From e5ab0622364911a8a7364689d3b59e856a6c09e9 Mon Sep 17 00:00:00 2001 From: Ibrahim Muftee Date: Mon, 20 Jul 2026 18:44:45 -0500 Subject: chapter 2.6 --- ast/ast.odin | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 ast/ast.odin (limited to 'ast/ast.odin') 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 +} -- cgit v1.2.3