summaryrefslogtreecommitdiff
path: root/ast
diff options
context:
space:
mode:
Diffstat (limited to 'ast')
-rw-r--r--ast/ast.odin62
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
+}