diff options
Diffstat (limited to 'boot/parse.c')
| -rw-r--r-- | boot/parse.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/boot/parse.c b/boot/parse.c index 6129950..54461fa 100644 --- a/boot/parse.c +++ b/boot/parse.c @@ -80,6 +80,12 @@ parser_new(struct Parser* p, struct Lexer* lexer) } bool +parser_reached_end(struct Parser* p) +{ + return p->lexer->eof; +} + +bool parser_lookahead_pop(struct Parser* p, struct Token* token) { struct Token head = p->lookahead[0]; @@ -994,6 +1000,7 @@ parser_statement(struct Parser* p, struct Parser_Error* error) // skip empty statements. while (token_ends_statement(&token)) { + if (parser_reached_end(p)) return nil; parser_next(p); token = parser_peek(p); } @@ -1037,8 +1044,10 @@ parser_do_your_thing(struct Parser* p, struct Parser_Error* error) struct Statement* head = nil; struct Statement* current = nil; - while (!p->lexer->eof) { + while (!parser_reached_end(p)) { struct Statement* next = CHECK_RETURN(parser_statement(p, error), struct Tree); + if (!next) break; // on eof + CHECK_RETURN(parser_end_statement(p, error), struct Tree); if (current) { |
