From 886542c37569776552d398042d4dba6c59a4227f Mon Sep 17 00:00:00 2001 From: ahmedsamyh Date: Sun, 27 Apr 2025 18:57:29 +0500 Subject: [PATCH] [main.c] Can parse multiple Statements*... - Statement is not yet defined but its basically one or more expressions ending in a semicolon. --- main.c | 29 ++++++++++++++++++++++------- main.momo | 3 ++- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/main.c b/main.c index bf2583c..8aa9c85 100644 --- a/main.c +++ b/main.c @@ -340,6 +340,12 @@ struct Expression { void print_expression_as_value(FILE *f, Expression e); void print_expression(FILE *f, Expression e); +typedef struct { + Expression **items; + size_t count; + size_t capacity; +} Expression_refs; + /// /// Identifiers @@ -1551,16 +1557,25 @@ int main(int argc, char **argv) { Arena expr_arena = arena_make(0); - Expression *expr = expression(&expr_arena, &p); - - if (expr == NULL) return 1; + Expression_refs expr_refs = {0}; - if (!parser_match(&p, TK_SEMICOLON)) { - error_pretty(parser_peek(&p).loc, (*p.lexer), "Expected semicolon but got '%s'", token_type_as_str(parser_peek(&p).type)); - return 1; + Expression *expr = expression(&expr_arena, &p); + while (expr != NULL) { + if (!parser_match(&p, TK_SEMICOLON)) { + error_pretty(parser_peek(&p).loc, (*p.lexer), "Expected semicolon but got '%s'", token_type_as_str(parser_peek(&p).type)); + return 1; + } + da_append(expr_refs, expr); + if (parser_eof(&p)) { + break; + }; + expr = expression(&expr_arena, &p); } - print_expression(stdout, *expr); printf("\n"); + for (size_t i = 0; i < expr_refs.count; ++i) { + Expression *expr = expr_refs.items[i]; + print_expression(stdout, *expr); printf("\n"); + } arena_free(&expr_arena); free_parser(&p); diff --git a/main.momo b/main.momo index 9a849bb..adc82c9 100644 --- a/main.momo +++ b/main.momo @@ -1 +1,2 @@ -1 + (1 0); +1 / (1 - 0); +2 * (1 + 3); -- 2.39.5