about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--boot/parse.c11
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) {