init basic
This commit is contained in:
94
ccompiler/frontend/parser/ast/decl.c
Normal file
94
ccompiler/frontend/parser/ast/decl.c
Normal file
@@ -0,0 +1,94 @@
|
||||
#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;
|
||||
}
|
||||
Reference in New Issue
Block a user