diff graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/parser/Parser.java @ 13761:7c418666c6c9

Refactoring and cleanup of Simple Language (more to come soon)
author Christian Wimmer <christian.wimmer@oracle.com>
date Fri, 24 Jan 2014 18:16:24 -0800
parents 7311354f5bf8
children cad8bed1a1ac
line wrap: on
line diff
--- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/parser/Parser.java	Fri Jan 24 18:13:38 2014 -0800
+++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/parser/Parser.java	Fri Jan 24 18:16:24 2014 -0800
@@ -21,14 +21,17 @@
  * questions.
  */
 
-// The content of this file is automatically generated. DO NOT EDIT.
+ // The content of this file is automatically generated. DO NOT EDIT.
+
 
 package com.oracle.truffle.sl.parser;
 
 import java.util.*;
 
+import com.oracle.truffle.api.*;
 import com.oracle.truffle.sl.*;
 import com.oracle.truffle.sl.nodes.*;
+import com.oracle.truffle.sl.runtime.*;
 
 // Checkstyle: stop
 // @formatter:off
@@ -37,7 +40,7 @@
 	public static final int _identifier = 1;
 	public static final int _stringLiteral = 2;
 	public static final int _numericLiteral = 3;
-	public static final int maxT = 29;
+	public static final int maxT = 30;
 
     static final boolean T = true;
     static final boolean x = false;
@@ -51,9 +54,9 @@
     public final Errors errors;
     private final SLNodeFactory factory;
     
