From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp0.migadu.com ([2001:41d0:303:e16b::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by ms5.migadu.com with LMTPS id MOqIL96C7mbLFQEAqHPOHw:P1 (envelope-from ) for ; Sat, 21 Sep 2024 10:25:02 +0200 Received: from aspmx1.migadu.com ([2001:41d0:303:e16b::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp0.migadu.com with LMTPS id MOqIL96C7mbLFQEAqHPOHw (envelope-from ) for ; Sat, 21 Sep 2024 10:25:02 +0200 X-Envelope-To: patches@johnnyrichard.com Authentication-Results: aspmx1.migadu.com; dkim=pass header.d=lists.sr.ht header.s=20240113 header.b=HvE8l6Mk; dkim=pass header.d=maniero.me header.s=hostingermail1 header.b=WF3HD80R; dmarc=pass (policy=none) header.from=maniero.me; spf=pass (aspmx1.migadu.com: domain of lists@sr.ht designates 46.23.81.152 as permitted sender) smtp.mailfrom=lists@sr.ht; arc=pass ("mailchannels.net:s=arc-2022:i=1") ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=johnnyrichard.com; s=key1; t=1726907102; 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=zVQrmPLQJNuv37O4Xf2JgeJGRMPW3qMVoZhgaOzviB4=; b=Ttunl+NEnamOgOBecgZ5Z791eofvTCSbUmPG5Ht3fepBg6JnznsCC5BpV1pLKp0usXYxHf Nb5gSyB/AWM1d0pSqOC8+YCgBSWQTwfijmGqEjs+0uOMorVCiw1eO5f3KmRikG1znjsfGr u8uBL8t+TSd0sFPcOAwFx3fcW/N5SOcHxi5AZBZXR4lYta5BgfolfKvrOgJ3Aqvw0RTYpI rTSh06ArrCXWSyKv8qW88u8NlOwqTVEVAmfXNTE2d3BT81629sl+jdTJFG53Gu1YsJ+jIp zai2qbc2LMafxnIBmBeyUJ3x4D3Lnqhdsr85IbQI61Q+TiCCAB/DQyA4c5GO8A== ARC-Seal: i=2; s=key1; d=johnnyrichard.com; t=1726907102; a=rsa-sha256; cv=pass; b=YivzR7I9MtAmVS3xI2HX+hGjNkb6GBi8/Ic56t4sJoJLWAGJu3ZQBBjZCtmHPaXjOoKDAs mE/GveHlcP7kz0t6Kn1FGJFky6BCmCDR4phoejlYsif2/PiLWzzXgBi0AMdfs/Dapxf1rQ GJ4fuEy4VrrBZBCec8NeNwrbvQHVFkQlwrFamNnOlJECYDxKGGjsuC8Az1DetOKbURrJI3 ZI9W1h3LR1pvk4WXB38WVeQQd/jd/a3JJycGb1pfkwv5CzPByXrlm+Hafrdnt1knNv40nf Ich04Vnhf9LtaSmhXci095/HVw6h+gh2Leeu+SwExHmMKbVbfcwjdgE9hE355g== ARC-Authentication-Results: i=2; aspmx1.migadu.com; dkim=pass header.d=lists.sr.ht header.s=20240113 header.b=HvE8l6Mk; dkim=pass header.d=maniero.me header.s=hostingermail1 header.b=WF3HD80R; dmarc=pass (policy=none) header.from=maniero.me; spf=pass (aspmx1.migadu.com: domain of lists@sr.ht designates 46.23.81.152 as permitted sender) smtp.mailfrom=lists@sr.ht; arc=pass ("mailchannels.net:s=arc-2022:i=1") 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 8551113359 for ; Sat, 21 Sep 2024 10:25:02 +0200 (CEST) DKIM-Signature: a=rsa-sha256; bh=sPxEuso9aNLFKLRlIkmbwYfSyMVfxDiVNCZNCtBsHNE=; c=simple/simple; d=lists.sr.ht; h=From:To:Cc:Subject:In-Reply-To:References:Date:List-Unsubscribe:List-Subscribe:List-Archive:List-Post:List-ID; q=dns/txt; s=20240113; t=1726907101; v=1; b=HvE8l6Mkv/tSS5VTJxoEE0NTKie3Q9Cwa88CEZ43Wcyk5TgHujXcrDMf2CKMjv3EB+yIb9gx tV3n8+3lC+i8UCfTwplLtk8TXbMDr0wDO/DcwKEeev35wu5KsY68Ci7TPbhVLLE1OM2AatkHzWU K4KDEmjQahO1Gh9NtkuSd9n0YaW1i71vpR6DRvrbMu2cz4xviWctHzeruuIvXA+DHZYosE11H1u b1X3wLW7xtA7A9+ROagPDQrGltvwUQuPxiVnZAmWXFK65DvbqVTfWqjZGI/030hfxtphHY6uJdw NqSi9jZDMqWQrFEc+ktwf8j49Vz4Ms/CGWFj3li4sl9hw== Received: from lists.sr.ht (unknown [46.23.81.154]) by mail-a.sr.ht (Postfix) with ESMTPSA id 3D1EC2027D for ; Sat, 21 Sep 2024 08:25:01 +0000 (UTC) Received: from cyan.elm.relay.mailchannels.net (cyan.elm.relay.mailchannels.net [23.83.212.47]) by mail-a.sr.ht (Postfix) with ESMTPS id 3FA6420246 for <~johnnyrichard/olang-devel@lists.sr.ht>; Sat, 21 Sep 2024 08:25:00 +0000 (UTC) X-Sender-Id: hostingeremail|x-authuser|carlos@maniero.me Received: from relay.mailchannels.net (localhost [127.0.0.1]) by relay.mailchannels.net (Postfix) with ESMTP id D43708A5C6C for <~johnnyrichard/olang-devel@lists.sr.ht>; Sat, 21 Sep 2024 08:24:58 +0000 (UTC) Received: from nl-srv-smtpout1.hostinger.io (trex-4.trex.outbound.svc.cluster.local [100.99.101.147]) (Authenticated sender: hostingeremail) by relay.mailchannels.net (Postfix) with ESMTPA id 473868A5C44 for <~johnnyrichard/olang-devel@lists.sr.ht>; Sat, 21 Sep 2024 08:24:58 +0000 (UTC) ARC-Seal: i=1; s=arc-2022; d=mailchannels.net; t=1726907098; a=rsa-sha256; cv=none; b=hRkic9CmQ9kcJAtbUwBbgLbtnMOzhnLM0TkXkSpuwRQtPiSR2d0jfCQukrLHeFgoGBdD2v T1nweR7KfI1v94euf2XFvo2afq94rzdW+FCd1UJW1nW1NpeSKInFqPHVxv4ffflPDTgBoY ZCUUgibfPLopm9E73z7lBvf8jDvNYhp8h1TnfqEY4p8dQKOm35OFz4xPveJZy5A4FDeyhc S7fwCd7a86Z4v97XTF2yhOLTetiyG/PiBb/GDMIL5qWswRWfnvQUYDkhQgueLLTNxw8qHX vl7CzNrGV5yOhE0bciYla20l6nPSWpVym2ueIdxq7VwBuUGwWbPeuOmwOH1Xxg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=mailchannels.net; s=arc-2022; t=1726907098; 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:dkim-signature; bh=zVQrmPLQJNuv37O4Xf2JgeJGRMPW3qMVoZhgaOzviB4=; b=HTY8ACQPCmsWc/2D+7jkbr7ZyFfj0ilmLTWf4kdb1OicBzmW4ke2+3MYQL3prLyNn5hdA4 uxIMCr6x4GbbTZNI2qrNyoxD5sG8btyDeDucdSbfBPJxOnYPyc0cNOUjW+ZYhPJMbnhtvv MMiRIBHLYD4qcwoyUqwGxIzk3O00mLR9IdbepR47hOSg9p6xLmKq52XHV6eIqurB1rMYW0 TgDfzKy3q2fUWWyq1eN0vDGVYQ9NvgpDWQBHp0tUo/COB9o1/QP1L2JTvMFbToXrmK+9zf AS3uJsYy1SwvmUm3JB0/G9UNKFQhG3+SCQ5nnfSOetRmrwZHxPqVQ8wtwUXfOw== ARC-Authentication-Results: i=1; rspamd-5b46bcd97f-2pssd; auth=pass smtp.auth=hostingeremail smtp.mailfrom=carlos@maniero.me X-Sender-Id: hostingeremail|x-authuser|carlos@maniero.me X-MC-Relay: Neutral X-MailChannels-SenderId: hostingeremail|x-authuser|carlos@maniero.me X-MailChannels-Auth-Id: hostingeremail X-Share-Rock: 4a24325d0a5ebcc8_1726907098776_1784750007 X-MC-Loop-Signature: 1726907098776:978048296 X-MC-Ingress-Time: 1726907098776 Received: from nl-srv-smtpout1.hostinger.io (nl-srv-smtpout1.hostinger.io [145.14.150.87]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384) by 100.99.101.147 (trex/7.0.2); Sat, 21 Sep 2024 08:24:58 +0000 From: Carlos Maniero DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=maniero.me; s=hostingermail1; t=1726907096; 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=zVQrmPLQJNuv37O4Xf2JgeJGRMPW3qMVoZhgaOzviB4=; b=WF3HD80RikRjUIB9E+xKflw1I9mGncW2tlCD99O11/7d2p2ZOpnzVLZGzRJc1sqNpNZs7r 23gDL6kcF9iJ6BfReL+45wC7/+kbRA37xBLaqW94f044LtAMwxtqor1wV/w26TvTd0R5Bt 2OITOy5FroZpzRD+AL/dnYwZLuak5vl/nj8SGMmJxfGhHfAdI7J5fgNorjyxYmy1rl4nn6 //K3jApxwRd+uG1cWgsj6oLmIlM8nFpv2TF4/9ZXeqxgEmYBLHM4d592/R+qwnj7St+Z4i RvnSQbaogfHSrISOHGIHY8NjFN1JbbFfNyIX5lRAhe7yuU8iFuwDcwax7cM05Q== To: ~johnnyrichard/olang-devel@lists.sr.ht Cc: Carlos Maniero Subject: [PATCH olang 2/5] checker: scope: populate symbol's type Message-Id: <20240921082437.396691-3-carlos@maniero.me> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240921082437.396691-1-carlos@maniero.me> References: <20240921082437.396691-1-carlos@maniero.me> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Date: Sat, 21 Sep 2024 08:24:56 +0000 (UTC) X-CM-Analysis: v=2.4 cv=c5X5Qg9l c=1 sm=1 tr=0 ts=66ee82d8 a=WwxFCuf3mf1fs3oSi6/dng==:117 a=WwxFCuf3mf1fs3oSi6/dng==:17 a=MKtGQD3n3ToA:10 a=1oJP67jkp3AA:10 a=mDV3o1hIAAAA:8 a=8ie5wO0jOj7HX9jAkbQA:9 a=BXDaF_L80NY05PYiAFlV:22 X-CM-Envelope: MS4xfELr9Ow4p+BYu7gYjJxKPAsEN5tulYjTxj3qN7u+9StnabJPkqaeRW2lAwyTUySwF50vAZqW9cXaNZxtPWI9X/iX53sjjEPHCL8hdssY/57/ETfeWkCq BP55Agy3+ulAubnTQDA0/iXsjuWwafcSruGXWtCnahdXlGTXzVuTfKPYZzJBnR6vvPqGDyR4dSP4E/cNzyIsJ6CwnNXmZKIn8CA1TaOMD3arKaN3mZO95zFj X-AuthUser: carlos@maniero.me 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-Country: NL X-Migadu-Flow: FLOW_IN X-Migadu-Spam-Score: -0.16 X-Spam-Score: -0.16 X-Migadu-Scanner: mx13.migadu.com X-Migadu-Queue-Id: 8551113359 X-TUID: do+MoamKb46e Persisting the symbol type will be very convenient for codegen once this information can be used to determine how many bytes that symbol requires. A new type header file was added since ast and scope depends on type but scope depends on ast. Signed-off-by: Carlos Maniero --- src/ast.h | 6 +--- src/checker.c | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++- src/scope.c | 3 +- src/scope.h | 4 ++- src/type.h | 39 ++++++++++++++++++++++++ 5 files changed, 127 insertions(+), 8 deletions(-) create mode 100644 src/type.h diff --git a/src/ast.h b/src/ast.h index 72fcc3e..2dc120d 100644 --- a/src/ast.h +++ b/src/ast.h @@ -23,6 +23,7 @@ #include "list.h" #include "scope.h" #include "string_view.h" +#include "type.h" typedef struct ast_node ast_node_t; @@ -40,11 +41,6 @@ typedef enum AST_NODE_UNKNOWN } ast_node_kind_t; -typedef struct type -{ - string_view_t id; -} type_t; - typedef struct ast_block { list_t *nodes; diff --git a/src/checker.c b/src/checker.c index 3b713f7..f5068e0 100644 --- a/src/checker.c +++ b/src/checker.c @@ -23,6 +23,9 @@ static void populate_scope(checker_t *checker, scope_t *scope, ast_node_t *ast); +static void +populate_types(checker_t *checker, ast_node_t *ast); + checker_t * checker_new(arena_t *arena) { @@ -44,6 +47,7 @@ checker_check(checker_t *checker, ast_node_t *ast) assert(ast); scope_t *scope = scope_new(checker->arena); + populate_types(checker, ast); populate_scope(checker, scope, ast); // TODO: traverse the ast tree to verify semantics @@ -107,7 +111,8 @@ populate_scope(checker_t *checker, scope_t *scope, ast_node_t *ast) case AST_NODE_VAR_DEF: { string_view_t id = ast->as_var_def.identifier; - symbol_t *symbol = symbol_new(checker->arena, id); + type_t type = ast->as_var_def.type; + symbol_t *symbol = symbol_new(checker->arena, id, type); scope_insert(scope, symbol); ast->as_var_def.scope = scope; @@ -124,3 +129,79 @@ populate_scope(checker_t *checker, scope_t *scope, ast_node_t *ast) return; } } + +static void +evaluate_type(type_t *type) +{ + if (string_view_eq_to_cstr(type->id, "u32")) { + type->kind = TYPE_PRIMITIVE; + type->as_primitive = TYPE_U32; + return; + } + + type->kind = TYPE_USER_DEFINED; +} + +static void +populate_types(checker_t *checker, ast_node_t *ast) +{ + switch (ast->kind) { + case AST_NODE_PROGRAM: { + populate_types(checker, ast->as_program.fn); + return; + } + + case AST_NODE_FN_DEF: { + evaluate_type(&ast->as_fn_def.return_type); + populate_types(checker, ast->as_fn_def.block); + return; + } + + case AST_NODE_IF_STMT: { + populate_types(checker, ast->as_if_stmt.cond); + populate_types(checker, ast->as_if_stmt.then); + + if (ast->as_if_stmt._else) { + populate_types(checker, ast->as_if_stmt._else); + } + + return; + } + + case AST_NODE_BINARY_OP: { + ast_binary_op_t bin_op = ast->as_bin_op; + + populate_types(checker, bin_op.lhs); + populate_types(checker, bin_op.rhs); + return; + } + + case AST_NODE_RETURN_STMT: { + populate_types(checker, ast->as_return_stmt.data); + return; + } + + case AST_NODE_BLOCK: { + ast_block_t block = ast->as_block; + + list_item_t *item = list_head(block.nodes); + + while (item != NULL) { + populate_types(checker, (ast_node_t *)item->value); + item = list_next(item); + } + + return; + } + + case AST_NODE_VAR_DEF: { + evaluate_type(&ast->as_var_def.type); + return; + } + + case AST_NODE_REF: + case AST_NODE_LITERAL: + case AST_NODE_UNKNOWN: + return; + } +} diff --git a/src/scope.c b/src/scope.c index b23e865..81f610a 100644 --- a/src/scope.c +++ b/src/scope.c @@ -49,7 +49,7 @@ scope_new(arena_t *arena) } symbol_t * -symbol_new(arena_t *arena, string_view_t id) +symbol_new(arena_t *arena, string_view_t id, type_t type) { assert(arena); symbol_t *symbol = (symbol_t *)arena_alloc(arena, sizeof(symbol_t)); @@ -58,6 +58,7 @@ symbol_new(arena_t *arena, string_view_t id) exit(EXIT_FAILURE); } symbol->id = id; + symbol->type = type; return symbol; } diff --git a/src/scope.h b/src/scope.h index 7f7eaae..92a5a4f 100644 --- a/src/scope.h +++ b/src/scope.h @@ -21,10 +21,12 @@ #include "list.h" #include "map.h" #include "string_view.h" +#include "type.h" typedef struct symbol { string_view_t id; + type_t type; } symbol_t; typedef struct scope @@ -39,7 +41,7 @@ scope_t * scope_new(arena_t *arena); symbol_t * -symbol_new(arena_t *arena, string_view_t id); +symbol_new(arena_t *arena, string_view_t id, type_t type); symbol_t * scope_lookup(scope_t *scope, string_view_t id); diff --git a/src/type.h b/src/type.h new file mode 100644 index 0000000..855cd83 --- /dev/null +++ b/src/type.h @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2024 olang maintainers + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#ifndef TYPE_H +#define TYPE_H +typedef enum +{ + TYPE_PRIMITIVE, + TYPE_USER_DEFINED +} type_kind_t; + +typedef enum +{ + TYPE_U32 +} type_primitive_t; + +typedef struct type +{ + string_view_t id; + type_kind_t kind; + union + { + type_primitive_t as_primitive; + }; +} type_t; +#endif -- 2.34.1