Mercurial > hg > truffle
comparison graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/parser/Parser.java @ 18962:cfb85e1f4ca5
Prevent polluting SLFunctionRegistry (via SLNodeFactory.createRead()) with LHS names of assignment
author | Paul Woegerer <paul.woegerer@oracle.com> |
---|---|
date | Tue, 27 Jan 2015 14:24:59 +0100 |
parents | dc2e000bed40 |
children |
comparison
equal
deleted
inserted
replaced
18961:afa70d3e8159 | 18962:cfb85e1f4ca5 |
---|---|
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 = 31; | 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 |
48 public Token t; // last recognized token | 48 public Token t; // last recognized token |
49 public Token la; // lookahead token | 49 public Token la; // lookahead token |
50 int errDist = minErrDist; | 50 int errDist = minErrDist; |
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 result = factory.createRead(t); | |
349 if (la.kind == 5 || la.kind == 29 || la.kind == 30) { | 348 if (la.kind == 5 || la.kind == 29 || la.kind == 30) { |
350 result = MemberExpression(result, null, t); | 349 result = MemberExpression(null, null, t); |
351 } | 350 } else if (StartOf(4)) { |
351 result = factory.createRead(t); | |
352 } else SynErr(33); | |
352 } else if (la.kind == 2) { | 353 } else if (la.kind == 2) { |
353 Get(); | 354 Get(); |
354 result = factory.createStringLiteral(t); | 355 result = factory.createStringLiteral(t); |
355 } else if (la.kind == 3) { | 356 } else if (la.kind == 3) { |
356 Get(); | 357 Get(); |
361 result = Expression(); | 362 result = Expression(); |
362 SLExpressionNode expr = result; | 363 SLExpressionNode expr = result; |
363 Expect(7); | 364 Expect(7); |
364 int length = (t.charPos + t.val.length()) - start; | 365 int length = (t.charPos + t.val.length()) - start; |
365 result = factory.createParenExpression(expr, start, length); | 366 result = factory.createParenExpression(expr, start, length); |
366 } else SynErr(33); | 367 } else SynErr(34); |
367 return result; | 368 return result; |
368 } | 369 } |
369 | 370 |
370 SLExpressionNode MemberExpression(SLExpressionNode receiver, SLExpressionNode assignmentReceiver, Token assignmentName) { | 371 SLExpressionNode MemberExpression(SLExpressionNode r, SLExpressionNode assignmentReceiver, Token assignmentName) { |
371 SLExpressionNode result; | 372 SLExpressionNode result; |
372 result = null; | 373 result = null; |
374 SLExpressionNode receiver = r; | |
373 Token nestedAssignmentName = null; | 375 Token nestedAssignmentName = null; |
374 if (la.kind == 5) { | 376 if (la.kind == 5) { |
375 Get(); | 377 Get(); |
376 List<SLExpressionNode> parameters = new ArrayList<>(); | 378 List<SLExpressionNode> parameters = new ArrayList<>(); |
377 SLExpressionNode parameter; | 379 SLExpressionNode parameter; |
380 if (receiver == null) { | |
381 receiver = factory.createRead(assignmentName); | |
382 } | |
378 if (StartOf(2)) { | 383 if (StartOf(2)) { |
379 parameter = Expression(); | 384 parameter = Expression(); |
380 parameters.add(parameter); | 385 parameters.add(parameter); |
381 while (la.kind == 6) { | 386 while (la.kind == 6) { |
382 Get(); | 387 Get(); |
397 } else { | 402 } else { |
398 result = factory.createWriteProperty(assignmentReceiver, assignmentName, value); | 403 result = factory.createWriteProperty(assignmentReceiver, assignmentName, value); |
399 } | 404 } |
400 } else if (la.kind == 30) { | 405 } else if (la.kind == 30) { |
401 Get(); | 406 Get(); |
407 if (receiver == null) { | |
408 receiver = factory.createRead(assignmentName); | |
409 } | |
402 Expect(1); | 410 Expect(1); |
403 result = factory.createReadProperty(receiver, t); | 411 result = factory.createReadProperty(receiver, t); |
404 nestedAssignmentName = t; | 412 nestedAssignmentName = t; |
405 } else SynErr(34); | 413 } else SynErr(35); |
406 if (la.kind == 5 || la.kind == 29 || la.kind == 30) { | 414 if (la.kind == 5 || la.kind == 29 || la.kind == 30) { |
407 result = MemberExpression(result, receiver, nestedAssignmentName); | 415 result = MemberExpression(result, receiver, nestedAssignmentName); |
408 } | 416 } |
409 return result; | 417 return result; |
410 } | 418 } |
419 Expect(0); | 427 Expect(0); |
420 | 428 |
421 } | 429 } |
422 | 430 |
423 private static final boolean[][] set = { | 431 private static final boolean[][] set = { |
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}, | 432 {_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}, |
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}, | 433 {_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}, |
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}, | 434 {_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}, |
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} | 435 {_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}, |
436 {_x,_x,_x,_x, _x,_T,_T,_T, _x,_x,_x,_T, _x,_x,_x,_x, _x,_T,_T,_T, _T,_T,_T,_T, _T,_T,_T,_T, _T,_T,_T,_x, _x} | |
428 | 437 |
429 }; | 438 }; |
430 | 439 |
431 public static void parseSL(SLContext context, Source source) { | 440 public static void parseSL(SLContext context, Source source) { |
432 Parser parser = new Parser(context, source); | 441 Parser parser = new Parser(context, source); |
499 case 29: s = "\"=\" expected"; break; | 508 case 29: s = "\"=\" expected"; break; |
500 case 30: s = "\".\" expected"; break; | 509 case 30: s = "\".\" expected"; break; |
501 case 31: s = "??? expected"; break; | 510 case 31: s = "??? expected"; break; |
502 case 32: s = "invalid Statement"; break; | 511 case 32: s = "invalid Statement"; break; |
503 case 33: s = "invalid Factor"; break; | 512 case 33: s = "invalid Factor"; break; |
504 case 34: s = "invalid MemberExpression"; break; | 513 case 34: s = "invalid Factor"; break; |
514 case 35: s = "invalid MemberExpression"; break; | |
505 default: | 515 default: |
506 s = "error " + n; | 516 s = "error " + n; |
507 break; | 517 break; |
508 } | 518 } |
509 printMsg(line, col, s); | 519 printMsg(line, col, s); |