void evaluateif(String name, doVector& vec, tree& symbolTable, tree& localVar, funcS& funcTable){ for(int i = 0; i < vec.len(); i+=1){ if(vec.op[i].c == output){ numHandler(evaluateOpFunc(vec.op[i].operate, symbolTable, localVar, funcTable)); }else if(vec.op[i].c == text){ textHandler(vec.op[i].text); }else if(vec.op[i].c == set){ if(localVar.isMember(vec.op[i].text)){ localVar.insert(vec.op[i].text,evaluateOpFunc(vec.op[i].operate, symbolTable, localVar, funcTable)); }else if(symbolTable.isMember(vec.op[i].text)){ symbolTable.insert(vec.op[i].text,evaluateOpFunc(vec.op[i].operate, symbolTable, localVar, funcTable)); }else{ localVar.insert(vec.op[i].text,evaluateOpFunc(vec.op[i].operate, symbolTable, localVar, funcTable)); printf("variable %s not declared\n", vec.op[i].text.c_str()); } }else if(vec.op[i].c == ifs){ if(evaluateOpFunc(vec.op[i].operate, symbolTable, localVar, funcTable)){ evaluateif(name,*(vec.op[i].block), symbolTable, localVar, funcTable); if(function_return){ return; } }else{ evaluateElse(*(vec.op[i].block),symbolTable, localVar, funcTable); if(function_return){ return; } } }else if(vec.op[i].c == var){ if(symbolTable.isMember(vec.op[i].text)){ printf("variable %s incorrectly re-initialized\n", vec.op[i].text.c_str()); } symbolTable.insert(vec.op[i].text,evaluateOpFunc(vec.op[i].operate, symbolTable, localVar, funcTable)); }else if(vec.op[i].c == dos){ while(evaluateOpFunc(vec.op[i].operate, symbolTable, localVar, funcTable)){ evaluateif(name, *(vec.op[i].block), symbolTable, localVar, funcTable); if(function_return){ return; } } }else if(vec.op[i].c == call){ evaluateOpFunc(vec.op[i].operate, symbolTable, localVar, funcTable); if(function_return){return;} }else if(vec.op[i].c == returns){ funcTable.addVal(name, evaluateOpFunc(vec.op[i].operate, symbolTable, localVar, funcTable)); function_return = true; return; }else if(vec.op[i].c == func){ if(funcTable.isMember(vec.op[i].text)){ printf("WARNING: function %s redefined \n", vec.op[i].text.c_str()); } funcTable.addFunc(tempFunc, vec.op[i].text); } function_return = false; } }
/* ** 名字:Scanner::AddHandlers() ** 说明:为自动机添加回调函数 ** */ int Scanner::AddHandlers() { LPVOID param = NULL; HandlerFunctorType* functor; auto InsertCB = [&]() { functor = new HandlerFunctorType; m_cbList.push_back( functor );}; // 处理其他情况的处理函数 InsertCB(); m_pFSM->AddOtherHandler( &( *functor = [=]()->int { return otherHandler( param ); }) ); // 读取当前字符的处理函数 InsertCB(); m_pFSM->AddLookAheadCB( &( *functor = [=]()->int { return m_pFileReader->GetChar(); }) ); // 遇到错误可被调用 InsertCB(); m_pFSM->AddErrorCB( &( *functor = [=]()->int { return errorHandler( param ); }) ); // 添加遇到“;”注释会调用的回调函数 InsertCB(); m_pFSM->AddHandler( ';', &( *functor = [=]()->int { return commentHandler( param ); }) ); // 添加遇到“'”注释会调用的回调函数 InsertCB(); m_pFSM->AddHandler( '\'', &( *functor = [=]()->int { return strHandler( param ); }) ); // 添加遇到数字会调用的回调函数 InsertCB(); *functor = [=]()->int { return numHandler( param ); }; for ( char c = '0'; c <= '9'; c++ ) { m_pFSM->AddHandler( c, functor ); } // 添加遇到字母会调用的回调函数 InsertCB(); *functor = [=]()->int { return IDHandler( param ); }; for ( char c = 'A'; c <= 'z'; c++ ) { m_pFSM->AddHandler( c, functor ); } // 添加遇到空白会调用的回调函数 InsertCB(); *functor = [=]()->int { return whitespaceHandler( param ); }; m_pFSM->AddHandler( '\n', functor ); m_pFSM->AddHandler( '\t', functor ); m_pFSM->AddHandler( '\r', functor ); m_pFSM->AddHandler( ' ', functor ); return 0; }
void evaluateFunc(String name, tree& symbolTable, funcS& funcTable){ if(!(funcTable.getBlock(name))){ return; // if a function with no body } doVector vec = *(funcTable.getBlock(name)); tree localVar = *(funcTable.getParams(name)); for(int i = 0; i < vec.len(); i+=1){ if(vec.op[i].c == output){ numHandler(evaluateOpFunc(vec.op[i].operate, symbolTable, localVar, funcTable)); }else if(vec.op[i].c == text){ textHandler(vec.op[i].text); }else if(vec.op[i].c == set){ if(localVar.isMember(vec.op[i].text)){// if the variable is a local variable localVar.insert(vec.op[i].text,evaluateOpFunc(vec.op[i].operate, symbolTable, localVar, funcTable)); }else if(symbolTable.isMember(vec.op[i].text)){// else if it is local symbolTable.insert(vec.op[i].text,evaluateOpFunc(vec.op[i].operate, symbolTable, localVar, funcTable)); }else{ printf("variable %s not declared\n", vec.op[i].text.c_str()); } }else if(vec.op[i].c == ifs){ if(evaluateOpFunc(vec.op[i].operate, symbolTable, localVar, funcTable)){ evaluateif(name, *(vec.op[i].block), symbolTable, localVar, funcTable); if(function_return){return;} } }else if(vec.op[i].c == returns){ funcTable.addVal(name, evaluateOpFunc(vec.op[i].operate, symbolTable, localVar, funcTable)); function_return = true; return; }else if(vec.op[i].c == dos){ while(evaluateOpFunc(vec.op[i].operate, symbolTable, localVar, funcTable)){ evaluateif(name, *(vec.op[i].block), symbolTable, localVar, funcTable); if(function_return){return;} } }else if(vec.op[i].c == var){ if(localVar.isMember(vec.op[i].text)){ printf("variable %s incorrectly re-initialized\n", vec.op[i].text.c_str()); } localVar.insert(vec.op[i].text,evaluateOpFunc(vec.op[i].operate, symbolTable, localVar, funcTable)); }else if(vec.op[i].c == call){ evaluateOpFunc(vec.op[i].operate, symbolTable, localVar, funcTable); if(function_return){return;} }else if(vec.op[i].c == func){ if(funcTable.isMember(vec.op[i].text)){ printf("WARNING: function %s redefined \n", vec.op[i].text.c_str()); } funcTable.addFunc(tempFunc, vec.op[i].text); } } function_return = false; funcTable.addVal(name, 0);// if there is no return statment it returns 0 }