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