From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp0.migadu.com ([2001:41d0:303:5f26::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by ms5.migadu.com with LMTPS id IC0TF3uN62XULgEAbAwnHQ (envelope-from ) for ; Fri, 08 Mar 2024 23:13:15 +0100 Received: from aspmx1.migadu.com ([2001:41d0:303:e224::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp0.migadu.com with LMTPS id iNepD3qN62V5kQAAqHPOHw (envelope-from ) for ; Fri, 08 Mar 2024 23:13:15 +0100 X-Envelope-To: patches@johnnyrichard.com Authentication-Results: aspmx1.migadu.com; dkim=pass header.d=lists.sr.ht header.s=20240113 header.b="KNMeY/MS"; dkim=pass header.d=johnnyrichard.com header.s=key1 header.b=Kr1GpUTe; spf=pass (aspmx1.migadu.com: domain of lists@sr.ht designates 46.23.81.152 as permitted sender) smtp.mailfrom=lists@sr.ht; dmarc=pass (policy=quarantine) header.from=johnnyrichard.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=johnnyrichard.com; s=key1; t=1709935993; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding:list-id: list-unsubscribe:list-subscribe:list-post:dkim-signature; bh=1AJ+9hiLeW+n/+td7zmo+SQlq8BuAKPAklVIuDHVADg=; b=AIZVbnID4nLz8VRK7Eqe82YuO3QKx84dThn903ol6gP9r6w+DFsG7Rb8ORt2kFSGyCPRQ2 KD7XtA6lPd7IJD0RVZ3f/sI+dWTvzVOOz/ee5pztJdzk9ts9tDcFsgOVLxHlW2M2fMrQjl 1yE+kxD4VEEqbB8PG5Lth+0rlYQ9ecF7D6eyalI8Ou3wrG6GbzzcfQUR/1PftHfDkpr5n0 oZsAIdif0w4qpiSbk9oufTT4zJfMnlcCrHsrTykxp7FJwsSVSdFd9jdaWIF2ydzXfABBhP 6A+BkAYx9aG4AcFmimUabhAjNS8CDYGxDPQODZLSJOkhCuUe3A4P84/VLQAQLQ== ARC-Authentication-Results: i=1; aspmx1.migadu.com; dkim=pass header.d=lists.sr.ht header.s=20240113 header.b="KNMeY/MS"; dkim=pass header.d=johnnyrichard.com header.s=key1 header.b=Kr1GpUTe; spf=pass (aspmx1.migadu.com: domain of lists@sr.ht designates 46.23.81.152 as permitted sender) smtp.mailfrom=lists@sr.ht; dmarc=pass (policy=quarantine) header.from=johnnyrichard.com ARC-Seal: i=1; s=key1; d=johnnyrichard.com; t=1709935993; a=rsa-sha256; cv=none; b=Dan7imyynBUCOGs8YkEnSd90VixTX1n9mKnQsltrH9G1f/C15yRwKbpPvG4OczRE5AP9sx rj64HD82AmAnFLR0S8oY1xUo722udODNXg0htI7ZZ69H4tjr2LcHASor99P8w5LRvfAGeT 5QiSJ9gSsyl/LnlcwpwlTs4T1tPwuD/5mnyXsjW2P7foquYcN6QUoCridQBZdaOGHwscCV Bb5hcqhCVTTubpWIybna7Cm1qtc73wEofbpuP8BIVnUGGH/0icrsJJq/Ccdqn8BaaXKmTX ZXx3vaAVKJuKqjHvylD+LQL+WftVGPTP7xTZAvAJoBGqlvU7lfHfq5eYsmWiJg== Received: from mail-a.sr.ht (mail-a.sr.ht [46.23.81.152]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by aspmx1.migadu.com (Postfix) with ESMTPS id 7B3EC3376E for ; Fri, 8 Mar 2024 23:13:11 +0100 (CET) DKIM-Signature: a=rsa-sha256; bh=Xroky/27ngtquG1bD6aZzto0xiRcbWBqNBmp2S8p5JE=; c=simple/simple; d=lists.sr.ht; h=From:To:Cc:Subject:Date:List-Unsubscribe:List-Subscribe:List-Archive:List-Post:List-ID; q=dns/txt; s=20240113; t=1709935988; v=1; b=KNMeY/MSRWrPdNt7a7RDMOFXENXvV16OhndFRZ7UHz2S/qVOPg1CSNSkKlVfkXaDfqK5Fgrr gHpOc+RfW6H/JPwc9uJWbtJhlnUWaxgRBrHwJox0f+gLlyFSHjppkCldOqkHiWLeZTWdH06pvEt jSNQOd/n/vh8goYzfwvYJez31+8Yk05kxzvj5ZwUVLmtiyPJo9JZBPLR47LHuc8yxSQV3lMqdpJ XfcPehqv9QdbIyJQGukwd79sDfDuVKGl65R6cEv7vO17H2dYelIXA+N9JLLVGUkDHyFQnbLByH1 0RpXHeofmajooIePu2c6B+HMhJcroDPxdJU65afEsxByA== Received: from lists.sr.ht (unknown [46.23.81.154]) by mail-a.sr.ht (Postfix) with ESMTPSA id BF56420269 for ; Fri, 8 Mar 2024 22:13:08 +0000 (UTC) Received: from out-188.mta0.migadu.com (out-188.mta0.migadu.com [IPv6:2001:41d0:1004:224b::bc]) by mail-a.sr.ht (Postfix) with ESMTPS id E379820258 for <~johnnyrichard/olang-devel@lists.sr.ht>; Fri, 8 Mar 2024 22:13:07 +0000 (UTC) X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=johnnyrichard.com; s=key1; t=1709935987; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding; bh=1AJ+9hiLeW+n/+td7zmo+SQlq8BuAKPAklVIuDHVADg=; b=Kr1GpUTeT5ZoMWSYnb6NVBhoI76+ksZf8dZzFK7EgiCDt3Owr3hkZzAE9kT8N4DtXIj5YA DDnxSRzMM7zgNC/YRuywoL5bgpEQ1VLvIHUCc6JYOdFE8ekD9jFSP7nFXO0M17+009xbce L9e1Lcfjf9MSkhfohBRnZ/WtHOxE6v9Llgjo+GDG2njZkVQOZ9Dl0xQOnIVCcgbUjA/uYf 2xX+vqKnh9lwH9YxtHbbFdOPhCbxUgLDCrXqh5Wo3qiLBTIYuBCTJ4b3A+iJvhjc00WD7k XnyIhjnn6GM83NxvAXbWzAdOk8GozpCn98E/lp3s8Ws75cUmK5y3wgJq5MWxFA== From: Johnny Richard To: ~johnnyrichard/olang-devel@lists.sr.ht Cc: Johnny Richard Subject: [PATCH olang v1] ast: add ast_node root for the entire program Date: Sat, 9 Mar 2024 00:13:14 +0100 Message-ID: <20240308231331.1056371-1-johnny@johnnyrichard.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Sourcehut-Patchset-Status: PROPOSED List-Unsubscribe: List-Subscribe: List-Archive: Archived-At: List-Post: List-ID: ~johnnyrichard/olang-devel <~johnnyrichard/olang-devel.lists.sr.ht> Sender: ~johnnyrichard/olang-devel <~johnnyrichard/olang-devel@lists.sr.ht> X-Migadu-Country: NL X-Migadu-Flow: FLOW_IN X-Migadu-Scanner: mx12.migadu.com X-Migadu-Spam-Score: -9.05 X-Spam-Score: -9.05 X-Migadu-Queue-Id: 7B3EC3376E X-TUID: EX/NFrwbalZj Feels weird the codegen parse a function definition. We know that in the future we are going to parse a root node which will contains all variables and function definition. This patch is the initial change towards this goal. Signed-off-by: Johnny Richard --- src/ast.c | 14 ++++++++++++++ src/ast.h | 10 ++++++++++ src/codegen_linux_x86_64.c | 8 +++++--- src/main.c | 2 +- src/parser.c | 12 ++++++++++++ src/parser.h | 2 +- tests/unit/parser_test.c | 26 ++++++++++++++------------ 7 files changed, 57 insertions(+), 17 deletions(-) diff --git a/src/ast.c b/src/ast.c index fb39295..ab56c96 100644 --- a/src/ast.c +++ b/src/ast.c @@ -22,6 +22,20 @@ #include "ast.h" #include "string_view.h" +ast_node_t * +ast_new_program(arena_t *arena, ast_node_t *fn_def) +{ + ast_node_t *node = (ast_node_t *)arena_alloc(arena, sizeof(ast_node_t)); + assert(node); + + node->kind = AST_NODE_PROGRAM; + ast_program_t *program = &node->data.as_program; + + program->fn = fn_def; + + return node; +} + ast_node_t * ast_new_node_fn_def(arena_t *arena, string_view_t identifier, type_t return_type, ast_node_t *block) { diff --git a/src/ast.h b/src/ast.h index b243334..2b42781 100644 --- a/src/ast.h +++ b/src/ast.h @@ -27,6 +27,7 @@ typedef struct ast_node ast_node_t; typedef enum { + AST_NODE_PROGRAM, AST_NODE_BLOCK, AST_NODE_FN_DEF, AST_NODE_RETURN_STMT, @@ -44,6 +45,11 @@ typedef struct ast_block list_t *nodes; } ast_block_t; +typedef struct ast_program +{ + ast_node_t *fn; +} ast_program_t; + typedef struct ast_fn_definition { string_view_t identifier; @@ -74,6 +80,7 @@ typedef struct ast_return_stmt typedef union { + ast_program_t as_program; ast_fn_definition_t as_fn_def; ast_literal_t as_literal; ast_block_t as_block; @@ -86,6 +93,9 @@ typedef struct ast_node ast_node_data_t data; } ast_node_t; +ast_node_t * +ast_new_program(arena_t *arena, ast_node_t *fn_def); + ast_node_t * ast_new_node_fn_def(arena_t *arena, string_view_t identifier, type_t return_type, ast_node_t *block); diff --git a/src/codegen_linux_x86_64.c b/src/codegen_linux_x86_64.c index 3d4b17e..d4f8222 100644 --- a/src/codegen_linux_x86_64.c +++ b/src/codegen_linux_x86_64.c @@ -30,12 +30,14 @@ static void codegen_linux_x86_64_emit_function(FILE *out, ast_fn_definition_t *fn); void -codegen_linux_x86_64_emit_program(FILE *out, ast_node_t *prog) +codegen_linux_x86_64_emit_program(FILE *out, ast_node_t *node) { codegen_linux_x86_64_emit_start_entrypoint(out); - assert(prog->kind == AST_NODE_FN_DEF); - ast_fn_definition_t fn = prog->data.as_fn_def; + assert(node->kind == AST_NODE_PROGRAM); + ast_program_t program = node->data.as_program; + + ast_fn_definition_t fn = program.fn->data.as_fn_def; assert(string_view_eq_to_cstr(fn.identifier, "main")); codegen_linux_x86_64_emit_function(out, &fn); diff --git a/src/main.c b/src/main.c index 785ad6d..f6d49f0 100644 --- a/src/main.c +++ b/src/main.c @@ -158,7 +158,7 @@ handle_codegen_linux_x86_64(cli_opts_t *opts) lexer_init(&lexer, file_content); parser_init(&parser, &lexer, &arena, opts->file_path); - ast_node_t *ast = parser_parse_fn_definition(&parser); + ast_node_t *ast = parser_parse_program(&parser); char asm_file[opts->output_bin.size + 3]; sprintf(asm_file, "" SV_FMT ".s", SV_ARG(opts->output_bin)); diff --git a/src/parser.c b/src/parser.c index a9699be..70ee8e8 100644 --- a/src/parser.c +++ b/src/parser.c @@ -20,6 +20,7 @@ #include #include +#include "ast.h" #include "lexer.h" #include "parser.h" @@ -35,6 +36,9 @@ parser_parse_type(parser_t *parser, type_t *type); static ast_node_t * parser_parse_block(parser_t *parser); +ast_node_t * +parser_parse_fn_definition(parser_t *parser); + static void skip_line_feeds(lexer_t *lexer); @@ -49,6 +53,14 @@ parser_init(parser_t *parser, lexer_t *lexer, arena_t *arena, char *file_path) parser->file_path = file_path; } +ast_node_t * +parser_parse_program(parser_t *parser) +{ + ast_node_t *fn = parser_parse_fn_definition(parser); + + return ast_new_program(parser->arena, fn); +} + ast_node_t * parser_parse_fn_definition(parser_t *parser) { diff --git a/src/parser.h b/src/parser.h index 3f1a00b..5bcef1d 100644 --- a/src/parser.h +++ b/src/parser.h @@ -33,6 +33,6 @@ void parser_init(parser_t *parser, lexer_t *lexer, arena_t *arena, char *file_path); ast_node_t * -parser_parse_fn_definition(parser_t *parser); +parser_parse_program(parser_t *parser); #endif /* PARSER_H */ diff --git a/tests/unit/parser_test.c b/tests/unit/parser_test.c index 32ebc8e..208b1bc 100644 --- a/tests/unit/parser_test.c +++ b/tests/unit/parser_test.c @@ -27,7 +27,7 @@ #define ARENA_CAPACITY (1024 * 1024) static MunitResult -parse_fn_definition_test(const MunitParameter params[], void *user_data_or_fixture) +parse_program_test(const MunitParameter params[], void *user_data_or_fixture) { arena_t arena = arena_new(ARENA_CAPACITY); @@ -41,15 +41,19 @@ parse_fn_definition_test(const MunitParameter params[], void *user_data_or_fixtu parser_t parser; parser_init(&parser, &lexer, &arena, file_path); - ast_node_t *node_fn_def = parser_parse_fn_definition(&parser); - assert_not_null(node_fn_def); - assert_uint(node_fn_def->kind, ==, AST_NODE_FN_DEF); + ast_node_t *program_node = parser_parse_program(&parser); + assert_not_null(program_node); + assert_uint(program_node->kind, ==, AST_NODE_PROGRAM); - ast_fn_definition_t *fn = &node_fn_def->data.as_fn_def; - assert_memory_equal(fn->identifier.size, fn->identifier.chars, "main"); - assert_uint(fn->return_type, ==, TYPE_U32); + ast_program_t program = program_node->data.as_program; + assert_not_null(program.fn); + assert_uint(program.fn->kind, ==, AST_NODE_FN_DEF); - ast_node_t *block = fn->block; + ast_fn_definition_t fn = program.fn->data.as_fn_def; + assert_memory_equal(fn.identifier.size, fn.identifier.chars, "main"); + assert_uint(fn.return_type, ==, TYPE_U32); + + ast_node_t *block = fn.block; assert_not_null(block); assert_uint(block->kind, ==, AST_NODE_BLOCK); @@ -73,10 +77,8 @@ parse_fn_definition_test(const MunitParameter params[], void *user_data_or_fixtu return MUNIT_OK; } -static MunitTest tests[] = { - { "/parse_fn_definition", parse_fn_definition_test, NULL, NULL, MUNIT_TEST_OPTION_NONE, NULL }, - { NULL, NULL, NULL, NULL, MUNIT_TEST_OPTION_NONE, NULL } -}; +static MunitTest tests[] = { { "/parse_program", parse_program_test, NULL, NULL, MUNIT_TEST_OPTION_NONE, NULL }, + { NULL, NULL, NULL, NULL, MUNIT_TEST_OPTION_NONE, NULL } }; static const MunitSuite suite = { "/parser", tests, NULL, 1, MUNIT_SUITE_OPTION_NONE }; base-commit: 35f594370443a2b9f73d2d2ebe573b4cab472be6 -- 2.44.0