- 重命名和重构了多个文件,包括 lexer、parser 和 AST 相关代码 - 添加了日志功能,使用 LOG_* 宏替代原有的 error 和 warn 函数 - 优化了错误处理和内存分配方式 - 调整了代码结构,提高了模块化和可读性
35 lines
821 B
C
35 lines
821 B
C
#include "../ast.h"
|
|
#include "../parser.h"
|
|
|
|
#ifndef PROG_MAX_NODE_SIZE
|
|
#define PROG_MAX_NODE_SIZE (1024 * 4)
|
|
#endif
|
|
|
|
void parse_func(parser_t* parser);
|
|
|
|
void parse_prog(parser_t* parser) {
|
|
/**
|
|
* Program := (Declaration | Definition)*
|
|
* same as
|
|
* Program := Declaration* Definition*
|
|
*/
|
|
tok_stream_t *tokbuf = &(parser->tokbuf);
|
|
parser->root = new_ast_node();
|
|
ast_node_t* node;
|
|
parser->root->type = NT_ROOT;
|
|
vector_init(parser->root->root.children);
|
|
while (1) {
|
|
flush_peek_tok(tokbuf);
|
|
if (peek_tok_type(tokbuf) == TOKEN_EOF) {
|
|
break;
|
|
}
|
|
node = parse_decl(parser);
|
|
if (node == NULL) {
|
|
parse_func(parser);
|
|
} else {
|
|
vector_push(parser->root->root.children, node);
|
|
}
|
|
}
|
|
return;
|
|
}
|