Beispiel #1
0
 // [RULE] stat: list EOF | assign EOF;
 void stat() {
     // check if stat is a list
     if (stat_list()) {
         list();
         match(EOF_TYPE);
     }
     // check if stat is an assignment
     else if (stat_assign()) {
         assign();
         match(EOF_TYPE);
     } else
         throw NoViableAltException(lookaheadType(1));
 }
Beispiel #2
0
//语句
AST_node statement(AST_node parent)
{
	AST_node t = makeNode(STATEMENT, parent);
	if (symbol == IDENT)
	{
		//赋值语句或者过程调用语句
		//<赋值语句>::=<标识符>:=<表达式>|<函数标识符>:=<表达式>|<标识符>'['<表达式>']':=<表达式>
		//<过程调用语句>::=<标识符>[<实在参数表>]
		match(IDENT,t);
		if (symbol == BECOMES || symbol == LBRACKET)
		{
			//赋值语句
			stat_assign(t);
		}
		else if (symbol == LPARENT || symbol == SEMICOLON 
			|| symbol == END	//过程调用语句在end前,可以没有分号
			)
			
		{
			//过程调用语句
			stat_procedure(t);
		}
		else
		{
			error("Unknown Statement!");
			recovery(2, SEMICOLON, END);
		}
	}
	else if (symbol == IF)
	{
		//条件语句
		//<条件语句>::=if<条件>then<语句>|if<条件>then<语句>else<语句>
		stat_if(t);
	}
	else if (symbol == DO)
	{
		//当循环语句
		//<当循环语句>::=do<语句>while<条件>
		stat_do(t);
	}
	else if (symbol == FOR)
	{
		//for循环语句
		//<for循环语句>::=for<标识符>:=<表达式>(downto|to)<表达式>do<语句>//步长为1
		stat_for(t);
	}
	else if (symbol == BEGIN)
	{
		//复合语句
		//<复合语句>::=begin<语句>{;<语句>}end
		stat_list(t);
	}
	else if (symbol == READ)
	{
		//读语句
		//<读语句>::=read'('<标识符>{,<标识符>}')'
		stat_read(t);
	}
	else if (symbol == WRITE)
	{
		//写语句
		//<写语句>::=write'('<字符串>,<表达式>')'|write'('<字符串>')'|write'('<表达式>')'
		stat_write(t);
	}
	else
	{
		//空语句
		t->ast_type = EMPTY;
		printf("----------------Empty Statement--------------\n");
	}
	return 0;
}