-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathParseNode.java
118 lines (108 loc) · 2.68 KB
/
ParseNode.java
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
package net.zerobone.knife.parser;
import net.zerobone.knife.ast.TranslationUnitNode;
import net.zerobone.knife.ast.entities.ProductionStatementBody;
import net.zerobone.knife.ast.statements.ProductionStatementNode;
import net.zerobone.knife.ast.statements.StatementNode;
import net.zerobone.knife.ast.statements.TypeStatementNode;
import net.zerobone.knife.lexer.tokens.CodeToken;
import net.zerobone.knife.lexer.tokens.IdToken;
import net.zerobone.knife.utils.StringUtils;
import java.lang.Object;
import java.util.ArrayList;
final class ParseNode {
int actionId = 0;
final int symbolId;
Object payload = null;
ArrayList<Object> children;
ParseNode(int symbolId) {
this.symbolId = symbolId;
children = this.symbolId < 0 ? new ArrayList<>() : null;
}
void reduce() {
Object v;
switch (actionId - 1) {
case 0:
{
v = new TranslationUnitNode();
}
break;
case 1:
{
StatementNode s = (StatementNode)((ParseNode)children.get(1)).payload;
TranslationUnitNode t = (TranslationUnitNode)((ParseNode)children.get(0)).payload;
t.addStatement(s); v = t;
}
break;
case 2:
{
IdToken nonTerminal = (IdToken)((ParseNode)children.get(2)).payload;
ProductionStatementBody body = (ProductionStatementBody)((ParseNode)children.get(0)).payload;
v = new ProductionStatementNode(nonTerminal.id, body.getProduction(), body.getCode());
}
break;
case 3:
{
IdToken symbol = (IdToken)((ParseNode)children.get(1)).payload;
IdToken type = (IdToken)((ParseNode)children.get(0)).payload;
v = new TypeStatementNode(symbol.id, type.id);
}
break;
case 4:
{
CodeToken code = (CodeToken)((ParseNode)children.get(0)).payload;
v = new ProductionStatementBody(code == null ? null : code.code);
}
break;
case 5:
{
IdToken s = (IdToken)((ParseNode)children.get(2)).payload;
IdToken arg = (IdToken)((ParseNode)children.get(1)).payload;
ProductionStatementBody b = (ProductionStatementBody)((ParseNode)children.get(0)).payload;
if (StringUtils.isTerminal(s.id)) {
if (arg == null) {
b.addTerminal(s.id);
}
else {
b.addTerminal(s.id, arg.id);
}
}
else {
if (arg == null) {
b.addNonTerminal(s.id);
}
else {
b.addNonTerminal(s.id, arg.id);
}
}
v = b;
}
break;
case 6:
{
v = null;
}
break;
case 7:
{
Object c = (Object)((ParseNode)children.get(0)).payload;
v = c;
}
break;
case 8:
{
v = null;
}
break;
case 9:
{
IdToken arg = (IdToken)((ParseNode)children.get(1)).payload;
v = arg;
}
break;
default:
throw new IllegalStateException();
}
payload = v;
children = null;
}
}