Mercurial > hg > graal-compiler
comparison graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/expression/Parser.java @ 19289:62c43fcf5be2
Truffle-DSL: implement @Cached and fixes for the new guard expression syntax.
author | Christian Humer <christian.humer@gmail.com> |
---|---|
date | Tue, 03 Feb 2015 15:07:07 +0100 |
parents | 08aa0372dad4 |
children | b1530a6cce8c |
comparison
equal
deleted
inserted
replaced
19288:3a37116ef37f | 19289:62c43fcf5be2 |
---|---|
35 // @formatter:off | 35 // @formatter:off |
36 class Parser { | 36 class Parser { |
37 public static final int _EOF = 0; | 37 public static final int _EOF = 0; |
38 public static final int _identifier = 1; | 38 public static final int _identifier = 1; |
39 public static final int _numericLiteral = 2; | 39 public static final int _numericLiteral = 2; |
40 public static final int maxT = 14; | 40 public static final int maxT = 15; |
41 | 41 |
42 static final boolean _T = true; | 42 static final boolean _T = true; |
43 static final boolean _x = false; | 43 static final boolean _x = false; |
44 static final int minErrDist = 2; | 44 static final int minErrDist = 2; |
45 | 45 |
120 } | 120 } |
121 } | 121 } |
122 | 122 |
123 DSLExpression Expression() { | 123 DSLExpression Expression() { |
124 DSLExpression result; | 124 DSLExpression result; |
125 result = LogicFactor(); | |
126 return result; | |
127 } | |
128 | |
129 DSLExpression LogicFactor() { | |
130 DSLExpression result; | |
131 result = ComparisonFactor(); | |
132 if (la.kind == 3) { | |
133 Get(); | |
134 Token op = t; | |
135 DSLExpression right = ComparisonFactor(); | |
136 result = new Binary(op.val, result, right); | |
137 } | |
138 return result; | |
139 } | |
140 | |
141 DSLExpression ComparisonFactor() { | |
142 DSLExpression result; | |
125 result = NegateFactor(); | 143 result = NegateFactor(); |
144 if (StartOf(1)) { | |
145 switch (la.kind) { | |
146 case 4: { | |
147 Get(); | |
148 break; | |
149 } | |
150 case 5: { | |
151 Get(); | |
152 break; | |
153 } | |
154 case 6: { | |
155 Get(); | |
156 break; | |
157 } | |
158 case 7: { | |
159 Get(); | |
160 break; | |
161 } | |
162 case 8: { | |
163 Get(); | |
164 break; | |
165 } | |
166 case 9: { | |
167 Get(); | |
168 break; | |
169 } | |
170 } | |
171 Token op = t; | |
172 DSLExpression right = NegateFactor(); | |
173 result = new Binary(op.val, result, right); | |
174 } | |
126 return result; | 175 return result; |
127 } | 176 } |
128 | 177 |
129 DSLExpression NegateFactor() { | 178 DSLExpression NegateFactor() { |
130 DSLExpression result; | 179 DSLExpression result; |
131 boolean negated = false; | 180 boolean negated = false; |
132 if (la.kind == 3) { | 181 if (la.kind == 10) { |
133 Get(); | 182 Get(); |
134 negated = true; | 183 negated = true; |
135 } | 184 } |
136 result = LogicFactor(); | 185 result = Factor(); |
137 result = negated ? new Negate(result) : result; | 186 result = negated ? new Negate(result) : result; |
138 return result; | |
139 } | |
140 | |
141 DSLExpression LogicFactor() { | |
142 DSLExpression result; | |
143 result = Factor(); | |
144 if (StartOf(1)) { | |
145 switch (la.kind) { | |
146 case 4: { | |
147 Get(); | |
148 break; | |
149 } | |
150 case 5: { | |
151 Get(); | |
152 break; | |
153 } | |
154 case 6: { | |
155 Get(); | |
156 break; | |
157 } | |
158 case 7: { | |
159 Get(); | |
160 break; | |
161 } | |
162 case 8: { | |
163 Get(); | |
164 break; | |
165 } | |
166 case 9: { | |
167 Get(); | |
168 break; | |
169 } | |
170 } | |
171 Token op = t; | |
172 DSLExpression right = Factor(); | |
173 result = new Binary(op.val, result, right); | |
174 } | |
175 return result; | 187 return result; |
176 } | 188 } |
177 | 189 |
178 DSLExpression Factor() { | 190 DSLExpression Factor() { |
179 DSLExpression result; | 191 DSLExpression result; |
181 if (la.kind == 1) { | 193 if (la.kind == 1) { |
182 result = MemberExpression(result); | 194 result = MemberExpression(result); |
183 } else if (la.kind == 2) { | 195 } else if (la.kind == 2) { |
184 Get(); | 196 Get(); |
185 result = new IntLiteral(t.val); | 197 result = new IntLiteral(t.val); |
186 } else if (la.kind == 10) { | 198 } else if (la.kind == 11) { |
187 Get(); | 199 Get(); |
188 result = Expression(); | 200 result = Expression(); |
189 Expect(11); | 201 Expect(12); |
190 } else SynErr(15); | 202 } else SynErr(16); |
191 return result; | 203 return result; |
192 } | 204 } |
193 | 205 |
194 DSLExpression MemberExpression(DSLExpression receiver) { | 206 DSLExpression MemberExpression(DSLExpression receiver) { |
195 DSLExpression result; | 207 DSLExpression result; |
196 result = null; | 208 result = null; |
197 Expect(1); | 209 Expect(1); |
198 Variable variable = new Variable(receiver, t.val); | 210 Variable variable = new Variable(receiver, t.val); |
199 result = variable; | 211 result = variable; |
200 if (la.kind == 10) { | 212 if (la.kind == 11) { |
201 Get(); | 213 Get(); |
202 List<DSLExpression> parameters = new ArrayList<>(); | 214 List<DSLExpression> parameters = new ArrayList<>(); |
203 DSLExpression parameter; | 215 DSLExpression parameter; |
204 if (StartOf(2)) { | 216 if (StartOf(2)) { |
205 parameter = Expression(); | 217 parameter = Expression(); |
206 parameters.add(parameter); | 218 parameters.add(parameter); |
207 while (la.kind == 12) { | 219 while (la.kind == 13) { |
208 Get(); | 220 Get(); |
209 parameter = Expression(); | 221 parameter = Expression(); |
210 parameters.add(parameter); | 222 parameters.add(parameter); |
211 } | 223 } |
212 } | 224 } |
213 Expect(11); | 225 Expect(12); |
214 result = new Call(variable.getReceiver(), variable.getName(), parameters); | 226 result = new Call(variable.getReceiver(), variable.getName(), parameters); |
215 } | 227 } |
216 if (la.kind == 13) { | 228 if (la.kind == 14) { |
217 Get(); | 229 Get(); |
218 result = MemberExpression(result); | 230 result = MemberExpression(result); |
219 } | 231 } |
220 return result; | 232 return result; |
221 } | 233 } |
231 | 243 |
232 return result; | 244 return result; |
233 } | 245 } |
234 | 246 |
235 private static final boolean[][] set = { | 247 private static final boolean[][] set = { |
236 {_T,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x}, | 248 {_T,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x}, |
237 {_x,_x,_x,_x, _T,_T,_T,_T, _T,_T,_x,_x, _x,_x,_x,_x}, | 249 {_x,_x,_x,_x, _T,_T,_T,_T, _T,_T,_x,_x, _x,_x,_x,_x, _x}, |
238 {_x,_T,_T,_T, _x,_x,_x,_x, _x,_x,_T,_x, _x,_x,_x,_x} | 250 {_x,_T,_T,_x, _x,_x,_x,_x, _x,_x,_T,_T, _x,_x,_x,_x, _x} |
239 | 251 |
240 }; | 252 }; |
241 | 253 |
242 public static DSLExpression parse(InputStream input) { | 254 public static DSLExpression parse(InputStream input) { |
243 Parser parser = new Parser(input); | 255 Parser parser = new Parser(input); |
284 String s; | 296 String s; |
285 switch (n) { | 297 switch (n) { |
286 case 0: s = "EOF expected"; break; | 298 case 0: s = "EOF expected"; break; |
287 case 1: s = "identifier expected"; break; | 299 case 1: s = "identifier expected"; break; |
288 case 2: s = "numericLiteral expected"; break; | 300 case 2: s = "numericLiteral expected"; break; |
289 case 3: s = "\"!\" expected"; break; | 301 case 3: s = "\"||\" expected"; break; |
290 case 4: s = "\"<\" expected"; break; | 302 case 4: s = "\"<\" expected"; break; |
291 case 5: s = "\"<=\" expected"; break; | 303 case 5: s = "\"<=\" expected"; break; |
292 case 6: s = "\">\" expected"; break; | 304 case 6: s = "\">\" expected"; break; |
293 case 7: s = "\">=\" expected"; break; | 305 case 7: s = "\">=\" expected"; break; |
294 case 8: s = "\"==\" expected"; break; | 306 case 8: s = "\"==\" expected"; break; |
295 case 9: s = "\"!=\" expected"; break; | 307 case 9: s = "\"!=\" expected"; break; |
296 case 10: s = "\"(\" expected"; break; | 308 case 10: s = "\"!\" expected"; break; |
297 case 11: s = "\")\" expected"; break; | 309 case 11: s = "\"(\" expected"; break; |
298 case 12: s = "\",\" expected"; break; | 310 case 12: s = "\")\" expected"; break; |
299 case 13: s = "\".\" expected"; break; | 311 case 13: s = "\",\" expected"; break; |
300 case 14: s = "??? expected"; break; | 312 case 14: s = "\".\" expected"; break; |
301 case 15: s = "invalid Factor"; break; | 313 case 15: s = "??? expected"; break; |
314 case 16: s = "invalid Factor"; break; | |
302 default: | 315 default: |
303 s = "error " + n; | 316 s = "error " + n; |
304 break; | 317 break; |
305 } | 318 } |
306 printMsg(line, col, s); | 319 printMsg(line, col, s); |