-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathParser.java
124 lines (96 loc) · 3.06 KB
/
Parser.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
119
120
121
122
123
124
import java.io.InputStream;
import java.text.ParseException;
class Parser {
private LexicalAnalyzer lex;
private void checkToken(Token expectedToken) throws ParseException {
if (lex.getCurToken() != expectedToken) {
throw new ParseException(
"Expected token: " + expectedToken.getValue() + ", actual: " + lex.getCurToken() + ".",
lex.getCurPos()
);
}
}
private void unexpectedTokenError() throws ParseException {
throw new ParseException(
"Unexpected token " + lex.getCurToken().getValue() + ".",
lex.getCurPos());
}
private Tree S() throws ParseException {
checkToken(Token.FOR);
lex.nextToken();
checkToken(Token.LEFT_BRACKET);
lex.nextToken();
Tree parameters = P();
checkToken(Token.RIGHT_BRACKET);
lex.nextToken();
checkToken(Token.END);
return new Tree("S",
new Tree("for"),
new Tree("("),
parameters,
new Tree(")"));
}
private Tree P() throws ParseException {
Tree decl = D();
checkToken(Token.SEMICOLON);
lex.nextToken();
Tree cond = C();
checkToken(Token.SEMICOLON);
lex.nextToken();
Tree move = M();
return new Tree("P",
decl,
new Tree(";"),
cond,
new Tree(";"),
move);
}
private Tree D() throws ParseException {
String type = lex.getCurTokenValue();
checkToken(Token.IDENT);
lex.nextToken();
String ident = lex.getCurTokenValue();
checkToken(Token.IDENT);
lex.nextToken();
checkToken(Token.EQUAL);
lex.nextToken();
String val = lex.getCurTokenValue();
checkToken(Token.VAL);
lex.nextToken();
return new Tree("D",
new Tree(type),
new Tree(ident),
new Tree("="),
new Tree(val));
}
private Tree C() throws ParseException {
String ident = lex.getCurTokenValue();
checkToken(Token.IDENT);
lex.nextToken();
String comp = lex.getCurTokenValue();
checkToken(Token.COMP);
lex.nextToken();
String val = lex.getCurTokenValue();
checkToken(Token.VAL);
lex.nextToken();
return new Tree("C",
new Tree(ident),
new Tree(comp),
new Tree(val));
}
private Tree M() throws ParseException {
String ident = lex.getCurTokenValue();
checkToken(Token.IDENT);
lex.nextToken();
String op = lex.getCurTokenValue();
checkToken(Token.OP);
lex.nextToken();
return new Tree("M",
new Tree(ident),
new Tree(op));
}
Tree parse(InputStream is) throws ParseException {
lex = new LexicalAnalyzer(is);
return S();
}
}