From b89242ff336b0d06db3b4ac0f8335d1567ce5e95 Mon Sep 17 00:00:00 2001 From: paulzfm Date: Sun, 22 Sep 2019 14:02:42 +0800 Subject: [PATCH] update to fit 19-fall course --- README.md | 2 +- build.sbt | 4 +- demos/arith/build.xml | 48 - demos/arith/src/arith/BaseLexer.java | 55 - demos/arith/src/arith/BaseParser.java | 86 - demos/arith/src/arith/Driver.java | 63 - demos/arith/src/arith/Expr.java | 105 - demos/arith/src/arith/Lexer.java | 552 ---- demos/arith/src/arith/Lexer.l | 42 - demos/arith/src/arith/Location.java | 45 - demos/arith/src/arith/Parser.java | 211 -- demos/arith/src/arith/Parser.spec | 71 - demos/arith/src/arith/SemValue.java | 38 - demos/arith/src/arith/error/CompileError.java | 40 - demos/arith/src/arith/error/MsgError.java | 22 - .../src/arith/error/UnrecogCharError.java | 21 - demos/decaf/build.xml | 48 - demos/decaf/src/decaf/BaseLexer.java | 81 - demos/decaf/src/decaf/BaseParser.java | 84 - demos/decaf/src/decaf/Driver.java | 59 - demos/decaf/src/decaf/Lexer.java | 2867 ----------------- demos/decaf/src/decaf/Lexer.l | 99 - demos/decaf/src/decaf/Location.java | 45 - demos/decaf/src/decaf/Parser.java | 2415 -------------- demos/decaf/src/decaf/Parser.spec | 762 ----- demos/decaf/src/decaf/SemValue.java | 236 -- demos/decaf/src/decaf/Tree.java | 1501 --------- demos/decaf/src/decaf/error/DecafError.java | 40 - .../src/decaf/error/IntTooLargeError.java | 23 - demos/decaf/src/decaf/error/MsgError.java | 22 - .../src/decaf/error/NewlineInStrError.java | 23 - .../src/decaf/error/UnrecogCharError.java | 21 - .../decaf/src/decaf/error/UntermStrError.java | 23 - .../src/decaf/utils/IndentPrintWriter.java | 88 - demos/decaf/src/decaf/utils/MiscUtils.java | 33 - demos/decaf/testcases/error1.decaf | 8 - demos/decaf/testcases/error2.decaf | 10 - demos/decaf/testcases/error3.decaf | 9 - demos/decaf/testcases/error4.decaf | 7 - demos/decaf/testcases/error5.decaf | 4 - demos/decaf/testcases/nqueues.decaf | 90 - demos/decaf/testcases/test1.decaf | 23 - demos/decaf/testcases/test2.decaf | 43 - demos/decaf/testcases/test3.decaf | 18 - demos/decaf/testcases/test4.decaf | 22 - demos/decaf/testcases/test5.decaf | 6 - demos/tools/JFlex.jar | Bin 169635 -> 0 bytes project/assembly.sbt | 1 - project/build.properties | 2 +- project/plugins.sbt | 5 +- .../{ => decaf/tools/pg}/Generator.scala | 8 +- .../{ => decaf/tools/pg}/IndentWriter.scala | 2 + .../{ => decaf/tools/pg}/JavaCodeFile.scala | 12 +- .../scala/{ => decaf/tools/pg}/Main.scala | 29 +- .../scala/{ => decaf/tools/pg}/Parsers.scala | 31 +- .../{ => decaf/tools/pg}/Printable.scala | 2 + .../scala/{ => decaf/tools/pg}/SpecAST.scala | 28 +- .../scala/{ => decaf/tools/pg}/Utils.scala | 6 +- .../{ => decaf/tools/pg}/TestGenerator.scala | 6 +- .../{ => decaf/tools/pg}/TestParsers.scala | 38 +- 60 files changed, 114 insertions(+), 10171 deletions(-) delete mode 100755 demos/arith/build.xml delete mode 100755 demos/arith/src/arith/BaseLexer.java delete mode 100755 demos/arith/src/arith/BaseParser.java delete mode 100755 demos/arith/src/arith/Driver.java delete mode 100644 demos/arith/src/arith/Expr.java delete mode 100644 demos/arith/src/arith/Lexer.java delete mode 100755 demos/arith/src/arith/Lexer.l delete mode 100644 demos/arith/src/arith/Location.java delete mode 100644 demos/arith/src/arith/Parser.java delete mode 100644 demos/arith/src/arith/Parser.spec delete mode 100644 demos/arith/src/arith/SemValue.java delete mode 100755 demos/arith/src/arith/error/CompileError.java delete mode 100755 demos/arith/src/arith/error/MsgError.java delete mode 100755 demos/arith/src/arith/error/UnrecogCharError.java delete mode 100755 demos/decaf/build.xml delete mode 100755 demos/decaf/src/decaf/BaseLexer.java delete mode 100755 demos/decaf/src/decaf/BaseParser.java delete mode 100755 demos/decaf/src/decaf/Driver.java delete mode 100644 demos/decaf/src/decaf/Lexer.java delete mode 100755 demos/decaf/src/decaf/Lexer.l delete mode 100644 demos/decaf/src/decaf/Location.java delete mode 100644 demos/decaf/src/decaf/Parser.java delete mode 100644 demos/decaf/src/decaf/Parser.spec delete mode 100644 demos/decaf/src/decaf/SemValue.java delete mode 100755 demos/decaf/src/decaf/Tree.java delete mode 100755 demos/decaf/src/decaf/error/DecafError.java delete mode 100755 demos/decaf/src/decaf/error/IntTooLargeError.java delete mode 100755 demos/decaf/src/decaf/error/MsgError.java delete mode 100755 demos/decaf/src/decaf/error/NewlineInStrError.java delete mode 100755 demos/decaf/src/decaf/error/UnrecogCharError.java delete mode 100755 demos/decaf/src/decaf/error/UntermStrError.java delete mode 100755 demos/decaf/src/decaf/utils/IndentPrintWriter.java delete mode 100755 demos/decaf/src/decaf/utils/MiscUtils.java delete mode 100755 demos/decaf/testcases/error1.decaf delete mode 100755 demos/decaf/testcases/error2.decaf delete mode 100755 demos/decaf/testcases/error3.decaf delete mode 100755 demos/decaf/testcases/error4.decaf delete mode 100755 demos/decaf/testcases/error5.decaf delete mode 100755 demos/decaf/testcases/nqueues.decaf delete mode 100755 demos/decaf/testcases/test1.decaf delete mode 100755 demos/decaf/testcases/test2.decaf delete mode 100755 demos/decaf/testcases/test3.decaf delete mode 100755 demos/decaf/testcases/test4.decaf delete mode 100755 demos/decaf/testcases/test5.decaf delete mode 100755 demos/tools/JFlex.jar delete mode 100644 project/assembly.sbt rename src/main/scala/{ => decaf/tools/pg}/Generator.scala (98%) rename src/main/scala/{ => decaf/tools/pg}/IndentWriter.scala (98%) rename src/main/scala/{ => decaf/tools/pg}/JavaCodeFile.scala (97%) rename src/main/scala/{ => decaf/tools/pg}/Main.scala (71%) rename src/main/scala/{ => decaf/tools/pg}/Parsers.scala (85%) rename src/main/scala/{ => decaf/tools/pg}/Printable.scala (85%) rename src/main/scala/{ => decaf/tools/pg}/SpecAST.scala (87%) rename src/main/scala/{ => decaf/tools/pg}/Utils.scala (97%) rename src/test/scala/{ => decaf/tools/pg}/TestGenerator.scala (97%) rename src/test/scala/{ => decaf/tools/pg}/TestParsers.scala (85%) diff --git a/README.md b/README.md index 10873b2..c9510ca 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # LL1-Parser-Gen -LL(1) Parser Generator that automatically generates a parser class written in Java which +LL(1) Parser decaf.tools.pg.Generator that automatically generates a parser class written in Java which satisfies the context-free grammar (CFG) given as a specification file. The parse engine is based on LL(1) parsing technique, from top to bottom. diff --git a/build.sbt b/build.sbt index 0738f11..d896c2a 100644 --- a/build.sbt +++ b/build.sbt @@ -1,6 +1,6 @@ -name := "LL1-Parser-Gen" +name := "ll1-pg" -version := "1.0" +version := "decaf-course-19-fall" scalaVersion := "2.12.1" diff --git a/demos/arith/build.xml b/demos/arith/build.xml deleted file mode 100755 index 99c8734..0000000 --- a/demos/arith/build.xml +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/demos/arith/src/arith/BaseLexer.java b/demos/arith/src/arith/BaseLexer.java deleted file mode 100755 index b5a306a..0000000 --- a/demos/arith/src/arith/BaseLexer.java +++ /dev/null @@ -1,55 +0,0 @@ -package arith; - -import java.io.IOException; - -import arith.Driver; -import arith.Location; -import arith.error.CompileError; - -/** - * Base class of `Lexer`, which is generated by `JFlex`. - */ -public abstract class BaseLexer { - - private Parser parser; - - public void setParser(Parser parser) { - this.parser = parser; - } - - /** - * Lexer function of `JFlex`. - * - * @return the parsed token from input. - * @throws IOException - */ - abstract int yylex() throws IOException; - - abstract Location getLocation(); - - private CompileError error = null; - - public void handleError() throws CompileError { - if (error != null) throw error; - } - - protected void issueError(CompileError err) { - error = err; - } - - protected void setSemantic(Location where, SemValue v) { - v.loc = where; - parser.val = v; - } - - protected int operator(int code) { - setSemantic(getLocation(), SemValue.createOperator(code)); - return code; - } - - protected int intConst(String ival) { - setSemantic(getLocation(), SemValue.createNum(Integer.decode(ival))); - return Parser.NUM; - } - -} diff --git a/demos/arith/src/arith/BaseParser.java b/demos/arith/src/arith/BaseParser.java deleted file mode 100755 index 624f383..0000000 --- a/demos/arith/src/arith/BaseParser.java +++ /dev/null @@ -1,86 +0,0 @@ -package arith; - -import arith.Driver; -import arith.Expr; -import arith.error.CompileError; -import arith.error.MsgError; - -import java.util.Arrays; - -/** - * Base class of `Parser`, generated by our tool. - */ -public abstract class BaseParser { - private Lexer lexer; - - public void setLexer(Lexer lexer) { - this.lexer = lexer; - } - - /** - * Custom function to handle syntax error when EOF or EOS expected, but `token` found. - * - * @param token actual token found. - * @return an instance of error. - */ - protected MsgError error(String token) { - return new MsgError(lexer.getLocation(), "EOF is expected but " + token + " is " + "found"); - } - - /** - * Custom function to handle syntax error when `expected` is expected but `token` is found. - * - * @param token actual token found. - * @param expected expected token. - * @return an instance of error. - */ - protected MsgError error(String token, String expected) { - return new MsgError(lexer.getLocation(), - expected + " is expected but " + token + " is " + "found"); - } - - /** - * Custom function to handle syntax error when one of `acceptable` token is acceptable but - * `token` is found. - * - * @param token actual token found. - * @param acceptable accepted tokens. - * @return an instance of error. - */ - protected MsgError error(String token, String[] acceptable) { - return new MsgError(lexer.getLocation(), - Arrays.toString(acceptable) + " are expected but " + token + " is " + "found"); - } - - /** - * Custom function to communicate with lexer. - * - * @return token. - * @throws Exception. - */ - protected int lex() throws Exception { - int token = lexer.yylex(); - lexer.handleError(); - return token; - } - - /** - * Parse function of our tool. - * - * @return value of start symbol if successfully parsed. - * @throws Exception. - */ - abstract protected SemValue parse() throws Exception; - - /** - * Explict interface for calling the parser. - * - * @return the expression if successfully parsed. - * @throws Exception. - */ - public Expr parseFile() throws Exception { - SemValue v = parse(); - return v.expr; - } - -} diff --git a/demos/arith/src/arith/Driver.java b/demos/arith/src/arith/Driver.java deleted file mode 100755 index 3bb2895..0000000 --- a/demos/arith/src/arith/Driver.java +++ /dev/null @@ -1,63 +0,0 @@ -package arith; - -import java.io.*; -import java.util.*; - -import arith.Expr; -import arith.error.CompileError; -import arith.Lexer; -import arith.Parser; - -/** - * Main class of demo `arith`. - * - * Input: an arithmetic expression consist of `+`, `*` and numbers. - * Output: the parsed AST and the evaluation result. - */ -public final class Driver { - - private static Driver driver; - - private Lexer lexer; - - private Parser parser; - - public static Driver getDriver() { - return driver; - } - - public void issueError(CompileError error) throws CompileError { - throw error; - } - - private void compile(InputStream in) throws Exception { - lexer = new Lexer(in); - parser = new Parser(); - lexer.setParser(parser); - parser.setLexer(lexer); - Expr tree = parser.parseFile(); - System.out.println(tree); - System.out.println(tree.eval()); - } - - public static void main(String[] args) throws IOException { - driver = new Driver(); - Console console = System.console(); - System.out.println("Arith - type expressions and enter to evaluate."); - System.out.println(" - type 'q' to quit."); - while (true) { - String expr = console.readLine(">> "); - if (expr.charAt(0) == 'q') { - break; - } - - InputStream in = new ByteArrayInputStream(expr.getBytes()); - try { - driver.compile(in); - } catch (Exception ex) { - System.err.println(ex); - } - } - } - -} diff --git a/demos/arith/src/arith/Expr.java b/demos/arith/src/arith/Expr.java deleted file mode 100644 index e673d9c..0000000 --- a/demos/arith/src/arith/Expr.java +++ /dev/null @@ -1,105 +0,0 @@ -package arith; - -import java.util.*; - -/** - * Expressions. - */ -public abstract class Expr { - // Expr types - public static final int TYPE_ARITH = 1; - public static final int TYPE_NUM = 2; - - // Operator types - public static final int ADD = 3; - public static final int MUL = 4; - - public int type; - - public Expr(int type) { - this.type = type; - } - - /** - * Evaluate the expression. - * - * @return computation result. - */ - public abstract int eval(); - - /** - * Arithmetic expressions. - */ - public static class ArithExpr extends Expr { - public int op; - public Expr left, right; - - public ArithExpr(int op, Expr left, Expr right) { - super(TYPE_ARITH); - this.op = op; - this.left = left; - this.right = right; - } - - @Override - public int eval() { - int l = left.eval(); - int r = right.eval(); - switch (op) { - case ADD: - return l + r; - case MUL: - return l * r; - } - return 0; - } - - @Override - public String toString() { - String s = "(" + (op == ADD ? "+" : "*") + " "; - s += left; - s += " "; - s += right; - s += ")"; - return s; - } - } - - /** - * Numbers (integers). - */ - public static class Number extends Expr { - public int value; - - public Number(int value) { - super(TYPE_NUM); - this.value = value; - } - - @Override - public int eval() { - return value; - } - - @Override - public String toString() { return "" + value; } - } - - /** - * Tuple of operator and expression, used by parser as a temporary storage. - */ - public static class Term { - public int op; - public Expr expr; - - public Term(int op, Expr expr) { - this.op = op; - this.expr = expr; - } - - @Override - public String toString() { - return "(" + (op == ADD ? "+" : "*") + ", " + expr + ")"; - } - } -} \ No newline at end of file diff --git a/demos/arith/src/arith/Lexer.java b/demos/arith/src/arith/Lexer.java deleted file mode 100644 index 1f3898c..0000000 --- a/demos/arith/src/arith/Lexer.java +++ /dev/null @@ -1,552 +0,0 @@ -/* The following code was generated by JFlex 1.4.1 on 8/8/17 2:15 PM */ - -package arith; - -import arith.Location; -import arith.error.*; - - -/** - * This class is a scanner generated by - * JFlex 1.4.1 - * on 8/8/17 2:15 PM from the specification file - * src/arith/Lexer.l - */ -public class Lexer extends BaseLexer { - - /** This character denotes the end of file */ - public static final int YYEOF = -1; - - /** initial size of the lookahead buffer */ - private static final int ZZ_BUFFERSIZE = 16384; - - /** lexical states */ - public static final int S = 1; - public static final int YYINITIAL = 0; - - /** - * Translates characters to character classes - */ - private static final String ZZ_CMAP_PACKED = - "\11\0\1\5\1\2\2\0\1\1\22\0\1\5\7\0\1\4\1\4"+ - "\1\4\1\4\4\0\12\3\uffc6\0"; - - /** - * Translates characters to character classes - */ - private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED); - - /** - * Translates DFA states to action switch labels. - */ - private static final int [] ZZ_ACTION = zzUnpackAction(); - - private static final String ZZ_ACTION_PACKED_0 = - "\2\0\1\1\2\2\1\3\1\4\1\2"; - - private static int [] zzUnpackAction() { - int [] result = new int[8]; - int offset = 0; - offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result); - return result; - } - - private static int zzUnpackAction(String packed, int offset, int [] result) { - int i = 0; /* index in packed string */ - int j = offset; /* index in unpacked array */ - int l = packed.length(); - while (i < l) { - int count = packed.charAt(i++); - int value = packed.charAt(i++); - do result[j++] = value; while (--count > 0); - } - return j; - } - - - /* error codes */ - private static final int ZZ_UNKNOWN_ERROR = 0; - private static final int ZZ_NO_MATCH = 1; - private static final int ZZ_PUSHBACK_2BIG = 2; - - /* error messages for the codes above */ - private static final String ZZ_ERROR_MSG[] = { - "Unkown internal scanner error", - "Error: could not match input", - "Error: pushback value was too large" - }; - - /** the input device */ - private java.io.Reader zzReader; - - /** the current state of the DFA */ - private int zzState; - - /** the current lexical state */ - private int zzLexicalState = YYINITIAL; - - /** this buffer contains the current text to be matched and is - the source of the yytext() string */ - private char zzBuffer[] = new char[ZZ_BUFFERSIZE]; - - /** the textposition at the last accepting state */ - private int zzMarkedPos; - - /** the textposition at the last state to be included in yytext */ - private int zzPushbackPos; - - /** the current text position in the buffer */ - private int zzCurrentPos; - - /** startRead marks the beginning of the yytext() string in the buffer */ - private int zzStartRead; - - /** endRead marks the last character in the buffer, that has been read - from input */ - private int zzEndRead; - - /** number of newlines encountered up to the start of the matched text */ - private int yyline; - - /** the number of characters up to the start of the matched text */ - private int yychar; - - /** - * the number of characters from the last newline up to the start of the - * matched text - */ - private int yycolumn; - - /** - * zzAtBOL == true <=> the scanner is currently at the beginning of a line - */ - private boolean zzAtBOL = true; - - /** zzAtEOF == true <=> the scanner is at the EOF */ - private boolean zzAtEOF; - - /** denotes if the user-EOF-code has already been executed */ - private boolean zzEOFDone; - - /* user code: */ - private Location sloc = null; - private StringBuilder buffer = new StringBuilder(); - - public Location getLocation() { - return new Location(yyline + 1, yycolumn + 1); - } - - - /** - * Creates a new scanner - * There is also a java.io.InputStream version of this constructor. - * - * @param in the java.io.Reader to read input from. - */ - public Lexer(java.io.Reader in) { - this.zzReader = in; - } - - /** - * Creates a new scanner. - * There is also java.io.Reader version of this constructor. - * - * @param in the java.io.Inputstream to read input from. - */ - public Lexer(java.io.InputStream in) { - this(new java.io.InputStreamReader(in)); - } - - /** - * Unpacks the compressed character translation table. - * - * @param packed the packed character translation table - * @return the unpacked character translation table - */ - private static char [] zzUnpackCMap(String packed) { - char [] map = new char[0x10000]; - int i = 0; /* index in packed string */ - int j = 0; /* index in unpacked array */ - while (i < 30) { - int count = packed.charAt(i++); - char value = packed.charAt(i++); - do map[j++] = value; while (--count > 0); - } - return map; - } - - - /** - * Refills the input buffer. - * - * @return false, iff there was new input. - * - * @exception java.io.IOException if any I/O-Error occurs - */ - private boolean zzRefill() throws java.io.IOException { - - /* first: make room (if you can) */ - if (zzStartRead > 0) { - System.arraycopy(zzBuffer, zzStartRead, - zzBuffer, 0, - zzEndRead-zzStartRead); - - /* translate stored positions */ - zzEndRead-= zzStartRead; - zzCurrentPos-= zzStartRead; - zzMarkedPos-= zzStartRead; - zzPushbackPos-= zzStartRead; - zzStartRead = 0; - } - - /* is the buffer big enough? */ - if (zzCurrentPos >= zzBuffer.length) { - /* if not: blow it up */ - char newBuffer[] = new char[zzCurrentPos*2]; - System.arraycopy(zzBuffer, 0, newBuffer, 0, zzBuffer.length); - zzBuffer = newBuffer; - } - - /* finally: fill the buffer with new input */ - int numRead = zzReader.read(zzBuffer, zzEndRead, - zzBuffer.length-zzEndRead); - - if (numRead < 0) { - return true; - } - else { - zzEndRead+= numRead; - return false; - } - } - - - /** - * Closes the input stream. - */ - public final void yyclose() throws java.io.IOException { - zzAtEOF = true; /* indicate end of file */ - zzEndRead = zzStartRead; /* invalidate buffer */ - - if (zzReader != null) - zzReader.close(); - } - - - /** - * Resets the scanner to read from a new input stream. - * Does not close the old reader. - * - * All internal variables are reset, the old input stream - * cannot be reused (internal buffer is discarded and lost). - * Lexical state is set to ZZ_INITIAL. - * - * @param reader the new input stream - */ - public final void yyreset(java.io.Reader reader) { - zzReader = reader; - zzAtBOL = true; - zzAtEOF = false; - zzEndRead = zzStartRead = 0; - zzCurrentPos = zzMarkedPos = zzPushbackPos = 0; - yyline = yychar = yycolumn = 0; - zzLexicalState = YYINITIAL; - } - - - /** - * Returns the current lexical state. - */ - public final int yystate() { - return zzLexicalState; - } - - - /** - * Enters a new lexical state - * - * @param newState the new lexical state - */ - public final void yybegin(int newState) { - zzLexicalState = newState; - } - - - /** - * Returns the text matched by the current regular expression. - */ - public final String yytext() { - return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead ); - } - - - /** - * Returns the character at position pos from the - * matched text. - * - * It is equivalent to yytext().charAt(pos), but faster - * - * @param pos the position of the character to fetch. - * A value from 0 to yylength()-1. - * - * @return the character at position pos - */ - public final char yycharat(int pos) { - return zzBuffer[zzStartRead+pos]; - } - - - /** - * Returns the length of the matched text region. - */ - public final int yylength() { - return zzMarkedPos-zzStartRead; - } - - - /** - * Reports an error that occured while scanning. - * - * In a wellformed scanner (no or only correct usage of - * yypushback(int) and a match-all fallback rule) this method - * will only be called with things that "Can't Possibly Happen". - * If this method is called, something is seriously wrong - * (e.g. a JFlex bug producing a faulty scanner etc.). - * - * Usual syntax/scanner level error handling should be done - * in error fallback rules. - * - * @param errorCode the code of the errormessage to display - */ - private void zzScanError(int errorCode) { - String message; - try { - message = ZZ_ERROR_MSG[errorCode]; - } - catch (ArrayIndexOutOfBoundsException e) { - message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR]; - } - - throw new Error(message); - } - - - /** - * Pushes the specified amount of characters back into the input stream. - * - * They will be read again by then next call of the scanning method - * - * @param number the number of characters to be read again. - * This number must not be greater than yylength()! - */ - public void yypushback(int number) { - if ( number > yylength() ) - zzScanError(ZZ_PUSHBACK_2BIG); - - zzMarkedPos -= number; - } - - - /** - * Contains user EOF-code, which will be executed exactly once, - * when the end of file is reached - */ - private void zzDoEOF() throws java.io.IOException { - if (!zzEOFDone) { - zzEOFDone = true; - yyclose(); - } - } - - - /** - * Resumes scanning until the next regular expression is matched, - * the end of input is encountered or an I/O-Error occurs. - * - * @return the next token - * @exception java.io.IOException if any I/O-Error occurs - */ - public int yylex() throws java.io.IOException { - int zzInput; - int zzAction; - - // cached fields: - int zzCurrentPosL; - int zzMarkedPosL; - int zzEndReadL = zzEndRead; - char [] zzBufferL = zzBuffer; - char [] zzCMapL = ZZ_CMAP; - - - while (true) { - zzMarkedPosL = zzMarkedPos; - - boolean zzR = false; - for (zzCurrentPosL = zzStartRead; zzCurrentPosL < zzMarkedPosL; - zzCurrentPosL++) { - switch (zzBufferL[zzCurrentPosL]) { - case '\u000B': - case '\u000C': - case '\u0085': - case '\u2028': - case '\u2029': - yyline++; - yycolumn = 0; - zzR = false; - break; - case '\r': - yyline++; - yycolumn = 0; - zzR = true; - break; - case '\n': - if (zzR) - zzR = false; - else { - yyline++; - yycolumn = 0; - } - break; - default: - zzR = false; - yycolumn++; - } - } - - if (zzR) { - // peek one character ahead if it is \n (if we have counted one line too much) - boolean zzPeek; - if (zzMarkedPosL < zzEndReadL) - zzPeek = zzBufferL[zzMarkedPosL] == '\n'; - else if (zzAtEOF) - zzPeek = false; - else { - boolean eof = zzRefill(); - zzEndReadL = zzEndRead; - zzMarkedPosL = zzMarkedPos; - zzBufferL = zzBuffer; - if (eof) - zzPeek = false; - else - zzPeek = zzBufferL[zzMarkedPosL] == '\n'; - } - if (zzPeek) yyline--; - } - zzAction = -1; - - zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL; - - zzState = zzLexicalState; - - - zzForAction: { - while (true) { - - if (zzCurrentPosL < zzEndReadL) - zzInput = zzBufferL[zzCurrentPosL++]; - else if (zzAtEOF) { - zzInput = YYEOF; - break zzForAction; - } - else { - // store back cached positions - zzCurrentPos = zzCurrentPosL; - zzMarkedPos = zzMarkedPosL; - boolean eof = zzRefill(); - // get translated positions and possibly new buffer - zzCurrentPosL = zzCurrentPos; - zzMarkedPosL = zzMarkedPos; - zzBufferL = zzBuffer; - zzEndReadL = zzEndRead; - if (eof) { - zzInput = YYEOF; - break zzForAction; - } - else { - zzInput = zzBufferL[zzCurrentPosL++]; - } - } - zzInput = zzCMapL[zzInput]; - - boolean zzIsFinal = false; - boolean zzNoLookAhead = false; - - zzForNext: { switch (zzState) { - case 0: - switch (zzInput) { - case 1: zzIsFinal = true; zzState = 3; break zzForNext; - case 2: zzIsFinal = true; zzNoLookAhead = true; zzState = 4; break zzForNext; - case 3: zzIsFinal = true; zzState = 5; break zzForNext; - case 4: zzIsFinal = true; zzNoLookAhead = true; zzState = 6; break zzForNext; - case 5: zzIsFinal = true; zzState = 7; break zzForNext; - default: zzIsFinal = true; zzNoLookAhead = true; zzState = 2; break zzForNext; - } - - case 3: - switch (zzInput) { - case 2: zzIsFinal = true; zzNoLookAhead = true; zzState = 4; break zzForNext; - default: break zzForAction; - } - - case 5: - switch (zzInput) { - case 3: zzIsFinal = true; break zzForNext; - default: break zzForAction; - } - - case 7: - switch (zzInput) { - case 5: zzIsFinal = true; break zzForNext; - default: break zzForAction; - } - - default: - // if this is ever reached, there is a serious bug in JFlex - zzScanError(ZZ_UNKNOWN_ERROR); - break; - } } - - if ( zzIsFinal ) { - zzAction = zzState; - zzMarkedPosL = zzCurrentPosL; - if ( zzNoLookAhead ) break zzForAction; - } - - } - } - - // store back cached position - zzMarkedPos = zzMarkedPosL; - - switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) { - case 4: - { return operator(yycharat(0)); - } - case 5: break; - case 3: - { return intConst(yytext()); - } - case 6: break; - case 1: - { issueError(new UnrecogCharError(getLocation(), yycharat(0))); - } - case 7: break; - case 2: - { /* Just ignore */ - } - case 8: break; - default: - if (zzInput == YYEOF && zzStartRead == zzCurrentPos) { - zzAtEOF = true; - zzDoEOF(); - { return 0; } - } - else { - zzScanError(ZZ_NO_MATCH); - } - } - } - } - - -} diff --git a/demos/arith/src/arith/Lexer.l b/demos/arith/src/arith/Lexer.l deleted file mode 100755 index af3fd14..0000000 --- a/demos/arith/src/arith/Lexer.l +++ /dev/null @@ -1,42 +0,0 @@ -package arith; - -import arith.Location; -import arith.error.*; - -%% -%public -%class Lexer -%extends BaseLexer -%byaccj -%line -%column -%switch -%unicode - -%{ - private Location sloc = null; - private StringBuilder buffer = new StringBuilder(); - - public Location getLocation() { - return new Location(yyline + 1, yycolumn + 1); - } -%} - -NEWLINE = (\r|\n|\r\n) -DIGIT = ([0-9]) -INTEGER = ({DIGIT}+) -OPERATOR = ("+"|"*"|"("|")") -WHITESPACE = ([ \t]+) - -%x S - -%% - -{WHITESPACE} { /* Just ignore */ } -{NEWLINE} { /* Just ignore */ } - -{OPERATOR} { return operator(yycharat(0)); } - -{INTEGER} { return intConst(yytext()); } - -. { issueError(new UnrecogCharError(getLocation(), yycharat(0))); } diff --git a/demos/arith/src/arith/Location.java b/demos/arith/src/arith/Location.java deleted file mode 100644 index 0a939ff..0000000 --- a/demos/arith/src/arith/Location.java +++ /dev/null @@ -1,45 +0,0 @@ -package arith; - -/** - * Location of tokens. - */ -public class Location implements Comparable { - - public static final Location NO_LOCATION = new Location(-1, -1); - - /** - * Line number. - */ - private int line; - - /** - * Column number. - */ - private int column; - - public Location(int lin, int col) { - line = lin; - column = col; - } - - @Override - public String toString() { - return "(" + line + "," + column + ")"; - } - - public int compareTo(Location o) { - if (line > o.line) { - return 1; - } - if (line < o.line) { - return -1; - } - if (column > o.column) { - return 1; - } - if (column < o.column) { - return -1; - } - return 0; - } -} diff --git a/demos/arith/src/arith/Parser.java b/demos/arith/src/arith/Parser.java deleted file mode 100644 index 4d2bd16..0000000 --- a/demos/arith/src/arith/Parser.java +++ /dev/null @@ -1,211 +0,0 @@ -/* This is auto-generated Parser source by LL1-Parser-Gen. - * Specification file: /Users/paul/Workspace/LL1-Parser-Gen/demos/arith/src/arith/Parser.spec - * Options: unstrict mode - * Generated at: Tue Aug 08 14:15:03 CST 2017 - * Please do NOT modify it! - * - * Project repository: https://github.com/paulzfm/LL1-Parser-Gen - * Version: 1.0 - * Author: Zhu Fengmin (Paul) - */ - -package arith; - -import arith.Expr; -import arith.Expr.*; -import arith.error.CompileError; -import java.util.*; - -public class Parser extends BaseParser - { - private static final int eof = -1; - private static final int eos = 0; - private int lookahead = -1; - public SemValue val = new SemValue(); - - /* tokens */ - public static final int NUM = 257; //# line 25 - - /* search token name */ - private String[] tokens = { - "NUM", - }; - - private String name(int token) { - if (token >= 0 && token <= 256) { - return "'" + (char) token + "'"; - } else { - return tokens[token - 257]; - } - } - - public SemValue parse() throws Exception { - if (lookahead < 0) { - lookahead = lex(); - } - SemValue result = parseE(); - if (lookahead != eos && lookahead != eof) { - throw error(name(lookahead)); - } - return result; - } - - private SemValue matchToken(int expected) throws Exception { - SemValue self = val; - if (lookahead == expected) { - lookahead = lex(); - } else { - throw error(name(lookahead), name(expected)); - } - return self; - } - - /* parsers */ - //# line 38 - private SemValue parseE1() throws Exception { - switch (lookahead) { - case '+': - { - SemValue[] params = new SemValue[4]; - params[0] = new SemValue(); - params[1] = matchToken('+'); - params[2] = parseT(); - params[3] = parseE1(); - //# line 39 - params[0].terms.add(new Term(Expr.ADD, params[2].expr)); - params[0].terms.addAll(params[3].terms); - return params[0]; - } - case eof: - case eos: - case ')': - { - SemValue[] params = new SemValue[1]; - params[0] = new SemValue(); - /* no action */ - return params[0]; - } - default: - { - String[] acc = {name('+'), name('#'), name(')')}; - throw error(name(lookahead), acc); - } - } - } - - //# line 63 - private SemValue parseF() throws Exception { - switch (lookahead) { - case '(': - { - SemValue[] params = new SemValue[4]; - params[0] = new SemValue(); - params[1] = matchToken('('); - params[2] = parseE(); - params[3] = matchToken(')'); - //# line 64 - params[0].expr = params[2].expr; - return params[0]; - } - case NUM: - { - SemValue[] params = new SemValue[2]; - params[0] = new SemValue(); - params[1] = matchToken(NUM); - //# line 68 - params[0].expr = params[1].expr; - return params[0]; - } - default: - { - String[] acc = {name('('), name(NUM)}; - throw error(name(lookahead), acc); - } - } - } - - //# line 55 - private SemValue parseT1() throws Exception { - switch (lookahead) { - case '*': - { - SemValue[] params = new SemValue[4]; - params[0] = new SemValue(); - params[1] = matchToken('*'); - params[2] = parseF(); - params[3] = parseT1(); - //# line 56 - params[0].terms.add(new Term(Expr.MUL, params[2].expr)); - params[0].terms.addAll(params[3].terms); - return params[0]; - } - case '+': - case eof: - case eos: - case ')': - { - SemValue[] params = new SemValue[1]; - params[0] = new SemValue(); - /* no action */ - return params[0]; - } - default: - { - String[] acc = {name('*'), name('+'), name('#'), name(')')}; - throw error(name(lookahead), acc); - } - } - } - - //# line 29 - private SemValue parseE() throws Exception { - switch (lookahead) { - case NUM: - case '(': - { - SemValue[] params = new SemValue[3]; - params[0] = new SemValue(); - params[1] = parseT(); - params[2] = parseE1(); - //# line 30 - params[0].expr = params[1].expr; - for (Term t : params[2].terms) { - params[0].expr = new ArithExpr(t.op, params[0].expr, t.expr); - } - return params[0]; - } - default: - { - String[] acc = {name(NUM), name('(')}; - throw error(name(lookahead), acc); - } - } - } - - //# line 46 - private SemValue parseT() throws Exception { - switch (lookahead) { - case NUM: - case '(': - { - SemValue[] params = new SemValue[3]; - params[0] = new SemValue(); - params[1] = parseF(); - params[2] = parseT1(); - //# line 47 - params[0].expr = params[1].expr; - for (Term t : params[2].terms) { - params[0].expr = new ArithExpr(t.op, params[0].expr, t.expr); - } - return params[0]; - } - default: - { - String[] acc = {name(NUM), name('(')}; - throw error(name(lookahead), acc); - } - } - } - -} -/* end of file */ diff --git a/demos/arith/src/arith/Parser.spec b/demos/arith/src/arith/Parser.spec deleted file mode 100644 index b601eb1..0000000 --- a/demos/arith/src/arith/Parser.spec +++ /dev/null @@ -1,71 +0,0 @@ -/* CFG: - E -> E + T | T - T -> T * F | F - F -> (E) | a - - LL(1) Grammar: - E -> TE' - E' -> +TE' | `epsilon` - T -> FT' - T' -> *FT' | `epsilon` - F -> (E) | a - */ - -%package arith -%import -arith.Expr -arith.Expr.* -arith.error.CompileError -java.util.* - -%class Parser extends BaseParser -%sem SemValue -%start E - -%tokens NUM '+' '*' '(' ')' - -%% - -E : T E1 - { - $$.expr = $1.expr; - for (Term t : $2.terms) { - $$.expr = new ArithExpr(t.op, $$.expr, t.expr); - } - } - ; - -E1 : '+' T E1 - { - $$.terms.add(new Term(Expr.ADD, $2.expr)); - $$.terms.addAll($3.terms); - } - | /* empty */ - ; - -T : F T1 - { - $$.expr = $1.expr; - for (Term t : $2.terms) { - $$.expr = new ArithExpr(t.op, $$.expr, t.expr); - } - } - ; - -T1 : '*' F T1 - { - $$.terms.add(new Term(Expr.MUL, $2.expr)); - $$.terms.addAll($3.terms); - } - | /* empty */ - ; - -F : '(' E ')' - { - $$.expr = $2.expr; - } - | NUM - { - $$.expr = $1.expr; - } - ; diff --git a/demos/arith/src/arith/SemValue.java b/demos/arith/src/arith/SemValue.java deleted file mode 100644 index 49d46df..0000000 --- a/demos/arith/src/arith/SemValue.java +++ /dev/null @@ -1,38 +0,0 @@ -package arith; - -import arith.Expr; -import java.util.ArrayList; - -/** - * Semantic value. - */ -public class SemValue { - public Location loc; - - public Expr expr; - - public ArrayList terms = new ArrayList(); - - public int op; - - public static SemValue createOperator(int op) { - SemValue v = new SemValue(); - v.op = op; - return v; - } - - public static SemValue createNum(int value) { - SemValue v = new SemValue(); - v.expr = new Expr.Number(value); - return v; - } - - @Override - public String toString() { - String s = loc + ": expr=" + expr + ", op=" + op + ", terms="; - for (Expr.Term t: terms) { - s += (t + ","); - } - return s; - } -} \ No newline at end of file diff --git a/demos/arith/src/arith/error/CompileError.java b/demos/arith/src/arith/error/CompileError.java deleted file mode 100755 index e86efbd..0000000 --- a/demos/arith/src/arith/error/CompileError.java +++ /dev/null @@ -1,40 +0,0 @@ -package arith.error; - -import arith.Location; - -/** - * Compilation error. - */ -public abstract class CompileError extends Exception { - - /** - * Where error happens. - */ - protected Location location; - - /** - * @return description of error. - */ - protected abstract String getErrMsg(); - - public CompileError(Location location) { - this.location = location; - } - - public Location getLocation() { - return location; - } - - /** - * @return complete description of error including location. - */ - @Override - public String toString() { - if (location.equals(Location.NO_LOCATION)) { - return "*** Error: " + getErrMsg(); - } else { - return "*** Error at " + location + ": " + getErrMsg(); - } - } - -} diff --git a/demos/arith/src/arith/error/MsgError.java b/demos/arith/src/arith/error/MsgError.java deleted file mode 100755 index cccc3d0..0000000 --- a/demos/arith/src/arith/error/MsgError.java +++ /dev/null @@ -1,22 +0,0 @@ -package arith.error; - -import arith.Location; - -/** - * Message error, used by parser. - */ -public class MsgError extends CompileError { - - private String msg; - - public MsgError(Location location, String msg) { - super(location); - this.msg = msg; - } - - @Override - protected String getErrMsg() { - return msg; - } - -} diff --git a/demos/arith/src/arith/error/UnrecogCharError.java b/demos/arith/src/arith/error/UnrecogCharError.java deleted file mode 100755 index c324989..0000000 --- a/demos/arith/src/arith/error/UnrecogCharError.java +++ /dev/null @@ -1,21 +0,0 @@ -package arith.error; - -import arith.Location; - -/** - * Unrecognize character. - */ -public class UnrecogCharError extends CompileError { - - private char c; - - public UnrecogCharError(Location location, char c) { - super(location); - this.c = c; - } - - @Override - protected String getErrMsg() { - return "unrecognized character '" + c + "'"; - } -} diff --git a/demos/decaf/build.xml b/demos/decaf/build.xml deleted file mode 100755 index aabe588..0000000 --- a/demos/decaf/build.xml +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/demos/decaf/src/decaf/BaseLexer.java b/demos/decaf/src/decaf/BaseLexer.java deleted file mode 100755 index 70de5dc..0000000 --- a/demos/decaf/src/decaf/BaseLexer.java +++ /dev/null @@ -1,81 +0,0 @@ -package decaf; - -import java.io.IOException; - -import decaf.Driver; -import decaf.Location; -import decaf.error.*; -import decaf.Tree; - -/** - * Base class of `Lexer`, which is generated by `JFlex`. - */ -public abstract class BaseLexer { - - private Parser parser; - - public void setParser(Parser parser) { - this.parser = parser; - } - - /** - * Lexer function of `JFlex`. - * - * @return the parsed token from input. - * @throws IOException - */ - abstract int yylex() throws IOException; - - abstract Location getLocation(); - - private DecafError error = null; - - public void handleError() throws DecafError { - if (error != null) throw error; - } - - protected void issueError(DecafError err) { - error = err; - } - - protected void setSemantic(Location where, SemValue v) { - v.loc = where; - parser.val = v; - } - - protected int keyword(int code) { - setSemantic(getLocation(), SemValue.createKeyword(code)); - return code; - } - - protected int operator(int code) { - setSemantic(getLocation(), SemValue.createOperator(code)); - return code; - } - - protected int boolConst(boolean bval) { - setSemantic(getLocation(), SemValue.createLiteral(Tree.BOOL, bval)); - return Parser.LITERAL; - } - - protected int StringConst(String sval, Location loc) { - setSemantic(loc, SemValue.createLiteral(Tree.STRING, sval)); - return Parser.LITERAL; - } - - protected int intConst(String ival) { - try { - setSemantic(getLocation(), SemValue.createLiteral( - Tree.INT, Integer.decode(ival))); - } catch (NumberFormatException e) { - issueError(new IntTooLargeError(getLocation(), ival)); - } - return Parser.LITERAL; - } - - protected int identifier(String name) { - setSemantic(getLocation(), SemValue.createIdentifier(name)); - return Parser.IDENTIFIER; - } - -} diff --git a/demos/decaf/src/decaf/BaseParser.java b/demos/decaf/src/decaf/BaseParser.java deleted file mode 100755 index efc156f..0000000 --- a/demos/decaf/src/decaf/BaseParser.java +++ /dev/null @@ -1,84 +0,0 @@ -package decaf; - -import decaf.error.MsgError; -import decaf.Tree; - -import java.util.Arrays; - -/** - * Base class of `Parser`, generated by our tool. - */ -public abstract class BaseParser { - private Lexer lexer; - - public void setLexer(Lexer lexer) { - this.lexer = lexer; - } - - /** - * Custom function to handle syntax error when EOF or EOS expected, but `token` found. - * - * @param token actual token found. - * @return an instance of error. - */ - protected MsgError error(String token) { - return new MsgError(lexer.getLocation(), "EOF is expected but " + token + " is " + "found"); - } - - /** - * Custom function to handle syntax error when `expected` is expected but `token` is found. - * - * @param token actual token found. - * @param expected expected token. - * @return an instance of error. - */ - protected MsgError error(String token, String expected) { - return new MsgError(lexer.getLocation(), - expected + " is expected but " + token + " is " + "found"); - } - - /** - * Custom function to handle syntax error when one of `acceptable` token is acceptable but - * `token` is found. - * - * @param token actual token found. - * @param acceptable accepted tokens. - * @return an instance of error. - */ - protected MsgError error(String token, String[] acceptable) { - return new MsgError(lexer.getLocation(), - Arrays.toString(acceptable) + " are expected but " + token + " is " + "found"); - } - - /** - * Custom function to communicate with lexer. - * - * @return token. - * @throws Exception. - */ - protected int lex() throws Exception { - int token = lexer.yylex(); - lexer.handleError(); - return token; - } - - /** - * Parse function of our tool. - * - * @return value of start symbol if successfully parsed. - * @throws Exception. - */ - abstract protected SemValue parse() throws Exception; - - /** - * Explict interface for calling the parser. - * - * @return the expression if successfully parsed. - * @throws Exception. - */ - public Tree.TopLevel parseFile() throws Exception { - SemValue v = parse(); - return v.prog; - } - -} diff --git a/demos/decaf/src/decaf/Driver.java b/demos/decaf/src/decaf/Driver.java deleted file mode 100755 index d269b8a..0000000 --- a/demos/decaf/src/decaf/Driver.java +++ /dev/null @@ -1,59 +0,0 @@ -package decaf; - -import java.io.*; - -import decaf.Lexer; -import decaf.Parser; -import decaf.Tree; -import decaf.error.DecafError; -import decaf.utils.IndentPrintWriter; - -/** - * Main class of demo `decaf`. - * - * Input: a decaf program source path. - * Output: the decaf AST. - */ -public final class Driver { - - private static Driver driver; - - private Lexer lexer; - - private Parser parser; - - public static Driver getDriver() { - return driver; - } - - public void issueError(DecafError error) throws DecafError { - throw error; - } - - private void compile(InputStream in) throws Exception { - lexer = new Lexer(in); - parser = new Parser(); - lexer.setParser(parser); - parser.setLexer(lexer); - Tree.TopLevel tree = parser.parseFile(); - IndentPrintWriter pw = new IndentPrintWriter(System.out, 4); - tree.printTo(pw); - pw.close(); - } - - public static void main(String[] args) throws IOException { - driver = new Driver(); - if (args.length != 1) { - System.err.println("Usage: java -jar decaf.jar source_file"); - System.exit(1); - } - - InputStream in = new FileInputStream(args[0]); - try { - driver.compile(in); - } catch (Exception err) { - System.err.println(err); - } - } - -} diff --git a/demos/decaf/src/decaf/Lexer.java b/demos/decaf/src/decaf/Lexer.java deleted file mode 100644 index 4ff428a..0000000 --- a/demos/decaf/src/decaf/Lexer.java +++ /dev/null @@ -1,2867 +0,0 @@ -/* The following code was generated by JFlex 1.4.1 on 8/8/17 2:14 PM */ - -package decaf; - -import decaf.Location; -import decaf.error.*; -import decaf.utils.MiscUtils; - - -/** - * This class is a scanner generated by - * JFlex 1.4.1 - * on 8/8/17 2:14 PM from the specification file - * src/decaf/Lexer.l - */ -public class Lexer extends BaseLexer { - - /** This character denotes the end of file */ - public static final int YYEOF = -1; - - /** initial size of the lookahead buffer */ - private static final int ZZ_BUFFERSIZE = 16384; - - /** lexical states */ - public static final int S = 1; - public static final int YYINITIAL = 0; - - /** - * Translates characters to character classes - */ - private static final String ZZ_CMAP_PACKED = - "\11\0\1\17\1\2\2\0\1\1\22\0\1\17\1\16\1\52\2\0"+ - "\1\11\1\50\1\0\1\11\1\11\1\11\1\11\1\11\1\11\1\11"+ - "\1\12\1\5\11\3\1\11\1\11\1\14\1\13\1\15\1\11\1\0"+ - "\6\4\2\7\1\46\2\7\1\47\3\7\1\44\1\7\1\45\5\7"+ - "\1\6\2\7\1\11\1\53\1\11\1\0\1\10\1\0\1\37\1\26"+ - "\1\36\1\23\1\33\1\42\1\32\1\41\1\22\1\7\1\43\1\27"+ - "\1\7\1\24\1\21\2\7\1\31\1\30\1\25\1\35\1\20\1\34"+ - "\1\40\2\7\1\11\1\51\1\11\uff82\0"; - - /** - * Translates characters to character classes - */ - private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED); - - /** - * Translates DFA states to action switch labels. - */ - private static final int [] ZZ_ACTION = zzUnpackAction(); - - private static final String ZZ_ACTION_PACKED_0 = - "\2\0\1\1\2\2\1\3\1\4\1\3\6\5\1\2"+ - "\15\4\2\1\1\6\1\7\2\10\1\11\1\7\2\0"+ - "\1\12\1\13\1\14\1\15\2\4\1\16\20\4\1\17"+ - "\1\20\1\21\1\22\1\23\1\24\1\3\1\4\1\25"+ - "\1\4\1\26\14\4\1\27\3\4\1\30\1\4\1\31"+ - "\1\32\1\33\1\34\4\4\1\35\7\4\1\36\4\4"+ - "\1\37\1\40\1\41\1\42\3\4\1\43\1\44\1\45"+ - "\4\4\1\46\4\4\1\47\2\4\1\50\1\4\1\51"; - - private static int [] zzUnpackAction() { - int [] result = new int[136]; - int offset = 0; - offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result); - return result; - } - - private static int zzUnpackAction(String packed, int offset, int [] result) { - int i = 0; /* index in packed string */ - int j = offset; /* index in unpacked array */ - int l = packed.length(); - while (i < l) { - int count = packed.charAt(i++); - int value = packed.charAt(i++); - do result[j++] = value; while (--count > 0); - } - return j; - } - - - /* error codes */ - private static final int ZZ_UNKNOWN_ERROR = 0; - private static final int ZZ_NO_MATCH = 1; - private static final int ZZ_PUSHBACK_2BIG = 2; - - /* error messages for the codes above */ - private static final String ZZ_ERROR_MSG[] = { - "Unkown internal scanner error", - "Error: could not match input", - "Error: pushback value was too large" - }; - - /** the input device */ - private java.io.Reader zzReader; - - /** the current state of the DFA */ - private int zzState; - - /** the current lexical state */ - private int zzLexicalState = YYINITIAL; - - /** this buffer contains the current text to be matched and is - the source of the yytext() string */ - private char zzBuffer[] = new char[ZZ_BUFFERSIZE]; - - /** the textposition at the last accepting state */ - private int zzMarkedPos; - - /** the textposition at the last state to be included in yytext */ - private int zzPushbackPos; - - /** the current text position in the buffer */ - private int zzCurrentPos; - - /** startRead marks the beginning of the yytext() string in the buffer */ - private int zzStartRead; - - /** endRead marks the last character in the buffer, that has been read - from input */ - private int zzEndRead; - - /** number of newlines encountered up to the start of the matched text */ - private int yyline; - - /** the number of characters up to the start of the matched text */ - private int yychar; - - /** - * the number of characters from the last newline up to the start of the - * matched text - */ - private int yycolumn; - - /** - * zzAtBOL == true <=> the scanner is currently at the beginning of a line - */ - private boolean zzAtBOL = true; - - /** zzAtEOF == true <=> the scanner is at the EOF */ - private boolean zzAtEOF; - - /** denotes if the user-EOF-code has already been executed */ - private boolean zzEOFDone; - - /* user code: */ - private Location sloc = null; - private StringBuilder buffer = new StringBuilder(); - - public Location getLocation() { - return new decaf.Location(yyline + 1, yycolumn + 1); - } - - - /** - * Creates a new scanner - * There is also a java.io.InputStream version of this constructor. - * - * @param in the java.io.Reader to read input from. - */ - public Lexer(java.io.Reader in) { - this.zzReader = in; - } - - /** - * Creates a new scanner. - * There is also java.io.Reader version of this constructor. - * - * @param in the java.io.Inputstream to read input from. - */ - public Lexer(java.io.InputStream in) { - this(new java.io.InputStreamReader(in)); - } - - /** - * Unpacks the compressed character translation table. - * - * @param packed the packed character translation table - * @return the unpacked character translation table - */ - private static char [] zzUnpackCMap(String packed) { - char [] map = new char[0x10000]; - int i = 0; /* index in packed string */ - int j = 0; /* index in unpacked array */ - while (i < 152) { - int count = packed.charAt(i++); - char value = packed.charAt(i++); - do map[j++] = value; while (--count > 0); - } - return map; - } - - - /** - * Refills the input buffer. - * - * @return false, iff there was new input. - * - * @exception java.io.IOException if any I/O-Error occurs - */ - private boolean zzRefill() throws java.io.IOException { - - /* first: make room (if you can) */ - if (zzStartRead > 0) { - System.arraycopy(zzBuffer, zzStartRead, - zzBuffer, 0, - zzEndRead-zzStartRead); - - /* translate stored positions */ - zzEndRead-= zzStartRead; - zzCurrentPos-= zzStartRead; - zzMarkedPos-= zzStartRead; - zzPushbackPos-= zzStartRead; - zzStartRead = 0; - } - - /* is the buffer big enough? */ - if (zzCurrentPos >= zzBuffer.length) { - /* if not: blow it up */ - char newBuffer[] = new char[zzCurrentPos*2]; - System.arraycopy(zzBuffer, 0, newBuffer, 0, zzBuffer.length); - zzBuffer = newBuffer; - } - - /* finally: fill the buffer with new input */ - int numRead = zzReader.read(zzBuffer, zzEndRead, - zzBuffer.length-zzEndRead); - - if (numRead < 0) { - return true; - } - else { - zzEndRead+= numRead; - return false; - } - } - - - /** - * Closes the input stream. - */ - public final void yyclose() throws java.io.IOException { - zzAtEOF = true; /* indicate end of file */ - zzEndRead = zzStartRead; /* invalidate buffer */ - - if (zzReader != null) - zzReader.close(); - } - - - /** - * Resets the scanner to read from a new input stream. - * Does not close the old reader. - * - * All internal variables are reset, the old input stream - * cannot be reused (internal buffer is discarded and lost). - * Lexical state is set to ZZ_INITIAL. - * - * @param reader the new input stream - */ - public final void yyreset(java.io.Reader reader) { - zzReader = reader; - zzAtBOL = true; - zzAtEOF = false; - zzEndRead = zzStartRead = 0; - zzCurrentPos = zzMarkedPos = zzPushbackPos = 0; - yyline = yychar = yycolumn = 0; - zzLexicalState = YYINITIAL; - } - - - /** - * Returns the current lexical state. - */ - public final int yystate() { - return zzLexicalState; - } - - - /** - * Enters a new lexical state - * - * @param newState the new lexical state - */ - public final void yybegin(int newState) { - zzLexicalState = newState; - } - - - /** - * Returns the text matched by the current regular expression. - */ - public final String yytext() { - return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead ); - } - - - /** - * Returns the character at position pos from the - * matched text. - * - * It is equivalent to yytext().charAt(pos), but faster - * - * @param pos the position of the character to fetch. - * A value from 0 to yylength()-1. - * - * @return the character at position pos - */ - public final char yycharat(int pos) { - return zzBuffer[zzStartRead+pos]; - } - - - /** - * Returns the length of the matched text region. - */ - public final int yylength() { - return zzMarkedPos-zzStartRead; - } - - - /** - * Reports an error that occured while scanning. - * - * In a wellformed scanner (no or only correct usage of - * yypushback(int) and a match-all fallback rule) this method - * will only be called with things that "Can't Possibly Happen". - * If this method is called, something is seriously wrong - * (e.g. a JFlex bug producing a faulty scanner etc.). - * - * Usual syntax/scanner level error handling should be done - * in error fallback rules. - * - * @param errorCode the code of the errormessage to display - */ - private void zzScanError(int errorCode) { - String message; - try { - message = ZZ_ERROR_MSG[errorCode]; - } - catch (ArrayIndexOutOfBoundsException e) { - message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR]; - } - - throw new Error(message); - } - - - /** - * Pushes the specified amount of characters back into the input stream. - * - * They will be read again by then next call of the scanning method - * - * @param number the number of characters to be read again. - * This number must not be greater than yylength()! - */ - public void yypushback(int number) { - if ( number > yylength() ) - zzScanError(ZZ_PUSHBACK_2BIG); - - zzMarkedPos -= number; - } - - - /** - * Contains user EOF-code, which will be executed exactly once, - * when the end of file is reached - */ - private void zzDoEOF() throws java.io.IOException { - if (!zzEOFDone) { - zzEOFDone = true; - yyclose(); - } - } - - - /** - * Resumes scanning until the next regular expression is matched, - * the end of input is encountered or an I/O-Error occurs. - * - * @return the next token - * @exception java.io.IOException if any I/O-Error occurs - */ - public int yylex() throws java.io.IOException { - int zzInput; - int zzAction; - - // cached fields: - int zzCurrentPosL; - int zzMarkedPosL; - int zzEndReadL = zzEndRead; - char [] zzBufferL = zzBuffer; - char [] zzCMapL = ZZ_CMAP; - - - while (true) { - zzMarkedPosL = zzMarkedPos; - - boolean zzR = false; - for (zzCurrentPosL = zzStartRead; zzCurrentPosL < zzMarkedPosL; - zzCurrentPosL++) { - switch (zzBufferL[zzCurrentPosL]) { - case '\u000B': - case '\u000C': - case '\u0085': - case '\u2028': - case '\u2029': - yyline++; - yycolumn = 0; - zzR = false; - break; - case '\r': - yyline++; - yycolumn = 0; - zzR = true; - break; - case '\n': - if (zzR) - zzR = false; - else { - yyline++; - yycolumn = 0; - } - break; - default: - zzR = false; - yycolumn++; - } - } - - if (zzR) { - // peek one character ahead if it is \n (if we have counted one line too much) - boolean zzPeek; - if (zzMarkedPosL < zzEndReadL) - zzPeek = zzBufferL[zzMarkedPosL] == '\n'; - else if (zzAtEOF) - zzPeek = false; - else { - boolean eof = zzRefill(); - zzEndReadL = zzEndRead; - zzMarkedPosL = zzMarkedPos; - zzBufferL = zzBuffer; - if (eof) - zzPeek = false; - else - zzPeek = zzBufferL[zzMarkedPosL] == '\n'; - } - if (zzPeek) yyline--; - } - zzAction = -1; - - zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL; - - zzState = zzLexicalState; - - - zzForAction: { - while (true) { - - if (zzCurrentPosL < zzEndReadL) - zzInput = zzBufferL[zzCurrentPosL++]; - else if (zzAtEOF) { - zzInput = YYEOF; - break zzForAction; - } - else { - // store back cached positions - zzCurrentPos = zzCurrentPosL; - zzMarkedPos = zzMarkedPosL; - boolean eof = zzRefill(); - // get translated positions and possibly new buffer - zzCurrentPosL = zzCurrentPos; - zzMarkedPosL = zzMarkedPos; - zzBufferL = zzBuffer; - zzEndReadL = zzEndRead; - if (eof) { - zzInput = YYEOF; - break zzForAction; - } - else { - zzInput = zzBufferL[zzCurrentPosL++]; - } - } - zzInput = zzCMapL[zzInput]; - - boolean zzIsFinal = false; - boolean zzNoLookAhead = false; - - zzForNext: { switch (zzState) { - case 0: - switch (zzInput) { - case 0: - case 8: - case 43: zzIsFinal = true; zzNoLookAhead = true; zzState = 2; break zzForNext; - case 1: zzIsFinal = true; zzState = 3; break zzForNext; - case 2: zzIsFinal = true; zzNoLookAhead = true; zzState = 4; break zzForNext; - case 3: zzIsFinal = true; zzState = 5; break zzForNext; - case 5: zzIsFinal = true; zzState = 7; break zzForNext; - case 9: zzIsFinal = true; zzNoLookAhead = true; zzState = 8; break zzForNext; - case 10: zzIsFinal = true; zzState = 9; break zzForNext; - case 11: zzIsFinal = true; zzState = 10; break zzForNext; - case 12: zzIsFinal = true; zzState = 11; break zzForNext; - case 13: zzIsFinal = true; zzState = 12; break zzForNext; - case 14: zzIsFinal = true; zzState = 13; break zzForNext; - case 15: zzIsFinal = true; zzState = 14; break zzForNext; - case 16: zzIsFinal = true; zzState = 15; break zzForNext; - case 18: zzIsFinal = true; zzState = 16; break zzForNext; - case 20: zzIsFinal = true; zzState = 17; break zzForNext; - case 21: zzIsFinal = true; zzState = 18; break zzForNext; - case 22: zzIsFinal = true; zzState = 19; break zzForNext; - case 24: zzIsFinal = true; zzState = 20; break zzForNext; - case 25: zzIsFinal = true; zzState = 21; break zzForNext; - case 27: zzIsFinal = true; zzState = 22; break zzForNext; - case 28: zzIsFinal = true; zzState = 23; break zzForNext; - case 30: zzIsFinal = true; zzState = 24; break zzForNext; - case 34: zzIsFinal = true; zzState = 25; break zzForNext; - case 36: zzIsFinal = true; zzState = 26; break zzForNext; - case 37: zzIsFinal = true; zzState = 27; break zzForNext; - case 40: zzIsFinal = true; zzState = 28; break zzForNext; - case 41: zzIsFinal = true; zzState = 29; break zzForNext; - case 42: zzIsFinal = true; zzNoLookAhead = true; zzState = 30; break zzForNext; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 1: - switch (zzInput) { - case 1: zzIsFinal = true; zzState = 32; break zzForNext; - case 2: zzIsFinal = true; zzNoLookAhead = true; zzState = 33; break zzForNext; - case 42: zzIsFinal = true; zzNoLookAhead = true; zzState = 34; break zzForNext; - case 43: zzIsFinal = true; zzState = 35; break zzForNext; - default: zzIsFinal = true; zzNoLookAhead = true; zzState = 31; break zzForNext; - } - - case 3: - switch (zzInput) { - case 2: zzIsFinal = true; zzNoLookAhead = true; zzState = 4; break zzForNext; - default: break zzForAction; - } - - case 5: - switch (zzInput) { - case 3: - case 5: zzIsFinal = true; break zzForNext; - default: break zzForAction; - } - - case 6: - switch (zzInput) { - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; break zzForNext; - } - - case 7: - switch (zzInput) { - case 3: - case 5: zzIsFinal = true; zzState = 5; break zzForNext; - case 6: - case 32: zzState = 36; break zzForNext; - default: break zzForAction; - } - - case 9: - switch (zzInput) { - case 10: zzState = 37; break zzForNext; - default: break zzForAction; - } - - case 10: - switch (zzInput) { - case 11: zzIsFinal = true; zzNoLookAhead = true; zzState = 38; break zzForNext; - default: break zzForAction; - } - - case 11: - switch (zzInput) { - case 11: zzIsFinal = true; zzNoLookAhead = true; zzState = 39; break zzForNext; - default: break zzForAction; - } - - case 12: - switch (zzInput) { - case 11: zzIsFinal = true; zzNoLookAhead = true; zzState = 40; break zzForNext; - default: break zzForAction; - } - - case 13: - switch (zzInput) { - case 11: zzIsFinal = true; zzNoLookAhead = true; zzState = 41; break zzForNext; - default: break zzForAction; - } - - case 14: - switch (zzInput) { - case 15: zzIsFinal = true; break zzForNext; - default: break zzForAction; - } - - case 15: - switch (zzInput) { - case 17: zzIsFinal = true; zzState = 42; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 16: - switch (zzInput) { - case 20: zzIsFinal = true; zzState = 43; break zzForNext; - case 34: zzIsFinal = true; zzState = 44; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 17: - switch (zzInput) { - case 27: zzIsFinal = true; zzState = 45; break zzForNext; - case 29: zzIsFinal = true; zzState = 46; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 18: - switch (zzInput) { - case 25: zzIsFinal = true; zzState = 47; break zzForNext; - case 33: zzIsFinal = true; zzState = 48; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 19: - switch (zzInput) { - case 17: zzIsFinal = true; zzState = 49; break zzForNext; - case 25: zzIsFinal = true; zzState = 50; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 20: - switch (zzInput) { - case 21: zzIsFinal = true; zzState = 51; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 21: - switch (zzInput) { - case 27: zzIsFinal = true; zzState = 52; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 22: - switch (zzInput) { - case 23: zzIsFinal = true; zzState = 53; break zzForNext; - case 32: zzIsFinal = true; zzState = 54; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 23: - switch (zzInput) { - case 33: zzIsFinal = true; zzState = 55; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 24: - switch (zzInput) { - case 23: zzIsFinal = true; zzState = 56; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 25: - switch (zzInput) { - case 17: zzIsFinal = true; zzState = 57; break zzForNext; - case 31: zzIsFinal = true; zzState = 58; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 26: - switch (zzInput) { - case 25: zzIsFinal = true; zzState = 59; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 27: - switch (zzInput) { - case 27: zzIsFinal = true; zzState = 60; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 28: - switch (zzInput) { - case 40: zzIsFinal = true; zzNoLookAhead = true; zzState = 61; break zzForNext; - default: break zzForAction; - } - - case 29: - switch (zzInput) { - case 41: zzIsFinal = true; zzNoLookAhead = true; zzState = 62; break zzForNext; - default: break zzForAction; - } - - case 32: - switch (zzInput) { - case 2: zzIsFinal = true; zzNoLookAhead = true; zzState = 33; break zzForNext; - default: break zzForAction; - } - - case 35: - switch (zzInput) { - case 20: zzIsFinal = true; zzNoLookAhead = true; zzState = 63; break zzForNext; - case 21: zzIsFinal = true; zzNoLookAhead = true; zzState = 64; break zzForNext; - case 42: zzIsFinal = true; zzNoLookAhead = true; zzState = 65; break zzForNext; - case 43: zzIsFinal = true; zzNoLookAhead = true; zzState = 66; break zzForNext; - default: break zzForAction; - } - - case 36: - switch (zzInput) { - case 3: - case 4: - case 5: - case 19: - case 22: - case 27: - case 30: - case 31: - case 34: zzIsFinal = true; zzState = 67; break zzForNext; - default: break zzForAction; - } - - case 37: - switch (zzInput) { - case 1: zzIsFinal = true; zzState = 3; break zzForNext; - case 2: zzIsFinal = true; zzNoLookAhead = true; zzState = 4; break zzForNext; - default: break zzForNext; - } - - case 42: - switch (zzInput) { - case 18: zzIsFinal = true; zzState = 68; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 43: - switch (zzInput) { - case 21: zzIsFinal = true; zzState = 69; break zzForNext; - case 24: zzIsFinal = true; zzState = 70; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 44: - switch (zzInput) { - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 45: - switch (zzInput) { - case 28: zzIsFinal = true; zzState = 71; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 46: - switch (zzInput) { - case 23: zzIsFinal = true; zzState = 72; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 47: - switch (zzInput) { - case 29: zzIsFinal = true; zzState = 73; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 48: - switch (zzInput) { - case 18: zzIsFinal = true; zzState = 74; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 49: - switch (zzInput) { - case 17: zzIsFinal = true; zzState = 75; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 50: - switch (zzInput) { - case 27: zzIsFinal = true; zzState = 76; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 51: - switch (zzInput) { - case 25: zzIsFinal = true; zzState = 77; break zzForNext; - case 31: zzIsFinal = true; zzState = 78; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 52: - switch (zzInput) { - case 21: zzIsFinal = true; zzState = 79; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 53: - switch (zzInput) { - case 24: zzIsFinal = true; zzState = 80; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 54: - switch (zzInput) { - case 21: zzIsFinal = true; zzState = 81; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 55: - switch (zzInput) { - case 18: zzIsFinal = true; zzState = 82; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 56: - switch (zzInput) { - case 31: zzIsFinal = true; zzState = 83; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 57: - switch (zzInput) { - case 25: zzIsFinal = true; zzState = 84; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 58: - switch (zzInput) { - case 23: zzIsFinal = true; zzState = 85; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 59: - switch (zzInput) { - case 18: zzIsFinal = true; zzState = 86; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 60: - switch (zzInput) { - case 31: zzIsFinal = true; zzState = 87; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 67: - switch (zzInput) { - case 3: - case 4: - case 5: - case 19: - case 22: - case 27: - case 30: - case 31: - case 34: zzIsFinal = true; break zzForNext; - default: break zzForAction; - } - - case 68: - switch (zzInput) { - case 19: zzIsFinal = true; zzState = 88; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 69: - switch (zzInput) { - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 70: - switch (zzInput) { - case 21: zzIsFinal = true; zzState = 89; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 71: - switch (zzInput) { - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 72: - switch (zzInput) { - case 23: zzIsFinal = true; zzState = 90; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 73: - switch (zzInput) { - case 27: zzIsFinal = true; zzState = 91; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 74: - switch (zzInput) { - case 24: zzIsFinal = true; zzState = 92; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 75: - switch (zzInput) { - case 23: zzIsFinal = true; zzState = 93; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 76: - switch (zzInput) { - case 31: zzIsFinal = true; zzState = 94; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 77: - switch (zzInput) { - case 18: zzIsFinal = true; zzState = 95; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 78: - switch (zzInput) { - case 21: zzIsFinal = true; zzState = 96; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 79: - switch (zzInput) { - case 29: zzIsFinal = true; zzState = 97; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 80: - switch (zzInput) { - case 27: zzIsFinal = true; zzState = 98; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 81: - switch (zzInput) { - case 27: zzIsFinal = true; zzState = 99; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 82: - switch (zzInput) { - case 23: zzIsFinal = true; zzState = 100; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 83: - switch (zzInput) { - case 24: zzIsFinal = true; zzState = 101; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 84: - switch (zzInput) { - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 85: - switch (zzInput) { - case 24: zzIsFinal = true; zzState = 102; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 86: - switch (zzInput) { - case 20: zzIsFinal = true; zzState = 103; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 87: - switch (zzInput) { - case 19: zzIsFinal = true; zzState = 104; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 88: - switch (zzInput) { - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 89: - switch (zzInput) { - case 31: zzIsFinal = true; zzState = 105; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 90: - switch (zzInput) { - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 91: - switch (zzInput) { - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 92: - switch (zzInput) { - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 93: - switch (zzInput) { - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 94: - switch (zzInput) { - case 35: zzIsFinal = true; zzState = 106; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 95: - switch (zzInput) { - case 20: zzIsFinal = true; zzState = 107; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 96: - switch (zzInput) { - case 18: zzIsFinal = true; zzState = 108; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 97: - switch (zzInput) { - case 25: zzIsFinal = true; zzState = 109; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 98: - switch (zzInput) { - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 99: - switch (zzInput) { - case 20: zzIsFinal = true; zzState = 110; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 100: - switch (zzInput) { - case 27: zzIsFinal = true; zzState = 111; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 101: - switch (zzInput) { - case 24: zzIsFinal = true; zzState = 112; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 102: - switch (zzInput) { - case 27: zzIsFinal = true; zzState = 113; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 103: - switch (zzInput) { - case 21: zzIsFinal = true; zzState = 114; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 104: - switch (zzInput) { - case 38: zzIsFinal = true; zzState = 115; break zzForNext; - case 39: zzIsFinal = true; zzState = 116; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 105: - switch (zzInput) { - case 20: zzIsFinal = true; zzState = 117; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 106: - switch (zzInput) { - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 107: - switch (zzInput) { - case 26: zzIsFinal = true; zzState = 118; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 108: - switch (zzInput) { - case 30: zzIsFinal = true; zzState = 119; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 109: - switch (zzInput) { - case 20: zzIsFinal = true; zzState = 120; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 110: - switch (zzInput) { - case 19: zzIsFinal = true; zzState = 121; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 111: - switch (zzInput) { - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 112: - switch (zzInput) { - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 113: - switch (zzInput) { - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 114: - switch (zzInput) { - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 115: - switch (zzInput) { - case 20: zzIsFinal = true; zzState = 122; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 116: - switch (zzInput) { - case 18: zzIsFinal = true; zzState = 123; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 117: - switch (zzInput) { - case 30: zzIsFinal = true; zzState = 124; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 118: - switch (zzInput) { - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 119: - switch (zzInput) { - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 120: - switch (zzInput) { - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 121: - switch (zzInput) { - case 24: zzIsFinal = true; zzState = 125; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 122: - switch (zzInput) { - case 21: zzIsFinal = true; zzState = 126; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 123: - switch (zzInput) { - case 20: zzIsFinal = true; zzState = 127; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 124: - switch (zzInput) { - case 27: zzIsFinal = true; zzState = 128; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 125: - switch (zzInput) { - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 126: - switch (zzInput) { - case 27: zzIsFinal = true; zzState = 129; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 127: - switch (zzInput) { - case 27: zzIsFinal = true; zzState = 130; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 128: - switch (zzInput) { - case 17: zzIsFinal = true; zzState = 131; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 129: - switch (zzInput) { - case 26: zzIsFinal = true; zzState = 132; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 130: - switch (zzInput) { - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 131: - switch (zzInput) { - case 34: zzIsFinal = true; zzState = 133; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 132: - switch (zzInput) { - case 27: zzIsFinal = true; zzState = 134; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 133: - switch (zzInput) { - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 134: - switch (zzInput) { - case 25: zzIsFinal = true; zzState = 135; break zzForNext; - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - case 135: - switch (zzInput) { - case 0: - case 1: - case 2: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 40: - case 41: - case 42: - case 43: break zzForAction; - default: zzIsFinal = true; zzState = 6; break zzForNext; - } - - default: - // if this is ever reached, there is a serious bug in JFlex - zzScanError(ZZ_UNKNOWN_ERROR); - break; - } } - - if ( zzIsFinal ) { - zzAction = zzState; - zzMarkedPosL = zzCurrentPosL; - if ( zzNoLookAhead ) break zzForAction; - } - - } - } - - // store back cached position - zzMarkedPos = zzMarkedPosL; - - switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) { - case 18: - { buffer.append('\t'); - } - case 42: break; - case 24: - { return keyword(Parser.VOID); - } - case 43: break; - case 33: - { return boolConst(false); - } - case 44: break; - case 30: - { return keyword(Parser.BREAK); - } - case 45: break; - case 19: - { buffer.append('"'); - } - case 46: break; - case 31: - { return keyword(Parser.WHILE); - } - case 47: break; - case 29: - { return keyword(Parser.ELSE); - } - case 48: break; - case 4: - { return identifier(yytext()); - } - case 49: break; - case 20: - { buffer.append('\\'); - } - case 50: break; - case 27: - { return keyword(Parser.THIS); - } - case 51: break; - case 14: - { return keyword(Parser.IF); - } - case 52: break; - case 10: - { return operator(Parser.EQUAL); - } - case 53: break; - case 9: - { yybegin(YYINITIAL); - return StringConst(buffer.toString(), sloc); - } - case 54: break; - case 28: - { return keyword(Parser.BOOL); - } - case 55: break; - case 34: - { return keyword(Parser.PRINT); - } - case 56: break; - case 21: - { return keyword(Parser.INT); - } - case 57: break; - case 11: - { return operator(Parser.LESS_EQUAL); - } - case 58: break; - case 41: - { return keyword(Parser.READ_INTEGER); - } - case 59: break; - case 37: - { return keyword(Parser.RETURN); - } - case 60: break; - case 15: - { return operator(Parser.AND); - } - case 61: break; - case 16: - { return operator(Parser.OR); - } - case 62: break; - case 32: - { return keyword(Parser.CLASS); - } - case 63: break; - case 7: - { buffer.append(yytext()); - } - case 64: break; - case 12: - { return operator(Parser.GREATER_EQUAL); - } - case 65: break; - case 17: - { buffer.append('\n'); - } - case 66: break; - case 36: - { return keyword(Parser.STATIC); - } - case 67: break; - case 25: - { return keyword(Parser.NULL); - } - case 68: break; - case 5: - { return operator(yycharat(0)); - } - case 69: break; - case 40: - { return keyword(Parser.INSTANCEOF); - } - case 70: break; - case 13: - { return operator(Parser.NOT_EQUAL); - } - case 71: break; - case 38: - { return keyword(Parser.EXTENDS); - } - case 72: break; - case 26: - { return boolConst(true); - } - case 73: break; - case 39: - { return keyword(Parser.READ_LINE); - } - case 74: break; - case 6: - { sloc = getLocation(); - yybegin(S); - buffer = new StringBuilder(); - } - case 75: break; - case 23: - { return keyword(Parser.FOR); - } - case 76: break; - case 1: - { issueError(new UnrecogCharError(getLocation(), yycharat(0))); - } - case 77: break; - case 2: - { /* Just ignore */ - } - case 78: break; - case 22: - { return keyword(Parser.NEW); - } - case 79: break; - case 35: - { return keyword(Parser.STRING); - } - case 80: break; - case 3: - { return intConst(yytext()); - } - case 81: break; - case 8: - { issueError(new NewlineInStrError(sloc, MiscUtils.quote(buffer.toString()))); - } - case 82: break; - default: - if (zzInput == YYEOF && zzStartRead == zzCurrentPos) { - zzAtEOF = true; - zzDoEOF(); - switch (zzLexicalState) { - case S: { - issueError(new UntermStrError(sloc, MiscUtils.quote(buffer.toString()))); - yybegin(YYINITIAL); - } - case 137: break; - default: - { return 0; } - } - } - else { - zzScanError(ZZ_NO_MATCH); - } - } - } - } - - -} diff --git a/demos/decaf/src/decaf/Lexer.l b/demos/decaf/src/decaf/Lexer.l deleted file mode 100755 index 53ca794..0000000 --- a/demos/decaf/src/decaf/Lexer.l +++ /dev/null @@ -1,99 +0,0 @@ -package decaf; - -import decaf.Location; -import decaf.error.*; -import decaf.utils.MiscUtils; - -%% -%public -%class Lexer -%extends BaseLexer -%byaccj -%line -%column -%switch -%unicode - -%{ - private Location sloc = null; - private StringBuilder buffer = new StringBuilder(); - - public Location getLocation() { - return new decaf.Location(yyline + 1, yycolumn + 1); - } -%} - -NEWLINE = (\r|\n|\r\n) -DIGIT = ([0-9]) -HEX_DIGIT = ([0-9A-Fa-f]) -HEX_INTEGER = (0[Xx]{HEX_DIGIT}+) -DEC_INTEGER = ({DIGIT}+) -INTEGER = ({HEX_INTEGER}|{DEC_INTEGER}) -IDENTIFIER = ([A-Za-z][_0-9A-Za-z]*) -SIMPLE_OPERATOR = ("+"|"-"|"*"|"/"|"%"|"="|"<"|">"|"."|","|";"|"!"|"("|")"|"["|"]"|"{"|"}"|"?"|":") -S_COMMENT = ("//"[^\r\n]*{NEWLINE}) -WHITESPACE = ([ \t]+) - - // Start from string -%x S - -%% - // Comments and whitespaces -{WHITESPACE} { /* Just ignore */ } -{NEWLINE} { /* Just ignore */ } -{S_COMMENT} { /* Just ignore */ } - - // Keywords -"void" { return keyword(Parser.VOID); } -"int" { return keyword(Parser.INT); } -"bool" { return keyword(Parser.BOOL); } -"string" { return keyword(Parser.STRING); } -"new" { return keyword(Parser.NEW); } -"null" { return keyword(Parser.NULL); } -"class" { return keyword(Parser.CLASS); } -"extends" { return keyword(Parser.EXTENDS); } -"this" { return keyword(Parser.THIS); } -"while" { return keyword(Parser.WHILE); } -"for" { return keyword(Parser.FOR); } -"if" { return keyword(Parser.IF); } -"else" { return keyword(Parser.ELSE); } -"return" { return keyword(Parser.RETURN); } -"break" { return keyword(Parser.BREAK); } -"Print" { return keyword(Parser.PRINT); } -"ReadInteger" { return keyword(Parser.READ_INTEGER); } -"ReadLine" { return keyword(Parser.READ_LINE); } -"static" { return keyword(Parser.STATIC); } -"instanceof" { return keyword(Parser.INSTANCEOF); } - - // Operators -"<=" { return operator(Parser.LESS_EQUAL); } -">=" { return operator(Parser.GREATER_EQUAL);} -"==" { return operator(Parser.EQUAL); } -"!=" { return operator(Parser.NOT_EQUAL); } -"&&" { return operator(Parser.AND); } -"||" { return operator(Parser.OR); } -{SIMPLE_OPERATOR} { return operator(yycharat(0)); } - - // Constants -"true" { return boolConst(true); } -"false" { return boolConst(false); } -{INTEGER} { return intConst(yytext()); } -\" { sloc = getLocation(); - yybegin(S); - buffer = new StringBuilder(); } -{NEWLINE} { issueError(new NewlineInStrError(sloc, MiscUtils.quote(buffer.toString())));} -<> { issueError(new UntermStrError(sloc, MiscUtils.quote(buffer.toString()))); - yybegin(YYINITIAL); } -\" { yybegin(YYINITIAL); - return StringConst(buffer.toString(), sloc); } -"\\n" { buffer.append('\n'); } -"\\t" { buffer.append('\t'); } -"\\\"" { buffer.append('"'); } -"\\\\" { buffer.append('\\'); } -. { buffer.append(yytext()); } - - // Identifier -{IDENTIFIER} { return identifier(yytext()); } - - // Others -. { issueError(new UnrecogCharError(getLocation(), yycharat(0))); } diff --git a/demos/decaf/src/decaf/Location.java b/demos/decaf/src/decaf/Location.java deleted file mode 100644 index afc87e9..0000000 --- a/demos/decaf/src/decaf/Location.java +++ /dev/null @@ -1,45 +0,0 @@ -package decaf; - -/** - * Location of tokens. - */ -public class Location implements Comparable { - - public static final Location NO_LOCATION = new Location(-1, -1); - - /** - * Line number. - */ - private int line; - - /** - * Column number. - */ - private int column; - - public Location(int lin, int col) { - line = lin; - column = col; - } - - @Override - public String toString() { - return "(" + line + "," + column + ")"; - } - - public int compareTo(Location o) { - if (line > o.line) { - return 1; - } - if (line < o.line) { - return -1; - } - if (column > o.column) { - return 1; - } - if (column < o.column) { - return -1; - } - return 0; - } -} diff --git a/demos/decaf/src/decaf/Parser.java b/demos/decaf/src/decaf/Parser.java deleted file mode 100644 index 263e295..0000000 --- a/demos/decaf/src/decaf/Parser.java +++ /dev/null @@ -1,2415 +0,0 @@ -/* This is auto-generated Parser source by LL1-Parser-Gen. - * Specification file: /Users/paul/Workspace/LL1-Parser-Gen/demos/decaf/src/decaf/Parser.spec - * Options: unstrict mode - * Generated at: Tue Aug 08 14:14:52 CST 2017 - * Please do NOT modify it! - * - * Project repository: https://github.com/paulzfm/LL1-Parser-Gen - * Version: 1.0 - * Author: Zhu Fengmin (Paul) - */ - -package decaf; - -import decaf.Location; -import decaf.Tree; -import decaf.Tree.*; -import java.util.*; - -public class Parser extends BaseParser - { - private static final int eof = -1; - private static final int eos = 0; - private int lookahead = -1; - public SemValue val = new SemValue(); - - /* tokens */ - public static final int VOID = 257; //# line 13 - public static final int BOOL = 258; //# line 13 - public static final int INT = 259; //# line 13 - public static final int STRING = 260; //# line 13 - public static final int CLASS = 261; //# line 13 - public static final int NULL = 262; //# line 14 - public static final int EXTENDS = 263; //# line 14 - public static final int THIS = 264; //# line 14 - public static final int WHILE = 265; //# line 14 - public static final int FOR = 266; //# line 14 - public static final int IF = 267; //# line 15 - public static final int ELSE = 268; //# line 15 - public static final int RETURN = 269; //# line 15 - public static final int BREAK = 270; //# line 15 - public static final int NEW = 271; //# line 15 - public static final int PRINT = 272; //# line 16 - public static final int READ_INTEGER = 273; //# line 16 - public static final int READ_LINE = 274; //# line 16 - public static final int LITERAL = 275; //# line 17 - public static final int IDENTIFIER = 276; //# line 18 - public static final int AND = 277; //# line 18 - public static final int OR = 278; //# line 18 - public static final int STATIC = 279; //# line 18 - public static final int INSTANCEOF = 280; //# line 18 - public static final int LESS_EQUAL = 281; //# line 19 - public static final int GREATER_EQUAL = 282; //# line 19 - public static final int EQUAL = 283; //# line 19 - public static final int NOT_EQUAL = 284; //# line 19 - - /* search token name */ - private String[] tokens = { - "VOID", "BOOL", "INT", "STRING", "CLASS", - "NULL", "EXTENDS", "THIS", "WHILE", "FOR", - "IF", "ELSE", "RETURN", "BREAK", "NEW", - "PRINT", "READ_INTEGER", "READ_LINE", "LITERAL", "IDENTIFIER", - "AND", "OR", "STATIC", "INSTANCEOF", "LESS_EQUAL", - "GREATER_EQUAL", "EQUAL", "NOT_EQUAL", - }; - - private String name(int token) { - if (token >= 0 && token <= 256) { - return "'" + (char) token + "'"; - } else { - return tokens[token - 257]; - } - } - - public SemValue parse() throws Exception { - if (lookahead < 0) { - lookahead = lex(); - } - SemValue result = parseProgram(); - if (lookahead != eos && lookahead != eof) { - throw error(name(lookahead)); - } - return result; - } - - private SemValue matchToken(int expected) throws Exception { - SemValue self = val; - if (lookahead == expected) { - lookahead = lex(); - } else { - throw error(name(lookahead), name(expected)); - } - return self; - } - - /* parsers */ - //# line 48 - private SemValue parseVariableDef() throws Exception { - switch (lookahead) { - case VOID: - case CLASS: - case INT: - case STRING: - case BOOL: - { - SemValue[] params = new SemValue[3]; - params[0] = new SemValue(); - params[1] = parseVariable(); - params[2] = matchToken(';'); - //# line 49 - params[0].vdef = params[1].vdef; - return params[0]; - } - default: - { - String[] acc = {name(VOID), name(CLASS), name(INT), name(STRING), name(BOOL)}; - throw error(name(lookahead), acc); - } - } - } - - //# line 485 - private SemValue parseExprT5() throws Exception { - switch (lookahead) { - case '+': - case '-': - { - SemValue[] params = new SemValue[4]; - params[0] = new SemValue(); - params[1] = parseOper5(); - params[2] = parseExpr6(); - params[3] = parseExprT5(); - //# line 486 - params[0].svec = new Vector(); - params[0].lvec = new Vector(); - params[0].evec = new Vector(); - params[0].svec.add(params[1].counter); - params[0].lvec.add(params[1].loc); - params[0].evec.add(params[2].expr); - if (params[3].svec != null) { - params[0].svec.addAll(params[3].svec); - params[0].lvec.addAll(params[3].lvec); - params[0].evec.addAll(params[3].evec); - } - return params[0]; - } - case LESS_EQUAL: - case ']': - case GREATER_EQUAL: - case EQUAL: - case ')': - case NOT_EQUAL: - case ',': - case '=': - case OR: - case AND: - case ';': - case '<': - case '>': - { - SemValue[] params = new SemValue[1]; - params[0] = new SemValue(); - /* no action */ - return params[0]; - } - default: - { - String[] acc = {name('+'), name('-'), name(LESS_EQUAL), name(']'), name(GREATER_EQUAL), name(EQUAL), name(')'), name(NOT_EQUAL), name(','), name('='), name(OR), name(AND), name(';'), name('<'), name('>')}; - throw error(name(lookahead), acc); - } - } - } - - //# line 275 - private SemValue parseOper3() throws Exception { - switch (lookahead) { - case EQUAL: - { - SemValue[] params = new SemValue[2]; - params[0] = new SemValue(); - params[1] = matchToken(EQUAL); - //# line 276 - params[0].counter = Tree.EQ; - params[0].loc = params[1].loc; - return params[0]; - } - case NOT_EQUAL: - { - SemValue[] params = new SemValue[2]; - params[0] = new SemValue(); - params[1] = matchToken(NOT_EQUAL); - //# line 281 - params[0].counter = Tree.NE; - params[0].loc = params[1].loc; - return params[0]; - } - default: - { - String[] acc = {name(EQUAL), name(NOT_EQUAL)}; - throw error(name(lookahead), acc); - } - } - } - - //# line 321 - private SemValue parseOper6() throws Exception { - switch (lookahead) { - case '*': - { - SemValue[] params = new SemValue[2]; - params[0] = new SemValue(); - params[1] = matchToken('*'); - //# line 322 - params[0].counter = Tree.MUL; - params[0].loc = params[1].loc; - return params[0]; - } - case '/': - { - SemValue[] params = new SemValue[2]; - params[0] = new SemValue(); - params[1] = matchToken('/'); - //# line 327 - params[0].counter = Tree.DIV; - params[0].loc = params[1].loc; - return params[0]; - } - case '%': - { - SemValue[] params = new SemValue[2]; - params[0] = new SemValue(); - params[1] = matchToken('%'); - //# line 332 - params[0].counter = Tree.MOD; - params[0].loc = params[1].loc; - return params[0]; - } - default: - { - String[] acc = {name('*'), name('/'), name('%')}; - throw error(name(lookahead), acc); - } - } - } - - //# line 164 - private SemValue parseVariableList() throws Exception { - switch (lookahead) { - case VOID: - case CLASS: - case INT: - case STRING: - case BOOL: - { - SemValue[] params = new SemValue[3]; - params[0] = new SemValue(); - params[1] = parseVariable(); - params[2] = parseSubVariableList(); - //# line 165 - params[0].vlist = new ArrayList(); - params[0].vlist.add(params[1].vdef); - if (params[2].vlist != null) { - params[0].vlist.addAll(params[2].vlist); - } - return params[0]; - } - default: - { - String[] acc = {name(VOID), name(CLASS), name(INT), name(STRING), name(BOOL)}; - throw error(name(lookahead), acc); - } - } - } - - //# line 154 - private SemValue parseFormals() throws Exception { - switch (lookahead) { - case VOID: - case CLASS: - case INT: - case STRING: - case BOOL: - { - SemValue[] params = new SemValue[2]; - params[0] = new SemValue(); - params[1] = parseVariableList(); - //# line 155 - params[0].vlist = params[1].vlist; - return params[0]; - } - case ')': - { - SemValue[] params = new SemValue[1]; - params[0] = new SemValue(); - //# line 159 - params[0].vlist = new ArrayList(); - return params[0]; - } - default: - { - String[] acc = {name(VOID), name(CLASS), name(INT), name(STRING), name(BOOL), name(')')}; - throw error(name(lookahead), acc); - } - } - } - - //# line 338 - private SemValue parseOper7() throws Exception { - switch (lookahead) { - case '-': - { - SemValue[] params = new SemValue[2]; - params[0] = new SemValue(); - params[1] = matchToken('-'); - //# line 339 - params[0].counter = Tree.NEG; - params[0].loc = params[1].loc; - return params[0]; - } - case '!': - { - SemValue[] params = new SemValue[2]; - params[0] = new SemValue(); - params[1] = matchToken('!'); - //# line 344 - params[0].counter = Tree.NOT; - params[0].loc = params[1].loc; - return params[0]; - } - default: - { - String[] acc = {name('-'), name('!')}; - throw error(name(lookahead), acc); - } - } - } - - //# line 541 - private SemValue parseExpr8() throws Exception { - switch (lookahead) { - case READ_LINE: - case NULL: - case IDENTIFIER: - case NEW: - case THIS: - case INSTANCEOF: - case LITERAL: - case '(': - case READ_INTEGER: - { - SemValue[] params = new SemValue[3]; - params[0] = new SemValue(); - params[1] = parseExpr9(); - params[2] = parseExprT8(); - //# line 542 - params[0].expr = params[1].expr; - params[0].loc = params[1].loc; - if (params[2].vec != null) { - for (SemValue v : params[2].vec) { - if (v.expr != null) { - params[0].expr = new Tree.Indexed(params[0].expr, v.expr, params[0].loc); - } else if (v.elist != null) { - params[0].expr = new Tree.CallExpr(params[0].expr, v.ident, v.elist, v.loc); - params[0].loc = v.loc; - } else { - params[0].expr = new Tree.Ident(params[0].expr, v.ident, v.loc); - params[0].loc = v.loc; - } - } - } - return params[0]; - } - default: - { - String[] acc = {name(READ_LINE), name(NULL), name(IDENTIFIER), name(NEW), name(THIS), name(INSTANCEOF), name(LITERAL), name('('), name(READ_INTEGER)}; - throw error(name(lookahead), acc); - } - } - } - - //# line 649 - private SemValue parseAfterSimpleTypeExpr() throws Exception { - switch (lookahead) { - case ']': - { - SemValue[] params = new SemValue[4]; - params[0] = new SemValue(); - params[1] = matchToken(']'); - params[2] = matchToken('['); - params[3] = parseAfterSimpleTypeExpr(); - //# line 650 - params[0].expr = params[3].expr; - params[0].counter = 1 + params[3].counter; - return params[0]; - } - case '!': - case '-': - case READ_LINE: - case NULL: - case IDENTIFIER: - case NEW: - case THIS: - case INSTANCEOF: - case LITERAL: - case '(': - case READ_INTEGER: - { - SemValue[] params = new SemValue[3]; - params[0] = new SemValue(); - params[1] = parseExpr(); - params[2] = matchToken(']'); - //# line 655 - params[0].expr = params[1].expr; - params[0].counter = 0; - return params[0]; - } - default: - { - String[] acc = {name(']'), name('!'), name('-'), name(READ_LINE), name(NULL), name(IDENTIFIER), name(NEW), name(THIS), name(INSTANCEOF), name(LITERAL), name('('), name(READ_INTEGER)}; - throw error(name(lookahead), acc); - } - } - } - - //# line 386 - private SemValue parseExpr2() throws Exception { - switch (lookahead) { - case '!': - case '-': - case READ_LINE: - case NULL: - case IDENTIFIER: - case NEW: - case THIS: - case INSTANCEOF: - case LITERAL: - case '(': - case READ_INTEGER: - { - SemValue[] params = new SemValue[3]; - params[0] = new SemValue(); - params[1] = parseExpr3(); - params[2] = parseExprT2(); - //# line 387 - params[0].expr = params[1].expr; - if (params[2].svec != null) { - for (int i = 0; i < params[2].svec.size(); ++i) { - params[0].expr = new Tree.Binary(params[2].svec.get(i), params[0].expr, - params[2].evec.get(i), params[2].lvec.get(i)); - } - } - return params[0]; - } - default: - { - String[] acc = {name('!'), name('-'), name(READ_LINE), name(NULL), name(IDENTIFIER), name(NEW), name(THIS), name(INSTANCEOF), name(LITERAL), name('('), name(READ_INTEGER)}; - throw error(name(lookahead), acc); - } - } - } - - //# line 268 - private SemValue parseOper2() throws Exception { - switch (lookahead) { - case AND: - { - SemValue[] params = new SemValue[2]; - params[0] = new SemValue(); - params[1] = matchToken(AND); - //# line 269 - params[0].counter = Tree.AND; - params[0].loc = params[1].loc; - return params[0]; - } - default: - { - String[] acc = {name(AND)}; - throw error(name(lookahead), acc); - } - } - } - - //# line 502 - private SemValue parseExpr6() throws Exception { - switch (lookahead) { - case '!': - case '-': - case READ_LINE: - case NULL: - case IDENTIFIER: - case NEW: - case THIS: - case INSTANCEOF: - case LITERAL: - case '(': - case READ_INTEGER: - { - SemValue[] params = new SemValue[3]; - params[0] = new SemValue(); - params[1] = parseExpr7(); - params[2] = parseExprT6(); - //# line 503 - params[0].expr = params[1].expr; - if (params[2].svec != null) { - for (int i = 0; i < params[2].svec.size(); ++i) { - params[0].expr = new Tree.Binary(params[2].svec.get(i), params[0].expr, - params[2].evec.get(i), params[2].lvec.get(i)); - } - } - return params[0]; - } - default: - { - String[] acc = {name('!'), name('-'), name(READ_LINE), name(NULL), name(IDENTIFIER), name(NEW), name(THIS), name(INSTANCEOF), name(LITERAL), name('('), name(READ_INTEGER)}; - throw error(name(lookahead), acc); - } - } - } - - //# line 726 - private SemValue parseBreakStmt() throws Exception { - switch (lookahead) { - case BREAK: - { - SemValue[] params = new SemValue[2]; - params[0] = new SemValue(); - params[1] = matchToken(BREAK); - //# line 727 - params[0].stmt = new Tree.Break(params[1].loc); - return params[0]; - } - default: - { - String[] acc = {name(BREAK)}; - throw error(name(lookahead), acc); - } - } - } - - //# line 398 - private SemValue parseExprT2() throws Exception { - switch (lookahead) { - case AND: - { - SemValue[] params = new SemValue[4]; - params[0] = new SemValue(); - params[1] = parseOper2(); - params[2] = parseExpr3(); - params[3] = parseExprT2(); - //# line 399 - params[0].svec = new Vector(); - params[0].lvec = new Vector(); - params[0].evec = new Vector(); - params[0].svec.add(params[1].counter); - params[0].lvec.add(params[1].loc); - params[0].evec.add(params[2].expr); - if (params[3].svec != null) { - params[0].svec.addAll(params[3].svec); - params[0].lvec.addAll(params[3].lvec); - params[0].evec.addAll(params[3].evec); - } - return params[0]; - } - case ']': - case ')': - case ',': - case '=': - case OR: - case ';': - { - SemValue[] params = new SemValue[1]; - params[0] = new SemValue(); - /* no action */ - return params[0]; - } - default: - { - String[] acc = {name(AND), name(']'), name(')'), name(','), name('='), name(OR), name(';')}; - throw error(name(lookahead), acc); - } - } - } - - //# line 191 - private SemValue parseStmtList() throws Exception { - switch (lookahead) { - case PRINT: - case VOID: - case FOR: - case '!': - case '-': - case CLASS: - case READ_LINE: - case WHILE: - case RETURN: - case NULL: - case INT: - case IDENTIFIER: - case NEW: - case IF: - case THIS: - case INSTANCEOF: - case STRING: - case LITERAL: - case '(': - case ';': - case BOOL: - case BREAK: - case READ_INTEGER: - case '{': - { - SemValue[] params = new SemValue[3]; - params[0] = new SemValue(); - params[1] = parseStmt(); - params[2] = parseStmtList(); - //# line 192 - params[0].slist.add(params[1].stmt); - params[0].slist.addAll(params[2].slist); - return params[0]; - } - case '}': - { - SemValue[] params = new SemValue[1]; - params[0] = new SemValue(); - /* no action */ - return params[0]; - } - default: - { - String[] acc = {name(PRINT), name(VOID), name(FOR), name('!'), name('-'), name(CLASS), name(READ_LINE), name(WHILE), name(RETURN), name(NULL), name(INT), name(IDENTIFIER), name(NEW), name(IF), name(THIS), name(INSTANCEOF), name(STRING), name(LITERAL), name('('), name(';'), name(BOOL), name(BREAK), name(READ_INTEGER), name('{'), name('}')}; - throw error(name(lookahead), acc); - } - } - } - - //# line 673 - private SemValue parseConstant() throws Exception { - switch (lookahead) { - case LITERAL: - { - SemValue[] params = new SemValue[2]; - params[0] = new SemValue(); - params[1] = matchToken(LITERAL); - //# line 674 - params[0].expr = new Tree.Literal(params[1].typeTag, params[1].literal, params[1].loc); - return params[0]; - } - case NULL: - { - SemValue[] params = new SemValue[2]; - params[0] = new SemValue(); - params[1] = matchToken(NULL); - //# line 678 - params[0].expr = new Null(params[1].loc); - return params[0]; - } - default: - { - String[] acc = {name(LITERAL), name(NULL)}; - throw error(name(lookahead), acc); - } - } - } - - //# line 174 - private SemValue parseSubVariableList() throws Exception { - switch (lookahead) { - case ',': - { - SemValue[] params = new SemValue[4]; - params[0] = new SemValue(); - params[1] = matchToken(','); - params[2] = parseVariable(); - params[3] = parseSubVariableList(); - //# line 175 - params[0].vlist = new ArrayList(); - params[0].vlist.add(params[2].vdef); - if (params[3].vlist != null) { - params[0].vlist.addAll(params[3].vlist); - } - return params[0]; - } - case ')': - { - SemValue[] params = new SemValue[1]; - params[0] = new SemValue(); - /* no action */ - return params[0]; - } - default: - { - String[] acc = {name(','), name(')')}; - throw error(name(lookahead), acc); - } - } - } - - //# line 758 - private SemValue parsePrintStmt() throws Exception { - switch (lookahead) { - case PRINT: - { - SemValue[] params = new SemValue[5]; - params[0] = new SemValue(); - params[1] = matchToken(PRINT); - params[2] = matchToken('('); - params[3] = parseExprList(); - params[4] = matchToken(')'); - //# line 759 - params[0].stmt = new Tree.Print(params[3].elist, params[1].loc); - return params[0]; - } - default: - { - String[] acc = {name(PRINT)}; - throw error(name(lookahead), acc); - } - } - } - - //# line 720 - private SemValue parseForStmt() throws Exception { - switch (lookahead) { - case FOR: - { - SemValue[] params = new SemValue[10]; - params[0] = new SemValue(); - params[1] = matchToken(FOR); - params[2] = matchToken('('); - params[3] = parseSimpleStmt(); - params[4] = matchToken(';'); - params[5] = parseExpr(); - params[6] = matchToken(';'); - params[7] = parseSimpleStmt(); - params[8] = matchToken(')'); - params[9] = parseStmt(); - //# line 721 - params[0].stmt = new Tree.ForLoop(params[3].stmt, params[5].expr, params[7].stmt, params[9].stmt, params[1].loc); - return params[0]; - } - default: - { - String[] acc = {name(FOR)}; - throw error(name(lookahead), acc); - } - } - } - - //# line 593 - private SemValue parseExpr9() throws Exception { - switch (lookahead) { - case LITERAL: - case NULL: - { - SemValue[] params = new SemValue[2]; - params[0] = new SemValue(); - params[1] = parseConstant(); - //# line 594 - params[0].expr = params[1].expr; - return params[0]; - } - case READ_INTEGER: - { - SemValue[] params = new SemValue[4]; - params[0] = new SemValue(); - params[1] = matchToken(READ_INTEGER); - params[2] = matchToken('('); - params[3] = matchToken(')'); - //# line 598 - params[0].expr = new Tree.ReadIntExpr(params[1].loc); - return params[0]; - } - case READ_LINE: - { - SemValue[] params = new SemValue[4]; - params[0] = new SemValue(); - params[1] = matchToken(READ_LINE); - params[2] = matchToken('('); - params[3] = matchToken(')'); - //# line 602 - params[0].expr = new Tree.ReadLineExpr(params[1].loc); - return params[0]; - } - case THIS: - { - SemValue[] params = new SemValue[2]; - params[0] = new SemValue(); - params[1] = matchToken(THIS); - //# line 606 - params[0].expr = new Tree.ThisExpr(params[1].loc); - return params[0]; - } - case NEW: - { - SemValue[] params = new SemValue[3]; - params[0] = new SemValue(); - params[1] = matchToken(NEW); - params[2] = parseAfterNewExpr(); - //# line 610 - if (params[2].ident != null) { - params[0].expr = new Tree.NewClass(params[2].ident, params[1].loc); - } else { - params[0].expr = new Tree.NewArray(params[2].type, params[2].expr, params[1].loc); - } - return params[0]; - } - case INSTANCEOF: - { - SemValue[] params = new SemValue[7]; - params[0] = new SemValue(); - params[1] = matchToken(INSTANCEOF); - params[2] = matchToken('('); - params[3] = parseExpr(); - params[4] = matchToken(','); - params[5] = matchToken(IDENTIFIER); - params[6] = matchToken(')'); - //# line 618 - params[0].expr = new Tree.TypeTest(params[3].expr, params[5].ident, params[1].loc); - return params[0]; - } - case '(': - { - SemValue[] params = new SemValue[3]; - params[0] = new SemValue(); - params[1] = matchToken('('); - params[2] = parseAfterParenExpr(); - //# line 622 - params[0].expr = params[2].expr; - return params[0]; - } - case IDENTIFIER: - { - SemValue[] params = new SemValue[3]; - params[0] = new SemValue(); - params[1] = matchToken(IDENTIFIER); - params[2] = parseAfterIdentExpr(); - //# line 626 - if (params[2].elist != null) { - params[0].expr = new Tree.CallExpr(null, params[1].ident, params[2].elist, params[1].loc); - } else { - params[0].expr = new Tree.Ident(null, params[1].ident, params[1].loc); - } - return params[0]; - } - default: - { - String[] acc = {name(LITERAL), name(NULL), name(READ_INTEGER), name(READ_LINE), name(THIS), name(NEW), name(INSTANCEOF), name('('), name(IDENTIFIER)}; - throw error(name(lookahead), acc); - } - } - } - - //# line 357 - private SemValue parseExpr1() throws Exception { - switch (lookahead) { - case '!': - case '-': - case READ_LINE: - case NULL: - case IDENTIFIER: - case NEW: - case THIS: - case INSTANCEOF: - case LITERAL: - case '(': - case READ_INTEGER: - { - SemValue[] params = new SemValue[3]; - params[0] = new SemValue(); - params[1] = parseExpr2(); - params[2] = parseExprT1(); - //# line 358 - params[0].expr = params[1].expr; - if (params[2].svec != null) { - for (int i = 0; i < params[2].svec.size(); ++i) { - params[0].expr = new Tree.Binary(params[2].svec.get(i), params[0].expr, - params[2].evec.get(i), params[2].lvec.get(i)); - } - } - return params[0]; - } - default: - { - String[] acc = {name('!'), name('-'), name(READ_LINE), name(NULL), name(IDENTIFIER), name(NEW), name(THIS), name(INSTANCEOF), name(LITERAL), name('('), name(READ_INTEGER)}; - throw error(name(lookahead), acc); - } - } - } - - //# line 261 - private SemValue parseOper1() throws Exception { - switch (lookahead) { - case OR: - { - SemValue[] params = new SemValue[2]; - params[0] = new SemValue(); - params[1] = matchToken(OR); - //# line 262 - params[0].counter = Tree.OR; - params[0].loc = params[1].loc; - return params[0]; - } - default: - { - String[] acc = {name(OR)}; - throw error(name(lookahead), acc); - } - } - } - - //# line 738 - private SemValue parseElseClause() throws Exception { - switch (lookahead) { - case ELSE: - { - SemValue[] params = new SemValue[3]; - params[0] = new SemValue(); - params[1] = matchToken(ELSE); - params[2] = parseStmt(); - //# line 739 - params[0].stmt = params[2].stmt; - return params[0]; - } - case PRINT: - case VOID: - case FOR: - case '!': - case '-': - case CLASS: - case READ_LINE: - case WHILE: - case RETURN: - case NULL: - case INT: - case '}': - case IDENTIFIER: - case NEW: - case IF: - case THIS: - case INSTANCEOF: - case STRING: - case LITERAL: - case '(': - case ';': - case BOOL: - case BREAK: - case READ_INTEGER: - case '{': - { - SemValue[] params = new SemValue[1]; - params[0] = new SemValue(); - /* no action */ - return params[0]; - } - default: - { - String[] acc = {name(ELSE), name(PRINT), name(VOID), name(FOR), name('!'), name('-'), name(CLASS), name(READ_LINE), name(WHILE), name(RETURN), name(NULL), name(INT), name('}'), name(IDENTIFIER), name(NEW), name(IF), name(THIS), name(INSTANCEOF), name(STRING), name(LITERAL), name('('), name(';'), name(BOOL), name(BREAK), name(READ_INTEGER), name('{')}; - throw error(name(lookahead), acc); - } - } - } - - //# line 114 - private SemValue parseFieldList() throws Exception { - switch (lookahead) { - case VOID: - case CLASS: - case INT: - case STRING: - case STATIC: - case BOOL: - { - SemValue[] params = new SemValue[3]; - params[0] = new SemValue(); - params[1] = parseField(); - params[2] = parseFieldList(); - //# line 115 - params[0].flist = new ArrayList(); - if (params[1].vdef != null) { - params[0].flist.add(params[1].vdef); - } else { - params[0].flist.add(params[1].fdef); - } - params[0].flist.addAll(params[2].flist); - return params[0]; - } - case '}': - { - SemValue[] params = new SemValue[1]; - params[0] = new SemValue(); - //# line 125 - params[0].flist = new ArrayList(); - return params[0]; - } - default: - { - String[] acc = {name(VOID), name(CLASS), name(INT), name(STRING), name(STATIC), name(BOOL), name('}')}; - throw error(name(lookahead), acc); - } - } - } - - //# line 701 - private SemValue parseSubExprList() throws Exception { - switch (lookahead) { - case ',': - { - SemValue[] params = new SemValue[4]; - params[0] = new SemValue(); - params[1] = matchToken(','); - params[2] = parseExpr(); - params[3] = parseSubExprList(); - //# line 702 - params[0].elist = new ArrayList(); - params[0].elist.add(params[2].expr); - params[0].elist.addAll(params[3].elist); - return params[0]; - } - case ')': - { - SemValue[] params = new SemValue[1]; - params[0] = new SemValue(); - //# line 708 - params[0].elist = new ArrayList(); - return params[0]; - } - default: - { - String[] acc = {name(','), name(')')}; - throw error(name(lookahead), acc); - } - } - } - - //# line 661 - private SemValue parseAfterParenExpr() throws Exception { - switch (lookahead) { - case '!': - case '-': - case READ_LINE: - case NULL: - case IDENTIFIER: - case NEW: - case THIS: - case INSTANCEOF: - case LITERAL: - case '(': - case READ_INTEGER: - { - SemValue[] params = new SemValue[3]; - params[0] = new SemValue(); - params[1] = parseExpr(); - params[2] = matchToken(')'); - //# line 662 - params[0].expr = params[1].expr; - return params[0]; - } - case CLASS: - { - SemValue[] params = new SemValue[5]; - params[0] = new SemValue(); - params[1] = matchToken(CLASS); - params[2] = matchToken(IDENTIFIER); - params[3] = matchToken(')'); - params[4] = parseExpr9(); - //# line 666 - params[0].expr = new Tree.TypeCast(params[2].ident, params[4].expr, params[4].loc); - return params[0]; - } - default: - { - String[] acc = {name('!'), name('-'), name(READ_LINE), name(NULL), name(IDENTIFIER), name(NEW), name(THIS), name(INSTANCEOF), name(LITERAL), name('('), name(READ_INTEGER), name(CLASS)}; - throw error(name(lookahead), acc); - } - } - } - - //# line 101 - private SemValue parseClassDef() throws Exception { - switch (lookahead) { - case CLASS: - { - SemValue[] params = new SemValue[7]; - params[0] = new SemValue(); - params[1] = matchToken(CLASS); - params[2] = matchToken(IDENTIFIER); - params[3] = parseExtendsClause(); - params[4] = matchToken('{'); - params[5] = parseFieldList(); - params[6] = matchToken('}'); - //# line 102 - params[0].cdef = new Tree.ClassDef(params[2].ident, params[3].ident, params[5].flist, params[1].loc); - return params[0]; - } - default: - { - String[] acc = {name(CLASS)}; - throw error(name(lookahead), acc); - } - } - } - - //# line 745 - private SemValue parseReturnStmt() throws Exception { - switch (lookahead) { - case RETURN: - { - SemValue[] params = new SemValue[3]; - params[0] = new SemValue(); - params[1] = matchToken(RETURN); - params[2] = parseReturnExpr(); - //# line 746 - params[0].stmt = new Tree.Return(params[2].expr, params[1].loc); - return params[0]; - } - default: - { - String[] acc = {name(RETURN)}; - throw error(name(lookahead), acc); - } - } - } - - //# line 693 - private SemValue parseExprList() throws Exception { - switch (lookahead) { - case '!': - case '-': - case READ_LINE: - case NULL: - case IDENTIFIER: - case NEW: - case THIS: - case INSTANCEOF: - case LITERAL: - case '(': - case READ_INTEGER: - { - SemValue[] params = new SemValue[3]; - params[0] = new SemValue(); - params[1] = parseExpr(); - params[2] = parseSubExprList(); - //# line 694 - params[0].elist = new ArrayList(); - params[0].elist.add(params[1].expr); - params[0].elist.addAll(params[2].elist); - return params[0]; - } - default: - { - String[] acc = {name('!'), name('-'), name(READ_LINE), name(NULL), name(IDENTIFIER), name(NEW), name(THIS), name(INSTANCEOF), name(LITERAL), name('('), name(READ_INTEGER)}; - throw error(name(lookahead), acc); - } - } - } - - //# line 185 - private SemValue parseStmtBlock() throws Exception { - switch (lookahead) { - case '{': - { - SemValue[] params = new SemValue[4]; - params[0] = new SemValue(); - params[1] = matchToken('{'); - params[2] = parseStmtList(); - params[3] = matchToken('}'); - //# line 186 - params[0].stmt = new Tree.Block(params[2].slist, params[1].loc); - return params[0]; - } - default: - { - String[] acc = {name('{')}; - throw error(name(lookahead), acc); - } - } - } - - //# line 146 - private SemValue parseFunctionField() throws Exception { - switch (lookahead) { - case '(': - { - SemValue[] params = new SemValue[5]; - params[0] = new SemValue(); - params[1] = matchToken('('); - params[2] = parseFormals(); - params[3] = matchToken(')'); - params[4] = parseStmtBlock(); - //# line 147 - params[0].vlist = params[2].vlist; - params[0].stmt = params[4].stmt; - return params[0]; - } - case ';': - { - SemValue[] params = new SemValue[2]; - params[0] = new SemValue(); - params[1] = matchToken(';'); - /* no action */ - return params[0]; - } - default: - { - String[] acc = {name('('), name(';')}; - throw error(name(lookahead), acc); - } - } - } - - //# line 586 - private SemValue parseAfterIdentExpr() throws Exception { - switch (lookahead) { - case '(': - { - SemValue[] params = new SemValue[4]; - params[0] = new SemValue(); - params[1] = matchToken('('); - params[2] = parseActuals(); - params[3] = matchToken(')'); - //# line 587 - params[0].elist = params[2].elist; - return params[0]; - } - case '/': - case LESS_EQUAL: - case ']': - case GREATER_EQUAL: - case '.': - case '-': - case EQUAL: - case ')': - case NOT_EQUAL: - case ',': - case '=': - case OR: - case '+': - case AND: - case '*': - case ';': - case '<': - case '[': - case '>': - case '%': - { - SemValue[] params = new SemValue[1]; - params[0] = new SemValue(); - /* no action */ - return params[0]; - } - default: - { - String[] acc = {name('('), name('/'), name(LESS_EQUAL), name(']'), name(GREATER_EQUAL), name('.'), name('-'), name(EQUAL), name(')'), name(NOT_EQUAL), name(','), name('='), name(OR), name('+'), name(AND), name('*'), name(';'), name('<'), name('['), name('>'), name('%')}; - throw error(name(lookahead), acc); - } - } - } - - //# line 26 - private SemValue parseProgram() throws Exception { - switch (lookahead) { - case CLASS: - { - SemValue[] params = new SemValue[3]; - params[0] = new SemValue(); - params[1] = parseClassDef(); - params[2] = parseClassList(); - //# line 27 - params[0].clist = new ArrayList(); - params[0].clist.add(params[1].cdef); - if (params[2].clist != null) { - params[0].clist.addAll(params[2].clist); - } - params[0].prog = new Tree.TopLevel(params[0].clist, params[0].loc); - return params[0]; - } - default: - { - String[] acc = {name(CLASS)}; - throw error(name(lookahead), acc); - } - } - } - - //# line 351 - private SemValue parseExpr() throws Exception { - switch (lookahead) { - case '!': - case '-': - case READ_LINE: - case NULL: - case IDENTIFIER: - case NEW: - case THIS: - case INSTANCEOF: - case LITERAL: - case '(': - case READ_INTEGER: - { - SemValue[] params = new SemValue[2]; - params[0] = new SemValue(); - params[1] = parseExpr1(); - //# line 352 - params[0].expr = params[1].expr; - return params[0]; - } - default: - { - String[] acc = {name('!'), name('-'), name(READ_LINE), name(NULL), name(IDENTIFIER), name(NEW), name(THIS), name(INSTANCEOF), name(LITERAL), name('('), name(READ_INTEGER)}; - throw error(name(lookahead), acc); - } - } - } - - //# line 82 - private SemValue parseType() throws Exception { - switch (lookahead) { - case VOID: - case CLASS: - case INT: - case STRING: - case BOOL: - { - SemValue[] params = new SemValue[3]; - params[0] = new SemValue(); - params[1] = parseSimpleType(); - params[2] = parseArrayType(); - //# line 83 - params[0].type = params[1].type; - for (int i = 0; i < params[2].counter; ++i) { - params[0].type = new Tree.TypeArray(params[0].type, params[1].loc); - } - return params[0]; - } - default: - { - String[] acc = {name(VOID), name(CLASS), name(INT), name(STRING), name(BOOL)}; - throw error(name(lookahead), acc); - } - } - } - - //# line 473 - private SemValue parseExpr5() throws Exception { - switch (lookahead) { - case '!': - case '-': - case READ_LINE: - case NULL: - case IDENTIFIER: - case NEW: - case THIS: - case INSTANCEOF: - case LITERAL: - case '(': - case READ_INTEGER: - { - SemValue[] params = new SemValue[3]; - params[0] = new SemValue(); - params[1] = parseExpr6(); - params[2] = parseExprT5(); - //# line 474 - params[0].expr = params[1].expr; - if (params[2].svec != null) { - for (int i = 0; i < params[2].svec.size(); ++i) { - params[0].expr = new Tree.Binary(params[2].svec.get(i), params[0].expr, - params[2].evec.get(i), params[2].lvec.get(i)); - } - } - return params[0]; - } - default: - { - String[] acc = {name('!'), name('-'), name(READ_LINE), name(NULL), name(IDENTIFIER), name(NEW), name(THIS), name(INSTANCEOF), name(LITERAL), name('('), name(READ_INTEGER)}; - throw error(name(lookahead), acc); - } - } - } - - //# line 635 - private SemValue parseAfterNewExpr() throws Exception { - switch (lookahead) { - case IDENTIFIER: - { - SemValue[] params = new SemValue[4]; - params[0] = new SemValue(); - params[1] = matchToken(IDENTIFIER); - params[2] = matchToken('('); - params[3] = matchToken(')'); - //# line 636 - params[0].ident = params[1].ident; - return params[0]; - } - case VOID: - case CLASS: - case INT: - case STRING: - case BOOL: - { - SemValue[] params = new SemValue[4]; - params[0] = new SemValue(); - params[1] = parseSimpleType(); - params[2] = matchToken('['); - params[3] = parseAfterSimpleTypeExpr(); - //# line 640 - params[0].type = params[1].type; - for (int i = 0; i < params[3].counter; ++i) { - params[0].type = new Tree.TypeArray(params[0].type, params[1].loc); - } - params[0].expr = params[3].expr; - return params[0]; - } - default: - { - String[] acc = {name(IDENTIFIER), name(VOID), name(CLASS), name(INT), name(STRING), name(BOOL)}; - throw error(name(lookahead), acc); - } - } - } - - //# line 252 - private SemValue parseAssignment() throws Exception { - switch (lookahead) { - case '=': - { - SemValue[] params = new SemValue[3]; - params[0] = new SemValue(); - params[1] = matchToken('='); - params[2] = parseExpr(); - //# line 253 - params[0].loc = params[1].loc; - params[0].expr = params[2].expr; - return params[0]; - } - case ';': - case ')': - { - SemValue[] params = new SemValue[1]; - params[0] = new SemValue(); - /* no action */ - return params[0]; - } - default: - { - String[] acc = {name('='), name(';'), name(')')}; - throw error(name(lookahead), acc); - } - } - } - - //# line 107 - private SemValue parseExtendsClause() throws Exception { - switch (lookahead) { - case EXTENDS: - { - SemValue[] params = new SemValue[3]; - params[0] = new SemValue(); - params[1] = matchToken(EXTENDS); - params[2] = matchToken(IDENTIFIER); - //# line 108 - params[0].ident = params[2].ident; - return params[0]; - } - case '{': - { - SemValue[] params = new SemValue[1]; - params[0] = new SemValue(); - /* no action */ - return params[0]; - } - default: - { - String[] acc = {name(EXTENDS), name('{')}; - throw error(name(lookahead), acc); - } - } - } - - //# line 309 - private SemValue parseOper5() throws Exception { - switch (lookahead) { - case '+': - { - SemValue[] params = new SemValue[2]; - params[0] = new SemValue(); - params[1] = matchToken('+'); - //# line 310 - params[0].counter = Tree.PLUS; - params[0].loc = params[1].loc; - return params[0]; - } - case '-': - { - SemValue[] params = new SemValue[2]; - params[0] = new SemValue(); - params[1] = matchToken('-'); - //# line 315 - params[0].counter = Tree.MINUS; - params[0].loc = params[1].loc; - return params[0]; - } - default: - { - String[] acc = {name('+'), name('-')}; - throw error(name(lookahead), acc); - } - } - } - - //# line 91 - private SemValue parseArrayType() throws Exception { - switch (lookahead) { - case '[': - { - SemValue[] params = new SemValue[4]; - params[0] = new SemValue(); - params[1] = matchToken('['); - params[2] = matchToken(']'); - params[3] = parseArrayType(); - //# line 92 - params[0].counter = 1 + params[3].counter; - return params[0]; - } - case IDENTIFIER: - { - SemValue[] params = new SemValue[1]; - params[0] = new SemValue(); - //# line 96 - params[0].counter = 0; - return params[0]; - } - default: - { - String[] acc = {name('['), name(IDENTIFIER)}; - throw error(name(lookahead), acc); - } - } - } - - //# line 415 - private SemValue parseExpr3() throws Exception { - switch (lookahead) { - case '!': - case '-': - case READ_LINE: - case NULL: - case IDENTIFIER: - case NEW: - case THIS: - case INSTANCEOF: - case LITERAL: - case '(': - case READ_INTEGER: - { - SemValue[] params = new SemValue[3]; - params[0] = new SemValue(); - params[1] = parseExpr4(); - params[2] = parseExprT3(); - //# line 416 - params[0].expr = params[1].expr; - if (params[2].svec != null) { - for (int i = 0; i < params[2].svec.size(); ++i) { - params[0].expr = new Tree.Binary(params[2].svec.get(i), params[0].expr, - params[2].evec.get(i), params[2].lvec.get(i)); - } - } - return params[0]; - } - default: - { - String[] acc = {name('!'), name('-'), name(READ_LINE), name(NULL), name(IDENTIFIER), name(NEW), name(THIS), name(INSTANCEOF), name(LITERAL), name('('), name(READ_INTEGER)}; - throw error(name(lookahead), acc); - } - } - } - - //# line 683 - private SemValue parseActuals() throws Exception { - switch (lookahead) { - case '!': - case '-': - case READ_LINE: - case NULL: - case IDENTIFIER: - case NEW: - case THIS: - case INSTANCEOF: - case LITERAL: - case '(': - case READ_INTEGER: - { - SemValue[] params = new SemValue[2]; - params[0] = new SemValue(); - params[1] = parseExprList(); - //# line 684 - params[0].elist = params[1].elist; - return params[0]; - } - case ')': - { - SemValue[] params = new SemValue[1]; - params[0] = new SemValue(); - //# line 688 - params[0].elist = new ArrayList(); - return params[0]; - } - default: - { - String[] acc = {name('!'), name('-'), name(READ_LINE), name(NULL), name(IDENTIFIER), name(NEW), name(THIS), name(INSTANCEOF), name(LITERAL), name('('), name(READ_INTEGER), name(')')}; - throw error(name(lookahead), acc); - } - } - } - - //# line 54 - private SemValue parseVariable() throws Exception { - switch (lookahead) { - case VOID: - case CLASS: - case INT: - case STRING: - case BOOL: - { - SemValue[] params = new SemValue[3]; - params[0] = new SemValue(); - params[1] = parseType(); - params[2] = matchToken(IDENTIFIER); - //# line 55 - params[0].vdef = new Tree.VarDef(params[2].ident, params[1].type, params[2].loc); - return params[0]; - } - default: - { - String[] acc = {name(VOID), name(CLASS), name(INT), name(STRING), name(BOOL)}; - throw error(name(lookahead), acc); - } - } - } - - //# line 427 - private SemValue parseExprT3() throws Exception { - switch (lookahead) { - case EQUAL: - case NOT_EQUAL: - { - SemValue[] params = new SemValue[4]; - params[0] = new SemValue(); - params[1] = parseOper3(); - params[2] = parseExpr4(); - params[3] = parseExprT3(); - //# line 428 - params[0].svec = new Vector(); - params[0].lvec = new Vector(); - params[0].evec = new Vector(); - params[0].svec.add(params[1].counter); - params[0].lvec.add(params[1].loc); - params[0].evec.add(params[2].expr); - if (params[3].svec != null) { - params[0].svec.addAll(params[3].svec); - params[0].lvec.addAll(params[3].lvec); - params[0].evec.addAll(params[3].evec); - } - return params[0]; - } - case ']': - case ')': - case ',': - case '=': - case OR: - case AND: - case ';': - { - SemValue[] params = new SemValue[1]; - params[0] = new SemValue(); - /* no action */ - return params[0]; - } - default: - { - String[] acc = {name(EQUAL), name(NOT_EQUAL), name(']'), name(')'), name(','), name('='), name(OR), name(AND), name(';')}; - throw error(name(lookahead), acc); - } - } - } - - //# line 199 - private SemValue parseStmt() throws Exception { - switch (lookahead) { - case VOID: - case CLASS: - case INT: - case STRING: - case BOOL: - { - SemValue[] params = new SemValue[2]; - params[0] = new SemValue(); - params[1] = parseVariableDef(); - //# line 200 - params[0].stmt = params[1].vdef; - return params[0]; - } - case '!': - case '-': - case READ_LINE: - case NULL: - case IDENTIFIER: - case NEW: - case THIS: - case INSTANCEOF: - case LITERAL: - case '(': - case ';': - case READ_INTEGER: - { - SemValue[] params = new SemValue[3]; - params[0] = new SemValue(); - params[1] = parseSimpleStmt(); - params[2] = matchToken(';'); - //# line 204 - if (params[1].stmt == null) { - params[0].stmt = new Tree.Skip(params[2].loc); - } else { - params[0].stmt = params[1].stmt; - } - return params[0]; - } - case IF: - { - SemValue[] params = new SemValue[2]; - params[0] = new SemValue(); - params[1] = parseIfStmt(); - //# line 212 - params[0].stmt = params[1].stmt; - return params[0]; - } - case WHILE: - { - SemValue[] params = new SemValue[2]; - params[0] = new SemValue(); - params[1] = parseWhileStmt(); - //# line 216 - params[0].stmt = params[1].stmt; - return params[0]; - } - case FOR: - { - SemValue[] params = new SemValue[2]; - params[0] = new SemValue(); - params[1] = parseForStmt(); - //# line 220 - params[0].stmt = params[1].stmt; - return params[0]; - } - case RETURN: - { - SemValue[] params = new SemValue[3]; - params[0] = new SemValue(); - params[1] = parseReturnStmt(); - params[2] = matchToken(';'); - //# line 224 - params[0].stmt = params[1].stmt; - return params[0]; - } - case PRINT: - { - SemValue[] params = new SemValue[3]; - params[0] = new SemValue(); - params[1] = parsePrintStmt(); - params[2] = matchToken(';'); - //# line 228 - params[0].stmt = params[1].stmt; - return params[0]; - } - case BREAK: - { - SemValue[] params = new SemValue[3]; - params[0] = new SemValue(); - params[1] = parseBreakStmt(); - params[2] = matchToken(';'); - //# line 232 - params[0].stmt = params[1].stmt; - return params[0]; - } - case '{': - { - SemValue[] params = new SemValue[2]; - params[0] = new SemValue(); - params[1] = parseStmtBlock(); - //# line 236 - params[0].stmt = params[1].stmt; - return params[0]; - } - default: - { - String[] acc = {name(VOID), name(CLASS), name(INT), name(STRING), name(BOOL), name('!'), name('-'), name(READ_LINE), name(NULL), name(IDENTIFIER), name(NEW), name(THIS), name(INSTANCEOF), name(LITERAL), name('('), name(';'), name(READ_INTEGER), name(IF), name(WHILE), name(FOR), name(RETURN), name(PRINT), name(BREAK), name('{')}; - throw error(name(lookahead), acc); - } - } - } - - //# line 241 - private SemValue parseSimpleStmt() throws Exception { - switch (lookahead) { - case '!': - case '-': - case READ_LINE: - case NULL: - case IDENTIFIER: - case NEW: - case THIS: - case INSTANCEOF: - case LITERAL: - case '(': - case READ_INTEGER: - { - SemValue[] params = new SemValue[3]; - params[0] = new SemValue(); - params[1] = parseExpr(); - params[2] = parseAssignment(); - //# line 242 - if (params[2].expr == null) { - params[0].stmt = new Tree.Calculate(params[1].expr, params[1].loc); - } else { - params[0].stmt = new Tree.Assign(params[1].expr, params[2].expr, params[2].loc); - } - return params[0]; - } - case ';': - case ')': - { - SemValue[] params = new SemValue[1]; - params[0] = new SemValue(); - /* no action */ - return params[0]; - } - default: - { - String[] acc = {name('!'), name('-'), name(READ_LINE), name(NULL), name(IDENTIFIER), name(NEW), name(THIS), name(INSTANCEOF), name(LITERAL), name('('), name(READ_INTEGER), name(';'), name(')')}; - throw error(name(lookahead), acc); - } - } - } - - //# line 60 - private SemValue parseSimpleType() throws Exception { - switch (lookahead) { - case INT: - { - SemValue[] params = new SemValue[2]; - params[0] = new SemValue(); - params[1] = matchToken(INT); - //# line 61 - params[0].type = new Tree.TypeIdent(Tree.INT, params[1].loc); - return params[0]; - } - case VOID: - { - SemValue[] params = new SemValue[2]; - params[0] = new SemValue(); - params[1] = matchToken(VOID); - //# line 65 - params[0].type = new Tree.TypeIdent(Tree.VOID, params[1].loc); - return params[0]; - } - case BOOL: - { - SemValue[] params = new SemValue[2]; - params[0] = new SemValue(); - params[1] = matchToken(BOOL); - //# line 69 - params[0].type = new Tree.TypeIdent(Tree.BOOL, params[1].loc); - return params[0]; - } - case STRING: - { - SemValue[] params = new SemValue[2]; - params[0] = new SemValue(); - params[1] = matchToken(STRING); - //# line 73 - params[0].type = new Tree.TypeIdent(Tree.STRING, params[1].loc); - return params[0]; - } - case CLASS: - { - SemValue[] params = new SemValue[3]; - params[0] = new SemValue(); - params[1] = matchToken(CLASS); - params[2] = matchToken(IDENTIFIER); - //# line 77 - params[0].type = new Tree.TypeClass(params[2].ident, params[1].loc); - return params[0]; - } - default: - { - String[] acc = {name(INT), name(VOID), name(BOOL), name(STRING), name(CLASS)}; - throw error(name(lookahead), acc); - } - } - } - - //# line 714 - private SemValue parseWhileStmt() throws Exception { - switch (lookahead) { - case WHILE: - { - SemValue[] params = new SemValue[6]; - params[0] = new SemValue(); - params[1] = matchToken(WHILE); - params[2] = matchToken('('); - params[3] = parseExpr(); - params[4] = matchToken(')'); - params[5] = parseStmt(); - //# line 715 - params[0].stmt = new Tree.WhileLoop(params[3].expr, params[5].stmt, params[1].loc); - return params[0]; - } - default: - { - String[] acc = {name(WHILE)}; - throw error(name(lookahead), acc); - } - } - } - - //# line 369 - private SemValue parseExprT1() throws Exception { - switch (lookahead) { - case OR: - { - SemValue[] params = new SemValue[4]; - params[0] = new SemValue(); - params[1] = parseOper1(); - params[2] = parseExpr2(); - params[3] = parseExprT1(); - //# line 370 - params[0].svec = new Vector(); - params[0].lvec = new Vector(); - params[0].evec = new Vector(); - params[0].svec.add(params[1].counter); - params[0].lvec.add(params[1].loc); - params[0].evec.add(params[2].expr); - if (params[3].svec != null) { - params[0].svec.addAll(params[3].svec); - params[0].lvec.addAll(params[3].lvec); - params[0].evec.addAll(params[3].evec); - } - return params[0]; - } - case ']': - case ')': - case ',': - case '=': - case ';': - { - SemValue[] params = new SemValue[1]; - params[0] = new SemValue(); - /* no action */ - return params[0]; - } - default: - { - String[] acc = {name(OR), name(']'), name(')'), name(','), name('='), name(';')}; - throw error(name(lookahead), acc); - } - } - } - - //# line 444 - private SemValue parseExpr4() throws Exception { - switch (lookahead) { - case '!': - case '-': - case READ_LINE: - case NULL: - case IDENTIFIER: - case NEW: - case THIS: - case INSTANCEOF: - case LITERAL: - case '(': - case READ_INTEGER: - { - SemValue[] params = new SemValue[3]; - params[0] = new SemValue(); - params[1] = parseExpr5(); - params[2] = parseExprT4(); - //# line 445 - params[0].expr = params[1].expr; - if (params[2].svec != null) { - for (int i = 0; i < params[2].svec.size(); ++i) { - params[0].expr = new Tree.Binary(params[2].svec.get(i), params[0].expr, - params[2].evec.get(i), params[2].lvec.get(i)); - } - } - return params[0]; - } - default: - { - String[] acc = {name('!'), name('-'), name(READ_LINE), name(NULL), name(IDENTIFIER), name(NEW), name(THIS), name(INSTANCEOF), name(LITERAL), name('('), name(READ_INTEGER)}; - throw error(name(lookahead), acc); - } - } - } - - //# line 456 - private SemValue parseExprT4() throws Exception { - switch (lookahead) { - case LESS_EQUAL: - case GREATER_EQUAL: - case '<': - case '>': - { - SemValue[] params = new SemValue[4]; - params[0] = new SemValue(); - params[1] = parseOper4(); - params[2] = parseExpr5(); - params[3] = parseExprT4(); - //# line 457 - params[0].svec = new Vector(); - params[0].lvec = new Vector(); - params[0].evec = new Vector(); - params[0].svec.add(params[1].counter); - params[0].lvec.add(params[1].loc); - params[0].evec.add(params[2].expr); - if (params[3].svec != null) { - params[0].svec.addAll(params[3].svec); - params[0].lvec.addAll(params[3].lvec); - params[0].evec.addAll(params[3].evec); - } - return params[0]; - } - case ']': - case EQUAL: - case ')': - case NOT_EQUAL: - case ',': - case '=': - case OR: - case AND: - case ';': - { - SemValue[] params = new SemValue[1]; - params[0] = new SemValue(); - /* no action */ - return params[0]; - } - default: - { - String[] acc = {name(LESS_EQUAL), name(GREATER_EQUAL), name('<'), name('>'), name(']'), name(EQUAL), name(')'), name(NOT_EQUAL), name(','), name('='), name(OR), name(AND), name(';')}; - throw error(name(lookahead), acc); - } - } - } - - //# line 751 - private SemValue parseReturnExpr() throws Exception { - switch (lookahead) { - case '!': - case '-': - case READ_LINE: - case NULL: - case IDENTIFIER: - case NEW: - case THIS: - case INSTANCEOF: - case LITERAL: - case '(': - case READ_INTEGER: - { - SemValue[] params = new SemValue[2]; - params[0] = new SemValue(); - params[1] = parseExpr(); - //# line 752 - params[0].expr = params[1].expr; - return params[0]; - } - case ';': - { - SemValue[] params = new SemValue[1]; - params[0] = new SemValue(); - /* no action */ - return params[0]; - } - default: - { - String[] acc = {name('!'), name('-'), name(READ_LINE), name(NULL), name(IDENTIFIER), name(NEW), name(THIS), name(INSTANCEOF), name(LITERAL), name('('), name(READ_INTEGER), name(';')}; - throw error(name(lookahead), acc); - } - } - } - - //# line 732 - private SemValue parseIfStmt() throws Exception { - switch (lookahead) { - case IF: - { - SemValue[] params = new SemValue[7]; - params[0] = new SemValue(); - params[1] = matchToken(IF); - params[2] = matchToken('('); - params[3] = parseExpr(); - params[4] = matchToken(')'); - params[5] = parseStmt(); - params[6] = parseElseClause(); - //# line 733 - params[0].stmt = new Tree.If(params[3].expr, params[5].stmt, params[6].stmt, params[1].loc); - return params[0]; - } - default: - { - String[] acc = {name(IF)}; - throw error(name(lookahead), acc); - } - } - } - - //# line 514 - private SemValue parseExprT6() throws Exception { - switch (lookahead) { - case '*': - case '/': - case '%': - { - SemValue[] params = new SemValue[4]; - params[0] = new SemValue(); - params[1] = parseOper6(); - params[2] = parseExpr7(); - params[3] = parseExprT6(); - //# line 515 - params[0].svec = new Vector(); - params[0].lvec = new Vector(); - params[0].evec = new Vector(); - params[0].svec.add(params[1].counter); - params[0].lvec.add(params[1].loc); - params[0].evec.add(params[2].expr); - if (params[3].svec != null) { - params[0].svec.addAll(params[3].svec); - params[0].lvec.addAll(params[3].lvec); - params[0].evec.addAll(params[3].evec); - } - return params[0]; - } - case LESS_EQUAL: - case ']': - case GREATER_EQUAL: - case '-': - case EQUAL: - case ')': - case NOT_EQUAL: - case ',': - case '=': - case OR: - case '+': - case AND: - case ';': - case '<': - case '>': - { - SemValue[] params = new SemValue[1]; - params[0] = new SemValue(); - /* no action */ - return params[0]; - } - default: - { - String[] acc = {name('*'), name('/'), name('%'), name(LESS_EQUAL), name(']'), name(GREATER_EQUAL), name('-'), name(EQUAL), name(')'), name(NOT_EQUAL), name(','), name('='), name(OR), name('+'), name(AND), name(';'), name('<'), name('>')}; - throw error(name(lookahead), acc); - } - } - } - - //# line 561 - private SemValue parseExprT8() throws Exception { - switch (lookahead) { - case '[': - { - SemValue[] params = new SemValue[5]; - params[0] = new SemValue(); - params[1] = matchToken('['); - params[2] = parseExpr(); - params[3] = matchToken(']'); - params[4] = parseExprT8(); - //# line 562 - SemValue sem = new SemValue(); - sem.expr = params[2].expr; - params[0].vec = new Vector(); - params[0].vec.add(sem); - if (params[4].vec != null) { - params[0].vec.addAll(params[4].vec); - } - return params[0]; - } - case '.': - { - SemValue[] params = new SemValue[5]; - params[0] = new SemValue(); - params[1] = matchToken('.'); - params[2] = matchToken(IDENTIFIER); - params[3] = parseAfterIdentExpr(); - params[4] = parseExprT8(); - //# line 572 - SemValue sem = new SemValue(); - sem.ident = params[2].ident; - sem.loc = params[2].loc; - sem.elist = params[3].elist; - params[0].vec = new Vector(); - params[0].vec.add(sem); - if (params[4].vec != null) { - params[0].vec.addAll(params[4].vec); - } - return params[0]; - } - case '/': - case LESS_EQUAL: - case ']': - case GREATER_EQUAL: - case '-': - case EQUAL: - case ')': - case NOT_EQUAL: - case ',': - case '=': - case OR: - case '+': - case AND: - case '*': - case ';': - case '<': - case '>': - case '%': - { - SemValue[] params = new SemValue[1]; - params[0] = new SemValue(); - /* no action */ - return params[0]; - } - default: - { - String[] acc = {name('['), name('.'), name('/'), name(LESS_EQUAL), name(']'), name(GREATER_EQUAL), name('-'), name(EQUAL), name(')'), name(NOT_EQUAL), name(','), name('='), name(OR), name('+'), name(AND), name('*'), name(';'), name('<'), name('>'), name('%')}; - throw error(name(lookahead), acc); - } - } - } - - //# line 531 - private SemValue parseExpr7() throws Exception { - switch (lookahead) { - case '-': - case '!': - { - SemValue[] params = new SemValue[3]; - params[0] = new SemValue(); - params[1] = parseOper7(); - params[2] = parseExpr8(); - //# line 532 - params[0].expr = new Tree.Unary(params[1].counter, params[2].expr, params[1].loc); - return params[0]; - } - case READ_LINE: - case NULL: - case IDENTIFIER: - case NEW: - case THIS: - case INSTANCEOF: - case LITERAL: - case '(': - case READ_INTEGER: - { - SemValue[] params = new SemValue[2]; - params[0] = new SemValue(); - params[1] = parseExpr8(); - //# line 536 - params[0].expr = params[1].expr; - return params[0]; - } - default: - { - String[] acc = {name('-'), name('!'), name(READ_LINE), name(NULL), name(IDENTIFIER), name(NEW), name(THIS), name(INSTANCEOF), name(LITERAL), name('('), name(READ_INTEGER)}; - throw error(name(lookahead), acc); - } - } - } - - //# line 37 - private SemValue parseClassList() throws Exception { - switch (lookahead) { - case CLASS: - { - SemValue[] params = new SemValue[3]; - params[0] = new SemValue(); - params[1] = parseClassDef(); - params[2] = parseClassList(); - //# line 38 - params[0].clist = new ArrayList(); - params[0].clist.add(params[1].cdef); - if (params[2].clist != null) { - params[0].clist.addAll(params[2].clist); - } - return params[0]; - } - case eof: - case eos: - { - SemValue[] params = new SemValue[1]; - params[0] = new SemValue(); - /* no action */ - return params[0]; - } - default: - { - String[] acc = {name(CLASS), name('#')}; - throw error(name(lookahead), acc); - } - } - } - - //# line 287 - private SemValue parseOper4() throws Exception { - switch (lookahead) { - case LESS_EQUAL: - { - SemValue[] params = new SemValue[2]; - params[0] = new SemValue(); - params[1] = matchToken(LESS_EQUAL); - //# line 288 - params[0].counter = Tree.LE; - params[0].loc = params[1].loc; - return params[0]; - } - case GREATER_EQUAL: - { - SemValue[] params = new SemValue[2]; - params[0] = new SemValue(); - params[1] = matchToken(GREATER_EQUAL); - //# line 293 - params[0].counter = Tree.GE; - params[0].loc = params[1].loc; - return params[0]; - } - case '<': - { - SemValue[] params = new SemValue[2]; - params[0] = new SemValue(); - params[1] = matchToken('<'); - //# line 298 - params[0].counter = Tree.LT; - params[0].loc = params[1].loc; - return params[0]; - } - case '>': - { - SemValue[] params = new SemValue[2]; - params[0] = new SemValue(); - params[1] = matchToken('>'); - //# line 303 - params[0].counter = Tree.GT; - params[0].loc = params[1].loc; - return params[0]; - } - default: - { - String[] acc = {name(LESS_EQUAL), name(GREATER_EQUAL), name('<'), name('>')}; - throw error(name(lookahead), acc); - } - } - } - - //# line 130 - private SemValue parseField() throws Exception { - switch (lookahead) { - case STATIC: - { - SemValue[] params = new SemValue[8]; - params[0] = new SemValue(); - params[1] = matchToken(STATIC); - params[2] = parseType(); - params[3] = matchToken(IDENTIFIER); - params[4] = matchToken('('); - params[5] = parseFormals(); - params[6] = matchToken(')'); - params[7] = parseStmtBlock(); - //# line 131 - params[0].fdef = new Tree.MethodDef(true, params[3].ident, params[2].type, params[5].vlist, - (Block) params[7].stmt, params[3].loc); - return params[0]; - } - case VOID: - case CLASS: - case INT: - case STRING: - case BOOL: - { - SemValue[] params = new SemValue[4]; - params[0] = new SemValue(); - params[1] = parseType(); - params[2] = matchToken(IDENTIFIER); - params[3] = parseFunctionField(); - //# line 136 - if (params[3].vlist != null) { - params[0].fdef = new Tree.MethodDef(false, params[2].ident, params[1].type, params[3].vlist, - (Block) params[3].stmt, params[2].loc); - } else { - params[0].vdef = new Tree.VarDef(params[2].ident, params[1].type, params[2].loc); - } - return params[0]; - } - default: - { - String[] acc = {name(STATIC), name(VOID), name(CLASS), name(INT), name(STRING), name(BOOL)}; - throw error(name(lookahead), acc); - } - } - } - -} -/* end of file */ diff --git a/demos/decaf/src/decaf/Parser.spec b/demos/decaf/src/decaf/Parser.spec deleted file mode 100644 index 295911e..0000000 --- a/demos/decaf/src/decaf/Parser.spec +++ /dev/null @@ -1,762 +0,0 @@ -%package decaf -%import -decaf.Location -decaf.Tree -decaf.Tree.* -java.util.* - -%class Parser extends BaseParser -%sem SemValue -%start Program - -%tokens -VOID BOOL INT STRING CLASS -NULL EXTENDS THIS WHILE FOR -IF ELSE RETURN BREAK NEW -PRINT READ_INTEGER READ_LINE -LITERAL -IDENTIFIER AND OR STATIC INSTANCEOF -LESS_EQUAL GREATER_EQUAL EQUAL NOT_EQUAL -'+' '-' '*' '/' '%' '=' '>' '<' '.' -',' ';' '!' '(' ')' '[' ']' '{' '}' -'?' ':' - -%% - -Program : ClassDef ClassList - { - $$.clist = new ArrayList(); - $$.clist.add($1.cdef); - if ($2.clist != null) { - $$.clist.addAll($2.clist); - } - $$.prog = new Tree.TopLevel($$.clist, $$.loc); - } - ; - -ClassList : ClassDef ClassList - { - $$.clist = new ArrayList(); - $$.clist.add($1.cdef); - if ($2.clist != null) { - $$.clist.addAll($2.clist); - } - } - | /* empty */ - ; - -VariableDef : Variable ';' - { - $$.vdef = $1.vdef; - } - ; - -Variable : Type IDENTIFIER - { - $$.vdef = new Tree.VarDef($2.ident, $1.type, $2.loc); - } - ; - -SimpleType : INT - { - $$.type = new Tree.TypeIdent(Tree.INT, $1.loc); - } - | VOID - { - $$.type = new Tree.TypeIdent(Tree.VOID, $1.loc); - } - | BOOL - { - $$.type = new Tree.TypeIdent(Tree.BOOL, $1.loc); - } - | STRING - { - $$.type = new Tree.TypeIdent(Tree.STRING, $1.loc); - } - | CLASS IDENTIFIER - { - $$.type = new Tree.TypeClass($2.ident, $1.loc); - } - ; - -Type : SimpleType ArrayType - { - $$.type = $1.type; - for (int i = 0; i < $2.counter; ++i) { - $$.type = new Tree.TypeArray($$.type, $1.loc); - } - } - ; - -ArrayType : '[' ']' ArrayType - { - $$.counter = 1 + $3.counter; - } - | /* empty */ - { - $$.counter = 0; - } - ; - -ClassDef : CLASS IDENTIFIER ExtendsClause '{' FieldList '}' - { - $$.cdef = new Tree.ClassDef($2.ident, $3.ident, $5.flist, $1.loc); - } - ; - -ExtendsClause : EXTENDS IDENTIFIER - { - $$.ident = $2.ident; - } - | /* empty */ - ; - -FieldList : Field FieldList - { - $$.flist = new ArrayList(); - if ($1.vdef != null) { - $$.flist.add($1.vdef); - } else { - $$.flist.add($1.fdef); - } - $$.flist.addAll($2.flist); - } - | /* empty */ - { - $$.flist = new ArrayList(); - } - ; - -Field : STATIC Type IDENTIFIER '(' Formals ')' StmtBlock - { - $$.fdef = new Tree.MethodDef(true, $3.ident, $2.type, $5.vlist, - (Block) $7.stmt, $3.loc); - } - | Type IDENTIFIER FunctionField - { - if ($3.vlist != null) { - $$.fdef = new Tree.MethodDef(false, $2.ident, $1.type, $3.vlist, - (Block) $3.stmt, $2.loc); - } else { - $$.vdef = new Tree.VarDef($2.ident, $1.type, $2.loc); - } - } - ; - -FunctionField : '(' Formals ')' StmtBlock // function arguments with body - { - $$.vlist = $2.vlist; - $$.stmt = $4.stmt; - } - | ';' // just variable definition - ; - -Formals : VariableList - { - $$.vlist = $1.vlist; - } - | /* empty */ - { - $$.vlist = new ArrayList(); - } - ; - -VariableList : Variable SubVariableList - { - $$.vlist = new ArrayList(); - $$.vlist.add($1.vdef); - if ($2.vlist != null) { - $$.vlist.addAll($2.vlist); - } - } - ; - -SubVariableList : ',' Variable SubVariableList - { - $$.vlist = new ArrayList(); - $$.vlist.add($2.vdef); - if ($3.vlist != null) { - $$.vlist.addAll($3.vlist); - } - } - | /* empty */ - ; - -StmtBlock : '{' StmtList '}' - { - $$.stmt = new Tree.Block($2.slist, $1.loc); - } - ; - -StmtList : Stmt StmtList - { - $$.slist.add($1.stmt); - $$.slist.addAll($2.slist); - } - | /* empty */ - ; - -Stmt : VariableDef - { - $$.stmt = $1.vdef; - } - | SimpleStmt ';' - { - if ($1.stmt == null) { - $$.stmt = new Tree.Skip($2.loc); - } else { - $$.stmt = $1.stmt; - } - } - | IfStmt - { - $$.stmt = $1.stmt; - } - | WhileStmt - { - $$.stmt = $1.stmt; - } - | ForStmt - { - $$.stmt = $1.stmt; - } - | ReturnStmt ';' - { - $$.stmt = $1.stmt; - } - | PrintStmt ';' - { - $$.stmt = $1.stmt; - } - | BreakStmt ';' - { - $$.stmt = $1.stmt; - } - | StmtBlock - { - $$.stmt = $1.stmt; - } - ; - -SimpleStmt : Expr Assignment - { - if ($2.expr == null) { - $$.stmt = new Tree.Calculate($1.expr, $1.loc); - } else { - $$.stmt = new Tree.Assign($1.expr, $2.expr, $2.loc); - } - } - | /* empty */ - ; - -Assignment : '=' Expr - { - $$.loc = $1.loc; - $$.expr = $2.expr; - } - | /* empty */ - ; - -// operators -Oper1 : OR - { - $$.counter = Tree.OR; - $$.loc = $1.loc; - } - ; - -Oper2 : AND - { - $$.counter = Tree.AND; - $$.loc = $1.loc; - } - ; - -Oper3 : EQUAL - { - $$.counter = Tree.EQ; - $$.loc = $1.loc; - } - | NOT_EQUAL - { - $$.counter = Tree.NE; - $$.loc = $1.loc; - } - ; - -Oper4 : LESS_EQUAL - { - $$.counter = Tree.LE; - $$.loc = $1.loc; - } - | GREATER_EQUAL - { - $$.counter = Tree.GE; - $$.loc = $1.loc; - } - | '<' - { - $$.counter = Tree.LT; - $$.loc = $1.loc; - } - | '>' - { - $$.counter = Tree.GT; - $$.loc = $1.loc; - } - ; - -Oper5 : '+' - { - $$.counter = Tree.PLUS; - $$.loc = $1.loc; - } - | '-' - { - $$.counter = Tree.MINUS; - $$.loc = $1.loc; - } - ; - -Oper6 : '*' - { - $$.counter = Tree.MUL; - $$.loc = $1.loc; - } - | '/' - { - $$.counter = Tree.DIV; - $$.loc = $1.loc; - } - | '%' - { - $$.counter = Tree.MOD; - $$.loc = $1.loc; - } - ; - -Oper7 : '-' - { - $$.counter = Tree.NEG; - $$.loc = $1.loc; - } - | '!' - { - $$.counter = Tree.NOT; - $$.loc = $1.loc; - } - ; - -// expressions -Expr : Expr1 - { - $$.expr = $1.expr; - } - ; - -Expr1 : Expr2 ExprT1 - { - $$.expr = $1.expr; - if ($2.svec != null) { - for (int i = 0; i < $2.svec.size(); ++i) { - $$.expr = new Tree.Binary($2.svec.get(i), $$.expr, - $2.evec.get(i), $2.lvec.get(i)); - } - } - } - ; - -ExprT1 : Oper1 Expr2 ExprT1 - { - $$.svec = new Vector(); - $$.lvec = new Vector(); - $$.evec = new Vector(); - $$.svec.add($1.counter); - $$.lvec.add($1.loc); - $$.evec.add($2.expr); - if ($3.svec != null) { - $$.svec.addAll($3.svec); - $$.lvec.addAll($3.lvec); - $$.evec.addAll($3.evec); - } - } - | /* empty */ - ; - -Expr2 : Expr3 ExprT2 - { - $$.expr = $1.expr; - if ($2.svec != null) { - for (int i = 0; i < $2.svec.size(); ++i) { - $$.expr = new Tree.Binary($2.svec.get(i), $$.expr, - $2.evec.get(i), $2.lvec.get(i)); - } - } - } - ; - -ExprT2 : Oper2 Expr3 ExprT2 - { - $$.svec = new Vector(); - $$.lvec = new Vector(); - $$.evec = new Vector(); - $$.svec.add($1.counter); - $$.lvec.add($1.loc); - $$.evec.add($2.expr); - if ($3.svec != null) { - $$.svec.addAll($3.svec); - $$.lvec.addAll($3.lvec); - $$.evec.addAll($3.evec); - } - } - | /* empty */ - ; - -Expr3 : Expr4 ExprT3 - { - $$.expr = $1.expr; - if ($2.svec != null) { - for (int i = 0; i < $2.svec.size(); ++i) { - $$.expr = new Tree.Binary($2.svec.get(i), $$.expr, - $2.evec.get(i), $2.lvec.get(i)); - } - } - } - ; - -ExprT3 : Oper3 Expr4 ExprT3 - { - $$.svec = new Vector(); - $$.lvec = new Vector(); - $$.evec = new Vector(); - $$.svec.add($1.counter); - $$.lvec.add($1.loc); - $$.evec.add($2.expr); - if ($3.svec != null) { - $$.svec.addAll($3.svec); - $$.lvec.addAll($3.lvec); - $$.evec.addAll($3.evec); - } - } - | /* empty */ - ; - -Expr4 : Expr5 ExprT4 - { - $$.expr = $1.expr; - if ($2.svec != null) { - for (int i = 0; i < $2.svec.size(); ++i) { - $$.expr = new Tree.Binary($2.svec.get(i), $$.expr, - $2.evec.get(i), $2.lvec.get(i)); - } - } - } - ; - -ExprT4 : Oper4 Expr5 ExprT4 - { - $$.svec = new Vector(); - $$.lvec = new Vector(); - $$.evec = new Vector(); - $$.svec.add($1.counter); - $$.lvec.add($1.loc); - $$.evec.add($2.expr); - if ($3.svec != null) { - $$.svec.addAll($3.svec); - $$.lvec.addAll($3.lvec); - $$.evec.addAll($3.evec); - } - } - | /* empty */ - ; - -Expr5 : Expr6 ExprT5 - { - $$.expr = $1.expr; - if ($2.svec != null) { - for (int i = 0; i < $2.svec.size(); ++i) { - $$.expr = new Tree.Binary($2.svec.get(i), $$.expr, - $2.evec.get(i), $2.lvec.get(i)); - } - } - } - ; - -ExprT5 : Oper5 Expr6 ExprT5 - { - $$.svec = new Vector(); - $$.lvec = new Vector(); - $$.evec = new Vector(); - $$.svec.add($1.counter); - $$.lvec.add($1.loc); - $$.evec.add($2.expr); - if ($3.svec != null) { - $$.svec.addAll($3.svec); - $$.lvec.addAll($3.lvec); - $$.evec.addAll($3.evec); - } - } - | /* empty */ - ; - -Expr6 : Expr7 ExprT6 - { - $$.expr = $1.expr; - if ($2.svec != null) { - for (int i = 0; i < $2.svec.size(); ++i) { - $$.expr = new Tree.Binary($2.svec.get(i), $$.expr, - $2.evec.get(i), $2.lvec.get(i)); - } - } - } - ; - -ExprT6 : Oper6 Expr7 ExprT6 - { - $$.svec = new Vector(); - $$.lvec = new Vector(); - $$.evec = new Vector(); - $$.svec.add($1.counter); - $$.lvec.add($1.loc); - $$.evec.add($2.expr); - if ($3.svec != null) { - $$.svec.addAll($3.svec); - $$.lvec.addAll($3.lvec); - $$.evec.addAll($3.evec); - } - } - | /* empty */ - ; - -Expr7 : Oper7 Expr8 - { - $$.expr = new Tree.Unary($1.counter, $2.expr, $1.loc); - } - | Expr8 - { - $$.expr = $1.expr; - } - ; - -Expr8 : Expr9 ExprT8 - { - $$.expr = $1.expr; - $$.loc = $1.loc; - if ($2.vec != null) { - for (SemValue v : $2.vec) { - if (v.expr != null) { - $$.expr = new Tree.Indexed($$.expr, v.expr, $$.loc); - } else if (v.elist != null) { - $$.expr = new Tree.CallExpr($$.expr, v.ident, v.elist, v.loc); - $$.loc = v.loc; - } else { - $$.expr = new Tree.Ident($$.expr, v.ident, v.loc); - $$.loc = v.loc; - } - } - } - } - ; - -ExprT8 : '[' Expr ']' ExprT8 - { - SemValue sem = new SemValue(); - sem.expr = $2.expr; - $$.vec = new Vector(); - $$.vec.add(sem); - if ($4.vec != null) { - $$.vec.addAll($4.vec); - } - } - | '.' IDENTIFIER AfterIdentExpr ExprT8 - { - SemValue sem = new SemValue(); - sem.ident = $2.ident; - sem.loc = $2.loc; - sem.elist = $3.elist; - $$.vec = new Vector(); - $$.vec.add(sem); - if ($4.vec != null) { - $$.vec.addAll($4.vec); - } - } - | /* empty */ - ; - -AfterIdentExpr : '(' Actuals ')' - { - $$.elist = $2.elist; - } - | /* empty */ - ; - -Expr9 : Constant - { - $$.expr = $1.expr; - } - | READ_INTEGER '(' ')' - { - $$.expr = new Tree.ReadIntExpr($1.loc); - } - | READ_LINE '(' ')' - { - $$.expr = new Tree.ReadLineExpr($1.loc); - } - | THIS - { - $$.expr = new Tree.ThisExpr($1.loc); - } - | NEW AfterNewExpr - { - if ($2.ident != null) { - $$.expr = new Tree.NewClass($2.ident, $1.loc); - } else { - $$.expr = new Tree.NewArray($2.type, $2.expr, $1.loc); - } - } - | INSTANCEOF '(' Expr ',' IDENTIFIER ')' - { - $$.expr = new Tree.TypeTest($3.expr, $5.ident, $1.loc); - } - | '(' AfterParenExpr - { - $$.expr = $2.expr; - } - | IDENTIFIER AfterIdentExpr - { - if ($2.elist != null) { - $$.expr = new Tree.CallExpr(null, $1.ident, $2.elist, $1.loc); - } else { - $$.expr = new Tree.Ident(null, $1.ident, $1.loc); - } - } - ; - -AfterNewExpr : IDENTIFIER '(' ')' - { - $$.ident = $1.ident; - } - | SimpleType '[' AfterSimpleTypeExpr - { - $$.type = $1.type; - for (int i = 0; i < $3.counter; ++i) { - $$.type = new Tree.TypeArray($$.type, $1.loc); - } - $$.expr = $3.expr; - } - ; - -AfterSimpleTypeExpr : ']' '[' AfterSimpleTypeExpr - { - $$.expr = $3.expr; - $$.counter = 1 + $3.counter; - } - | Expr ']' - { - $$.expr = $1.expr; - $$.counter = 0; - } - ; - -AfterParenExpr : Expr ')' - { - $$.expr = $1.expr; - } - | CLASS IDENTIFIER ')' Expr9 - { - $$.expr = new Tree.TypeCast($2.ident, $4.expr, $4.loc); - } - ; - -// end of expressions - -Constant : LITERAL - { - $$.expr = new Tree.Literal($1.typeTag, $1.literal, $1.loc); - } - | NULL - { - $$.expr = new Null($1.loc); - } - ; - -Actuals : ExprList - { - $$.elist = $1.elist; - } - | /* empty */ - { - $$.elist = new ArrayList(); - } - ; - -ExprList : Expr SubExprList - { - $$.elist = new ArrayList(); - $$.elist.add($1.expr); - $$.elist.addAll($2.elist); - } - ; - -SubExprList : ',' Expr SubExprList - { - $$.elist = new ArrayList(); - $$.elist.add($2.expr); - $$.elist.addAll($3.elist); - } - | /* empty */ - { - $$.elist = new ArrayList(); - } - ; - -// statements -WhileStmt : WHILE '(' Expr ')' Stmt - { - $$.stmt = new Tree.WhileLoop($3.expr, $5.stmt, $1.loc); - } - ; - -ForStmt : FOR '(' SimpleStmt ';' Expr ';' SimpleStmt ')' Stmt - { - $$.stmt = new Tree.ForLoop($3.stmt, $5.expr, $7.stmt, $9.stmt, $1.loc); - } - ; - -BreakStmt : BREAK - { - $$.stmt = new Tree.Break($1.loc); - } - ; - -IfStmt : IF '(' Expr ')' Stmt ElseClause - { - $$.stmt = new Tree.If($3.expr, $5.stmt, $6.stmt, $1.loc); - } - ; - -ElseClause : ELSE Stmt // higher priority - { - $$.stmt = $2.stmt; - } - | /* empty */ - ; - -ReturnStmt : RETURN ReturnExpr - { - $$.stmt = new Tree.Return($2.expr, $1.loc); - } - ; - -ReturnExpr : Expr - { - $$.expr = $1.expr; - } - | /* empty */ - ; - -PrintStmt : PRINT '(' ExprList ')' - { - $$.stmt = new Tree.Print($3.elist, $1.loc); - } - ; diff --git a/demos/decaf/src/decaf/SemValue.java b/demos/decaf/src/decaf/SemValue.java deleted file mode 100644 index 89fa361..0000000 --- a/demos/decaf/src/decaf/SemValue.java +++ /dev/null @@ -1,236 +0,0 @@ -package decaf; - -import java.util.ArrayList; -import java.util.List; -import java.util.Vector; - -import decaf.Location; -import decaf.Tree; -import decaf.Tree.ClassDef; -import decaf.Tree.Expr; -import decaf.Tree.LValue; -import decaf.Tree.MethodDef; -import decaf.Tree.TopLevel; -import decaf.Tree.TypeLiteral; -import decaf.Tree.VarDef; -import decaf.utils.MiscUtils; - -/** - * Semantic value. - */ -public class SemValue { - - public int code; - - public int counter; - - public Vector svec; - - public Location loc; - - public Vector lvec; - - public int typeTag; - - public Object literal; - - public String ident; - - public List clist; - - /** - * field list - */ - public List flist; - - public List vlist; - - /** - * statement list - */ - public List slist = new ArrayList(); - - public List elist; - - public TopLevel prog; - - public ClassDef cdef; - - public VarDef vdef; - - public MethodDef fdef; - - public TypeLiteral type; - - public Tree stmt; - - public Expr expr; - - public Expr expr1; - - public Vector evec; - - public LValue lvalue; - - public Vector vec; - - /** - * Create semantic value for keywords. - * - * @param code keyword token - * @return the semantic value - */ - public static SemValue createKeyword(int code) { - SemValue v = new SemValue(); - v.code = code; - return v; - } - - /** - * Create semantic value for operators. - * - * @param code operator token - * @return the semantic value - */ - public static SemValue createOperator(int code) { - SemValue v = new SemValue(); - v.code = code; - return v; - } - - /** - * Create semantic value for literals. - * - * @param value value for the literal - * @return the semantic value - */ - public static SemValue createLiteral(int tag, Object value) { - SemValue v = new SemValue(); - v.code = Parser.LITERAL; - v.typeTag = tag; - v.literal = value; - return v; - } - - /** - * Create semantic value for identifiers. - * - * @param name name of the identifier - * @return the semantic value - */ - public static SemValue createIdentifier(String name) { - SemValue v = new SemValue(); - v.code = Parser.IDENTIFIER; - v.ident = name; - return v; - } - - @Override - public String toString() { - String msg; - switch (code) { - // keywords - case Parser.BOOL: - msg = "keyword : bool"; - break; - case Parser.BREAK: - msg = "keyword : break"; - break; - case Parser.CLASS: - msg = "keyword : class"; - break; - case Parser.ELSE: - msg = "keyword : else"; - break; - case Parser.EXTENDS: - msg = "keyword : extends"; - break; - case Parser.FOR: - msg = "keyword : for"; - break; - case Parser.IF: - msg = "keyword : if"; - break; - case Parser.INT: - msg = "keyword : int"; - break; - case Parser.INSTANCEOF: - msg = "keyword : instanceof"; - break; - case Parser.NEW: - msg = "keyword : new"; - break; - case Parser.NULL: - msg = "keyword : null"; - break; - case Parser.PRINT: - msg = "keyword : Print"; - break; - case Parser.READ_INTEGER: - msg = "keyword : ReadInteger"; - break; - case Parser.READ_LINE: - msg = "keyword : ReadLine"; - break; - case Parser.RETURN: - msg = "keyword : return"; - break; - case Parser.STRING: - msg = "keyword : string"; - break; - case Parser.THIS: - msg = "keyword : this"; - break; - case Parser.VOID: - msg = "keyword : void"; - break; - case Parser.WHILE: - msg = "keyword : while"; - break; - case Parser.STATIC: - msg = "keyword : static"; - break; - - // literals - case Parser.LITERAL: - switch (typeTag) { - case Tree.INT: - case Tree.BOOL: - msg = "constant : " + literal; - break; - default: - msg = "constant : " + MiscUtils.quote((String) literal); - } - break; - - // identifiers - case Parser.IDENTIFIER: - msg = "identifier: " + ident; - break; - - // operators - case Parser.AND: - msg = "operator : &&"; - break; - case Parser.EQUAL: - msg = "operator : =="; - break; - case Parser.GREATER_EQUAL: - msg = "operator : >="; - break; - case Parser.LESS_EQUAL: - msg = "operator : <="; - break; - case Parser.NOT_EQUAL: - msg = "operator : !="; - break; - case Parser.OR: - msg = "operator : ||"; - break; - default: - msg = "operator : " + (char) code; - break; - } - return (String.format("%-15s%s", loc, msg)); - } -} \ No newline at end of file diff --git a/demos/decaf/src/decaf/Tree.java b/demos/decaf/src/decaf/Tree.java deleted file mode 100755 index ad536f4..0000000 --- a/demos/decaf/src/decaf/Tree.java +++ /dev/null @@ -1,1501 +0,0 @@ -/** - * @(#)Tree.java 1.30 03/01/23 - * - * Copyright 2003 Sun Microsystems, Inc. All rights reserved. - * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. - */ -package decaf; - -import java.util.List; - -import decaf.*; -import decaf.utils.IndentPrintWriter; -import decaf.utils.MiscUtils; - -/** - * Root class for abstract syntax tree nodes. It provides definitions for - * specific tree nodes as subclasses nested inside There are 40 such subclasses. - * - * Each subclass is highly standardized. It generally contains only tree fields - * for the syntactic subcomponents of the node. Some classes that represent - * identifier uses or definitions also define a Symbol field that denotes the - * represented identifier. Classes for non-local jumps also carry the jump - * target as a field. The root class Tree itself defines fields for the tree's - * type and position. No other fields are kept in a tree node; instead - * parameters are passed to methods accessing the node. - * - * The only method defined in subclasses is `visit' which applies a given - * visitor to the tree. The actual tree processing is done by visitor classes in - * other packages. The abstract class Visitor, as well as an Factory interface - * for trees, are defined as inner classes in Tree. - * - * @see TreeMaker - * @see TreeInfo - * @see TreeTranslator - * @see Pretty - */ -public abstract class Tree { - - /** - * Toplevel nodes, of type TopLevel, representing entire source files. - */ - public static final int TOPLEVEL = 1; - - /** - * Import clauses, of type Import. - */ - public static final int IMPORT = TOPLEVEL + 1; - - /** - * Class definitions, of type ClassDef. - */ - public static final int CLASSDEF = IMPORT + 1; - - /** - * Method definitions, of type MethodDef. - */ - public static final int METHODDEF = CLASSDEF + 1; - - /** - * Variable definitions, of type VarDef. - */ - public static final int VARDEF = METHODDEF + 1; - - /** - * The no-op statement ";", of type Skip - */ - public static final int SKIP = VARDEF + 1; - - /** - * Blocks, of type Block. - */ - public static final int BLOCK = SKIP + 1; - - /** - * Do-while loops, of type DoLoop. - */ - public static final int DOLOOP = BLOCK + 1; - - /** - * While-loops, of type WhileLoop. - */ - public static final int WHILELOOP = DOLOOP + 1; - - /** - * For-loops, of type ForLoop. - */ - public static final int FORLOOP = WHILELOOP + 1; - - /** - * Labelled statements, of type Labelled. - */ - public static final int LABELLED = FORLOOP + 1; - - /** - * Synchronized statements, of type Synchonized. - */ - public static final int SYNCHRONIZED = LABELLED + 1; - - /** - * Try statements, of type Try. - */ - public static final int TRY = SYNCHRONIZED + 1; - - /** - * Catch clauses in try statements, of type Catch. - */ - public static final int CATCH = TRY + 1; - - /** - * Conditional expressions, of type Conditional. - */ - public static final int CONDEXPR = CATCH + 1; - - /** - * Conditional statements, of type If. - */ - public static final int IF = CONDEXPR + 1; - - /** - * Expression statements, of type Exec. - */ - public static final int EXEC = IF + 1; - - /** - * Break statements, of type Break. - */ - public static final int BREAK = EXEC + 1; - - /** - * Continue statements, of type Continue. - */ - public static final int CONTINUE = BREAK + 1; - - /** - * Return statements, of type Return. - */ - public static final int RETURN = CONTINUE + 1; - - /** - * Throw statements, of type Throw. - */ - public static final int THROW = RETURN + 1; - - /** - * Assert statements, of type Assert. - */ - public static final int ASSERT = THROW + 1; - - /** - * Method invocation expressions, of type Apply. - */ - public static final int APPLY = ASSERT + 1; - - /** - * Class instance creation expressions, of type NewClass. - */ - public static final int NEWCLASS = APPLY + 1; - - /** - * Array creation expressions, of type NewArray. - */ - public static final int NEWARRAY = NEWCLASS + 1; - - /** - * Parenthesized subexpressions, of type Parens. - */ - public static final int PARENS = NEWARRAY + 1; - - /** - * Assignment expressions, of type Assign. - */ - public static final int ASSIGN = PARENS + 1; - - /** - * Calculate expressions, of type Calculate. - */ - public static final int CALCULATE = ASSIGN + 1; - - /** - * Type cast expressions, of type TypeCast. - */ - public static final int TYPECAST = CALCULATE + 1; - - /** - * Type test expressions, of type TypeTest. - */ - public static final int TYPETEST = TYPECAST + 1; - - /** - * Indexed array expressions, of type Indexed. - */ - public static final int INDEXED = TYPETEST + 1; - - /** - * Selections, of type Select. - */ - public static final int SELECT = INDEXED + 1; - - /** - * Simple identifiers, of type Ident. - */ - public static final int IDENT = SELECT + 1; - - /** - * Literals, of type Literal. - */ - public static final int LITERAL = IDENT + 1; - - /** - * Basic type identifiers, of type TypeIdent. - */ - public static final int TYPEIDENT = LITERAL + 1; - - /** - * Class types, of type TypeClass. - */ - public static final int TYPECLASS = TYPEIDENT + 1; - - /** - * Array types, of type TypeArray. - */ - public static final int TYPEARRAY = TYPECLASS + 1; - - /** - * Parameterized types, of type TypeApply. - */ - public static final int TYPEAPPLY = TYPEARRAY + 1; - - /** - * Formal type parameters, of type TypeParameter. - */ - public static final int TYPEPARAMETER = TYPEAPPLY + 1; - - /** - * Error trees, of type Erroneous. - */ - public static final int ERRONEOUS = TYPEPARAMETER + 1; - - /** - * Unary operators, of type Unary. - */ - public static final int POS = ERRONEOUS + 1; - public static final int NEG = POS + 1; - public static final int NOT = NEG + 1; - public static final int COMPL = NOT + 1; - public static final int PREINC = COMPL + 1; - public static final int PREDEC = PREINC + 1; - public static final int POSTINC = PREDEC + 1; - public static final int POSTDEC = POSTINC + 1; - - /** - * unary operator for null reference checks, only used internally. - */ - public static final int NULLCHK = POSTDEC + 1; - - /** - * Binary operators, of type Binary. - */ - public static final int OR = NULLCHK + 1; - public static final int AND = OR + 1; - public static final int BITOR = AND + 1; - public static final int BITXOR = BITOR + 1; - public static final int BITAND = BITXOR + 1; - public static final int EQ = BITAND + 1; - public static final int NE = EQ + 1; - public static final int LT = NE + 1; - public static final int GT = LT + 1; - public static final int LE = GT + 1; - public static final int GE = LE + 1; - public static final int SL = GE + 1; - public static final int SR = SL + 1; - public static final int USR = SR + 1; - public static final int PLUS = USR + 1; - public static final int MINUS = PLUS + 1; - public static final int MUL = MINUS + 1; - public static final int DIV = MUL + 1; - public static final int MOD = DIV + 1; - - public static final int NULL = MOD + 1; - public static final int CALLEXPR = NULL + 1; - public static final int THISEXPR = CALLEXPR + 1; - public static final int READINTEXPR = THISEXPR + 1; - public static final int READLINEEXPR = READINTEXPR + 1; - public static final int PRINT = READLINEEXPR + 1; - - /** - * Tags for Literal and TypeLiteral - */ - public static final int VOID = 0; - public static final int INT = VOID + 1; - public static final int BOOL = INT + 1; - public static final int STRING = BOOL + 1; - - /** - * Tertiary operator, of type Tertiary. - */ - public static final int TERTIARY = STRING + 1; - - public Location loc; - public int tag; - - /** - * Initialize tree with given tag. - */ - public Tree(int tag, Location loc) { - super(); - this.tag = tag; - this.loc = loc; - } - - public Location getLocation() { - return loc; - } - - /** - * Visit this tree with a given visitor. - */ - public void accept(Visitor v) { - v.visitTree(this); - } - - public abstract void printTo(IndentPrintWriter pw); - - public static class TopLevel extends Tree { - - public List classes; - - public TopLevel(List classes, Location loc) { - super(TOPLEVEL, loc); - this.classes = classes; - } - - @Override - public void accept(Visitor v) { - v.visitTopLevel(this); - } - - @Override - public void printTo(IndentPrintWriter pw) { - pw.println("program"); - pw.incIndent(); - for (ClassDef d : classes) { - d.printTo(pw); - } - pw.decIndent(); - } - } - - public static class ClassDef extends Tree { - - public String name; - public String parent; - public List fields; - - public ClassDef(String name, String parent, List fields, - Location loc) { - super(CLASSDEF, loc); - this.name = name; - this.parent = parent; - this.fields = fields; - } - - @Override - public void accept(Visitor v) { - v.visitClassDef(this); - } - - @Override - public void printTo(IndentPrintWriter pw) { - pw.println("class " + name + " " - + (parent != null ? parent : "")); - pw.incIndent(); - for (Tree f : fields) { - f.printTo(pw); - } - pw.decIndent(); - } - } - - public static class MethodDef extends Tree { - - public boolean statik; - public String name; - public TypeLiteral returnType; - public List formals; - public Block body; - - public MethodDef(boolean statik, String name, TypeLiteral returnType, - List formals, Block body, Location loc) { - super(METHODDEF, loc); - this.statik = statik; - this.name = name; - this.returnType = returnType; - this.formals = formals; - this.body = body; - } - - public void accept(Visitor v) { - v.visitMethodDef(this); - } - - @Override - public void printTo(IndentPrintWriter pw) { - if (statik) { - pw.print("static "); - } - pw.print("func " + name + " "); - returnType.printTo(pw); - pw.println(); - pw.incIndent(); - pw.println("formals"); - pw.incIndent(); - for (VarDef d : formals) { - d.printTo(pw); - } - pw.decIndent(); - body.printTo(pw); - pw.decIndent(); - } - } - - public static class VarDef extends Tree { - - public String name; - public TypeLiteral type; - - public VarDef(String name, TypeLiteral type, Location loc) { - super(VARDEF, loc); - this.name = name; - this.type = type; - } - - @Override - public void accept(Visitor v) { - v.visitVarDef(this); - } - - @Override - public void printTo(IndentPrintWriter pw) { - pw.print("vardef " + name + " "); - type.printTo(pw); - pw.println(); - } - } - - /** - * A no-op statement ";". - */ - public static class Skip extends Tree { - - public Skip(Location loc) { - super(SKIP, loc); - } - - @Override - public void accept(Visitor v) { - v.visitSkip(this); - } - - @Override - public void printTo(IndentPrintWriter pw) { - // print nothing - } - } - - public static class Block extends Tree { - - public List block; - - public Block(List block, Location loc) { - super(BLOCK, loc); - this.block = block; - } - - @Override - public void accept(Visitor v) { - v.visitBlock(this); - } - - @Override - public void printTo(IndentPrintWriter pw) { - pw.println("stmtblock"); - pw.incIndent(); - for (Tree s : block) { - s.printTo(pw); - } - pw.decIndent(); - } - } - - /** - * A while loop - */ - public static class WhileLoop extends Tree { - - public Expr condition; - public Tree loopBody; - - public WhileLoop(Expr condition, Tree loopBody, Location loc) { - super(WHILELOOP, loc); - this.condition = condition; - this.loopBody = loopBody; - } - - @Override - public void accept(Visitor v) { - v.visitWhileLoop(this); - } - - @Override - public void printTo(IndentPrintWriter pw) { - pw.println("while"); - pw.incIndent(); - condition.printTo(pw); - if (loopBody != null) { - loopBody.printTo(pw); - } - pw.decIndent(); - } - } - - /** - * A for loop. - */ - public static class ForLoop extends Tree { - - public Tree init; - public Expr condition; - public Tree update; - public Tree loopBody; - - public ForLoop(Tree init, Expr condition, Tree update, Tree loopBody, - Location loc) { - super(FORLOOP, loc); - this.init = init; - this.condition = condition; - this.update = update; - this.loopBody = loopBody; - } - - @Override - public void accept(Visitor v) { - v.visitForLoop(this); - } - - @Override - public void printTo(IndentPrintWriter pw) { - pw.println("for"); - pw.incIndent(); - if (init != null) { - init.printTo(pw); - } else { - pw.println(""); - } - condition.printTo(pw); - if (update != null) { - update.printTo(pw); - } else { - pw.println(""); - } - if (loopBody != null) { - loopBody.printTo(pw); - } - pw.decIndent(); - } - } - - /** - * An "if ( ) { } else { }" block - */ - public static class If extends Tree { - - public Expr condition; - public Tree trueBranch; - public Tree falseBranch; - - public If(Expr condition, Tree trueBranch, Tree falseBranch, - Location loc) { - super(IF, loc); - this.condition = condition; - this.trueBranch = trueBranch; - this.falseBranch = falseBranch; - } - - @Override - public void accept(Visitor v) { - v.visitIf(this); - } - - @Override - public void printTo(IndentPrintWriter pw) { - pw.println("if"); - pw.incIndent(); - condition.printTo(pw); - if (trueBranch != null) { - trueBranch.printTo(pw); - } - pw.decIndent(); - if (falseBranch != null) { - pw.println("else"); - pw.incIndent(); - falseBranch.printTo(pw); - pw.decIndent(); - } - } - } - - /** - * an expression statement - * - * @param expr - * expression structure - */ - public static class Exec extends Tree { - - public Expr expr; - - public Exec(Expr expr, Location loc) { - super(EXEC, loc); - this.expr = expr; - } - - @Override - public void accept(Visitor v) { - v.visitExec(this); - } - - @Override - public void printTo(IndentPrintWriter pw) { - expr.printTo(pw); - } - } - - /** - * A break from a loop. - */ - public static class Break extends Tree { - - public Break(Location loc) { - super(BREAK, loc); - } - - @Override - public void accept(Visitor v) { - v.visitBreak(this); - } - - @Override - public void printTo(IndentPrintWriter pw) { - pw.println("break"); - } - } - - /** - * A return statement. - */ - public static class Print extends Tree { - - public List exprs; - - public Print(List exprs, Location loc) { - super(PRINT, loc); - this.exprs = exprs; - } - - @Override - public void accept(Visitor v) { - v.visitPrint(this); - } - - @Override - public void printTo(IndentPrintWriter pw) { - pw.println("print"); - pw.incIndent(); - for (Expr e : exprs) { - e.printTo(pw); - } - pw.decIndent(); - } - } - - /** - * A return statement. - */ - public static class Return extends Tree { - - public Expr expr; - - public Return(Expr expr, Location loc) { - super(RETURN, loc); - this.expr = expr; - } - - @Override - public void accept(Visitor v) { - v.visitReturn(this); - } - - @Override - public void printTo(IndentPrintWriter pw) { - pw.println("return"); - if (expr != null) { - pw.incIndent(); - expr.printTo(pw); - pw.decIndent(); - } - } - } - - public abstract static class Expr extends Tree { - - public boolean isClass; - public boolean usedForRef; - - public Expr(int tag, Location loc) { - super(tag, loc); - } - } - - /** - * A method invocation - */ - public static class Apply extends Expr { - - public Expr receiver; - public String method; - public List actuals; - - public Apply(Expr receiver, String method, List actuals, - Location loc) { - super(APPLY, loc); - this.receiver = receiver; - this.method = method; - this.actuals = actuals; - } - - @Override - public void accept(Visitor v) { - v.visitApply(this); - } - - @Override - public void printTo(IndentPrintWriter pw) { - pw.println("call " + method); - pw.incIndent(); - if (receiver != null) { - receiver.printTo(pw); - } else { - pw.println(""); - } - - for (Expr e : actuals) { - e.printTo(pw); - } - pw.decIndent(); - } - } - - /** - * A new(...) operation. - */ - public static class NewClass extends Expr { - - public String className; - - public NewClass(String className, Location loc) { - super(NEWCLASS, loc); - this.className = className; - } - - @Override - public void accept(Visitor v) { - v.visitNewClass(this); - } - - @Override - public void printTo(IndentPrintWriter pw) { - pw.println("newobj " + className); - } - } - - /** - * A new[...] operation. - */ - public static class NewArray extends Expr { - - public TypeLiteral elementType; - public Expr length; - - public NewArray(TypeLiteral elementType, Expr length, Location loc) { - super(NEWARRAY, loc); - this.elementType = elementType; - this.length = length; - } - - @Override - public void accept(Visitor v) { - v.visitNewArray(this); - } - - @Override - public void printTo(IndentPrintWriter pw) { - pw.print("newarray "); - elementType.printTo(pw); - pw.println(); - pw.incIndent(); - length.printTo(pw); - pw.decIndent(); - } - } - - public abstract static class LValue extends Expr { - - public enum Kind { - LOCAL_VAR, PARAM_VAR, MEMBER_VAR, ARRAY_ELEMENT - } - - public Kind lvKind; - - LValue(int tag, Location loc) { - super(tag, loc); - } - } - - /** - * An assignment with "=". - */ - public static class Assign extends Tree { - - public Expr left; // NOTE: change `LValue` as `Expr` to match the modified syntax. - public Expr expr; - - public Assign(Expr left, Expr expr, Location loc) { - super(ASSIGN, loc); - this.left = left; - this.expr = expr; - } - - @Override - public void accept(Visitor v) { - v.visitAssign(this); - } - - @Override - public void printTo(IndentPrintWriter pw) { - pw.println("assign"); - pw.incIndent(); - left.printTo(pw); - expr.printTo(pw); - pw.decIndent(); - } - } - - /** - * A calculate statement (like i++, --j). - */ - public static class Calculate extends Tree { - - public Expr expr; - - public Calculate(Expr expr, Location loc){ - super(CALCULATE, loc); - this.expr = expr; - } - - @Override - public void accept(Visitor v) { - v.visitCalculate(this); - } - - @Override - public void printTo(IndentPrintWriter pw) { - expr.printTo(pw); - } - } - - /** - * A unary operation. - */ - public static class Unary extends Expr { - - public Expr expr; - - public Unary(int kind, Expr expr, Location loc) { - super(kind, loc); - this.expr = expr; - } - - private void unaryOperatorToString(IndentPrintWriter pw, String op) { - pw.println(op); - pw.incIndent(); - expr.printTo(pw); - pw.decIndent(); - } - - @Override - public void accept(Visitor v) { - v.visitUnary(this); - } - - @Override - public void printTo(IndentPrintWriter pw) { - switch (tag) { - case NEG: - unaryOperatorToString(pw, "neg"); - break; - case NOT: - unaryOperatorToString(pw, "not"); - break; - case PREINC: - unaryOperatorToString(pw, "preadd"); - break; - case PREDEC: - unaryOperatorToString(pw, "preminus"); - break; - case POSTINC: - unaryOperatorToString(pw, "postadd"); - break; - case POSTDEC: - unaryOperatorToString(pw, "postminus"); - break; - } - } - } - - /** - * A binary operation. - */ - public static class Binary extends Expr { - - public Expr left; - public Expr right; - - public Binary(int kind, Expr left, Expr right, Location loc) { - super(kind, loc); - this.left = left; - this.right = right; - } - - private void binaryOperatorPrintTo(IndentPrintWriter pw, String op) { - pw.println(op); - pw.incIndent(); - left.printTo(pw); - right.printTo(pw); - pw.decIndent(); - } - - @Override - public void accept(Visitor visitor) { - visitor.visitBinary(this); - } - - @Override - public void printTo(IndentPrintWriter pw) { - switch (tag) { - case PLUS: - binaryOperatorPrintTo(pw, "add"); - break; - case MINUS: - binaryOperatorPrintTo(pw, "sub"); - break; - case MUL: - binaryOperatorPrintTo(pw, "mul"); - break; - case DIV: - binaryOperatorPrintTo(pw, "div"); - break; - case MOD: - binaryOperatorPrintTo(pw, "mod"); - break; - case AND: - binaryOperatorPrintTo(pw, "and"); - break; - case OR: - binaryOperatorPrintTo(pw, "or"); - break; - case EQ: - binaryOperatorPrintTo(pw, "equ"); - break; - case NE: - binaryOperatorPrintTo(pw, "neq"); - break; - case LT: - binaryOperatorPrintTo(pw, "les"); - break; - case LE: - binaryOperatorPrintTo(pw, "leq"); - break; - case GT: - binaryOperatorPrintTo(pw, "gtr"); - break; - case GE: - binaryOperatorPrintTo(pw, "geq"); - break; - } - } - } - - public static class CallExpr extends Expr { - - public Expr receiver; - - public String method; - - public List actuals; - - public boolean isArrayLength; - - public CallExpr(Expr receiver, String method, List actuals, - Location loc) { - super(CALLEXPR, loc); - this.receiver = receiver; - this.method = method; - this.actuals = actuals; - } - - @Override - public void accept(Visitor visitor) { - visitor.visitCallExpr(this); - } - - @Override - public void printTo(IndentPrintWriter pw) { - pw.println("call " + method); - pw.incIndent(); - if (receiver != null) { - receiver.printTo(pw); - } else { - pw.println(""); - } - - for (Expr e : actuals) { - e.printTo(pw); - } - pw.decIndent(); - } - } - - public static class ReadIntExpr extends Expr { - - public ReadIntExpr(Location loc) { - super(READINTEXPR, loc); - } - - @Override - public void accept(Visitor visitor) { - visitor.visitReadIntExpr(this); - } - - @Override - public void printTo(IndentPrintWriter pw) { - pw.println("readint"); - } - } - - public static class ReadLineExpr extends Expr { - - public ReadLineExpr(Location loc) { - super(READLINEEXPR, loc); - } - - @Override - public void accept(Visitor visitor) { - visitor.visitReadLineExpr(this); - } - - @Override - public void printTo(IndentPrintWriter pw) { - pw.println("readline"); - } - } - - public static class ThisExpr extends Expr { - - public ThisExpr(Location loc) { - super(THISEXPR, loc); - } - - @Override - public void accept(Visitor visitor) { - visitor.visitThisExpr(this); - } - - @Override - public void printTo(IndentPrintWriter pw) { - pw.println("this"); - } - } - - /** - * A type cast. - */ - public static class TypeCast extends Expr { - - public String className; - public Expr expr; - - public TypeCast(String className, Expr expr, Location loc) { - super(TYPECAST, loc); - this.className = className; - this.expr = expr; - } - - @Override - public void accept(Visitor v) { - v.visitTypeCast(this); - } - - @Override - public void printTo(IndentPrintWriter pw) { - pw.println("classcast"); - pw.incIndent(); - pw.println(className); - expr.printTo(pw); - pw.decIndent(); - } - } - - /** - * instanceof expression - */ - public static class TypeTest extends Expr { - - public Expr instance; - public String className; - - public TypeTest(Expr instance, String className, Location loc) { - super(TYPETEST, loc); - this.instance = instance; - this.className = className; - } - - @Override - public void accept(Visitor v) { - v.visitTypeTest(this); - } - - @Override - public void printTo(IndentPrintWriter pw) { - pw.println("instanceof"); - pw.incIndent(); - instance.printTo(pw); - pw.println(className); - pw.decIndent(); - } - } - - /** - * An array selection - */ - public static class Indexed extends LValue { - - public Expr array; - public Expr index; - - public Indexed(Expr array, Expr index, Location loc) { - super(INDEXED, loc); - this.array = array; - this.index = index; - } - - @Override - public void accept(Visitor v) { - v.visitIndexed(this); - } - - @Override - public void printTo(IndentPrintWriter pw) { - pw.println("arrref"); - pw.incIndent(); - array.printTo(pw); - index.printTo(pw); - pw.decIndent(); - } - } - - /** - * An identifier - */ - public static class Ident extends LValue { - - public Expr owner; - public String name; - public boolean isDefined; - - public Ident(Expr owner, String name, Location loc) { - super(IDENT, loc); - this.owner = owner; - this.name = name; - } - - @Override - public void accept(Visitor v) { - v.visitIdent(this); - } - - @Override - public void printTo(IndentPrintWriter pw) { - pw.println("varref " + name); - if (owner != null) { - pw.incIndent(); - owner.printTo(pw); - pw.decIndent(); - } - } - } - - /** - * A constant value given literally. - * - * @param value - * value representation - */ - public static class Literal extends Expr { - - public int typeTag; - public Object value; - - public Literal(int typeTag, Object value, Location loc) { - super(LITERAL, loc); - this.typeTag = typeTag; - this.value = value; - } - - @Override - public void accept(Visitor v) { - v.visitLiteral(this); - } - - @Override - public void printTo(IndentPrintWriter pw) { - switch (typeTag) { - case INT: - pw.println("intconst " + value); - break; - case BOOL: - pw.println("boolconst " + value); - break; - default: - pw.println("stringconst " + MiscUtils.quote((String) value)); - } - } - } - - public static class Null extends Expr { - - public Null(Location loc) { - super(NULL, loc); - } - - @Override - public void accept(Visitor v) { - v.visitNull(this); - } - - @Override - public void printTo(IndentPrintWriter pw) { - pw.println("null"); - } - } - - public static abstract class TypeLiteral extends Tree { - - public TypeLiteral(int tag, Location loc) { - super(tag, loc); - } - } - - /** - * Identifies a basic type. - * - * @param tag - * the basic type id - * @see SemanticConstants - */ - public static class TypeIdent extends TypeLiteral { - - public int typeTag; - - public TypeIdent(int typeTag, Location loc) { - super(TYPEIDENT, loc); - this.typeTag = typeTag; - } - - @Override - public void accept(Visitor v) { - v.visitTypeIdent(this); - } - - @Override - public void printTo(IndentPrintWriter pw) { - switch (typeTag) { - case INT: - pw.print("inttype"); - break; - case BOOL: - pw.print("booltype"); - break; - case VOID: - pw.print("voidtype"); - break; - default: - pw.print("stringtype"); - } - } - } - - public static class TypeClass extends TypeLiteral { - - public String name; - - public TypeClass(String name, Location loc) { - super(TYPECLASS, loc); - this.name = name; - } - - @Override - public void accept(Visitor visitor) { - visitor.visitTypeClass(this); - } - - @Override - public void printTo(IndentPrintWriter pw) { - pw.print("classtype " + name); - } - } - - /** - * An array type, A[] - */ - public static class TypeArray extends TypeLiteral { - - public TypeLiteral elementType; - - public TypeArray(TypeLiteral elementType, Location loc) { - super(TYPEARRAY, loc); - this.elementType = elementType; - } - - @Override - public void accept(Visitor v) { - v.visitTypeArray(this); - } - - @Override - public void printTo(IndentPrintWriter pw) { - pw.print("arrtype "); - elementType.printTo(pw); - } - } - - /** - * A generic visitor class for trees. - */ - public static abstract class Visitor { - - public Visitor() { - super(); - } - - public void visitTopLevel(TopLevel that) { - visitTree(that); - } - - public void visitClassDef(ClassDef that) { - visitTree(that); - } - - public void visitMethodDef(MethodDef that) { - visitTree(that); - } - - public void visitVarDef(VarDef that) { - visitTree(that); - } - - public void visitSkip(Skip that) { - visitTree(that); - } - - public void visitBlock(Block that) { - visitTree(that); - } - - public void visitWhileLoop(WhileLoop that) { - visitTree(that); - } - - public void visitForLoop(ForLoop that) { - visitTree(that); - } - - public void visitIf(If that) { - visitTree(that); - } - - public void visitExec(Exec that) { - visitTree(that); - } - - public void visitBreak(Break that) { - visitTree(that); - } - - public void visitReturn(Return that) { - visitTree(that); - } - - public void visitApply(Apply that) { - visitTree(that); - } - - public void visitNewClass(NewClass that) { - visitTree(that); - } - - public void visitNewArray(NewArray that) { - visitTree(that); - } - - public void visitAssign(Assign that) { - visitTree(that); - } - - public void visitUnary(Unary that) { - visitTree(that); - } - - public void visitBinary(Binary that) { - visitTree(that); - } - - public void visitCallExpr(CallExpr that) { - visitTree(that); - } - - public void visitReadIntExpr(ReadIntExpr that) { - visitTree(that); - } - - public void visitReadLineExpr(ReadLineExpr that) { - visitTree(that); - } - - public void visitPrint(Print that) { - visitTree(that); - } - - public void visitThisExpr(ThisExpr that) { - visitTree(that); - } - - public void visitLValue(LValue that) { - visitTree(that); - } - - public void visitTypeCast(TypeCast that) { - visitTree(that); - } - - public void visitTypeTest(TypeTest that) { - visitTree(that); - } - - public void visitIndexed(Indexed that) { - visitTree(that); - } - - public void visitIdent(Ident that) { - visitTree(that); - } - - public void visitLiteral(Literal that) { - visitTree(that); - } - - public void visitNull(Null that) { - visitTree(that); - } - - public void visitTypeIdent(TypeIdent that) { - visitTree(that); - } - - public void visitTypeClass(TypeClass that) { - visitTree(that); - } - - public void visitTypeArray(TypeArray that) { - visitTree(that); - } - - public void visitCalculate(Calculate that) { - visitTree(that); - } - - public void visitTree(Tree that) { - assert false; - } - } -} diff --git a/demos/decaf/src/decaf/error/DecafError.java b/demos/decaf/src/decaf/error/DecafError.java deleted file mode 100755 index 7dedf90..0000000 --- a/demos/decaf/src/decaf/error/DecafError.java +++ /dev/null @@ -1,40 +0,0 @@ -package decaf.error; - -import decaf.Location; - -/** - * Compilation error. - */ -public abstract class DecafError extends Exception { - - /** - * Where error happens. - */ - protected Location location; - - /** - * @return description of error. - */ - protected abstract String getErrMsg(); - - public DecafError(Location location) { - this.location = location; - } - - public Location getLocation() { - return location; - } - - /** - * @return complete description of error including location. - */ - @Override - public String toString() { - if (location.equals(Location.NO_LOCATION)) { - return "*** Error: " + getErrMsg(); - } else { - return "*** Error at " + location + ": " + getErrMsg(); - } - } - -} diff --git a/demos/decaf/src/decaf/error/IntTooLargeError.java b/demos/decaf/src/decaf/error/IntTooLargeError.java deleted file mode 100755 index 633a148..0000000 --- a/demos/decaf/src/decaf/error/IntTooLargeError.java +++ /dev/null @@ -1,23 +0,0 @@ -package decaf.error; - -import decaf.Location; - -/** - * example:integer literal 112233445566778899 is too large
- * PA1 - */ -public class IntTooLargeError extends DecafError { - - private String val; - - public IntTooLargeError(Location location, String val) { - super(location); - this.val = val; - } - - @Override - protected String getErrMsg() { - return "integer literal " + val + " is too large"; - } - -} diff --git a/demos/decaf/src/decaf/error/MsgError.java b/demos/decaf/src/decaf/error/MsgError.java deleted file mode 100755 index c46fcdb..0000000 --- a/demos/decaf/src/decaf/error/MsgError.java +++ /dev/null @@ -1,22 +0,0 @@ -package decaf.error; - -import decaf.Location; - -/** - * Message error, used by parser. - */ -public class MsgError extends DecafError { - - private String msg; - - public MsgError(Location location, String msg) { - super(location); - this.msg = msg; - } - - @Override - protected String getErrMsg() { - return msg; - } - -} diff --git a/demos/decaf/src/decaf/error/NewlineInStrError.java b/demos/decaf/src/decaf/error/NewlineInStrError.java deleted file mode 100755 index 50cfeb1..0000000 --- a/demos/decaf/src/decaf/error/NewlineInStrError.java +++ /dev/null @@ -1,23 +0,0 @@ -package decaf.error; - -import decaf.Location; - -/** - * example:illegal newline in string constant "this is stri"
- * PA1 - */ -public class NewlineInStrError extends DecafError { - - private String str; - - public NewlineInStrError(Location location, String str) { - super(location); - this.str = str; - } - - @Override - protected String getErrMsg() { - return "illegal newline in string constant " + str; - } - -} diff --git a/demos/decaf/src/decaf/error/UnrecogCharError.java b/demos/decaf/src/decaf/error/UnrecogCharError.java deleted file mode 100755 index 5bbaf47..0000000 --- a/demos/decaf/src/decaf/error/UnrecogCharError.java +++ /dev/null @@ -1,21 +0,0 @@ -package decaf.error; - -import decaf.Location; - -/** - * Unrecognize character. - */ -public class UnrecogCharError extends DecafError { - - private char c; - - public UnrecogCharError(Location location, char c) { - super(location); - this.c = c; - } - - @Override - protected String getErrMsg() { - return "unrecognized character '" + c + "'"; - } -} diff --git a/demos/decaf/src/decaf/error/UntermStrError.java b/demos/decaf/src/decaf/error/UntermStrError.java deleted file mode 100755 index 27c4208..0000000 --- a/demos/decaf/src/decaf/error/UntermStrError.java +++ /dev/null @@ -1,23 +0,0 @@ -package decaf.error; - -import decaf.Location; - -/** - * example:unterminated string constant: "this is str"
- * PA1 - */ -public class UntermStrError extends DecafError { - - private String str; - - public UntermStrError(Location location, String str) { - super(location); - this.str = str; - } - - @Override - protected String getErrMsg() { - return "unterminated string constant " + str; - } - -} diff --git a/demos/decaf/src/decaf/utils/IndentPrintWriter.java b/demos/decaf/src/decaf/utils/IndentPrintWriter.java deleted file mode 100755 index 49aad52..0000000 --- a/demos/decaf/src/decaf/utils/IndentPrintWriter.java +++ /dev/null @@ -1,88 +0,0 @@ -package decaf.utils; - -import java.io.OutputStream; -import java.io.OutputStreamWriter; -import java.io.PrintWriter; -import java.io.Writer; - -/** - * Indent printer, used as the printer for the parsed AST. - */ -public class IndentPrintWriter extends PrintWriter { - private int step; - - private StringBuilder indent; - - private boolean newLineBegin; - - /** - * Constructor. - * - * @param out output stream. - * @param step number of spaces for each indentation level. - */ - public IndentPrintWriter(OutputStream out, int step) { - this(new OutputStreamWriter(out), step); - } - - /** - * Constructor. - * - * @param out output writer. - * @param step step number of spaces for each indentation level. - */ - public IndentPrintWriter(Writer out, int step) { - super(out); - this.step = step; - indent = new StringBuilder(); - newLineBegin = true; - } - - /** - * Increase indentation level. - */ - public void incIndent() { - for (int i = 0; i < step; i++) { - indent.append(" "); - } - } - - /** - * Decrease indentation level. - */ - public void decIndent() { - indent.setLength(indent.length() - step); - } - - @Override - public void println() { - super.println(); - newLineBegin = true; - } - - private void writeIndent() { - if (newLineBegin) { - newLineBegin = false; - print(indent); - } - } - - @Override - public void write(char[] buf, int off, int len) { - writeIndent(); - super.write(buf, off, len); - } - - @Override - public void write(int c) { - writeIndent(); - super.write(c); - } - - @Override - public void write(String s, int off, int len) { - writeIndent(); - super.write(s, off, len); - } - -} diff --git a/demos/decaf/src/decaf/utils/MiscUtils.java b/demos/decaf/src/decaf/utils/MiscUtils.java deleted file mode 100755 index fb76f9d..0000000 --- a/demos/decaf/src/decaf/utils/MiscUtils.java +++ /dev/null @@ -1,33 +0,0 @@ -package decaf.utils; - -public final class MiscUtils { - /** - * Return a string with quoted charactors. - * - * @param str input string (internal presentation) - * @return string with quoted charactors and `"` (external presentation) - */ - public static String quote(String str) { - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < str.length(); ++i) { - char c = str.charAt(i); - switch (c) { - case '"': - sb.append("\\\""); - break; - case '\n': - sb.append("\\n"); - break; - case '\t': - sb.append("\\t"); - break; - case '\\': - sb.append("\\\\"); - break; - default: - sb.append(c); - } - } - return ('"' + sb.toString() + '"'); - } -} diff --git a/demos/decaf/testcases/error1.decaf b/demos/decaf/testcases/error1.decaf deleted file mode 100755 index 2c98249..0000000 --- a/demos/decaf/testcases/error1.decaf +++ /dev/null @@ -1,8 +0,0 @@ -// This Program should trigger an "Unrecognized Character Error" - -class Main { - static void main() { - int i; - i = i @ -1; // error! - } -} \ No newline at end of file diff --git a/demos/decaf/testcases/error2.decaf b/demos/decaf/testcases/error2.decaf deleted file mode 100755 index 17f199c..0000000 --- a/demos/decaf/testcases/error2.decaf +++ /dev/null @@ -1,10 +0,0 @@ -// This Program should trigger an "Integer Too Large Error" - -class Main { - static void main() { - int i; - - i = 73295739294; // error! - i = 3141592653; // error too! - } -} \ No newline at end of file diff --git a/demos/decaf/testcases/error3.decaf b/demos/decaf/testcases/error3.decaf deleted file mode 100755 index c045d00..0000000 --- a/demos/decaf/testcases/error3.decaf +++ /dev/null @@ -1,9 +0,0 @@ -// This Program should trigger a "Syntax Error" - -class Main { - static void main() { - int i = 0; // error! we don't support this grammer - - i = i + 1; - } -} \ No newline at end of file diff --git a/demos/decaf/testcases/error4.decaf b/demos/decaf/testcases/error4.decaf deleted file mode 100755 index 429606c..0000000 --- a/demos/decaf/testcases/error4.decaf +++ /dev/null @@ -1,7 +0,0 @@ -class Main { - static void main() { - string str; - str = "string - "; - } -} \ No newline at end of file diff --git a/demos/decaf/testcases/error5.decaf b/demos/decaf/testcases/error5.decaf deleted file mode 100755 index 03a6f95..0000000 --- a/demos/decaf/testcases/error5.decaf +++ /dev/null @@ -1,4 +0,0 @@ -class Main { - static void main() { - string s; - s = "str \ No newline at end of file diff --git a/demos/decaf/testcases/nqueues.decaf b/demos/decaf/testcases/nqueues.decaf deleted file mode 100755 index dc189b1..0000000 --- a/demos/decaf/testcases/nqueues.decaf +++ /dev/null @@ -1,90 +0,0 @@ -// a program to solve the N-queens problem (from Cornell CS412 website) - -class Main { - - static void main() { - new NQueue().init(8).solve(); - } -} - -class NQueues { - int N; - int[] col; - int[] row; - int[] di1; - int[] di2; - - - class NQueues init(int n) { - N = n; - col = clearArray(new int[N]); - row = clearArray(new int[N]); - di1 = clearArray(new int[N]); - di2 = clearArray(new int[N]); - - return this; - } - - - void solve() { - try(0, col, row, di1, di2); - } - - - int[] clearArray(int[] a) { - int i; - i = a.length() - 1; - while (i >= 0) { - a[i] = 0; - } - - return a; - } - - - void printBoard(int[] col, int N) { - int i; - - i = 0; - while (i < N) { - int j; - j = 0; - while (j < N) { - if (col[i] == j) { - Print(1); - } else { - Print(0); - } - } - Print("\n"); - i = i + 1; - } - } - - - void try(int c, int[] row, int[] col, int[] diag1, int[] diag2) { - int N; - int r; - - N = col.length(); - r = 0; - - if (c == N) { - printBoard(col, N); - } else { - while (r < N) { - if (row[r] == 0 && diag1[r+c] == 0 && diag2[r+(N-1)-c] == 0) { - row[r] = 1; - diag1[r+c] = 1; - diag2[r+(N-1)-c] = 1; - col[c] = r; - try(c+1, row, col, diag1, diag2); - row[r] = 0; - diag1[r+c] = 0; - diag2[r+(N-1)-c] = 0; - } - r = r + 1; - } - } - } -} diff --git a/demos/decaf/testcases/test1.decaf b/demos/decaf/testcases/test1.decaf deleted file mode 100755 index 18d2e22..0000000 --- a/demos/decaf/testcases/test1.decaf +++ /dev/null @@ -1,23 +0,0 @@ -class Main { - bool field; - - class Main another; - - int[] foo(int y) { - int[] q; - int i; - - q = new int[y]; - i = 0; - while (i < y) { - q[i] = i; - i = i + 1; - } - - return q; - } - - static int main() { - return this.foo(5).length(); - } -} \ No newline at end of file diff --git a/demos/decaf/testcases/test2.decaf b/demos/decaf/testcases/test2.decaf deleted file mode 100755 index b273097..0000000 --- a/demos/decaf/testcases/test2.decaf +++ /dev/null @@ -1,43 +0,0 @@ -class Main { - int i; - - static void main() { - class Hoo h; - - i = 4; - h = new Goo(); - h.printNumbers(i); - Print(instanceof(h, Goo)); - class Goo g; - g = (class Goo)h; - g.printNumbers(i); - } -} - -class Hoo { - int printNumbers(int n) { - int i; - - if (10 < n) { - n = 10; - } - - i = 0; - while (i < n) { - Print(i); - i = i * 2; - } - - Print("\n"); - - return i; - } -} - -class Goo extends Hoo { - int printNumbers(int n) { - Print(n); - - return 1; - } -} \ No newline at end of file diff --git a/demos/decaf/testcases/test3.decaf b/demos/decaf/testcases/test3.decaf deleted file mode 100755 index 82be045..0000000 --- a/demos/decaf/testcases/test3.decaf +++ /dev/null @@ -1,18 +0,0 @@ -class MultipleFormals { - - int foo(int x, int y, int z) { - return (x + y + z)/3; - } - - int method() { - int x; - int y; - int z; - - x = 3; - y = x + x * x; - z = (x - y / x) % y; - - return foo(x, y, z); - } -} \ No newline at end of file diff --git a/demos/decaf/testcases/test4.decaf b/demos/decaf/testcases/test4.decaf deleted file mode 100755 index e841bd9..0000000 --- a/demos/decaf/testcases/test4.decaf +++ /dev/null @@ -1,22 +0,0 @@ -class Father { - int field; - - void method(int f) { - if (f > 0 && f < 10) { - f = f - 3; - return method(f); - } - } -} - -class Child extends Father { - void start() { - class Father p; - - p = this; - p.field = 5; - p = null; - - Print(this.field); - } -} \ No newline at end of file diff --git a/demos/decaf/testcases/test5.decaf b/demos/decaf/testcases/test5.decaf deleted file mode 100755 index ba0a83e..0000000 --- a/demos/decaf/testcases/test5.decaf +++ /dev/null @@ -1,6 +0,0 @@ -class Main { - static void main() { - string s; - s = "\\\"\n"; - } -} diff --git a/demos/tools/JFlex.jar b/demos/tools/JFlex.jar deleted file mode 100755 index d82e9d6c81146bfbf63355965493994650462eb2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 169635 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 diff --git a/project/assembly.sbt b/project/assembly.sbt deleted file mode 100644 index cc9a881..0000000 --- a/project/assembly.sbt +++ /dev/null @@ -1 +0,0 @@ -addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.5") \ No newline at end of file diff --git a/project/build.properties b/project/build.properties index b275c6a..dca663d 100644 --- a/project/build.properties +++ b/project/build.properties @@ -1 +1 @@ -sbt.version = 0.13.14 \ No newline at end of file +sbt.version = 1.2.8 diff --git a/project/plugins.sbt b/project/plugins.sbt index 14a6ca1..bbcdb4d 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -1 +1,4 @@ -logLevel := Level.Warn \ No newline at end of file +addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.10") + +logLevel := Level.Warn + diff --git a/src/main/scala/Generator.scala b/src/main/scala/decaf/tools/pg/Generator.scala similarity index 98% rename from src/main/scala/Generator.scala rename to src/main/scala/decaf/tools/pg/Generator.scala index 3abed85..c876561 100644 --- a/src/main/scala/Generator.scala +++ b/src/main/scala/decaf/tools/pg/Generator.scala @@ -1,6 +1,8 @@ -import Parsers.Error -import SpecAST._ -import Utils._ +package decaf.tools.pg + +import decaf.tools.pg.Parsers.Error +import decaf.tools.pg.SpecAST._ +import decaf.tools.pg.Utils._ import scala.collection.mutable import scala.util.{Failure, Success, Try} diff --git a/src/main/scala/IndentWriter.scala b/src/main/scala/decaf/tools/pg/IndentWriter.scala similarity index 98% rename from src/main/scala/IndentWriter.scala rename to src/main/scala/decaf/tools/pg/IndentWriter.scala index 31b72ed..b8ea9cb 100644 --- a/src/main/scala/IndentWriter.scala +++ b/src/main/scala/decaf/tools/pg/IndentWriter.scala @@ -1,3 +1,5 @@ +package decaf.tools.pg + import java.io.{BufferedWriter, File, FileWriter} /** diff --git a/src/main/scala/JavaCodeFile.scala b/src/main/scala/decaf/tools/pg/JavaCodeFile.scala similarity index 97% rename from src/main/scala/JavaCodeFile.scala rename to src/main/scala/decaf/tools/pg/JavaCodeFile.scala index cf278f4..3c144b8 100644 --- a/src/main/scala/JavaCodeFile.scala +++ b/src/main/scala/decaf/tools/pg/JavaCodeFile.scala @@ -1,7 +1,9 @@ +package decaf.tools.pg + import java.util.Calendar -import SpecAST._ -import Utils._ +import decaf.tools.pg.SpecAST.{Class, Imports, NonTerminal, Package, SemValue, Token} +import decaf.tools.pg.Utils._ import scala.util.parsing.input.NoPosition @@ -32,7 +34,7 @@ class JavaCodeFile(val pkg: Package, val imports: Imports, val cls: Class, val s writer.writeLn(" * Please do NOT modify it!") writer.writeLn(" *") writer.writeLn(" * Project repository: https://github.com/paulzfm/LL1-Parser-Gen") - writer.writeLn(s" * Version: special version for decaf-PA1-B") + writer.writeLn(s" * Version: decaf-course-19-fall") writer.writeLn(" * Author: Zhu Fengmin (Paul)") writer.writeLn(" */") writer.writeLn() @@ -44,8 +46,8 @@ class JavaCodeFile(val pkg: Package, val imports: Imports, val cls: Class, val s writer.writeLn() // Begin class. - writer.writeLn(cls.toString) - writer.writeLn(" {") + writer.writeLn(cls.decl) + writer.writeLn("{") writer.incIndent() // Print yy variables. diff --git a/src/main/scala/Main.scala b/src/main/scala/decaf/tools/pg/Main.scala similarity index 71% rename from src/main/scala/Main.scala rename to src/main/scala/decaf/tools/pg/Main.scala index 46bacb2..19aeb71 100644 --- a/src/main/scala/Main.scala +++ b/src/main/scala/decaf/tools/pg/Main.scala @@ -1,4 +1,7 @@ +package decaf.tools.pg + import java.io.File +import java.nio.file.Paths import scala.util.{Failure, Success, Try} @@ -9,29 +12,31 @@ object Main { def main(args: Array[String]): Unit = { // Parse command line option and arguments. var specFileName = "" - var parserFileName = "" + var outputDir = "" var strictMode = false + val usage = "Usage: java -jar ll1-pg.jar [-strict] " + if (args.length == 0) { - Console.err.println(s"Usage: java -jar pg.jar [-strict] ") + Console.err.println(usage) System.exit(1) } else if (args(0) == "-strict") { if (args.length >= 3) { specFileName = args(1) - parserFileName = args(2) + outputDir = args(2) strictMode = true } else { - Console.err.println(s"Usage: java -jar pg.jar [-strict] ") + Console.err.println(usage) System.exit(1) } } else if (args.length == 2) { specFileName = args(0) - parserFileName = args(1) + outputDir = args(1) } else if (args.length == 3) { Console.err.println(s"Invalid option: ${args(0)}") System.exit(1) } else { - Console.err.println(s"Usage: java -jar pg.jar [-strict] ") + Console.err.println(usage) System.exit(1) } @@ -40,27 +45,25 @@ object Main { val source = scala.io.Source.fromFile(inputFile) val lines = try source.mkString finally source.close() - val outputFile = new File(parserFileName) - // Parse and generate. - def parseAndGenerate(source: String): Try[Unit] = for { + def parseAndGenerate(source: String): Try[String] = for { spec <- Parsers.parse(source) gen = new Generator(spec, inputFile.getAbsolutePath, strictMode) code <- gen.generate } yield { val writer = new IndentWriter code.printTo(writer) + val outputFile = Paths.get(outputDir).resolve(spec.output.path.symbol).toFile writer.outputToFile(outputFile) + outputFile.toString } parseAndGenerate(lines) match { - case Success(_) => - println("Parser is successfully generated and written to \"" + - outputFile.getAbsolutePath + "\"") + case Success(outputFile) => + println("Parser is successfully generated and written to \"" + outputFile + "\"") case Failure(ex) => Console.err.println(ex.getMessage) System.exit(1) } } - } diff --git a/src/main/scala/Parsers.scala b/src/main/scala/decaf/tools/pg/Parsers.scala similarity index 85% rename from src/main/scala/Parsers.scala rename to src/main/scala/decaf/tools/pg/Parsers.scala index 6e21f34..353f078 100644 --- a/src/main/scala/Parsers.scala +++ b/src/main/scala/decaf/tools/pg/Parsers.scala @@ -1,4 +1,6 @@ -import SpecAST._ +package decaf.tools.pg + +import decaf.tools.pg.SpecAST.{Class, Const, ConstToken, Header, Headers, Ident, IdentToken, Imports, JavaCode, NonTerminal, OutputFile, Package, Rule, SemValue, Spec, Start, Term, Terminal, Token, Tokens} import scala.util.matching.Regex import scala.util.parsing.combinator.RegexParsers @@ -46,14 +48,16 @@ object Parsers { def ident: Parser[Ident] = positioned("""[_A-Za-z][_A-Za-z0-9]*""".r ^^ Ident) - def const: Parser[Const] = positioned("'" ~> """.""".r <~ "'" ^^ { + def constChar: Parser[Const] = positioned("'" ~> """.""".r <~ "'" ^^ { str => Const(str.head) }) - def token: Parser[Token] = positioned(ident ^^ IdentToken | const ^^ ConstToken) + def token: Parser[Token] = positioned(ident ^^ IdentToken | constChar ^^ ConstToken) def pkgName: Parser[Ident] = positioned("""[a-zA-Z0-9_.*]+""".r ^^ Ident) + def constStr: Parser[Ident] = positioned("\"" ~> """[^"]*""".r <~ "\"" ^^ Ident) + // to ignore Java-style comments protected override val whiteSpace: Regex = """(\s|//.*|(?m)/\*(\*(?!/)|[^*])*\*/)+""".r @@ -69,13 +73,21 @@ object Parsers { def semValue: Parser[SemValue] = positioned("%sem" ~> ident ^^ SemValue) - def cls: Parser[Class] = positioned("%class" ~> ident ^^ Class) + def javaClassMod: Parser[Ident] = positioned { + ("public" | "abstract" | "final") ^^ Ident + } + + def cls: Parser[Class] = positioned("%class" ~> javaClassMod.* ~ "class" ~ ident ~ ident.* ^^ { + case mods ~ _ ~ name ~ others => Class(name, (mods ++ List("class", name) ++ others).mkString(" ")) + }) + + def outputFile: Parser[OutputFile] = positioned("%output" ~> constStr ^^ OutputFile) def start: Parser[Start] = positioned("%start" ~> ident ^^ (NonTerminal andThen Start)) def tokens: Parser[Tokens] = positioned("%tokens" ~> token.* ^^ Tokens) - def header: Parser[Header] = positioned(pkg | imports | semValue | cls | start | tokens) + def header: Parser[Header] = positioned(pkg | imports | semValue | cls | outputFile | start | tokens) def headers: Parser[List[Header]] = header.* <~ "%%" } @@ -178,7 +190,7 @@ object Parsers { * - `Failure(ex)` if fails, and `ex` shows the error. */ def parseRules(source: HeaderParsers#Input, headers: Headers): Try[List[Rule]] = { - val tokens = headers._5.tokens + val tokens = headers._6.tokens val p = new RuleParser(tokens) p.parseAll(p.rules, source) match { case p.Success(rules: List[Rule], _) => Success(rules) @@ -209,9 +221,10 @@ object Parsers { h2 <- find[Imports](hds, x => x.isInstanceOf[Imports], "imports", "%import") h3 <- find[SemValue](hds, x => x.isInstanceOf[SemValue], "semantic value", "%sem") h4 <- find[Class](hds, x => x.isInstanceOf[Class], "class", "%class") - h5 <- find[Tokens](hds, x => x.isInstanceOf[Tokens], "tokens", "%tokens") - h6 <- find[Start](hds, x => x.isInstanceOf[Start], "start symbol", "%start") - headers = (h1, h2, h3, h4, h5, h6) + h5 <- find[OutputFile](hds, x => x.isInstanceOf[OutputFile], "output file path", "%output") + h6 <- find[Tokens](hds, x => x.isInstanceOf[Tokens], "tokens", "%tokens") + h7 <- find[Start](hds, x => x.isInstanceOf[Start], "start symbol", "%start") + headers = (h1, h2, h3, h4, h5, h6, h7) rules <- parseRules(next, headers) _ <- Try(checkNonTerminals(rules)) } yield Spec(headers, rules) diff --git a/src/main/scala/Printable.scala b/src/main/scala/decaf/tools/pg/Printable.scala similarity index 85% rename from src/main/scala/Printable.scala rename to src/main/scala/decaf/tools/pg/Printable.scala index ccc3456..ae04074 100644 --- a/src/main/scala/Printable.scala +++ b/src/main/scala/decaf/tools/pg/Printable.scala @@ -1,3 +1,5 @@ +package decaf.tools.pg + /** * An interface for type/class that can be printed to `IndentWriter`. */ diff --git a/src/main/scala/SpecAST.scala b/src/main/scala/decaf/tools/pg/SpecAST.scala similarity index 87% rename from src/main/scala/SpecAST.scala rename to src/main/scala/decaf/tools/pg/SpecAST.scala index ac8523a..088599a 100644 --- a/src/main/scala/SpecAST.scala +++ b/src/main/scala/decaf/tools/pg/SpecAST.scala @@ -1,3 +1,5 @@ +package decaf.tools.pg + import scala.util.parsing.input.Positional /** @@ -59,7 +61,7 @@ object SpecAST { /** * Complete headers. */ - type Headers = (Package, Imports, SemValue, Class, Tokens, Start) + type Headers = (Package, Imports, SemValue, Class, OutputFile, Tokens, Start) /** * Top level node presenting the whole specification. @@ -76,9 +78,11 @@ object SpecAST { def cls: Class = headers._4 - def tokens: List[Token] = headers._5.tokens + def output: OutputFile = headers._5 + + def tokens: List[Token] = headers._6.tokens - def start: NonTerminal = headers._6.symbol + def start: NonTerminal = headers._7.symbol } /** @@ -91,7 +95,7 @@ object SpecAST { def Spec(headers: (Tokens, Start), rules: List[Rule]): Spec = { val (tokens, start) = headers Spec( - (Package(Ident("")), Imports(Nil), SemValue(Ident("")), Class(Ident("")), tokens, start), + (Package(Ident("")), Imports(Nil), SemValue(Ident("")), Class(Ident(""), ""), OutputFile(Ident("")), tokens, start), rules ) } @@ -129,10 +133,20 @@ object SpecAST { /** * Class for the parser. * - * @param name identifier presenting the name of the class. + * @param name class name + * @param decl class declaration line, e.g. `public class Parser extends BaseParser implements IParser`. + */ + case class Class(name: Ident, decl: String) extends Header { + override def toString: String = decl + } + + /** + * Output file path for the parser. + * + * @param path file name */ - case class Class(name: Ident) extends Header { - override def toString: String = s"public class $name" + case class OutputFile(path: Ident) extends Header { + override def toString: String = path.toString } /** diff --git a/src/main/scala/Utils.scala b/src/main/scala/decaf/tools/pg/Utils.scala similarity index 97% rename from src/main/scala/Utils.scala rename to src/main/scala/decaf/tools/pg/Utils.scala index a9a046d..ddebd47 100644 --- a/src/main/scala/Utils.scala +++ b/src/main/scala/decaf/tools/pg/Utils.scala @@ -1,4 +1,6 @@ -import SpecAST._ +package decaf.tools.pg + +import decaf.tools.pg.SpecAST._ import scala.collection.mutable @@ -82,4 +84,4 @@ object Utils { case class NonTerminalPSTable(symbol: NonTerminal, cases: List[(List[LASym], Sentence, JavaCode)]) -} \ No newline at end of file +} diff --git a/src/test/scala/TestGenerator.scala b/src/test/scala/decaf/tools/pg/TestGenerator.scala similarity index 97% rename from src/test/scala/TestGenerator.scala rename to src/test/scala/decaf/tools/pg/TestGenerator.scala index 1d5bba7..e7cd2a1 100644 --- a/src/test/scala/TestGenerator.scala +++ b/src/test/scala/decaf/tools/pg/TestGenerator.scala @@ -1,5 +1,7 @@ -import SpecAST._ -import Utils._ +package decaf.tools.pg + +import decaf.tools.pg.SpecAST.{NonTerminal, _} +import decaf.tools.pg.Utils._ import org.junit.runner.RunWith import org.scalatest.FunSuite import org.scalatest.junit.JUnitRunner diff --git a/src/test/scala/TestParsers.scala b/src/test/scala/decaf/tools/pg/TestParsers.scala similarity index 85% rename from src/test/scala/TestParsers.scala rename to src/test/scala/decaf/tools/pg/TestParsers.scala index 296ed75..2073d83 100644 --- a/src/test/scala/TestParsers.scala +++ b/src/test/scala/decaf/tools/pg/TestParsers.scala @@ -1,5 +1,7 @@ -import Parsers._ -import SpecAST._ +package decaf.tools.pg + +import decaf.tools.pg.Parsers.RuleParser +import decaf.tools.pg.SpecAST._ import org.junit.runner.RunWith import org.scalatest.FunSuite import org.scalatest.junit.JUnitRunner @@ -44,10 +46,16 @@ class TestParsers extends FunSuite { assert(p.parseAll(p.semValue, "%sem SemValue").get == SemValue(Ident("SemValue"))) } - test("parse class: %class Parser") { + test("parse class: %class public class Parser") { val p = new Parsers.HeaderParsers - assert(p.parseAll(p.cls, "%class Parser").get == - Class(Ident("Parser"))) + assert(p.parseAll(p.cls, "%class public class Parser").get == + Class(Ident("Parser"), "public class Parser")) + } + + test("parse output file: %output \"Parser.java\"") { + val p = new Parsers.HeaderParsers + assert(p.parseAll(p.outputFile, "%output \"Parser.java\"").get == + OutputFile(Ident("Parser.java"))) } test("parse start: %start TopLevel") { @@ -123,11 +131,11 @@ class TestParsers extends FunSuite { val tokens = List(';').map(ConstToken) val code = """stmt : simpleStmt ';' - > { - > if ($$.stmt == null) { - > $$.stmt = new Skip; - > } - > } + > { + > if ($$.stmt == null) { + > $$.stmt = new Skip; + > } + > } """.stripMargin('>') val p = new RuleParser(tokens) @@ -143,10 +151,10 @@ class TestParsers extends FunSuite { val tokens = List(';').map(ConstToken) val code = """stmt : simpleStmt ';' - > { - > if ($$.stmt == null) { - > $$.stmt = new Skip; - > } + > { + > if ($$.stmt == null) { + > $$.stmt = new Skip; + > } """.stripMargin('>') val p = new RuleParser(tokens) @@ -158,7 +166,7 @@ class TestParsers extends FunSuite { } } - test ("parse rule with undefined token: '^'") { + test("parse rule with undefined token: '^'") { val tokens = List('+', '-').map(ConstToken) val code = """expr : expr '+' expr