// [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)); }
//语句 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; }