parse arithmetic binary expressions

This commit is contained in:
2026-08-10 23:35:10 +02:00
parent 891dc6516e
commit 8dd06afde2
10 changed files with 358 additions and 120 deletions
+23 -1
View File
@@ -12,6 +12,9 @@ import "@source/lexer"
@hide:file
TokenId :: alias lexer.TokenId
@hide:file
NO_ID_TOKEN :: alias lexer.NO_ID_TOKEN
NodeId :: distinct u32
ExtraId :: distinct u32
@@ -28,7 +31,7 @@ NodeData :: union {
Node :: struct {
kind NodeKind
main_token TokenId
main_token TokenId = NO_ID_TOKEN
data0 NodeData = NodeData{ node_id = NO_ID_NODE }
data1 NodeData = NodeData{ node_id = NO_ID_NODE }
@@ -45,7 +48,14 @@ NodeKind :: enum {
# * main_token: token literal
expr_identifier
# UNARY:
# todo: document
expr_unary
# BINARY:
# * main_token: operator
# * data0: NodeId - left-hand side
# * data1: NodeId - right-hand side
expr_binary
# DECL:
@@ -56,6 +66,13 @@ NodeKind :: enum {
# * data1: TokenId of either `::` or `:=` indicating mutability
stmt_decl
# PACKAGE:
# * data0: ExtraId
# * data1: ExtraId
#
# extra[data0..data1]: NodeId - all statement node ids in package
package
invalid
}
@@ -64,6 +81,11 @@ node_id proc(idx uint) NodeId {
return NodeId(idx)
}
maybe_node_id proc(idx uint) ?NodeId {
if (u64(idx) >= u64(NO_ID_NODE)) return null
return NodeId(idx)
}
extra_id proc(idx uint) ExtraId {
debug.assert(u64(idx) < u64(NO_ID_EXTRA))
return ExtraId(idx)