#include "../parser.h" #include "ast.h" #include "../symtab/symtab.h" /** * 0 false * 1 true */ int peek_decl(struct Parser* parser) { flushpeektok(parser); switch (peektoktype(parser)) { case TOKEN_STATIC: case TOKEN_EXTERN: case TOKEN_REGISTER: case TOKEN_TYPEDEF: error("not impliment"); break; default: flushpeektok(parser); } switch (peektoktype(parser)) { case TOKEN_VOID: case TOKEN_CHAR: case TOKEN_SHORT: case TOKEN_INT: case TOKEN_LONG: case TOKEN_FLOAT: case TOKEN_DOUBLE: return 1; default: flushpeektok(parser); } } struct ASTNode* parse_decl_val(struct Parser* parser) { flushpeektok(parser); // parse_type enum TokenType ttype; struct ASTNode* node; struct ASTNode* type_node = parse_type(parser); struct ASTNode* name_node = parser_ident_without_pop(parser); node = new_ast_node(); node->decl_val.type = type_node; node->decl_val.name = name_node; node->type = NT_DECL_VAR; symtab_add_symbol(parser->symtab, name_node->syms.tok.constant.str, node); ttype = peektoktype(parser); if (ttype == TOKEN_ASSIGN) { node->decl_val.expr_stmt = parse_stmt(parser); if (node->decl_val.expr_stmt->type != NT_STMT_EXPR) { error("parser_decl_val want stmt_expr"); } } else if (ttype == TOKEN_SEMICOLON) { poptok(parser); expecttok(parser, TOKEN_SEMICOLON); } else { error("parser_decl_val syntax error"); } return node; } // 类型解析入口改进 struct ASTNode* parse_decl(struct Parser* parser) { flushpeektok(parser); int idx; enum TokenType ttype; struct ASTNode* node; if (peek_decl(parser) == 0) { error("syntax error expect decl_val TYPE"); } if (peektoktype(parser) != TOKEN_IDENT) { error("syntax error expect decl_val IDENT"); } ttype = peektoktype(parser); switch (ttype) { case TOKEN_L_PAREN: // ( node = parse_func(parser); break; case TOKEN_ASSIGN: case TOKEN_SEMICOLON: node = parse_decl_val(parser); break; default: error("syntax error expect decl_val ASSIGN or SEMICOLON"); return NULL; } return node; }