From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp0.migadu.com ([2001:41d0:303:e224::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by ms5.migadu.com with LMTPS id IJp8Bcze3GZdTAAAqHPOHw:P1 (envelope-from ) for ; Sun, 08 Sep 2024 01:16:28 +0200 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 IJp8Bcze3GZdTAAAqHPOHw (envelope-from ) for ; Sun, 08 Sep 2024 01:16:28 +0200 X-Envelope-To: patches@johnnyrichard.com Authentication-Results: aspmx1.migadu.com; dkim=pass header.d=lists.sr.ht header.s=20240113 header.b=qIZGDbeh; dkim=pass header.d=johnnyrichard.com header.s=key1 header.b=u1w0DWRT; dmarc=pass (policy=quarantine) header.from=johnnyrichard.com; spf=pass (aspmx1.migadu.com: domain of lists@sr.ht designates 46.23.81.152 as permitted sender) smtp.mailfrom=lists@sr.ht ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=johnnyrichard.com; s=key1; t=1725750988; 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: in-reply-to:in-reply-to:references:references:list-id: list-unsubscribe:list-subscribe:list-post:dkim-signature; bh=NvVAElWZH+A6R2CdJ0ftHkFaOTX3XKOw/c+iP3lA3sU=; b=gN2d9ma95sKIzTALOyTtXvccuYKZeQQqRk8BVMb3l/JEpBvIbwkQM1xAnuUkGP4jbBDhFR 6BQ52tIXcZuwKfrx3k5EQl0R5Nx07U5R/G8FiNKDJzY8wuBG0zEnGXkXSTYdlsMRZOL6q0 d4PaZ+oNrfpPin8+62JB7BK/r6oqKTgTvb44Czillu/08kl6IlI1EDB0P1lb0NThLC9G1l M61UvbiFmU64gSj/3DZZL2NDtRKvE9y+43Z+HnOV/zJ4lvj+7sFtMu56MkCm/FW8bWL/C+ bZdtKU5peqZbUMeDTfQUGJP/E3/ol8vmwl5QXAeqdSruIeHHmscTBohoGm9FIQ== ARC-Seal: i=1; s=key1; d=johnnyrichard.com; t=1725750988; a=rsa-sha256; cv=none; b=c7TsM5y6/lKgPpQyzbC8q8z5B/6SX9AU+XDaucM4jKzf1NzRmmrnoCC3LKpF1DpwZ8dYCK qS2sqYNsMo417YRIfhFmyb7Ap6A+IvW9PMrVcIPuyO0hv7WmZoTgrrDoO7trQ5+T5a4sZt ohHN9baEL57Q3oywvr8B+4/DH/T7dXVT3qpVj2I7iQajsBQ/PseyVRNNKFbsS2jd7/WpaG QQZ6vl7+rVYbXjej3P5KhO1Mb6w2eDKrujQIWBUqNtpDkrWUS+X6zTImgQF/yRgDf50j2Z mMf1fAi9KAkP8AutG93JqC1UEjGUTnoG2fOlHY4DjfR/2C3SIIor0rdPuDvYIg== ARC-Authentication-Results: i=1; aspmx1.migadu.com; dkim=pass header.d=lists.sr.ht header.s=20240113 header.b=qIZGDbeh; dkim=pass header.d=johnnyrichard.com header.s=key1 header.b=u1w0DWRT; dmarc=pass (policy=quarantine) header.from=johnnyrichard.com; spf=pass (aspmx1.migadu.com: domain of lists@sr.ht designates 46.23.81.152 as permitted sender) smtp.mailfrom=lists@sr.ht 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 ED4EA10A7D for ; Sun, 8 Sep 2024 01:16:27 +0200 (CEST) DKIM-Signature: a=rsa-sha256; bh=2IA1/WrxRtMJwXUwPVZpVzMtW0fPfT9oxDDgN3peyGw=; c=simple/simple; d=lists.sr.ht; h=From:To:Cc:Subject:Date:In-Reply-To:References:List-Unsubscribe:List-Subscribe:List-Archive:List-Post:List-ID; q=dns/txt; s=20240113; t=1725750987; v=1; b=qIZGDbehKVxZKfmZ5XJhu2RXLmTx4QwfV5hGX7sFE+iEYjdpMbfK+I9Ggi+xe2aDikLKluBD Om2/aq8TKO++xwUMfkGHpA3XkJF8CagIIBshu+0Jeb/A2CnkBdV45hGcn55uRflA0Kj9rTHtAq7 4sM7t+1ipCSHwmvv21Jon7VnPZqqn0uGMKl8hNSDxGksp+I6v7hiwA/kxSfLmEF2xAgSj+SxtJ9 i+EFyWjjm71ZIInunQP5qLxyCZxjqZBGsvzqdT2KnGR0hlutUcfBkOj0P4Gx76LjI5Kaid8nzw6 JqU1reUXEKwMAsxOMQ961JIeKAy+AkIP1HoNq1+GhP39A== Received: from lists.sr.ht (unknown [46.23.81.154]) by mail-a.sr.ht (Postfix) with ESMTPSA id AF7F72025E for ; Sat, 07 Sep 2024 23:16:27 +0000 (UTC) Received: from out-181.mta1.migadu.com (out-181.mta1.migadu.com [95.215.58.181]) by mail-a.sr.ht (Postfix) with ESMTPS id 3E9BF20152 for <~johnnyrichard/olang-devel@lists.sr.ht>; Sat, 07 Sep 2024 23:16:27 +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=1725750987; 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: in-reply-to:in-reply-to:references:references; bh=NvVAElWZH+A6R2CdJ0ftHkFaOTX3XKOw/c+iP3lA3sU=; b=u1w0DWRTAAvXr8OWhuCczmw+cadJcpLnPIdb+AIq/IL3DHxAyLF6290k20qRSurYa/O98F zTfQFCsONO2mIkzZMIJFFfkChuo2DzsHtfz/Ee3dHcxU5VoEaGhuQudvNgZhcgBbra9bGd haHrRlKvkAZl4W88VqeuDYUBL85XhOInTMEbwsHAB4gPjubgZwYOud6c+kwvULBQQm4fu5 Dde4RBuf9KVqof6k7ftkSgswJutULNnceGPcXh8dlRsQ7egNQLFdCVMGqlIxIUQtTcCcep aOk3XZwpnQlQdSPv04qCow4ttJ4F/ot2Y7Gt+FN2W/h+n+/wy5/eVTU8NI4adg== From: Johnny Richard To: ~johnnyrichard/olang-devel@lists.sr.ht Cc: Carlos Maniero Subject: [PATCH olang v2 2/4] parser: parse a simple if statement Date: Sun, 8 Sep 2024 03:10:56 +0200 Message-ID: <20240908011512.152684-4-johnny@johnnyrichard.com> In-Reply-To: <20240908011512.152684-2-johnny@johnnyrichard.com> References: <20240908011512.152684-2-johnny@johnnyrichard.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Sourcehut-Patchset-Status: UNKNOWN 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-Flow: FLOW_IN X-Migadu-Country: NL X-Migadu-Queue-Id: ED4EA10A7D X-Migadu-Scanner: mx12.migadu.com X-Migadu-Spam-Score: -5.79 X-Spam-Score: -5.79 X-TUID: VqR/1nzCb+28 From: Carlos Maniero There is no support for else-branch at this point. Signed-off-by: Carlos Maniero --- src/ast.c | 13 ++++ src/ast.h | 11 +++ src/parser.c | 79 +++++++++++++++++++- src/pretty_print_ast.c | 14 ++++ tests/integration/tests/0020_if_statement.ol | 15 ++++ 5 files changed, 128 insertions(+), 4 deletions(-) diff --git a/src/ast.c b/src/ast.c index aa9e6db..c1fb6f5 100644 --- a/src/ast.c +++ b/src/ast.c @@ -90,6 +90,19 @@ ast_new_node_return_stmt(arena_t *arena) return node_return_stmt; } +ast_node_t * +ast_new_node_if_stmt(arena_t *arena, ast_node_t *cond, ast_node_t *then) +{ + ast_node_t *node_if_stmt = arena_alloc(arena, sizeof(ast_node_t)); + assert(node_if_stmt); + + node_if_stmt->kind = AST_NODE_IF_STMT; + node_if_stmt->as_if_stmt.cond = cond; + node_if_stmt->as_if_stmt.then = then; + + return node_if_stmt; +} + ast_node_t * ast_new_node_block(arena_t *arena) { diff --git a/src/ast.h b/src/ast.h index 024f2cc..15260c5 100644 --- a/src/ast.h +++ b/src/ast.h @@ -32,6 +32,7 @@ typedef enum AST_NODE_FN_DEF, AST_NODE_BINARY_OP, AST_NODE_RETURN_STMT, + AST_NODE_IF_STMT, AST_NODE_LITERAL, AST_NODE_UNKNOWN } ast_node_kind_t; @@ -106,6 +107,12 @@ typedef struct ast_return_stmt ast_node_t *data; } ast_return_stmt_t; +typedef struct ast_if_stmt +{ + ast_node_t *cond; + ast_node_t *then; +} ast_if_stmt_t; + typedef struct ast_node { ast_node_kind_t kind; @@ -117,6 +124,7 @@ typedef struct ast_node ast_literal_t as_literal; ast_block_t as_block; ast_return_stmt_t as_return_stmt; + ast_if_stmt_t as_if_stmt; }; } ast_node_t; @@ -135,6 +143,9 @@ ast_new_node_literal_u32(arena_t *arena, uint32_t value); ast_node_t * ast_new_node_return_stmt(arena_t *arena); +ast_node_t * +ast_new_node_if_stmt(arena_t *arena, ast_node_t *cond, ast_node_t *then); + ast_node_t * ast_new_node_block(arena_t *arena); diff --git a/src/parser.c b/src/parser.c index 24094b3..c0ef977 100644 --- a/src/parser.c +++ b/src/parser.c @@ -36,6 +36,12 @@ parser_parse_type(parser_t *parser, type_t *type); static ast_node_t * parser_parse_block(parser_t *parser); +static ast_node_t * +parser_parse_return_stmt(parser_t *parser); + +static ast_node_t * +parser_parse_if_stmt(parser_t *parser); + ast_node_t * parser_parse_fn_definition(parser_t *parser); @@ -324,6 +330,46 @@ parser_parse_block(parser_t *parser) return NULL; } + token_t next_token; + +StartLoop: + lexer_peek_next(parser->lexer, &next_token); + ast_node_t *node = NULL; + + switch (next_token.kind) { + case TOKEN_RETURN: { + node = parser_parse_return_stmt(parser); + break; + } + case TOKEN_IF: { + node = parser_parse_if_stmt(parser); + break; + } + default: { + goto EndLoop; + } + } + + if (node == NULL) { + return NULL; + } + + list_append(node_block->as_block.nodes, node); + + goto StartLoop; +EndLoop: + + skip_line_feeds(parser->lexer); + if (!skip_expected_token(parser, TOKEN_CCURLY)) { + return NULL; + } + + return node_block; +} + +static ast_node_t * +parser_parse_return_stmt(parser_t *parser) +{ if (!skip_expected_token(parser, TOKEN_RETURN)) { return NULL; } @@ -338,17 +384,42 @@ parser_parse_block(parser_t *parser) node_return_stmt->as_return_stmt.data = expr; - list_append(node_block->as_block.nodes, node_return_stmt); if (!skip_expected_token(parser, TOKEN_LF)) { return NULL; } - skip_line_feeds(parser->lexer); - if (!skip_expected_token(parser, TOKEN_CCURLY)) { + + return node_return_stmt; +} + +static ast_node_t * +parser_parse_if_stmt(parser_t *parser) +{ + if (!skip_expected_token(parser, TOKEN_IF)) { return NULL; } - return node_block; + ast_node_t *cond = parser_parse_expr(parser); + + if (cond == NULL) { + return NULL; + } + + ast_node_t *then = parser_parse_block(parser); + + if (then == NULL) { + return NULL; + } + + ast_node_t *node_if_stmt = ast_new_node_if_stmt(parser->arena, cond, then); + assert(node_if_stmt); + + if (!skip_expected_token(parser, TOKEN_LF)) { + return NULL; + } + skip_line_feeds(parser->lexer); + + return node_if_stmt; } static bool diff --git a/src/pretty_print_ast.c b/src/pretty_print_ast.c index 6ca172f..c3debe3 100644 --- a/src/pretty_print_ast.c +++ b/src/pretty_print_ast.c @@ -161,6 +161,20 @@ ast_node_to_pretty_print_node(ast_node_t *ast, arena_t *arena) return node; } + case AST_NODE_IF_STMT: { + pretty_print_node_t *node = pretty_print_node_new(arena); + ast_if_stmt_t if_stmt = ast->as_if_stmt; + + node->name = "If_Statement"; + + pretty_print_node_t *child = ast_node_to_pretty_print_node(if_stmt.cond, arena); + list_append(node->children, child); + + child = ast_node_to_pretty_print_node(if_stmt.then, arena); + list_append(node->children, child); + + return node; + } case AST_NODE_LITERAL: { pretty_print_node_t *node = pretty_print_node_new(arena); ast_literal_t literal = ast->as_literal; diff --git a/tests/integration/tests/0020_if_statement.ol b/tests/integration/tests/0020_if_statement.ol index f2f3262..ef3cd36 100644 --- a/tests/integration/tests/0020_if_statement.ol +++ b/tests/integration/tests/0020_if_statement.ol @@ -23,3 +23,18 @@ fn main(): u32 { # TEST test_contains_tokens WITH # ./tests/0020_if_statement.ol:17:3: # END + +# TEST test_ast WITH +# Translation_Unit +# `-Function_Definition +# `-Block +# |-If_Statement +# | |-Binary_Operation (==) +# | | |-Literal +# | | `-Literal +# | `-Block +# | `-Return_Statement +# | `-Literal +# `-Return_Statement +# `-Literal +# END -- 2.46.0