Exemplo n.º 1
0
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;
        }
}
Exemplo n.º 2
0
/*
** 名字: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;
}
Exemplo n.º 3
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
}