-    public Parser(Scanner scanner, SLNodeFactory factory) {
-        this.scanner = scanner;
-        this.factory = factory;
+    public Parser(SLContext context, Source source) {
+        this.scanner = new Scanner(source.getInputStream());
+        this.factory = new SLNodeFactory(context, source, this);
         errors = new Errors();
     }
 
@@ -130,113 +133,142 @@
 
 	void Function() {
 		Expect(4);
-		factory.startFunction(); 
 		Expect(1);
 		String name = t.val; 
-		List<String> parameterNames = new ArrayList<>(); 
-		if (la.kind == 5) {
+		Expect(5);
+		List<String> parameters = new ArrayList<>(); 
+		if (la.kind == 1) {
 			Get();
-			if (la.kind == 1) {
-				Get();
-				parameterNames.add(t.val); 
-			}
+			parameters.add(t.val); 
 			while (la.kind == 6) {
 				Get();
 				Expect(1);
-				parameterNames.add(t.val); 
+				parameters.add(t.val); 
 			}
-			Expect(7);
 		}
-		StatementNode body = Block();
-		factory.createFunction(body, name, parameterNames.toArray(new String[parameterNames.size()])); 
+		Expect(7);
+		factory.startFunction(name, parameters); 
+		SLStatementNode body = Block();
+		factory.finishFunction(body); 
 	}
 
-	StatementNode  Block() {
-		StatementNode  result;
-		List<StatementNode> statements = new ArrayList<>(); 
+	SLStatementNode  Block() {
+		SLStatementNode  result;
+		factory.startBlock();
+		List<SLStatementNode> statements = new ArrayList<>(); 
 		Expect(8);
 		while (StartOf(1)) {
-			StatementNode statement = Statement();
+			SLStatementNode statement = Statement();
 			statements.add(statement); 
 		}
 		Expect(9);
-		result = factory.createBlock(statements); 
+		result = factory.finishBlock(statements); 
 		return result;
 	}
 
-	StatementNode  Statement() {
-		StatementNode  result;
+	SLStatementNode  Statement() {
+		SLStatementNode  result;
 		result = null; 
-		if (la.kind == 13) {
+		switch (la.kind) {
+		case 15: {
 			result = WhileStatement();
-		} else if (la.kind == 11) {
+			break;
+		}
+		case 10: {
+			Get();
+			result = factory.createBreak(); 
+			Expect(11);
+			break;
+		}
+		case 12: {
+			Get();
+			result = factory.createContinue(); 
+			Expect(11);
+			break;
+		}
+		case 13: {
 			result = IfStatement();
-		} else if (la.kind == 14) {
+			break;
+		}
+		case 16: {
 			result = ReturnStatement();
-		} else if (StartOf(2)) {
+			break;
+		}
+		case 1: case 2: case 3: case 5: {
 			result = Expression();
-			Expect(10);
-		} else SynErr(30);
+			Expect(11);
+			break;
+		}
+		default: SynErr(31); break;
+		}
 		return result;
 	}
 
-	StatementNode  WhileStatement() {
-		StatementNode  result;
-		Expect(13);
+	SLStatementNode  WhileStatement() {
+		SLStatementNode  result;
+		Expect(15);
 		Expect(5);
-		ConditionNode condition = Expression();
+		SLExpressionNode condition = Expression();
 		Expect(7);
-		StatementNode body = Block();
+		SLStatementNode body = Block();
 		result = factory.createWhile(condition, body); 
 		return result;
 	}
 
-	StatementNode  IfStatement() {
-		StatementNode  result;
-		Expect(11);
+	SLStatementNode  IfStatement() {
+		SLStatementNode  result;
+		Expect(13);
 		Expect(5);
-		ConditionNode condition = Expression();
+		SLExpressionNode condition = Expression();
 		Expect(7);
-		StatementNode thenNode = null; StatementNode elseNode = null; 
-		thenNode = Block();
-		if (la.kind == 12) {
+		SLStatementNode thenPart = Block();
+		SLStatementNode elsePart = null; 
+		if (la.kind == 14) {
 			Get();
-			elseNode = Block();
+			elsePart = Block();
 		}
-		result = factory.createIf(condition, thenNode, elseNode); 
+		result = factory.createIf(condition, thenPart, elsePart); 
 		return result;
 	}
 
-	StatementNode  ReturnStatement() {
-		StatementNode  result;
-		Expect(14);
-		TypedNode value = Expression();
-		Expect(10);
+	SLStatementNode  ReturnStatement() {
+		SLStatementNode  result;
+		Expect(16);
+		SLExpressionNode value = Expression();
+		Expect(11);
 		result = factory.createReturn(value); 
 		return result;
 	}
 
-	TypedNode  Expression() {
-		TypedNode  result;
-		result = ValueExpression();
-		if (StartOf(3)) {
+	SLExpressionNode  Expression() {
+		SLExpressionNode  result;
+		result = LogicTerm();
+		while (la.kind == 17) {
+			Get();
+			String op = t.val; 
+			SLExpressionNode right = LogicTerm();
+			result = factory.createBinary(op, result, right); 
+		}
+		return result;
+	}
+
+	SLExpressionNode  LogicTerm() {
+		SLExpressionNode  result;
+		result = LogicFactor();
+		while (la.kind == 18) {
+			Get();
+			String op = t.val; 
+			SLExpressionNode right = LogicFactor();
+			result = factory.createBinary(op, result, right); 
+		}
+		return result;
+	}
+
+	SLExpressionNode  LogicFactor() {
+		SLExpressionNode  result;
+		result = Arithmetic();
+		if (StartOf(2)) {
 			switch (la.kind) {
-			case 15: {
-				Get();
-				break;
-			}
-			case 16: {
-				Get();
-				break;
-			}
-			case 17: {
-				Get();
-				break;
-			}
-			case 18: {
-				Get();
-				break;
-			}
 			case 19: {
 				Get();
 				break;
@@ -245,130 +277,101 @@
 				Get();
 				break;
 			}
+			case 21: {
+				Get();
+				break;
+			}
+			case 22: {
+				Get();
+				break;
+			}
+			case 23: {
+				Get();
+				break;
+			}
+			case 24: {
+				Get();
+				break;
+			}
 			}
 			String op = t.val; 
-			TypedNode right = ValueExpression();
+			SLExpressionNode right = Arithmetic();
 			result = factory.createBinary(op, result, right); 
 		}
 		return result;
 	}
 
-	TypedNode  ValueExpression() {
-		TypedNode  result;
+	SLExpressionNode  Arithmetic() {
+		SLExpressionNode  result;
 		result = Term();
-		while (la.kind == 21 || la.kind == 22) {
-			if (la.kind == 21) {
+		while (la.kind == 25 || la.kind == 26) {
+			if (la.kind == 25) {
 				Get();
 			} else {
 				Get();
 			}
 			String op = t.val; 
-			TypedNode right = Term();
-			result = factory.createBinary(op, result, right); 
-		}
-		return result;
-	}
-
-	TypedNode  Term() {
-		TypedNode  result;
-		result = Factor();
-		while (la.kind == 23 || la.kind == 24) {
-			if (la.kind == 23) {
-				Get();
-			} else {
-				Get();
-			}
-			String op = t.val; 
-			TypedNode right = Factor();
+			SLExpressionNode right = Term();
 			result = factory.createBinary(op, result, right); 
 		}
 		return result;
 	}
 
-	TypedNode  Factor() {
-		TypedNode  result;
-		result = null; 
-		if (la.kind == 1) {
-			result = VariableRefOrCall();
-		} else if (la.kind == 2) {
-			result = StringLiteral();
-		} else if (la.kind == 3) {
-			result = NumericLiteral();
-		} else if (la.kind == 25) {
-			result = Ternary();
-		} else if (la.kind == 5) {
-			Get();
-			result = Expression();
-			Expect(7);
-		} else SynErr(31);
-		return result;
-	}
-
-	TypedNode  VariableRefOrCall() {
-		TypedNode  result;
-		result = VariableRef();
-		if (la.kind == 5 || la.kind == 28) {
-			if (la.kind == 5) {
-				TypedNode[] parameters = Parameters();
-				result = factory.createCall(result, parameters); 
+	SLExpressionNode  Term() {
+		SLExpressionNode  result;
+		result = Factor();
+		while (la.kind == 27 || la.kind == 28) {
+			if (la.kind == 27) {
+				Get();
 			} else {
 				Get();
-				TypedNode assignment = Expression();
-				result = factory.createAssignment(result, assignment); 
 			}
+			String op = t.val; 
+			SLExpressionNode right = Factor();
+			result = factory.createBinary(op, result, right); 
 		}
 		return result;
 	}
 
-	TypedNode  StringLiteral() {
-		TypedNode  result;
-		Expect(2);
-		result = factory.createStringLiteral(t.val.substring(1, t.val.length() - 1)); 
-		return result;
-	}
-
-	TypedNode  NumericLiteral() {
-		TypedNode  result;
-		Expect(3);
-		result = factory.createNumericLiteral(t.val); 
-		return result;
-	}
-
-	TypedNode  Ternary() {
-		TypedNode  result;
-		TypedNode condition, thenPart, elsePart; 
-		Expect(25);
-		condition = Expression();
-		Expect(26);
-		thenPart = Expression();
-		Expect(27);
-		elsePart = Expression();
-		result = factory.createTernary(condition, thenPart, elsePart); 
-		return result;
-	}
-
-	TypedNode  VariableRef() {
-		TypedNode  result;
-		Expect(1);
-		result = factory.createLocal(t.val); 
-		return result;
-	}
-
-	TypedNode[]  Parameters() {
-		TypedNode[]  result;
-		Expect(5);
-		List<TypedNode> parameters = new ArrayList<>(); 
-		if (StartOf(2)) {
-			TypedNode e1 = Expression();
-			parameters.add(e1); 
-			while (la.kind == 6) {
+	SLExpressionNode  Factor() {
+		SLExpressionNode  result;
+		result = null; 
+		if (la.kind == 1) {
+			Get();
+			String name = t.val; 
+			if (la.kind == 5) {
 				Get();
-				TypedNode e2 = Expression();
-				parameters.add(e2); 
-			}
-		}
-		result = parameters.toArray(new TypedNode[parameters.size()]); 
-		Expect(7);
+				List<SLExpressionNode> parameters = new ArrayList<>();
+				SLExpressionNode parameter; 
+				if (StartOf(3)) {
+					parameter = Expression();
+					parameters.add(parameter); 
+					while (la.kind == 6) {
+						Get();
+						parameter = Expression();
+						parameters.add(parameter); 
+					}
+				}
+				result = factory.createCall(factory.createRead(name), parameters); 
+				Expect(7);
+			} else if (la.kind == 29) {
+				Get();
+				SLExpressionNode value = Expression();
+				result = factory.createAssignment(name, value); 
+			} else if (StartOf(4)) {
+				result = factory.createRead(name); 
+			} else SynErr(32);
+		} else if (la.kind == 2) {
+			Get();
+			result = factory.createStringLiteral(t.val.substring(1, t.val.length() - 1)); 
+		} else if (la.kind == 3) {
+			Get();
+			result = factory.createNumericLiteral(t.val); 
+		} else if (la.kind == 5) {
+			Get();
+			result = Expression();
+			Expect(7);
+		} else SynErr(33);
 		return result;
 	}
 
@@ -384,35 +387,30 @@
     }
 
     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,T,T,T, x,T,x,x, x,x,x,T, x,T,T,x, x,x,x,x, x,x,x,x, x,T,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,T,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}
+		{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,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}
 
     };
 
-    public String ParseErrors() {
-        java.io.PrintStream oldStream = System.out;
-
-        java.io.OutputStream out = new java.io.ByteArrayOutputStream();
-        java.io.PrintStream newStream = new java.io.PrintStream(out);
-
-        errors.errorStream = newStream;
-
-        Parse();
-
-        String errorStream = out.toString();
-        errors.errorStream = oldStream;
-
-        return errorStream;
-
+    public static void parseSL(SLContext context, Source source) {
+        Parser parser = new Parser(context, source);
+        parser.Parse();
+        if (parser.errors.errors.size() > 0) {
+            StringBuilder msg = new StringBuilder("Error(s) parsing script:\n");
+            for (String error : parser.errors.errors) {
+                msg.append(error).append("\n");
+            }
+            throw new SLException(msg.toString());
+        }
     }
 } // end Parser
 
 class Errors {
 
-    public int count = 0; // number of errors detected
-    public java.io.PrintStream errorStream = System.out; // error messages go to this stream
+    protected final List<String> errors = new ArrayList<>();
     public String errMsgFormat = "-- line {0} col {1}: {2}"; // 0=line, 1=column, 2=text
 
     protected void printMsg(int line, int column, String msg) {
@@ -430,7 +428,7 @@
         pos = b.indexOf("{2}");
         if (pos >= 0)
             b.replace(pos, pos + 3, msg);
-        errorStream.println(b.toString());
+        errors.add(b.toString());
     }
 
     public void SynErr(int line, int col, int n) {
@@ -446,44 +444,43 @@
 			case 7: s = "\")\" expected"; break;
 			case 8: s = "\"{\" expected"; break;
 			case 9: s = "\"}\" expected"; break;
-			case 10: s = "\";\" expected"; break;
-			case 11: s = "\"if\" expected"; break;
-			case 12: s = "\"else\" expected"; break;
-			case 13: s = "\"while\" expected"; break;
-			case 14: s = "\"return\" expected"; break;
-			case 15: s = "\"<\" expected"; break;
-			case 16: s = "\">\" 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 22: s = "\"-\" expected"; break;
-			case 23: s = "\"*\" expected"; break;
-			case 24: s = "\"/\" expected"; break;
-			case 25: s = "\"#\" expected"; break;
-			case 26: s = "\"?\" expected"; break;
-			case 27: s = "\":\" expected"; break;
-			case 28: s = "\"=\" expected"; break;
-			case 29: s = "??? expected"; break;
-			case 30: s = "invalid Statement"; break;
-			case 31: s = "invalid Factor"; break;
+			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 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 22: s = "\">=\" expected"; break;
+			case 23: s = "\"==\" expected"; break;
+			case 24: s = "\"!=\" expected"; break;
+			case 25: s = "\"+\" expected"; break;
+			case 26: s = "\"-\" expected"; break;
+			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 33: s = "invalid Factor"; break;
             default:
                 s = "error " + n;
                 break;
         }
         printMsg(line, col, s);
-        count++;
     }
 
     public void SemErr(int line, int col, String s) {
         printMsg(line, col, s);
-        count++;
     }
 
     public void SemErr(String s) {
-        errorStream.println(s);
-        count++;
+        errors.add(s);
     }
 
     public void Warning(int line, int col, String s) {
@@ -491,7 +488,7 @@
     }
 
     public void Warning(String s) {
-        errorStream.println(s);
+        errors.add(s);
     }
 } // Errors