1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
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
}
|