diff --git a/source/ast/ast.hon b/source/ast/ast.hon index e1392b0..0ed083e 100644 --- a/source/ast/ast.hon +++ b/source/ast/ast.hon @@ -1 +1,50 @@ -# todo: move ast stuff from parser module to here +import "@source/lexer" + +hide TokenId :: alias lexer.TokenId + +NodeId :: distinct u32 +ExtraId :: distinct u32 + +NO_ID_NODE :: maxval!(NodeId) +NO_ID_EXTRA :: maxval!(ExtraId) + +# unsafe access on its own; NodeKind serves as a the tag +# that determines the variant. +NodeData :: union { + token_id TokenId + node_id NodeId + extra_id ExtraId +} + +Node :: struct { + kind NodeKind + main_token TokenId + + data0 NodeData = NodeData{ node_id = NO_ID_NODE } + data1 NodeData = NodeData{ node_id = NO_ID_NODE } +} + +NodeKind :: enum { + # LITERALS: + # * main_token: token literal + literal_int + literal_float + literal_string + + # IDENTIFIER EXPR: + # * main_token: token literal + expr_identifier + + expr_unary + expr_binary + + # DECL: + # * main_token: symbol name (identifier) + # * data0: ExtraId + # + extra[data0]: NodeId - type identifier node + # + extra[data0 + 1]: NodeId - initializer expression + # * data1: TokenId of either `::` or `=` indicating mutability + stmt_decl + + invalid +} diff --git a/source/parser/parser.hon b/source/parser/parser.hon index 602c580..7ad7ae8 100644 --- a/source/parser/parser.hon +++ b/source/parser/parser.hon @@ -5,12 +5,7 @@ import "@std/debug" import "@std/enums/enummap" import "@source/lexer" - -NodeId :: distinct u32 -ExtraId :: distinct u32 - -NO_ID_NODE :: maxval!(NodeId) -NO_ID_EXTRA :: maxval!(ExtraId) +import "@source/ast" # todo: move error stuff into a separate file @@ -40,45 +35,13 @@ error_msg_map std.EnumMap(ErrorCode, ErrorDetails) :: enummap.init({ hide Token :: alias lexer.Token hide TokenId :: alias lexer.TokenId hide TokenKind :: alias lexer.TokenKind +hide Node :: alias ast.Node +hide NodeId :: alias ast.NodeId +hide ExtraId :: alias ast.ExtraId +hide NodeData :: alias ast.NodeData -NodeData :: union { - token_id TokenId - node_id NodeId - extra_id ExtraId -} - -Node :: struct { - kind NodeKind - main_token TokenId - - data0 NodeData = NodeData{ node_id = NO_ID_NODE } - data1 NodeData = NodeData{ node_id = NO_ID_NODE } -} - -NodeKind :: enum { - # LITERALS: - # * main_token: token literal - literal_int - literal_float - literal_string - - # IDENTIFIER EXPR: - # * main_token: token literal - expr_identifier - - expr_unary - expr_binary - - # DECL: - # * main_token: symbol name (identifier) - # * data0: ExtraId - # + extra[data0]: NodeId - type identifier node - # + extra[data0 + 1]: NodeId - initializer expression - # * data1: TokenId of either `::` or `=` indicating mutability - stmt_decl - - invalid -} +hide NO_ID_NODE :: alias ast.NO_ID_NODE +hide NO_ID_EXTRA :: alias ast.NO_ID_EXTRA State :: struct { nodes std.ArrayList(Node)