diff 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
line wrap: on
line diff
--- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/parser/Parser.java	Tue Oct 21 15:11:32 2014 +0200
+++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/parser/Parser.java	Tue Nov 18 23:02:58 2014 +0100
@@ -39,7 +39,7 @@
 	public static final int _identifier = 1;
 	public static final int _stringLiteral = 2;
 	public static final int _numericLiteral = 3;
-	public static final int maxT = 30;
+	public static final int maxT = 31;
 
     static final boolean T = true;
     static final boolean x = false;
@@ -200,7 +200,7 @@
 			Expect(11);
 			break;
 		}
-		default: SynErr(31); break;
+		default: SynErr(32); break;
 		}
 		return result;
 	}
@@ -345,30 +345,10 @@
 		result = null;
 		if (la.kind == 1) {
 			Get();
-			Token nameToken = t;
-			if (la.kind == 5) {
-				Get();
-				List<SLExpressionNode> parameters = new ArrayList<>();
-				SLExpressionNode parameter;
-				if (StartOf(2)) {
-					parameter = Expression();
-					parameters.add(parameter);
-					while (la.kind == 6) {
-						Get();
-						parameter = Expression();
-						parameters.add(parameter);
-					}
-				}
-				Expect(7);
-				Token finalToken = t;
-				result = factory.createCall(nameToken, parameters, finalToken);
-			} else if (la.kind == 29) {
-				Get();
-				SLExpressionNode value = Expression();
-				result = factory.createAssignment(nameToken, value);
-			} else if (StartOf(4)) {
-				result = factory.createRead(nameToken);
-			} else SynErr(32);
+			result = factory.createRead(t);
+			if (la.kind == 5 || la.kind == 29 || la.kind == 30) {
+				result = MemberExpression(result, null, t);
+			}
 		} else if (la.kind == 2) {
 			Get();
 			result = factory.createStringLiteral(t);
@@ -387,6 +367,48 @@
 		return result;
 	}
 
+	SLExpressionNode  MemberExpression(SLExpressionNode receiver, SLExpressionNode assignmentReceiver, Token assignmentName) {
+		SLExpressionNode  result;
+		result = null;
+		Token nestedAssignmentName = null;
+		if (la.kind == 5) {
+			Get();
+			List<SLExpressionNode> parameters = new ArrayList<>();
+			SLExpressionNode parameter;
+			if (StartOf(2)) {
+				parameter = Expression();
+				parameters.add(parameter);
+				while (la.kind == 6) {
+					Get();
+					parameter = Expression();
+					parameters.add(parameter);
+				}
+			}
+			Expect(7);
+			Token finalToken = t;
+			result = factory.createCall(receiver, parameters, finalToken);
+		} else if (la.kind == 29) {
+			Get();
+			SLExpressionNode value = Expression();
+			if (assignmentName == null) {
+			   SemErr("invalid assignment target");
+			} else if (assignmentReceiver == null) {
+			   result = factory.createAssignment(assignmentName, value);
+			} else {
+			   result = factory.createWriteProperty(assignmentReceiver, assignmentName, value);
+			}
+		} else if (la.kind == 30) {
+			Get();
+			Expect(1);
+			result = factory.createReadProperty(receiver, t);
+			nestedAssignmentName = t;
+		} else SynErr(34);
+		if (la.kind == 5 || la.kind == 29 || la.kind == 30) {
+			result = MemberExpression(result, receiver, nestedAssignmentName);
+		}
+		return result;
+	}
+
 
 
     public void Parse() {
@@ -399,11 +421,10 @@
     }
 
     private static final boolean[][] set = {
-		{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,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,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,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,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}
+		{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},
+		{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},
+		{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},
+		{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}
 
     };
 
@@ -476,10 +497,11 @@
 			case 27: s = "\"*\" expected"; break;
 			case 28: s = "\"/\" expected"; break;
 			case 29: s = "\"=\" expected"; break;
-			case 30: s = "??? expected"; break;
-			case 31: s = "invalid Statement"; break;
-			case 32: s = "invalid Factor"; break;
+			case 30: s = "\".\" expected"; break;
+			case 31: s = "??? expected"; break;
+			case 32: s = "invalid Statement"; break;
 			case 33: s = "invalid Factor"; break;
+			case 34: s = "invalid MemberExpression"; break;
             default:
                 s = "error " + n;
                 break;