diff graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/parser/Parser.java @ 13821:b16ec83edc73

Documentation and more refactoring of Simple Language
author Christian Wimmer <christian.wimmer@oracle.com>
date Wed, 29 Jan 2014 20:45:43 -0800
parents cad8bed1a1ac
children 64c77f0577bb
line wrap: on
line diff
--- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/parser/Parser.java	Wed Jan 29 20:43:28 2014 -0800
+++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/parser/Parser.java	Wed Jan 29 20:45:43 2014 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -55,7 +55,7 @@
     
     public Parser(SLContext context, Source source) {
         this.scanner = new Scanner(source.getInputStream());
-        this.factory = new SLNodeFactory(context, source, this);
+        this.factory = new SLNodeFactory(context, source);
         errors = new Errors();
     }
 
@@ -133,20 +133,18 @@
 	void Function() {
 		Expect(4);
 		Expect(1);
-		String name = t.val; 
+		factory.startFunction(t); 
 		Expect(5);
-		List<String> parameters = new ArrayList<>(); 
 		if (la.kind == 1) {
 			Get();
-			parameters.add(t.val); 
+			factory.addFormalParameter(t); 
 			while (la.kind == 6) {
 				Get();
 				Expect(1);
-				parameters.add(t.val); 
+				factory.addFormalParameter(t); 
 			}
 		}
 		Expect(7);
-		factory.startFunction(name, parameters); 
 		SLStatementNode body = Block();
 		factory.finishFunction(body); 
 	}
@@ -154,14 +152,14 @@
 	SLStatementNode  Block() {
 		SLStatementNode  result;
 		factory.startBlock();
-		List<SLStatementNode> statements = new ArrayList<>(); 
+		List<SLStatementNode> body = new ArrayList<>(); 
 		Expect(8);
 		while (StartOf(1)) {
-			SLStatementNode statement = Statement();
-			statements.add(statement); 
+			SLStatementNode s = Statement();
+			body.add(s); 
 		}
 		Expect(9);
-		result = factory.finishBlock(statements); 
+		result = factory.finishBlock(body); 
 		return result;
 	}
 
