Mercurial > hg > truffle
comparison graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/parser/Parser.java @ 18411:dc2e000bed40
SL: add basic support for creating objects and accessing properties
author | Andreas Woess <andreas.woess@jku.at> |
---|---|
date | Tue, 18 Nov 2014 23:02:58 +0100 |
parents | 7661cc464239 |
children | cfb85e1f4ca5 |
comparison
equal
deleted
inserted
replaced
18410:f444ef4684ec | 18411:dc2e000bed40 |
---|---|
37 public class Parser { | 37 public class Parser { |
38 public static final int _EOF = 0; | 38 public static final int _EOF = 0; |
39 public static final int _identifier = 1; | 39 public static final int _identifier = 1; |
40 public static final int _stringLiteral = 2; | 40 public static final int _stringLiteral = 2; |
41 public static final int _numericLiteral = 3; | 41 public static final int _numericLiteral = 3; |
42 public static final int maxT = 30; | 42 public static final int maxT = 31; |
43 | 43 |
44 static final boolean T = true; | 44 static final boolean T = true; |
45 static final boolean x = false; | 45 static final boolean x = false; |
46 static final int minErrDist = 2; | 46 static final int minErrDist = 2; |
47 | 47 |
198 case 1: case 2: case 3: case 5: { | 198 case 1: case 2: case 3: case 5: { |
199 result = Expression(); | 199 result = Expression(); |
200 Expect(11); | 200 Expect(11); |
201 break; | 201 break; |
202 } | 202 } |
203 default: SynErr(31); break; | 203 default: SynErr(32); break; |
204 } | 204 } |
205 return result; | 205 return result; |
206 } | 206 } |
207 | 207 |
208 SLStatementNode WhileStatement() { | 208 SLStatementNode WhileStatement() { |
343 SLExpressionNode Factor() { | 343 SLExpressionNode Factor() { |
344 SLExpressionNode result; | 344 SLExpressionNode result; |
345 result = null; | 345 result = null; |
346 if (la.kind == 1) { | 346 if (la.kind == 1) { |
347 Get(); | 347 Get(); |
348 Token nameToken = t; | 348 result = factory.createRead(t); |
349 if (la.kind == 5) { | 349 if (la.kind == 5 || la.kind == 29 || la.kind == 30) { |
350 Get(); | 350 result = MemberExpression(result, null, t); |
351 List<SLExpressionNode> parameters = new ArrayList<>(); | 351 } |
352 SLExpressionNode parameter; | |
353 if (StartOf(2)) { | |
354 parameter = Expression(); | |
355 parameters.add(parameter); | |
356 while (la.kind == 6) { | |
357 Get(); | |
358 parameter = Expression(); | |
359 parameters.add(parameter); | |
360 } | |
361 } | |
362 Expect(7); | |
363 Token finalToken = t; | |
364 result = factory.createCall(nameToken, parameters, finalToken); | |
365 } else if (la.kind == 29) { | |
366 Get(); | |
367 SLExpressionNode value = Expression(); | |
368 result = factory.createAssignment(nameToken, value); | |
369 } else if (StartOf(4)) { | |
370 result = factory.createRead(nameToken); | |
371 } else SynErr(32); | |
372 } else if (la.kind == 2) { | 352 } else if (la.kind == 2) { |
373 Get(); | 353 Get(); |
374 result = factory.createStringLiteral(t); | 354 result = factory.createStringLiteral(t); |
375 } else if (la.kind == 3) { | 355 } else if (la.kind == 3) { |
376 Get(); | 356 Get(); |
385 result = factory.createParenExpression(expr, start, length); | 365 result = factory.createParenExpression(expr, start, length); |
386 } else SynErr(33); | 366 } else SynErr(33); |
387 return result; | 367 return result; |
388 } | 368 } |
389 | 369 |
370 SLExpressionNode MemberExpression(SLExpressionNode receiver, SLExpressionNode assignmentReceiver, Token assignmentName) { | |
371 SLExpressionNode result; | |
372 result = null; | |
373 Token nestedAssignmentName = null; | |
374 if (la.kind == 5) { | |
375 Get(); | |
376 List<SLExpressionNode> parameters = new ArrayList<>(); | |
377 SLExpressionNode parameter; | |
378 if (StartOf(2)) { | |
379 parameter = Expression(); | |
380 parameters.add(parameter); | |
381 while (la.kind == 6) { | |
382 Get(); | |
383 parameter = Expression(); | |
384 parameters.add(parameter); | |
385 } | |
386 } | |
387 Expect(7); | |
388 Token finalToken = t; | |
389 result = factory.createCall(receiver, parameters, finalToken); | |
390 } else if (la.kind == 29) { | |
391 Get(); | |
392 SLExpressionNode value = Expression(); | |
393 if (assignmentName == null) { | |
394 SemErr("invalid assignment target"); | |
395 } else if (assignmentReceiver == null) { | |
396 result = factory.createAssignment(assignmentName, value); | |
397 } else { | |
398 result = factory.createWriteProperty(assignmentReceiver, assignmentName, value); | |
399 } | |
400 } else if (la.kind == 30) { | |
401 Get(); | |
402 Expect(1); | |
403 result = factory.createReadProperty(receiver, t); | |
404 nestedAssignmentName = t; | |
405 } else SynErr(34); | |
406 if (la.kind == 5 || la.kind == 29 || la.kind == 30) { | |
407 result = MemberExpression(result, receiver, nestedAssignmentName); | |
408 } | |
409 return result; | |
410 } | |
411 | |
390 | 412 |
391 | 413 |
392 public void Parse() { | 414 public void Parse() { |
393 la = new Token(); | 415 la = new Token(); |
394 la.val = ""; | 416 la.val = ""; |
397 Expect(0); | 419 Expect(0); |
398 | 420 |
399 } | 421 } |
400 | 422 |
401 private static final boolean[][] set = { | 423 private static final boolean[][] set = { |
402 {T,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x}, | 424 {T,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x}, |
403 {x,T,T,T, x,T,x,x, x,x,T,x, T,T,T,x, T,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x}, | 425 {x,T,T,T, x,T,x,x, x,x,T,x, T,T,T,x, T,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x}, |
404 {x,T,T,T, x,T,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x}, | 426 {x,T,T,T, x,T,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x}, |
405 {x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,T, T,T,T,T, T,x,x,x, x,x,x,x}, | 427 {x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,T, T,T,T,T, T,x,x,x, x,x,x,x, x} |
406 {x,x,x,x, x,x,T,T, x,x,x,T, x,x,x,x, x,T,T,T, T,T,T,T, T,T,T,T, T,x,x,x} | |
407 | 428 |
408 }; | 429 }; |
409 | 430 |
410 public static void parseSL(SLContext context, Source source) { | 431 public static void parseSL(SLContext context, Source source) { |
411 Parser parser = new Parser(context, source); | 432 Parser parser = new Parser(context, source); |
474 case 25: s = "\"+\" expected"; break; | 495 case 25: s = "\"+\" expected"; break; |
475 case 26: s = "\"-\" expected"; break; | 496 case 26: s = "\"-\" expected"; break; |
476 case 27: s = "\"*\" expected"; break; | 497 case 27: s = "\"*\" expected"; break; |
477 case 28: s = "\"/\" expected"; break; | 498 case 28: s = "\"/\" expected"; break; |
478 case 29: s = "\"=\" expected"; break; | 499 case 29: s = "\"=\" expected"; break; |
479 case 30: s = "??? expected"; break; | 500 case 30: s = "\".\" expected"; break; |
480 case 31: s = "invalid Statement"; break; | 501 case 31: s = "??? expected"; break; |
481 case 32: s = "invalid Factor"; break; | 502 case 32: s = "invalid Statement"; break; |
482 case 33: s = "invalid Factor"; break; | 503 case 33: s = "invalid Factor"; break; |
504 case 34: s = "invalid MemberExpression"; break; | |
483 default: | 505 default: |
484 s = "error " + n; | 506 s = "error " + n; |
485 break; | 507 break; |
486 } | 508 } |
487 printMsg(line, col, s); | 509 printMsg(line, col, s); |