diff options
| author | Ibrahim Muftee <ibrahim@muftee.net> | 2026-07-20 18:44:45 -0500 |
|---|---|---|
| committer | Ibrahim Muftee <ibrahim@muftee.net> | 2026-07-23 20:38:35 -0500 |
| commit | e5ab0622364911a8a7364689d3b59e856a6c09e9 (patch) | |
| tree | aac69f2f2da06cadf786c12494ed9d27eef0136b /ast | |
| parent | a84bf3b30c9cc3b2b5eeea542855a56915e26099 (diff) | |
chapter 2.6
Diffstat (limited to 'ast')
| -rw-r--r-- | ast/ast.odin | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/ast/ast.odin b/ast/ast.odin new file mode 100644 index 0000000..67039a3 --- /dev/null +++ b/ast/ast.odin @@ -0,0 +1,62 @@ +package ast + +import "../token" + +Node :: union { + Program, + Statement, + Expression, +} + +Program :: struct { + statements: []Statement, +} + +Statement :: union { + Let_Statement, + Return_Statement, +} + +Let_Statement :: struct { + token: token.Token, + name: Identifier, + value: Expression, +} + +Return_Statement :: struct { + token: token.Token, + return_value: Expression, +} + +Expression :: union { + Identifier, +} + +Identifier :: struct { + token: token.Token, + value: string, +} + + +token_literal :: proc(node: Node) -> (literal: string) { + switch n in node { + case Program: + if len(n.statements) > 0 { + stmt: Node = n.statements[0] + literal = token_literal(stmt) + } + case Statement: + switch s in n { + case Let_Statement: + literal = token.literal(s.token) + case Return_Statement: + literal = token.literal(s.token) + } + case Expression: + switch e in n { + case Identifier: + literal = token.literal(e.token) + } + } + return literal +} |
