From 5560de29043908588978b2ce4384a769eb08e471 Mon Sep 17 00:00:00 2001 From: omicron Date: Wed, 9 Apr 2025 01:15:51 +0200 Subject: [PATCH 1/2] Make sure parse skips past initial trivia in the tokenlist --- src/parser/parser.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/parser/parser.c b/src/parser/parser.c index 0476666..5f96681 100644 --- a/src/parser/parser.c +++ b/src/parser/parser.c @@ -136,5 +136,6 @@ parse_result_t parse_statement(tokenlist_entry_t *current) { } parse_result_t parse(tokenlist_entry_t *current) { + current = tokenlist_skip_trivia(current); return parse_many(current, NODE_PROGRAM, true, parse_statement); } -- 2.47.2 From 92c63092a145797c28be466d1071558d51dd78b8 Mon Sep 17 00:00:00 2001 From: omicron Date: Wed, 9 Apr 2025 01:17:09 +0200 Subject: [PATCH 2/2] Add regression test for trivia at the head of tokenlist --- tests/input/regression/test_trivia_head.asm | 5 ++++ tests/main.c | 8 ++++-- tests/regression.c | 31 +++++++++++++++++++++ 3 files changed, 41 insertions(+), 3 deletions(-) create mode 100644 tests/input/regression/test_trivia_head.asm create mode 100644 tests/regression.c diff --git a/tests/input/regression/test_trivia_head.asm b/tests/input/regression/test_trivia_head.asm new file mode 100644 index 0000000..4a4e64c --- /dev/null +++ b/tests/input/regression/test_trivia_head.asm @@ -0,0 +1,5 @@ +; sample program with trivia on the head of the tokenlist + +_start: + xor rax, rax + call exit diff --git a/tests/main.c b/tests/main.c index d8a79ea..c94d54d 100644 --- a/tests/main.c +++ b/tests/main.c @@ -2,12 +2,14 @@ extern MunitTest ast_tests[]; extern MunitTest lexer_tests[]; +extern MunitTest regression_tests[]; int main(int argc, char *argv[MUNIT_ARRAY_PARAM(argc + 1)]) { MunitSuite suites[] = { - {"/ast", ast_tests, nullptr, 1, MUNIT_SUITE_OPTION_NONE}, - {"/lexer", lexer_tests, nullptr, 1, MUNIT_SUITE_OPTION_NONE}, - {nullptr, nullptr, nullptr, 0, MUNIT_SUITE_OPTION_NONE}, + {"/regression", regression_tests, nullptr, 1, MUNIT_SUITE_OPTION_NONE}, + {"/ast", ast_tests, nullptr, 1, MUNIT_SUITE_OPTION_NONE}, + {"/lexer", lexer_tests, nullptr, 1, MUNIT_SUITE_OPTION_NONE}, + {nullptr, nullptr, nullptr, 0, MUNIT_SUITE_OPTION_NONE}, }; MunitSuite master_suite = {"/oas", nullptr, suites, 1, MUNIT_SUITE_OPTION_NONE}; diff --git a/tests/regression.c b/tests/regression.c new file mode 100644 index 0000000..9947a27 --- /dev/null +++ b/tests/regression.c @@ -0,0 +1,31 @@ +#include "../src/ast.h" +#include "../src/parser/parser.h" +#include "munit.h" + +MunitResult test_regression_trivia_head(const MunitParameter params[], void *data) { + (void)params; + (void)data; + + lexer_t *lex = &(lexer_t){}; + error_t *err = lexer_open(lex, "tests/input/regression/test_trivia_head.asm"); + munit_assert_null(err); + + tokenlist_t *list; + err = tokenlist_alloc(&list); + munit_assert_null(err); + + err = tokenlist_fill(list, lex); + munit_assert_null(err); + + parse_result_t result = parse(list->head); + munit_assert_null(result.err); + munit_assert_null(result.next); + + ast_node_free(result.node); + tokenlist_free(list); +} + +MunitTest regression_tests[] = { + {"/trivia_head", test_regression_trivia_head, nullptr, nullptr, MUNIT_TEST_OPTION_NONE, nullptr}, + {nullptr, nullptr, nullptr, nullptr, MUNIT_TEST_OPTION_NONE, nullptr} +}; -- 2.47.2