Mercurial > hg > truffle
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