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