From 5f4f2c7c87053eeda22a32b0f944f39f27c1e522 Mon Sep 17 00:00:00 2001 From: Mel Date: Sat, 14 Jun 2025 00:15:41 +0200 Subject: Don't choke on \n followed by EOF Signed-off-by: Mel --- boot/parse.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/boot/parse.c b/boot/parse.c index 6129950..54461fa 100644 --- a/boot/parse.c +++ b/boot/parse.c @@ -79,6 +79,12 @@ parser_new(struct Parser* p, struct Lexer* lexer) memset(p->lookahead, 0, sizeof(p->lookahead)); } +bool +parser_reached_end(struct Parser* p) +{ + return p->lexer->eof; +} + bool parser_lookahead_pop(struct Parser* p, struct Token* token) { @@ -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) { -- cgit 1.4.1