move ast definitions into its own package
This commit is contained in:
+50
-1
@@ -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
|
||||||
|
}
|
||||||
|
|||||||
@@ -5,12 +5,7 @@ import "@std/debug"
|
|||||||
import "@std/enums/enummap"
|
import "@std/enums/enummap"
|
||||||
|
|
||||||
import "@source/lexer"
|
import "@source/lexer"
|
||||||
|
import "@source/ast"
|
||||||
NodeId :: distinct u32
|
|
||||||
ExtraId :: distinct u32
|
|
||||||
|
|
||||||
NO_ID_NODE :: maxval!(NodeId)
|
|
||||||
NO_ID_EXTRA :: maxval!(ExtraId)
|
|
||||||
|
|
||||||
# todo: move error stuff into a separate file
|
# 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 Token :: alias lexer.Token
|
||||||
hide TokenId :: alias lexer.TokenId
|
hide TokenId :: alias lexer.TokenId
|
||||||
hide TokenKind :: alias lexer.TokenKind
|
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 {
|
hide NO_ID_NODE :: alias ast.NO_ID_NODE
|
||||||
token_id TokenId
|
hide NO_ID_EXTRA :: alias ast.NO_ID_EXTRA
|
||||||
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
|
|
||||||
}
|
|
||||||
|
|
||||||
State :: struct {
|
State :: struct {
|
||||||
nodes std.ArrayList(Node)
|
nodes std.ArrayList(Node)
|
||||||
|
|||||||
Reference in New Issue
Block a user