@@ -169,23 +167,23 @@
 		SLStatementNode  result;
 		result = null; 
 		switch (la.kind) {
-		case 15: {
+		case 13: {
 			result = WhileStatement();
 			break;
 		}
 		case 10: {
 			Get();
-			result = factory.createBreak(); 
+			result = factory.createBreak(t); 
 			Expect(11);
 			break;
 		}
 		case 12: {
 			Get();
-			result = factory.createContinue(); 
+			result = factory.createContinue(t); 
 			Expect(11);
 			break;
 		}
-		case 13: {
+		case 14: {
 			result = IfStatement();
 			break;
 		}
@@ -205,37 +203,43 @@
 
 	SLStatementNode  WhileStatement() {
 		SLStatementNode  result;
-		Expect(15);
+		Expect(13);
 		Expect(5);
+		Token whileToken = t; 
 		SLExpressionNode condition = Expression();
 		Expect(7);
 		SLStatementNode body = Block();
-		result = factory.createWhile(condition, body); 
+		result = factory.createWhile(whileToken, condition, body); 
 		return result;
 	}
 
 	SLStatementNode  IfStatement() {
 		SLStatementNode  result;
-		Expect(13);
+		Expect(14);
 		Expect(5);
+		Token ifToken = t; 
 		SLExpressionNode condition = Expression();
 		Expect(7);
 		SLStatementNode thenPart = Block();
 		SLStatementNode elsePart = null; 
-		if (la.kind == 14) {
+		if (la.kind == 15) {
 			Get();
 			elsePart = Block();
 		}
-		result = factory.createIf(condition, thenPart, elsePart); 
+		result = factory.createIf(ifToken, condition, thenPart, elsePart); 
 		return result;
 	}
 
 	SLStatementNode  ReturnStatement() {
 		SLStatementNode  result;
 		Expect(16);
-		SLExpressionNode value = Expression();
+		Token returnToken = t;
+		SLExpressionNode value = null; 
+		if (StartOf(2)) {
+			value = Expression();
+		}
+		result = factory.createReturn(returnToken, value); 
 		Expect(11);
-		result = factory.createReturn(value); 
 		return result;
 	}
 
@@ -244,7 +248,7 @@
 		result = LogicTerm();
 		while (la.kind == 17) {
 			Get();
-			String op = t.val; 
+			Token op = t; 
 			SLExpressionNode right = LogicTerm();
 			result = factory.createBinary(op, result, right); 
 		}
@@ -256,7 +260,7 @@
 		result = LogicFactor();
 		while (la.kind == 18) {
 			Get();
-			String op = t.val; 
+			Token op = t; 
 			SLExpressionNode right = LogicFactor();
 			result = factory.createBinary(op, result, right); 
 		}
@@ -266,7 +270,7 @@
 	SLExpressionNode  LogicFactor() {
 		SLExpressionNode  result;
 		result = Arithmetic();
-		if (StartOf(2)) {
+		if (StartOf(3)) {
 			switch (la.kind) {
 			case 19: {
 				Get();
@@ -293,7 +297,7 @@
 				break;
 			}
 			}
-			String op = t.val; 
+			Token op = t; 
 			SLExpressionNode right = Arithmetic();
 			result = factory.createBinary(op, result, right); 
 		}
@@ -309,7 +313,7 @@
 			} else {
 				Get();
 			}
-			String op = t.val; 
+			Token op = t; 
 			SLExpressionNode right = Term();
 			result = factory.createBinary(op, result, right); 
 		}
@@ -325,7 +329,7 @@
 			} else {
 				Get();
 			}
-			String op = t.val; 
+			Token op = t; 
 			SLExpressionNode right = Factor();
 			result = factory.createBinary(op, result, right); 
 		}
@@ -337,12 +341,12 @@
 		result = null; 
 		if (la.kind == 1) {
 			Get();
-			String name = t.val; 
+			Token nameToken = t; 
 			if (la.kind == 5) {
 				Get();
 				List<SLExpressionNode> parameters = new ArrayList<>();
 				SLExpressionNode parameter; 
-				if (StartOf(3)) {
+				if (StartOf(2)) {
 					parameter = Expression();
 					parameters.add(parameter); 
 					while (la.kind == 6) {
@@ -351,21 +355,21 @@
 						parameters.add(parameter); 
 					}
 				}
-				result = factory.createCall(factory.createRead(name), parameters); 
+				result = factory.createCall(nameToken, parameters); 
 				Expect(7);
 			} else if (la.kind == 29) {
 				Get();
 				SLExpressionNode value = Expression();
-				result = factory.createAssignment(name, value); 
+				result = factory.createAssignment(nameToken, value); 
 			} else if (StartOf(4)) {
-				result = factory.createRead(name); 
+				result = factory.createRead(nameToken); 
 			} else SynErr(32);
 		} else if (la.kind == 2) {
 			Get();
-			result = factory.createStringLiteral(t.val.substring(1, t.val.length() - 1)); 
+			result = factory.createStringLiteral(t); 
 		} else if (la.kind == 3) {
 			Get();
-			result = factory.createNumericLiteral(t.val); 
+			result = factory.createNumericLiteral(t); 
 		} else if (la.kind == 5) {
 			Get();
 			result = Expression();
@@ -387,9 +391,9 @@
 
     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,x,T, 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,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,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,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}
 
     };
@@ -446,15 +450,15 @@
 			case 10: s = "\"break\" expected"; break;
 			case 11: s = "\";\" expected"; break;
 			case 12: s = "\"continue\" expected"; break;
-			case 13: s = "\"if\" expected"; break;
-			case 14: s = "\"else\" expected"; break;
-			case 15: s = "\"while\" expected"; break;
+			case 13: s = "\"while\" expected"; break;
+			case 14: s = "\"if\" expected"; break;
+			case 15: s = "\"else\" expected"; break;
 			case 16: s = "\"return\" expected"; break;
 			case 17: s = "\"||\" expected"; break;
 			case 18: s = "\"&&\" expected"; break;
 			case 19: s = "\"<\" expected"; break;
-			case 20: s = "\">\" expected"; break;
-			case 21: s = "\"<=\" expected"; break;
+			case 20: s = "\"<=\" expected"; break;
+			case 21: s = "\">\" expected"; break;
 			case 22: s = "\">=\" expected"; break;
 			case 23: s = "\"==\" expected"; break;
 			case 24: s = "\"!=\" expected"; break;