ASTIdentifier* FindIdentifier(ASTBlock* block, const std::string& name) { auto result = block->identifiers[name]; if (!result && block->parent != nullptr) result = FindIdentifier(block->parent, name); return result; }
int CESBolanStack::PushScript(LPCTSTR ExpStr,CESVariableList* pVariableList,CESFunctionList * pFunctionList,int& LastLine) { TCHAR TempID[MAX_IDENTIFIER_LENGTH]; CESBolanStack TempStack; CESBolanStack OrginScript; ES_BOLAN Bolan; bool IsInStr; LastLine=1; CEasyBuffer Buffer(((UINT)_tcslen(ExpStr)+1)*sizeof(TCHAR)); CEasyBuffer TempBuffer(((UINT)_tcslen(ExpStr)+1)*sizeof(TCHAR)); TCHAR * ExpBuff=(TCHAR *)Buffer.GetBuffer(); TCHAR * TempBuff=(TCHAR *)TempBuffer.GetBuffer(); UINT Len=0; IsInStr=false; while(*ExpStr) { if(*ExpStr=='"') IsInStr=!IsInStr; if(IsInStr) ExpBuff[Len++]=(*ExpStr++); else ExpBuff[Len++]=toupper(*ExpStr++); } ExpBuff[Len]=0; //CharUpper(ExpBuff); ExpStr=ExpBuff; //先提取原始布兰式 while(*ExpStr) { Bolan.Clear(); Bolan.Line=LastLine; if(*ExpStr==' '||*ExpStr=='\r'||*ExpStr=='\n'||*ExpStr==' ') { //空格、空行忽略 if(*ExpStr=='\n') LastLine++; ExpStr++; } else if(*ExpStr=='/'&&*(ExpStr+1)=='/') { while((*ExpStr!='\r')&&(*ExpStr!='\n')&&(*ExpStr)) { if(*ExpStr=='\n') LastLine++; ExpStr++; } } else if(*ExpStr=='"')//字符串 { UINT i=0; ExpStr++; while(*ExpStr!='"') { //if(i>MAX_STRING_LENGTH) // return 1001; if(*ExpStr==0) return 1002; TempBuff[i++]=*ExpStr++; if(*ExpStr=='"'&&*(ExpStr+1)=='"') { TempBuff[i++]=*ExpStr++; ExpStr++; } } TempBuff[i]=0; ExpStr++; Bolan.Type=BOLAN_TYPE_VALUE; Bolan.ValueType=VALUE_TYPE_STRING; Bolan.StrValue=TempBuff; Bolan.Level=0; OrginScript.Push(&Bolan); } else if((*ExpStr>='0'&&*ExpStr<='9')||*ExpStr=='.') //数字 { UINT i=0; while((*ExpStr>='0'&&*ExpStr<='9')||*ExpStr=='.'||*ExpStr=='F'||*ExpStr=='D'||*ExpStr=='I'||*ExpStr=='L'||*ExpStr=='E'|| *ExpStr=='A'||*ExpStr=='B'||*ExpStr=='C'||*ExpStr=='X') { TempBuff[i++]=*ExpStr++; } TempBuff[i]=0; Bolan.Type=BOLAN_TYPE_VALUE; Bolan.Level=0; StrToNumber(TempBuff,Bolan); OrginScript.Push(&Bolan); } else if(*ExpStr==':') //跳转标识 { UINT i=0; ExpStr++; while(CanMakeIdentifier(*ExpStr)) { if(i>MAX_IDENTIFIER_LENGTH) return 1003; TempID[i++]=*ExpStr++; } TempID[i]=0; Bolan.Type=BOLAN_TYPE_IDENTIFIER; Bolan.Index=IDENTIFIER_TYPE_JUMP_DEFINE; Bolan.Level=0; Bolan.StrValue=TempID; OrginScript.Push(&Bolan); } else if(*ExpStr==';'||*ExpStr=='\r'||*ExpStr=='\n')//行结束符 { Bolan.Type=BOLAN_TYPE_KEYWORD; Bolan.Level=0; Bolan.Index=KW_LINEEND; OrginScript.Push(&Bolan); //除去多余的行结束符 while(*ExpStr==' '||*ExpStr==';'||*ExpStr=='\r'||*ExpStr=='\n') { if(*ExpStr=='\n') LastLine++; ExpStr++; } } else if(*ExpStr>='A'&&*ExpStr<='Z')//标识符 { UINT i=0; while(CanMakeIdentifier(*ExpStr)) { if(i>MAX_IDENTIFIER_LENGTH) return 1003; TempBuff[i++]=*ExpStr++; } TempBuff[i]=0; if(_tcsicmp(TempBuff,_T("AND"))==0) { Bolan.Type=BOLAN_TYPE_OPERATOR; Bolan.Level=15; Bolan.Index=OPERATOR_AND; OrginScript.Push(&Bolan); } else if(_tcsicmp(TempBuff,_T("OR"))==0) { Bolan.Type=BOLAN_TYPE_OPERATOR; Bolan.Level=15; Bolan.Index=OPERATOR_OR; OrginScript.Push(&Bolan); } else if(_tcsicmp(TempBuff,_T("NOT"))==0) { Bolan.Type=BOLAN_TYPE_OPERATOR; Bolan.Level=16; Bolan.Index=OPERATOR_NOT; OrginScript.Push(&Bolan); } else { int KeyWord=FindKeyWord(TempBuff); if(KeyWord>=0)//关键字 { Bolan.Type=BOLAN_TYPE_KEYWORD; Bolan.Level=0; Bolan.Index=KeyWord; OrginScript.Push(&Bolan); } else { Bolan.Type=BOLAN_TYPE_IDENTIFIER; Bolan.Index=IDENTIFIER_TYPE_UNKNOW; Bolan.Level=0; Bolan.StrValue=TempBuff; OrginScript.Push(&Bolan); } } } else if(*ExpStr=='(') { Bolan.Type=BOLAN_TYPE_OPERATOR; Bolan.Level=0; Bolan.Index=OPERATOR_LP; OrginScript.Push(&Bolan); ExpStr++; } else if(*ExpStr==')') { Bolan.Type=BOLAN_TYPE_OPERATOR; Bolan.Level=0; Bolan.Index=OPERATOR_RP; OrginScript.Push(&Bolan); ExpStr++; } else if(*ExpStr=='=') { if(*(ExpStr+1)=='=') { Bolan.Type=BOLAN_TYPE_OPERATOR; Bolan.Level=20; Bolan.Index=OPERATOR_EQU; OrginScript.Push(&Bolan); ExpStr+=2; } else { Bolan.Type=BOLAN_TYPE_OPERATOR; Bolan.Level=10; Bolan.Index=OPERATOR_EVA; OrginScript.Push(&Bolan); ExpStr++; } } else if(*ExpStr=='>') { if(*(ExpStr+1)=='=') { Bolan.Type=BOLAN_TYPE_OPERATOR; Bolan.Level=20; Bolan.Index=OPERATOR_MORE_EQU; OrginScript.Push(&Bolan); ExpStr+=2; } else { Bolan.Type=BOLAN_TYPE_OPERATOR; Bolan.Level=20; Bolan.Index=OPERATOR_MORE; OrginScript.Push(&Bolan); ExpStr++; } } else if(*ExpStr=='<') { if(*(ExpStr+1)=='=') { Bolan.Type=BOLAN_TYPE_OPERATOR; Bolan.Level=20; Bolan.Index=OPERATOR_LESS_EQU; OrginScript.Push(&Bolan); ExpStr+=2; } else if(*(ExpStr+1)=='>') { Bolan.Type=BOLAN_TYPE_OPERATOR; Bolan.Level=20; Bolan.Index=OPERATOR_DIFF; OrginScript.Push(&Bolan); ExpStr+=2; } else { Bolan.Type=BOLAN_TYPE_OPERATOR; Bolan.Level=20; Bolan.Index=OPERATOR_LESS; OrginScript.Push(&Bolan); ExpStr++; } } else if(*ExpStr=='+'||*ExpStr=='-') { //if(*ExpStr=='-'&&(ExpStr==ExpBuff||*(ExpStr-1)=='(')) //{ // Bolan.Type=BOLAN_TYPE_OPERATOR; // Bolan.Index=OPERATOR_NEG; // Bolan.Level=50; // OrginScript.Push(&Bolan); // ExpStr++; //} //else { Bolan.Type=BOLAN_TYPE_OPERATOR; Bolan.Level=30; if(*ExpStr=='+') Bolan.Index=OPERATOR_ADD; else Bolan.Index=OPERATOR_SUB; OrginScript.Push(&Bolan); ExpStr++; } } else if(*ExpStr=='*'||*ExpStr=='/') { Bolan.Type=BOLAN_TYPE_OPERATOR; Bolan.Level=40; if(*ExpStr=='*') Bolan.Index=OPERATOR_MUL; else Bolan.Index=OPERATOR_DIV; OrginScript.Push(&Bolan); ExpStr++; } else if(*ExpStr==',') { Bolan.Type=BOLAN_TYPE_OPERATOR; Bolan.Index=OPERATOR_COMMA; Bolan.Level=0; OrginScript.Push(&Bolan); ExpStr++; } else { return 1005; //非法字符 } } CESThread ESThread; ESThread.SetScript(&OrginScript); ESThread.SetVariableList(pVariableList); ESThread.SetFunctionList(pFunctionList); int RetCode=DealIdentifiers(&ESThread); LastLine=ESThread.GetLastLine(); if(RetCode) return RetCode; for(UINT i=0;i<OrginScript.GetSize();i++) { ES_BOLAN * pBolan=OrginScript.GetAt(i); LastLine=pBolan->Line; switch(pBolan->Type) { case BOLAN_TYPE_VALUE: Push(pBolan); break; case BOLAN_TYPE_OPERATOR: if(pBolan->Index==OPERATOR_RP) { while(TempStack.GetTop()!=NULL&&(TempStack.GetTop()->Type!=BOLAN_TYPE_OPERATOR||TempStack.GetTop()->Index!=OPERATOR_LP)) { ES_BOLAN * pTemp=TempStack.Pop(); Push(pTemp); } if(TempStack.GetTop()==NULL||TempStack.GetTop()->Type!=BOLAN_TYPE_OPERATOR||TempStack.GetTop()->Index!=OPERATOR_LP) return 2021; TempStack.Pop(); } else if(pBolan->Index==OPERATOR_LP) { TempStack.Push(pBolan); } else if(pBolan->Index==OPERATOR_NOP) { } else if(pBolan->Index==OPERATOR_COMMA) { while(TempStack.GetTop()!=NULL&&(TempStack.GetTop()->Type!=BOLAN_TYPE_OPERATOR||TempStack.GetTop()->Index!=OPERATOR_LP)) { ES_BOLAN * pTemp=TempStack.Pop(); Push(pTemp); } } else { while(TempStack.GetTop()!=NULL&&TempStack.GetTop()->Level>=pBolan->Level) { ES_BOLAN * pTemp=TempStack.Pop(); Push(pTemp); } TempStack.Push(pBolan); } break; case BOLAN_TYPE_FUNCTION: while(TempStack.GetTop()!=NULL&&TempStack.GetTop()->Level>=pBolan->Level) { ES_BOLAN * pTemp=TempStack.Pop(); Push(pTemp); } TempStack.Push(pBolan); break; case BOLAN_TYPE_VARIABLE: Push(pBolan); break; case BOLAN_TYPE_KEYWORD: while(TempStack.GetTop()!=NULL) { ES_BOLAN * pTemp=TempStack.Pop(); Push(pTemp); } switch(pBolan->Index) { case KW_EXIT: case KW_IF: case KW_THEN: case KW_ELSE: case KW_ELSEIF: case KW_ENDIF: case KW_WHILE: case KW_DO: case KW_ENDWHILE: case KW_BREAK: case KW_CONTINUE: case KW_GOTO: Push(pBolan); break; case KW_LINEEND: case KW_INT: case KW_INT64: case KW_FLOAT: case KW_DOUBLE: case KW_STRING: break; case KW_FUNCTION: case KW_ENDFUN: Push(pBolan); break; }; break; case BOLAN_TYPE_IDENTIFIER: while(TempStack.GetTop()!=NULL) { ES_BOLAN * pTemp=TempStack.Pop(); Push(pTemp); } if(pBolan->Index!=IDENTIFIER_TYPE_VARIABLE_DEFINE) Push(pBolan); break; } } while(TempStack.GetTop()!=NULL) { ES_BOLAN * pTemp=TempStack.Pop(); if(pTemp->Type==BOLAN_TYPE_OPERATOR&&pTemp->Index==OPERATOR_LP) return 2021; Push(pTemp); } //设置各种控制语句 ES_FUNCTION * pCurFunction=NULL; for(UINT i=0;i<GetSize();i++) { ES_BOLAN * pBolan=GetAt(i); LastLine=pBolan->Line; if(pBolan->Type==BOLAN_TYPE_FUNCTION) { pBolan->Type=BOLAN_TYPE_OPERATOR; pBolan->Level=pBolan->Index; pBolan->Index=OPERATOR_CALL; } else if(pBolan->Type==BOLAN_TYPE_KEYWORD) { switch(pBolan->Index) { case KW_EXIT: pBolan->Type=BOLAN_TYPE_OPERATOR; pBolan->Index=OPERATOR_EXIT; break; case KW_IF: case KW_ELSEIF: { int EndPos=FindCoupleKeyWord(KW_ENDIF,KW_IF,KW_ENDIF,i+1); if(EndPos<0) return 2001; if(pBolan->Index==KW_ELSEIF) { pBolan->Type=BOLAN_TYPE_OPERATOR; pBolan->Index=OPERATOR_JMP; pBolan->Level=EndPos+1; } int Pos=GetNextKeyWord(i+1); if(Pos<0) return 2001; ES_BOLAN * pThenBolan=GetAt(Pos); if(pThenBolan->Type!=BOLAN_TYPE_KEYWORD&&pThenBolan->Index!=KW_THEN) return 2001; int ElseIfPos=FindCoupleKeyWord(KW_ELSEIF,KW_IF,KW_ENDIF,i+1,EndPos+1); int ElsePos=FindCoupleKeyWord(KW_ELSE,KW_IF,KW_ENDIF,i+1,EndPos+1); pThenBolan->Type=BOLAN_TYPE_OPERATOR; pThenBolan->Index=OPERATOR_JZ; if(ElseIfPos>=0) pThenBolan->Level=ElseIfPos+1; else if(ElsePos>=0) pThenBolan->Level=ElsePos+1; else pThenBolan->Level=EndPos+1; } break; case KW_ELSE: { int EndPos=FindCoupleKeyWord(KW_ENDIF,KW_IF,KW_ENDIF,i+1); if(EndPos<0) return 2001; pBolan->Type=BOLAN_TYPE_OPERATOR; pBolan->Index=OPERATOR_JMP; pBolan->Level=EndPos+1; } break; case KW_WHILE: { int Pos=GetNextKeyWord(i+1); if(Pos<0) return 2011; ES_BOLAN * pDoBolan=GetAt(Pos); if(pDoBolan->Type!=BOLAN_TYPE_KEYWORD||pDoBolan->Index!=KW_DO) return 2011; Pos=FindCoupleKeyWord(KW_ENDWHILE,KW_WHILE,KW_ENDWHILE,i+1); if(Pos<0) return 2011; ES_BOLAN * pEndBolan=GetAt(Pos); pDoBolan->Type=BOLAN_TYPE_OPERATOR; pDoBolan->Index=OPERATOR_JZ; pDoBolan->Level=Pos+1; pEndBolan->Type=BOLAN_TYPE_OPERATOR; pEndBolan->Index=OPERATOR_JMP; pEndBolan->Level=i+1; } break; case KW_ENDWHILE: { return 2011; //int Pos=FindCoupleKeyWordReverse(KW_WHILE,KW_WHILE,KW_ENDWHILE,i-1); //if(Pos<0) // return 2011; //pBolan->Type=BOLAN_TYPE_OPERATOR; //pBolan->Index=OPERATOR_JMP; //pBolan->Level=Pos+1; } break; case KW_BREAK: { int Pos=FindCoupleKeyWord(KW_ENDWHILE,KW_WHILE,KW_ENDWHILE,i); if(Pos<0) return 2012; pBolan->Type=BOLAN_TYPE_OPERATOR; pBolan->Index=OPERATOR_JMP; pBolan->Level=Pos+1; } break; case KW_CONTINUE: { int Pos=FindCoupleKeyWordReverse(KW_WHILE,KW_WHILE,KW_ENDWHILE,i); if(Pos<0) return 2013; pBolan->Type=BOLAN_TYPE_OPERATOR; pBolan->Index=OPERATOR_JMP; pBolan->Level=Pos+1; } break; case KW_GOTO: { ES_BOLAN *pIDBolan=GetAt(i+1); if(pIDBolan==NULL) return 2014; if(pIDBolan->Type!=BOLAN_TYPE_IDENTIFIER) return 2014; int Pos=FindIdentifier(0,pIDBolan->StrValue); if(Pos<0) return 2015; pBolan->Type=BOLAN_TYPE_OPERATOR; pBolan->Index=OPERATOR_JMP; pBolan->Level=Pos+1; } break; case KW_FUNCTION: { int Pos=FindKeyWord(KW_ENDFUN,i,-1); if(Pos<0) return 2016; pBolan->Type=BOLAN_TYPE_OPERATOR; pBolan->Index=OPERATOR_JMP_FUNC; pBolan->Level=Pos+1; } break; case KW_ENDFUN: { if(pCurFunction==NULL) return 2019; pCurFunction->FunEndPos=i+1; pBolan->Type=BOLAN_TYPE_OPERATOR; pBolan->Index=OPERATOR_RET; } break; } } else if(pBolan->Type==BOLAN_TYPE_IDENTIFIER&&pBolan->Index==IDENTIFIER_TYPE_FUNCTION_DEFINE) { pCurFunction=pFunctionList->FindFunction(pBolan->StrValue); if(pCurFunction==NULL) { return 2019; } if(pCurFunction->Type!=FUNCTION_TYPE_SCRIPT) { return 2019; } pCurFunction->FunStartPos=i; //反转函数参数顺序 RetCode=ReverseFunctionParam(this,i+1,pCurFunction->ParaCount); if(RetCode) return RetCode; } } //删除多余的布兰式 for(int i=(int)GetSize()-1;i>=0;i--) { ES_BOLAN * pBolan=GetAt(i); if(pBolan->Type!=BOLAN_TYPE_VALUE&& pBolan->Type!=BOLAN_TYPE_OPERATOR&& pBolan->Type!=BOLAN_TYPE_VARIABLE&&(pBolan->Type!=BOLAN_TYPE_KEYWORD||pBolan->Index!=KW_FUNCTION)) { DeleteBolan(this,pFunctionList,i); } } //进行变量绑定 ESThread.SetScript(this); RetCode=DoVariableBind(&ESThread,LastLine); if(RetCode) return RetCode; return 0; }