static void statement() { int second_token; if(token == TOK_IF){ selection_stmt(); }else if(token == TOK_LBRACKET){ compound_stmt(); }else if(token == TOK_ID||token == TOK_AND){ second_token = virtual_get_token(true); if(second_token == TOK_ASSIGN){ assign_stmt(); }else if(second_token == TOK_LSQUARE){ while(second_token!=TOK_RSQUARE){ second_token = virtual_get_token(false); if(second_token == TOK_ASSIGN ||second_token == TOK_SEMI ||second_token == TOK_EOF) { fprintf( stderr, "line %d: error array var", save_line ); break; } } second_token = virtual_get_token(false); if(second_token == TOK_ASSIGN){ assign_stmt(); }else{ expression_stmt(); } }else{ expression_stmt(); } }else if(token == TOK_WHILE||token == TOK_FOR){ iteration_stmt(); }else if(token == TOK_RETURN){ return_stmt(); }else if(token == TOK_SEMI){ match(TOK_SEMI); }else fprintf( stderr, "line %d: error statements", save_line ); }
/* EBNF: statment -> expression-stmt | compound-stmt | * selection-stmt | iteration-stmt | return-stmt */ static TreeNode * statement (void) { TreeNode * t = NULL; while (token == COMMENT) unexpectedTokenHandling(); switch (token) { /* First(expression-stmt)={ID,LPAREN,NUM} */ case ID: case LPAREN: case NUM: t = expression_stmt(); break; case CLPAREN: t = compound_stmt(); break; case IF: t = selection_stmt(); break; case WHILE: t = iteration_stmt(); break; case RETURN: t = return_stmt(); break; default: unexpectedTokenHandling(); break; } return t; }