// Parse a statement. // // stmt -> block-stmt // | declaration-stmt // | expression-stmt Stmt* Parser::stmt() { switch (lookahead()) { case semicolon_tok: return empty_stmt(); case lbrace_tok: return block_stmt(); case return_kw: return return_stmt(); case if_kw: return if_stmt(); case while_kw: return while_stmt(); case break_kw: return break_stmt(); case continue_kw: return continue_stmt(); case var_kw: case def_kw: case foreign_kw: return declaration_stmt(); default: return expression_stmt(); } }
static NODE * statement(void){ NODE *t = NULL; switch (token.type){ case IF: t = if_stmt(); break; case WHILE: t = while_stmt(); break; case READ: t = read(); break; case VAR: t = assign(); break; case PRINT: t = print(); break; case BEGIN: t = stmt_list(); break; default: syntax_error("Unexpected token ->"); token = getToken(); break; } return t; }
static stmt_code(stream, node, brk, cont, ret) { /* Handle the null expression. */ if ( !node ) return; auto op = node[0]; /* For debugging purposes, put a blank line between each statement. */ fputs("\n", stream); if ( op == 'dcls' ) declaration( stream, node ); else if ( op == 'brea' ) branch( stream, brk ); else if ( op == 'cont' ) branch( stream, cont ); else if ( op == 'retu' ) return_stmt( stream, node, ret ); else if ( op == 'goto' ) goto_stmt( stream, node ); else if ( op == 'if' ) if_stmt( stream, node, brk, cont, ret ); else if ( op == 'whil' ) while_stmt( stream, node, brk, cont, ret ); else if ( op == 'for' ) for_stmt( stream, node, brk, cont, ret ); else if ( op == 'do' ) do_stmt( stream, node, brk, cont, ret ); else if ( op == 'swit' ) switch_stmt( stream, node, brk, cont, ret ); else if ( op == 'case' || op == 'defa' ) case_stmt( stream, node, brk, cont, ret ); else if ( op == ':' ) label_stmt( stream, node, brk, cont, ret ); else if ( op == '{}' ) do_block( stream, node, brk, cont, ret ); else expr_code( stream, node, 0 ); }
Stmt *Parser::stmt() { if (lookahead_ == Token::IDENT) return assign(); else if (lookahead_ == Token::IF) return if_stmt(); else if (lookahead_ == Token::WHILE) return while_stmt(); else return action(); }
TreeNode * statement(void) //statement -> expression| if_stmt| while_stmt|for_stmt|var_stmt|assign_stmt { TreeNode * t = NULL; switch (token) { case IF : t = if_stmt(); break; case FOR : t = for_stmt(); break; case ID : t = assign_stmt(); break; case WHILE : t = while_stmt(); break; case INT : case CHAR : t = var_stmt(); break; case RBRACE : match(RBRACE); break; default : syntaxError("unexpected token -> "); printToken(token,tokenString); token = getToken(); break; } /* end case */ return t; }