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);