52 lines
1.5 KiB
C
52 lines
1.5 KiB
C
#include "../parser.h"
|
|
#include "../type.h"
|
|
#include "ast.h"
|
|
|
|
ast_node_t* new_ast_ident_node(tok_t* tok) {
|
|
if (tok->type != TOKEN_IDENT) {
|
|
error("syntax error: want identifier but got %d", tok->type);
|
|
}
|
|
ast_node_t* node = new_ast_node();
|
|
node->type = NT_TERM_IDENT;
|
|
node->syms.tok = *tok;
|
|
node->syms.decl_node = NULL;
|
|
return node;
|
|
}
|
|
|
|
ast_node_t* expect_pop_ident(tok_buf_t* tokbuf) {
|
|
flush_peek_tok(tokbuf);
|
|
tok_t* tok = peek_tok(tokbuf);
|
|
ast_node_t* node = new_ast_ident_node(tok);
|
|
pop_tok(tokbuf);
|
|
return node;
|
|
}
|
|
|
|
ast_node_t* parse_type(parser_t* parser) {
|
|
tok_buf_t* tokbuf = &parser->tokbuf;
|
|
flush_peek_tok(tokbuf);
|
|
tok_type_t ttype = peek_tok_type(tokbuf);
|
|
data_type_t dtype;
|
|
switch(ttype) {
|
|
case TOKEN_VOID: dtype = TYPE_VOID; break;
|
|
case TOKEN_CHAR: dtype = TYPE_CHAR; break;
|
|
case TOKEN_SHORT: dtype = TYPE_SHORT; break;
|
|
case TOKEN_INT: dtype = TYPE_INT; break;
|
|
case TOKEN_LONG: dtype = TYPE_LONG; break;
|
|
case TOKEN_FLOAT: dtype = TYPE_FLOAT; break;
|
|
case TOKEN_DOUBLE: dtype = TYPE_DOUBLE; break;
|
|
default:
|
|
error("无效的类型说明符");
|
|
}
|
|
|
|
ast_node_t* node = new_ast_node();
|
|
node->type = NT_TERM_TYPE;
|
|
// TODO added by disable warning, will add typing system
|
|
dtype += 1;
|
|
pop_tok(tokbuf);
|
|
|
|
if (peek_tok_type(tokbuf) == TOKEN_MUL) {
|
|
pop_tok(tokbuf);
|
|
}
|
|
return node;
|
|
}
|