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 }