35 lines
815 B
C
35 lines
815 B
C
#include "../parser.h"
|
|
#include "ast.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_buf_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;
|
|
}
|