summaryrefslogtreecommitdiff
path: root/ast/ast.odin
blob: 67039a35979ba3fdfee22217242dbd2511198ac0 (plain)
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
}