diff --git a/EOF.class b/EOF.class new file mode 100644 index 0000000..02a1bec Binary files /dev/null and b/EOF.class differ diff --git a/GETEILT.class b/GETEILT.class new file mode 100644 index 0000000..9d00195 Binary files /dev/null and b/GETEILT.class differ diff --git a/JLex2.jar b/JLex2.jar new file mode 100644 index 0000000..4baf1f9 Binary files /dev/null and b/JLex2.jar differ diff --git a/KLAMMERAUF.class b/KLAMMERAUF.class new file mode 100644 index 0000000..38704b9 Binary files /dev/null and b/KLAMMERAUF.class differ diff --git a/KLAMMERZU.class b/KLAMMERZU.class new file mode 100644 index 0000000..420958c Binary files /dev/null and b/KLAMMERZU.class differ diff --git a/MAL.class b/MAL.class new file mode 100644 index 0000000..ff226a3 Binary files /dev/null and b/MAL.class differ diff --git a/MALKLAMMERAUF.class b/MALKLAMMERAUF.class new file mode 100644 index 0000000..6c45ab8 Binary files /dev/null and b/MALKLAMMERAUF.class differ diff --git a/MINUS.class b/MINUS.class new file mode 100644 index 0000000..2ecde58 Binary files /dev/null and b/MINUS.class differ diff --git a/Main.class b/Main.class new file mode 100644 index 0000000..aa820e6 Binary files /dev/null and b/Main.class differ diff --git a/Main.java b/Main.java new file mode 100644 index 0000000..28a05db --- /dev/null +++ b/Main.java @@ -0,0 +1,20 @@ +import java.io.FileNotFoundException; + +public class Main { +public static void main (String [] args) { +TschenrechnerScanner scanner; +try { + scanner = new TschenrechnerScanner + (new java.io.FileReader("test")); +} catch (FileNotFoundException e) { + scanner = new TschenrechnerScanner(new java.io.StringReader("digga")); +} +TschenrechnerParser parser = new TschenrechnerParser() ; +try { +parser.yyparse(scanner); +} +catch (Exception e) { +e.printStackTrace(); +} +} +} \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..c5dabdb --- /dev/null +++ b/Makefile @@ -0,0 +1,15 @@ +JAVAC = javac +JAOOY = jaooy + +Main.class: Main.java yyTokenclass.class TschenrechnerScanner.class + $(JAVAC) Main.java +yyTokenclass.class: TschenrechnerParser.java + $(JAVAC) TschenrechnerParser.java +TschenrechnerScanner.class: TaschenrechnerLexer.java + $(JAVAC) TaschenrechnerLexer.java +TaschenrechnerLexer.java: TaschenrechnerLexer + java -cp JLex2.jar JLex2.Main TaschenrechnerLexer +TschenrechnerParser.java: TschenrechnerParser.jay skeleton.jaooy + $(JAOOY) -v TschenrechnerParser.jay < skeleton.jaooy > TschenrechnerParser.java +clean: + rm -f *.class TaschenrechnerLexer.java TschenrechnerParser.java \ No newline at end of file diff --git a/PLUS.class b/PLUS.class new file mode 100644 index 0000000..f0a4bd3 Binary files /dev/null and b/PLUS.class differ diff --git a/TaschenrechnerLexer b/TaschenrechnerLexer new file mode 100644 index 0000000..4e8e676 --- /dev/null +++ b/TaschenrechnerLexer @@ -0,0 +1,25 @@ +%% +%jayscanner TschenrechnerScanner +%jayparser TschenrechnerParser + +%class TaschenrechnerLexer +%eofval{ + System.out.println("ENd of file: gut gemacht"); + return new EOF(); +%eofval} + +ws = [ \t\r\n\b\015]+ +%% + +"+" { return new PLUS(); } +"*" { return new MAL(); } +"-" { return new MINUS(); } +"/" { return new GETEILT(); } +"(" { return new KLAMMERAUF(); } +")" { return new KLAMMERZU(); } +[+|-]?[0-9][0-9]*("."[0-9]+)? { return new ZAHL();} +[+|-]?[0-9][0-9]*("."[0-9]+)?"(" {return new KLAMMERAUF();} +{ws} { } +. {System.out.print("Fehler");} + + diff --git a/TaschenrechnerLexer.class b/TaschenrechnerLexer.class new file mode 100644 index 0000000..c68b65c Binary files /dev/null and b/TaschenrechnerLexer.class differ diff --git a/TaschenrechnerLexer.java b/TaschenrechnerLexer.java new file mode 100644 index 0000000..c6ce1ce --- /dev/null +++ b/TaschenrechnerLexer.java @@ -0,0 +1,348 @@ + + +class TaschenrechnerLexer { + private final int YY_BUFFER_SIZE = 512; + private final int YY_F = -1; + private final int YY_NO_STATE = -1; + private final int YY_NOT_ACCEPT = 0; + private final int YY_START = 1; + private final int YY_END = 2; + private final int YY_NO_ANCHOR = 4; + private final int YY_BOL = 128; + private final int YY_EOF = 129; + private java.io.BufferedReader yy_reader; + private int yy_buffer_index; + private int yy_buffer_read; + private int yy_buffer_start; + private int yy_buffer_end; + private char yy_buffer[]; + private boolean yy_at_bol; + private int yy_lexical_state; + + TaschenrechnerLexer (java.io.Reader reader) { + this (); + if (null == reader) { + throw (new Error("Error: Bad input stream initializer.")); + } + yy_reader = new java.io.BufferedReader(reader); + } + + TaschenrechnerLexer (java.io.InputStream instream) { + this (); + if (null == instream) { + throw (new Error("Error: Bad input stream initializer.")); + } + yy_reader = new java.io.BufferedReader(new java.io.InputStreamReader(instream)); + } + + private TaschenrechnerLexer () { + yy_buffer = new char[YY_BUFFER_SIZE]; + yy_buffer_read = 0; + yy_buffer_index = 0; + yy_buffer_start = 0; + yy_buffer_end = 0; + yy_at_bol = true; + yy_lexical_state = YYINITIAL; + } + + private boolean yy_eof_done = false; + private final int YYINITIAL = 0; + private final int yy_state_dtrans[] = { + 0 + }; + private void yybegin (int state) { + yy_lexical_state = state; + } + private int yy_advance () + throws java.io.IOException { + int next_read; + int i; + int j; + + if (yy_buffer_index < yy_buffer_read) { + return yy_buffer[yy_buffer_index++]; + } + + if (0 != yy_buffer_start) { + i = yy_buffer_start; + j = 0; + while (i < yy_buffer_read) { + yy_buffer[j] = yy_buffer[i]; + ++i; + ++j; + } + yy_buffer_end = yy_buffer_end - yy_buffer_start; + yy_buffer_start = 0; + yy_buffer_read = j; + yy_buffer_index = j; + next_read = yy_reader.read(yy_buffer, + yy_buffer_read, + yy_buffer.length - yy_buffer_read); + if (-1 == next_read) { + return YY_EOF; + } + yy_buffer_read = yy_buffer_read + next_read; + } + + while (yy_buffer_index >= yy_buffer_read) { + if (yy_buffer_index >= yy_buffer.length) { + yy_buffer = yy_double(yy_buffer); + } + next_read = yy_reader.read(yy_buffer, + yy_buffer_read, + yy_buffer.length - yy_buffer_read); + if (-1 == next_read) { + return YY_EOF; + } + yy_buffer_read = yy_buffer_read + next_read; + } + return yy_buffer[yy_buffer_index++]; + } + private void yy_move_end () { + if (yy_buffer_end > yy_buffer_start && + '\n' == yy_buffer[yy_buffer_end-1]) + yy_buffer_end--; + if (yy_buffer_end > yy_buffer_start && + '\r' == yy_buffer[yy_buffer_end-1]) + yy_buffer_end--; + } + private boolean yy_last_was_cr=false; + private void yy_mark_start () { + yy_buffer_start = yy_buffer_index; + } + private void yy_mark_end () { + yy_buffer_end = yy_buffer_index; + } + private void yy_to_mark () { + yy_buffer_index = yy_buffer_end; + yy_at_bol = (yy_buffer_end > yy_buffer_start) && + ('\r' == yy_buffer[yy_buffer_end-1] || + '\n' == yy_buffer[yy_buffer_end-1] || + 2028/*LS*/ == yy_buffer[yy_buffer_end-1] || + 2029/*PS*/ == yy_buffer[yy_buffer_end-1]); + } + private java.lang.String yytext () { + return (new java.lang.String(yy_buffer, + yy_buffer_start, + yy_buffer_end - yy_buffer_start)); + } + private int yylength () { + return yy_buffer_end - yy_buffer_start; + } + private char[] yy_double (char buf[]) { + int i; + char newbuf[]; + newbuf = new char[2*buf.length]; + for (i = 0; i < buf.length; ++i) { + newbuf[i] = buf[i]; + } + return newbuf; + } + private final int YY_E_INTERNAL = 0; + private final int YY_E_MATCH = 1; + private java.lang.String yy_error_string[] = { + "Error: Internal error.\n", + "Error: Unmatched input.\n" + }; + private void yy_error (int code,boolean fatal) { + java.lang.System.out.print(yy_error_string[code]); + java.lang.System.out.flush(); + if (fatal) { + throw new Error("Fatal Error.\n"); + } + } + private int[][] unpackFromString(int size1, int size2, String st) { + int colonIndex = -1; + String lengthString; + int sequenceLength = 0; + int sequenceInteger = 0; + + int commaIndex; + String workString; + + int res[][] = new int[size1][size2]; + for (int i= 0; i < size1; i++) { + for (int j= 0; j < size2; j++) { + if (sequenceLength != 0) { + res[i][j] = sequenceInteger; + sequenceLength--; + continue; + } + commaIndex = st.indexOf(','); + workString = (commaIndex==-1) ? st : + st.substring(0, commaIndex); + st = st.substring(commaIndex+1); + colonIndex = workString.indexOf(':'); + if (colonIndex == -1) { + res[i][j]=Integer.parseInt(workString); + continue; + } + lengthString = + workString.substring(colonIndex+1); + sequenceLength=Integer.parseInt(lengthString); + workString=workString.substring(0,colonIndex); + sequenceInteger=Integer.parseInt(workString); + res[i][j] = sequenceInteger; + sequenceLength--; + } + } + return res; + } + private int yy_acpt[] = { + /* 0 */ YY_NOT_ACCEPT, + /* 1 */ YY_NO_ANCHOR, + /* 2 */ YY_NO_ANCHOR, + /* 3 */ YY_NO_ANCHOR, + /* 4 */ YY_NO_ANCHOR, + /* 5 */ YY_NO_ANCHOR, + /* 6 */ YY_NO_ANCHOR, + /* 7 */ YY_NO_ANCHOR, + /* 8 */ YY_NO_ANCHOR, + /* 9 */ YY_NO_ANCHOR, + /* 10 */ YY_NO_ANCHOR, + /* 11 */ YY_NO_ANCHOR, + /* 12 */ YY_NOT_ACCEPT, + /* 13 */ YY_NO_ANCHOR, + /* 14 */ YY_NO_ANCHOR + }; + private int yy_cmap[] = unpackFromString(1,130, +"11:8,10:3,11:2,10,11:18,10,11:7,5,6,2,1,11,3,9,4,8:10,11:66,7,11:3,0:2")[0]; + + private int yy_rmap[] = unpackFromString(1,15, +"0,1,2,1,2,1:3,2,3,4,1,5,1,6")[0]; + + private int yy_nxt[][] = unpackFromString(7,12, +"1,2,3,4,5,6,7,8,9,13,10,13,-1:20,9,-1:8,11,-1:2,9,12,-1:12,10,-1:9,14,-1:8," + +"11,-1:2,14,-1:3"); + + public yyTokenclass yylex () + throws java.io.IOException { + int yy_lookahead; + int yy_anchor = YY_NO_ANCHOR; + int yy_state = yy_state_dtrans[yy_lexical_state]; + int yy_next_state = YY_NO_STATE; + int yy_last_accept_state = YY_NO_STATE; + boolean yy_initial = true; + int yy_this_accept; + + yy_mark_start(); + yy_this_accept = yy_acpt[yy_state]; + if (YY_NOT_ACCEPT != yy_this_accept) { + yy_last_accept_state = yy_state; + yy_mark_end(); + } + while (true) { + if (yy_initial && yy_at_bol) yy_lookahead = YY_BOL; + else yy_lookahead = yy_advance(); + yy_next_state = YY_F; + yy_next_state = yy_nxt[yy_rmap[yy_state]][yy_cmap[yy_lookahead]]; + if (YY_EOF == yy_lookahead && true == yy_initial) { + + System.out.println("ENd of file: gut gemacht"); + return new EOF(); + } + if (YY_F != yy_next_state) { + yy_state = yy_next_state; + yy_initial = false; + yy_this_accept = yy_acpt[yy_state]; + if (YY_NOT_ACCEPT != yy_this_accept) { + yy_last_accept_state = yy_state; + yy_mark_end(); + } + } + else { + if (YY_NO_STATE == yy_last_accept_state) { + throw (new Error("Lexical Error: Unmatched Input.")); + } + else { + yy_anchor = yy_acpt[yy_last_accept_state]; + if (0 != (YY_END & yy_anchor)) { + yy_move_end(); + } + yy_to_mark(); + switch (yy_last_accept_state) { + case 1: + + case -2: + break; + case 2: + { return new PLUS(); } + case -3: + break; + case 3: + { return new MAL(); } + case -4: + break; + case 4: + { return new MINUS(); } + case -5: + break; + case 5: + { return new GETEILT(); } + case -6: + break; + case 6: + { return new KLAMMERAUF(); } + case -7: + break; + case 7: + { return new KLAMMERZU(); } + case -8: + break; + case 8: + {System.out.print("Fehler");} + case -9: + break; + case 9: + { return new ZAHL();} + case -10: + break; + case 10: + { } + case -11: + break; + case 11: + {return new KLAMMERAUF();} + case -12: + break; + case 13: + {System.out.print("Fehler");} + case -13: + break; + case 14: + { return new ZAHL();} + case -14: + break; + default: + yy_error(YY_E_INTERNAL,false); + case -1: + } + yy_initial = true; + yy_state = yy_state_dtrans[yy_lexical_state]; + yy_next_state = YY_NO_STATE; + yy_last_accept_state = YY_NO_STATE; + yy_mark_start(); + yy_this_accept = yy_acpt[yy_state]; + if (YY_NOT_ACCEPT != yy_this_accept) { + yy_last_accept_state = yy_state; + yy_mark_end(); + } + } + } + } + } +} +class TschenrechnerScanner extends TaschenrechnerLexer implements TschenrechnerParser.yyInput { + public TschenrechnerScanner (java.io.Reader reader) { + super (reader); + } + //public int token() is not longer necessary + + public yyTokenclass advance() throws java.io.IOException { + yyTokenclass ret = yylex(); + return ret; + } + + //public Object value () is not longer necessary + +} diff --git a/TschenrechnerParser$YyCheckClass.class b/TschenrechnerParser$YyCheckClass.class new file mode 100644 index 0000000..fa01198 Binary files /dev/null and b/TschenrechnerParser$YyCheckClass.class differ diff --git a/TschenrechnerParser$YyDefRedClass.class b/TschenrechnerParser$YyDefRedClass.class new file mode 100644 index 0000000..727c224 Binary files /dev/null and b/TschenrechnerParser$YyDefRedClass.class differ diff --git a/TschenrechnerParser$YyDgotoClass.class b/TschenrechnerParser$YyDgotoClass.class new file mode 100644 index 0000000..c56b946 Binary files /dev/null and b/TschenrechnerParser$YyDgotoClass.class differ diff --git a/TschenrechnerParser$YyGindexClass.class b/TschenrechnerParser$YyGindexClass.class new file mode 100644 index 0000000..70a7ff6 Binary files /dev/null and b/TschenrechnerParser$YyGindexClass.class differ diff --git a/TschenrechnerParser$YyLenClass.class b/TschenrechnerParser$YyLenClass.class new file mode 100644 index 0000000..b026737 Binary files /dev/null and b/TschenrechnerParser$YyLenClass.class differ diff --git a/TschenrechnerParser$YyLhsClass.class b/TschenrechnerParser$YyLhsClass.class new file mode 100644 index 0000000..cbd68f9 Binary files /dev/null and b/TschenrechnerParser$YyLhsClass.class differ diff --git a/TschenrechnerParser$YyNameClass.class b/TschenrechnerParser$YyNameClass.class new file mode 100644 index 0000000..438f824 Binary files /dev/null and b/TschenrechnerParser$YyNameClass.class differ diff --git a/TschenrechnerParser$YyRindexClass.class b/TschenrechnerParser$YyRindexClass.class new file mode 100644 index 0000000..664ba3d Binary files /dev/null and b/TschenrechnerParser$YyRindexClass.class differ diff --git a/TschenrechnerParser$YySindexClass.class b/TschenrechnerParser$YySindexClass.class new file mode 100644 index 0000000..97129c2 Binary files /dev/null and b/TschenrechnerParser$YySindexClass.class differ diff --git a/TschenrechnerParser$YyTableClass.class b/TschenrechnerParser$YyTableClass.class new file mode 100644 index 0000000..37c89b4 Binary files /dev/null and b/TschenrechnerParser$YyTableClass.class differ diff --git a/TschenrechnerParser$yyCheck0.class b/TschenrechnerParser$yyCheck0.class new file mode 100644 index 0000000..fc04452 Binary files /dev/null and b/TschenrechnerParser$yyCheck0.class differ diff --git a/TschenrechnerParser$yyException.class b/TschenrechnerParser$yyException.class new file mode 100644 index 0000000..60aa0b1 Binary files /dev/null and b/TschenrechnerParser$yyException.class differ diff --git a/TschenrechnerParser$yyInput.class b/TschenrechnerParser$yyInput.class new file mode 100644 index 0000000..56170ea Binary files /dev/null and b/TschenrechnerParser$yyInput.class differ diff --git a/TschenrechnerParser$yyTable0.class b/TschenrechnerParser$yyTable0.class new file mode 100644 index 0000000..fd07a48 Binary files /dev/null and b/TschenrechnerParser$yyTable0.class differ diff --git a/TschenrechnerParser.class b/TschenrechnerParser.class new file mode 100644 index 0000000..a5f13b9 Binary files /dev/null and b/TschenrechnerParser.class differ diff --git a/TschenrechnerParser.java b/TschenrechnerParser.java new file mode 100644 index 0000000..60a8b48 --- /dev/null +++ b/TschenrechnerParser.java @@ -0,0 +1,631 @@ +// created by jay 0.8 (c) 1998 Axel.Schreiner@informatik.uni-osnabrueck.de + + // line 1 "TschenrechnerParser.jay" + +class TschenrechnerParser { + // line 7 "-" + yyError yytemperror = new yyError(); + public final int yyErrorCode = yytemperror.tokennr; + + /** thrown for irrecoverable syntax errors and stack overflow. + */ + public static class yyException extends java.lang.Exception { + public yyException (String message) { + super(message); + } + } + + /** must be implemented by a scanner object to supply input to the parser. + */ + public interface yyInput { + /** move on to next token. + @return false if positioned beyond tokens. + @throws IOException on input error. + */ + /** modified by diho, 10.04.2004 */ + yyTokenclass advance () throws java.io.IOException; + /** classifies current token. + Should not be called if advance() returned false. + @return current %token or single character. + */ + /** modified by diho, 10.04.2004 token () is not longer necessary, + advance () supplies token or null + int token (); */ + + + /** associated with current token. + Should not be called if advance() returned false. + @return value for token(). + */ + /** modified by diho, 10.04.2004 value () is not longer necessary, + Token value can be retrieved from Token itself. + Object value ();*/ + } + + /** simplified error message. + @see yyerror + */ + public void yyerror (String message) { + yyerror(message, null); + } + + /** (syntax) error message. + Can be overwritten to control message format. + @param message text to be displayed. + @param expected vector of acceptable tokens, if available. + */ + public void yyerror (String message, String[] expected) { + if (expected != null && expected.length > 0) { + System.err.print(message+", expecting"); + for (int n = 0; n < expected.length; ++ n) + System.err.print(" "+expected[n]); + System.err.println(); + } else + System.err.println(message); + } + + /** debugging support, requires the package jay.yydebug. + Set to null to suppress debugging messages. + */ +//t protected jay.yydebug.yyDebug yydebug; + + protected static final int yyFinal = 3; + + /** index-checked interface to yyName[]. + @param token single character or %token value. + @return token name or [illegal] or [unknown]. + */ +//t public static final String yyname (int token) { +//t if (token < 0 || token > YyNameClass.yyName.length) return "[illegal]"; +//t String name; +//t if ((name = YyNameClass.yyName[token]) != null) return name; +//t return "[unknown]"; +//t } + + /** computes list of expected tokens on error by tracing the tables. + @param state for which to compute the list. + @return list of token names. + */ + protected String[] yyExpecting (int state) { + int token, n, len = 0; + boolean[] ok = new boolean[YyNameClass.yyName.length]; + + if ((n = YySindexClass.yySindex[state]) != 0) + for (token = n < 0 ? -n : 0; + token < YyNameClass.yyName.length && n+token < YyTableClass.yyTable.length; ++ token) + if (YyCheckClass.yyCheck[n+token] == token && !ok[token] && YyNameClass.yyName[token] != null) { + ++ len; + ok[token] = true; + } + if ((n = YyRindexClass.yyRindex[state]) != 0) + for (token = n < 0 ? -n : 0; + token < YyNameClass.yyName.length && n+token < YyTableClass.yyTable.length; ++ token) + if (YyCheckClass.yyCheck[n+token] == token && !ok[token] && YyNameClass.yyName[token] != null) { + ++ len; + ok[token] = true; + } + + String result[] = new String[len]; + for (n = token = 0; n < len; ++ token) + if (ok[token]) result[n++] = YyNameClass.yyName[token]; + return result; + } + + /** the generated parser, with debugging messages. + Maintains a state and a value stack, currently with fixed maximum size. + @param yyLex scanner. + @param yydebug debug message writer implementing yyDebug, or null. + @return result of the last reduction, if any. + @throws yyException on irrecoverable parse error. + */ + public Object yyparse (yyInput yyLex, Object yydebug) + throws java.io.IOException, yyException { +//t this.yydebug = (jay.yydebug.yyDebug)yydebug; + return yyparse(yyLex); + } + + /** initial size and increment of the state/value stack [default 256]. + This is not final so that it can be overwritten outside of invocations + of yyparse(). + */ + protected int yyMax; + + /** executed at the beginning of a reduce action. + Used as $$ = yyDefault($1), prior to the user-specified action, if any. + Can be overwritten to provide deep copy, etc. + @param first value for $1, or null. + @return first. + */ + protected Object yyDefault (Object first) { + return first; + } + + /** the generated parser. + Maintains a state and a value stack, currently with fixed maximum size. + @param yyLex scanner. + @return result of the last reduction, if any. + @throws yyException on irrecoverable parse error. + */ + public Object yyparse (yyInput yyLex) + throws java.io.IOException, yyException { + YyCheckClass.yyCheckInit(); // initial yyCheck eingefuegt PL 05-03-08 + YyTableClass.yyTableInit(); // initial yyCheck eingefuegt PL 05-03-08 + if (yyMax <= 0) yyMax = 256; // initial size + int yyState = 0, yyStates[] = new int[yyMax]; // state stack + Object yyVal = null, yyVals[] = new Object[yyMax]; // value stack + /*modified by diho, 14.04.2004 + orig: int yyToken = -1 was replaced by "empty Token"*/ + yyTokenclass yyToken = new yyTokenclass(); // current input + int yyErrorFlag = 0; // #tks to shift + + yyLoop: for (int yyTop = 0;; ++ yyTop) { + if (yyTop >= yyStates.length) { // dynamically increase + int[] i = new int[yyStates.length+yyMax]; + System.arraycopy(yyStates, 0, i, 0, yyStates.length); + yyStates = i; + Object[] o = new Object[yyVals.length+yyMax]; + System.arraycopy(yyVals, 0, o, 0, yyVals.length); + yyVals = o; + } + yyStates[yyTop] = yyState; + yyVals[yyTop] = yyVal; +//t if (yydebug != null) yydebug.push(yyState, yyVal); + + yyDiscarded: for (;;) { // discarding a token does not change stack + int yyN; + if ((yyN = YyDefRedClass.yyDefRed[yyState]) == 0) { // else [default] reduce (yyN) + /* modified by diho, 14.04.2004 + if "empty token", get next token */ + if (yyToken.tokennr <0) { + /* modified by diho, 10.04.2004 + call yyLex.advance in any case, check if yyToken is EOF */ + yyToken = yyLex.advance(); /*? yyLex.token() : 0;*/ + /* modified by diho, 27.04.2004 + if "null", create EOF token */ + if (yyToken == null) {yyToken = new EOF();} + +//t if (yydebug != null) +//t /* modified by diho, 14.04.2004 +//t orig.: yydebug.lex(yyState, yyToken, yyname(yyToken), yyLex.value()); */ +//t yydebug.lex(yyState, yyToken.tokennr, yyname(yyToken.tokennr), yyToken.value); + } + /* modified by diho, 14.04.2004 + replaced yyToken by yyToken.tokennr*/ + if ((yyN = YySindexClass.yySindex[yyState]) != 0 && (yyN += yyToken.tokennr) >= 0 + /* modified by diho, 14.04.2004 + replaced yyToken by yyToken.tokennr*/ + && yyN < YyTableClass.yyTable.length && YyCheckClass.yyCheck[yyN] == yyToken.tokennr) { +//t if (yydebug != null) +//t yydebug.shift(yyState, YyTableClass.yyTable[yyN], yyErrorFlag-1); + yyState = YyTableClass.yyTable[yyN]; // shift to yyN + /* modified by diho, 14.04.2004 + replaced yyLex.value() by yyToken.value*/ + yyVal = yyToken.value; + /* modified by diho, 14.04.2004 + orig: yyToken = -1 */ + yyToken = new yyTokenclass(); + if (yyErrorFlag > 0) -- yyErrorFlag; + continue yyLoop; + } + /* modified by diho, 14.04.2004 + replaced yyToken by yyToken.tokennr*/ + if ((yyN = YyRindexClass.yyRindex[yyState]) != 0 && (yyN += yyToken.tokennr) >= 0 + /* modified by diho, 14.04.2004 + replaced yyToken by yyToken.tokennr*/ + && yyN < YyTableClass.yyTable.length && YyCheckClass.yyCheck[yyN] == yyToken.tokennr) + yyN = YyTableClass.yyTable[yyN]; // reduce (yyN) + else + switch (yyErrorFlag) { + + case 0: + yyerror("syntax error", yyExpecting(yyState)); +//t if (yydebug != null) yydebug.error("syntax error"); + + case 1: case 2: + yyErrorFlag = 3; + do { + if ((yyN = YySindexClass.yySindex[yyStates[yyTop]]) != 0 + && (yyN += yyErrorCode) >= 0 && yyN < YyTableClass.yyTable.length + && YyCheckClass.yyCheck[yyN] == yyErrorCode) { +//t if (yydebug != null) +//t yydebug.shift(yyStates[yyTop], YyTableClass.yyTable[yyN], 3); + yyState = YyTableClass.yyTable[yyN]; + /* modified by diho, 14.04.2004 + replaced yyLex.value by yyToken.value*/ + yyVal = yyToken.value; + continue yyLoop; + } +//t if (yydebug != null) yydebug.pop(yyStates[yyTop]); + } while (-- yyTop >= 0); +//t if (yydebug != null) yydebug.reject(); + throw new yyException("irrecoverable syntax error"); + + case 3: + /* modified by diho, 14.04.2004 + orig.: if (yyToken == 0)*/ + if (yyToken == null) { +//t if (yydebug != null) yydebug.reject(); + throw new yyException("irrecoverable syntax error at end-of-file"); + } +//t if (yydebug != null) + /* modified by diho, 14.04.2004 + replaced yyToken by yyToken.tokennr, yyLex.value by yyToken.value*/ +//t yydebug.discard(yyState, yyToken.tokennr, yyname(yyToken.tokennr), +//t yyToken.value); + /* modified by diho, 14.04.2004 + orig: yyToken = -1*/ + yyToken = new yyTokenclass(); + continue yyDiscarded; // leave stack alone + } + } + int yyV = yyTop + 1-YyLenClass.yyLen[yyN]; +//t if (yydebug != null) +//t yydebug.reduce(yyState, yyStates[yyV-1], yyN, YyRuleClass.yyRule[yyN], YyLenClass.yyLen[yyN]); + yyVal = yyDefault(yyV > yyTop ? null : yyVals[yyV]); + switch (yyN) { +case 1: + // line 15 "TschenrechnerParser.jay" + {} + break; +case 2: + // line 16 "TschenrechnerParser.jay" + {} + break; +case 3: + // line 17 "TschenrechnerParser.jay" + {} + break; +case 4: + // line 19 "TschenrechnerParser.jay" + {} + break; +case 5: + // line 20 "TschenrechnerParser.jay" + {} + break; +case 6: + // line 21 "TschenrechnerParser.jay" + {} + break; +case 7: + // line 22 "TschenrechnerParser.jay" + {} + break; + // line 295 "-" + } + yyTop -= YyLenClass.yyLen[yyN]; + yyState = yyStates[yyTop]; + int yyM = YyLhsClass.yyLhs[yyN]; + if (yyState == 0 && yyM == 0) { +//t if (yydebug != null) yydebug.shift(0, yyFinal); + yyState = yyFinal; + /* modified by diho, 14.04.2004 + replaced yyToken by yyToken.tokennr*/ + if (yyToken.tokennr < 0) { + /** modified by diho, 10.04.2004 + */ + yyToken = yyLex.advance(); /* ? yyLex.token() : 0;*/ + /* modified by diho, 14.04.2004 + if "empty token", get next token */ + if (yyToken == null) {yyToken = new EOF();} +//t if (yydebug != null) + /* modified by diho, 14.04.2004 + replaced yyToken by yyToken.tokennr, yyLex.value() by yyToken.value*/ +//t yydebug.lex(yyState, yyToken.tokennr,yyname(yyToken.tokennr), yyToken.value); + } + /* modified by diho, 14.04.2004 + orig.: if (yyToken == 0) */ + if (yyToken.tokennr == 0) { +//t if (yydebug != null) yydebug.accept(yyVal); + return yyVal; + } + continue yyLoop; + } + if ((yyN = YyGindexClass.yyGindex[yyM]) != 0 && (yyN += yyState) >= 0 + && yyN < YyTableClass.yyTable.length && YyCheckClass.yyCheck[yyN] == yyState) + yyState = YyTableClass.yyTable[yyN]; + else + yyState = YyDgotoClass.yyDgoto[yyM]; +//t if (yydebug != null) yydebug.shift(yyStates[yyTop], yyState); + continue yyLoop; + } + } + } + + protected static final class YyLhsClass { + + public static final short yyLhs [] = { -1, + 0, 0, 0, 1, 1, 1, 1, + }; + } /* End of class YyLhsClass */ + + protected static final class YyLenClass { + + public static final short yyLen [] = { 2, + 3, 3, 1, 1, 1, 1, 1, + }; + } /* End class YyLenClass */ + + protected static final class YyDefRedClass { + + public static final short yyDefRed [] = { 0, + 0, 3, 0, 0, 4, 5, 6, 7, 0, 1, + 0, + }; + } /* End of class YyDefRedClass */ + + protected static final class YyDgotoClass { + + public static final short yyDgoto [] = { 3, + 9, + }; + } /* End of class YyDgotoClass */ + + protected static final class YySindexClass { + + public static final short yySindex [] = { -247, + -247, 0, -248, -255, 0, 0, 0, 0, -247, 0, + -248, + }; + } /* End of class YySindexClass */ + + protected static final class YyRindexClass { + + public static final short yyRindex [] = { 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, + }; + } /* End of class YyRindexClass */ + + protected static final class YyGindexClass { + + public static final short yyGindex [] = { -1, + 0, + }; + } /* End of class YyGindexClass */ + +protected static class yyTable0 { + protected static final short yyTable0 [] = { 4, + 2, 5, 6, 7, 8, 0, 10, 11, 5, 6, + 7, 8, 0, 1, 0, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, + }; +} + protected static final class YyTableClass { + + static short[] yyTable = new short[264]; + protected static void yyTableInit () { + int numyycheck; + int yyTableerun = 0; + for (numyycheck = 0; numyycheck <= 1000; numyycheck++) { + if (yyTableerun < 264) { + yyTable[yyTableerun] = yyTable0.yyTable0[numyycheck]; + yyTableerun++; + } + } +} + } /* End of class YyTableClass */ + +protected static class yyCheck0 { + protected static final short yyCheck0 [] = { 1, + 0, 257, 258, 259, 260, -1, 262, 9, 257, 258, + 259, 260, -1, 261, -1, 263, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 262, + }; +} + protected static final class YyCheckClass { + + static short[] yyCheck = new short[264]; + protected static void yyCheckInit () { + int numyycheck; + int yyCheckerun = 0; + for (numyycheck = 0; numyycheck <= 1000; numyycheck++) { + if (yyCheckerun < 264) { + yyCheck[yyCheckerun] = yyCheck0.yyCheck0[numyycheck]; + yyCheckerun++; + } + } + + }; + } /* End of class YyCheckClass */ + + +//t protected static final class YyRuleClass { + +//t public static final String yyRule [] = { +//t "$accept : S", +//t "S : KLAMMERAUF S KLAMMERZU", +//t "S : S operationszeichen S", +//t "S : ZAHL", +//t "operationszeichen : PLUS", +//t "operationszeichen : MAL", +//t "operationszeichen : MINUS", +//t "operationszeichen : GETEILT", +//t }; +//t } /* End of class YyRuleClass */ + + protected static final class YyNameClass { + + public static final String yyName [] = { + "end-of-file",null,null,null,null,null,null,null,null,null,null,null, + null,null,null,null,null,null,null,null,null,null,null,null,null,null, + null,null,null,null,null,null,null,null,null,null,null,null,null,null, + null,null,null,null,null,null,null,null,null,null,null,null,null,null, + null,null,null,null,null,null,null,null,null,null,null,null,null,null, + null,null,null,null,null,null,null,null,null,null,null,null,null,null, + null,null,null,null,null,null,null,null,null,null,null,null,null,null, + null,null,null,null,null,null,null,null,null,null,null,null,null,null, + null,null,null,null,null,null,null,null,null,null,null,null,null,null, + null,null,null,null,null,null,null,null,null,null,null,null,null,null, + null,null,null,null,null,null,null,null,null,null,null,null,null,null, + null,null,null,null,null,null,null,null,null,null,null,null,null,null, + null,null,null,null,null,null,null,null,null,null,null,null,null,null, + null,null,null,null,null,null,null,null,null,null,null,null,null,null, + null,null,null,null,null,null,null,null,null,null,null,null,null,null, + null,null,null,null,null,null,null,null,null,null,null,null,null,null, + null,null,null,null,null,null,null,null,null,null,null,null,null,null, + null,null,null,null,null,null,null,null,null,null,null,null,null,null, + null,null,null,null,null,null,null,"PLUS","MAL","MINUS","GETEILT", + "KLAMMERAUF","KLAMMERZU","ZAHL","MALKLAMMERAUF", + }; + } /* End of class YyNameClass */ + + + // line 23 "TschenrechnerParser.jay" + + } + // line 535 "-" +class yyTokenclass { + public int tokennr; + public Object value; + + yyTokenclass () { + this.tokennr=-1; + } + yyTokenclass (Object o) { + this.value = o; + } +} +class EOF extends yyTokenclass { + + EOF () { + super(); + this.tokennr=0; + } +} +// %token constants + + final class PLUS extends yyTokenclass { + PLUS(Object o) { + super(o); + this.tokennr = 257; + } + PLUS() { + super(); + this.tokennr = 257; + } +} + final class MAL extends yyTokenclass { + MAL(Object o) { + super(o); + this.tokennr = 258; + } + MAL() { + super(); + this.tokennr = 258; + } +} + final class MINUS extends yyTokenclass { + MINUS(Object o) { + super(o); + this.tokennr = 259; + } + MINUS() { + super(); + this.tokennr = 259; + } +} + final class GETEILT extends yyTokenclass { + GETEILT(Object o) { + super(o); + this.tokennr = 260; + } + GETEILT() { + super(); + this.tokennr = 260; + } +} + final class KLAMMERAUF extends yyTokenclass { + KLAMMERAUF(Object o) { + super(o); + this.tokennr = 261; + } + KLAMMERAUF() { + super(); + this.tokennr = 261; + } +} + final class KLAMMERZU extends yyTokenclass { + KLAMMERZU(Object o) { + super(o); + this.tokennr = 262; + } + KLAMMERZU() { + super(); + this.tokennr = 262; + } +} + final class ZAHL extends yyTokenclass { + ZAHL(Object o) { + super(o); + this.tokennr = 263; + } + ZAHL() { + super(); + this.tokennr = 263; + } +} + final class MALKLAMMERAUF extends yyTokenclass { + MALKLAMMERAUF(Object o) { + super(o); + this.tokennr = 264; + } + MALKLAMMERAUF() { + super(); + this.tokennr = 264; + } +} +final class yyError extends yyTokenclass { + yyError () { + super(); + this.tokennr = 256; + } +} diff --git a/TschenrechnerParser.jay b/TschenrechnerParser.jay new file mode 100644 index 0000000..651b0ef --- /dev/null +++ b/TschenrechnerParser.jay @@ -0,0 +1,24 @@ +%{ +class TschenrechnerParser { +%} +%token PLUS +%token MAL +%token MINUS +%token GETEILT +%token KLAMMERAUF +%token KLAMMERZU +%token ZAHL +%token MALKLAMMERAUF + + +%% +S : KLAMMERAUF S KLAMMERZU {} + | S operationszeichen S {} + | ZAHL {} +operationszeichen : + PLUS {} + | MAL{} + | MINUS{} + | GETEILT{} +%% +} \ No newline at end of file diff --git a/TschenrechnerScanner.class b/TschenrechnerScanner.class new file mode 100644 index 0000000..5887c39 Binary files /dev/null and b/TschenrechnerScanner.class differ diff --git a/ZAHL.class b/ZAHL.class new file mode 100644 index 0000000..3692ce2 Binary files /dev/null and b/ZAHL.class differ diff --git a/jaooy b/jaooy new file mode 100644 index 0000000..232c8df Binary files /dev/null and b/jaooy differ diff --git a/skeleton.jaooy b/skeleton.jaooy new file mode 100644 index 0000000..781c544 --- /dev/null +++ b/skeleton.jaooy @@ -0,0 +1,350 @@ +# jay skeleton + +# character in column 1 determines outcome... +# # is a comment +# . is copied +# t is copied as //t if -t is set +# other lines are interpreted to call jay procedures + +.// created by jay 0.8 (c) 1998 Axel.Schreiner@informatik.uni-osnabrueck.de +. + + prolog ## %{ ... %} prior to the first %% + +. yyError yytemperror = new yyError(); +. public final int yyErrorCode = yytemperror.tokennr; +. +. /** thrown for irrecoverable syntax errors and stack overflow. +. */ +. public static class yyException extends java.lang.Exception { +. public yyException (String message) { +. super(message); +. } +. } +. +. /** must be implemented by a scanner object to supply input to the parser. +. */ +. public interface yyInput { +. /** move on to next token. +. @return false if positioned beyond tokens. +. @throws IOException on input error. +. */ +. /** modified by diho, 10.04.2004 */ +. yyTokenclass advance () throws java.io.IOException; +. /** classifies current token. +. Should not be called if advance() returned false. +. @return current %token or single character. +. */ +. /** modified by diho, 10.04.2004 token () is not longer necessary, +. advance () supplies token or null +. int token (); */ +. +. +. /** associated with current token. +. Should not be called if advance() returned false. +. @return value for token(). +. */ +. /** modified by diho, 10.04.2004 value () is not longer necessary, +. Token value can be retrieved from Token itself. +. Object value ();*/ +. } +. +. /** simplified error message. +. @see yyerror +. */ +. public void yyerror (String message) { +. yyerror(message, null); +. } +. +. /** (syntax) error message. +. Can be overwritten to control message format. +. @param message text to be displayed. +. @param expected vector of acceptable tokens, if available. +. */ +. public void yyerror (String message, String[] expected) { +. if (expected != null && expected.length > 0) { +. System.err.print(message+", expecting"); +. for (int n = 0; n < expected.length; ++ n) +. System.err.print(" "+expected[n]); +. System.err.println(); +. } else +. System.err.println(message); +. } +. +. /** debugging support, requires the package jay.yydebug. +. Set to null to suppress debugging messages. +. */ +t protected jay.yydebug.yyDebug yydebug; +. + final_rule ## constant storing final rule +. +. /** index-checked interface to yyName[]. +. @param token single character or %token value. +. @return token name or [illegal] or [unknown]. +. */ +t public static final String yyname (int token) { +t if (token < 0 || token > YyNameClass.yyName.length) return "[illegal]"; +t String name; +t if ((name = YyNameClass.yyName[token]) != null) return name; +t return "[unknown]"; +t } +. +. /** computes list of expected tokens on error by tracing the tables. +. @param state for which to compute the list. +. @return list of token names. +. */ +. protected String[] yyExpecting (int state) { +. int token, n, len = 0; +. boolean[] ok = new boolean[YyNameClass.yyName.length]; +. +. if ((n = YySindexClass.yySindex[state]) != 0) +. for (token = n < 0 ? -n : 0; +. token < YyNameClass.yyName.length && n+token < YyTableClass.yyTable.length; ++ token) +. if (YyCheckClass.yyCheck[n+token] == token && !ok[token] && YyNameClass.yyName[token] != null) { +. ++ len; +. ok[token] = true; +. } +. if ((n = YyRindexClass.yyRindex[state]) != 0) +. for (token = n < 0 ? -n : 0; +. token < YyNameClass.yyName.length && n+token < YyTableClass.yyTable.length; ++ token) +. if (YyCheckClass.yyCheck[n+token] == token && !ok[token] && YyNameClass.yyName[token] != null) { +. ++ len; +. ok[token] = true; +. } +. +. String result[] = new String[len]; +. for (n = token = 0; n < len; ++ token) +. if (ok[token]) result[n++] = YyNameClass.yyName[token]; +. return result; +. } +. +. /** the generated parser, with debugging messages. +. Maintains a state and a value stack, currently with fixed maximum size. +. @param yyLex scanner. +. @param yydebug debug message writer implementing yyDebug, or null. +. @return result of the last reduction, if any. +. @throws yyException on irrecoverable parse error. +. */ +. public Object yyparse (yyInput yyLex, Object yydebug) +. throws java.io.IOException, yyException { +t this.yydebug = (jay.yydebug.yyDebug)yydebug; +. return yyparse(yyLex); +. } +. +. /** initial size and increment of the state/value stack [default 256]. +. This is not final so that it can be overwritten outside of invocations +. of yyparse(). +. */ +. protected int yyMax; +. +. /** executed at the beginning of a reduce action. +. Used as $$ = yyDefault($1), prior to the user-specified action, if any. +. Can be overwritten to provide deep copy, etc. +. @param first value for $1, or null. +. @return first. +. */ +. protected Object yyDefault (Object first) { +. return first; +. } +. +. /** the generated parser. +. Maintains a state and a value stack, currently with fixed maximum size. +. @param yyLex scanner. +. @return result of the last reduction, if any. +. @throws yyException on irrecoverable parse error. +. */ +. public Object yyparse (yyInput yyLex) +. throws java.io.IOException, yyException { +. YyCheckClass.yyCheckInit(); // initial yyCheck eingefuegt PL 05-03-08 +. YyTableClass.yyTableInit(); // initial yyCheck eingefuegt PL 05-03-08 +. if (yyMax <= 0) yyMax = 256; // initial size +. int yyState = 0, yyStates[] = new int[yyMax]; // state stack +. Object yyVal = null, yyVals[] = new Object[yyMax]; // value stack +. /*modified by diho, 14.04.2004 +. orig: int yyToken = -1 was replaced by "empty Token"*/ +. yyTokenclass yyToken = new yyTokenclass(); // current input +. int yyErrorFlag = 0; // #tks to shift +. + local ## %{ ... %} after the first %% + +. yyLoop: for (int yyTop = 0;; ++ yyTop) { +. if (yyTop >= yyStates.length) { // dynamically increase +. int[] i = new int[yyStates.length+yyMax]; +. System.arraycopy(yyStates, 0, i, 0, yyStates.length); +. yyStates = i; +. Object[] o = new Object[yyVals.length+yyMax]; +. System.arraycopy(yyVals, 0, o, 0, yyVals.length); +. yyVals = o; +. } +. yyStates[yyTop] = yyState; +. yyVals[yyTop] = yyVal; +t if (yydebug != null) yydebug.push(yyState, yyVal); +. +. yyDiscarded: for (;;) { // discarding a token does not change stack +. int yyN; +. if ((yyN = YyDefRedClass.yyDefRed[yyState]) == 0) { // else [default] reduce (yyN) +. /* modified by diho, 14.04.2004 +. if "empty token", get next token */ +. if (yyToken.tokennr <0) { +. /* modified by diho, 10.04.2004 +. call yyLex.advance in any case, check if yyToken is EOF */ +. yyToken = yyLex.advance(); /*? yyLex.token() : 0;*/ +. /* modified by diho, 27.04.2004 +. if "null", create EOF token */ +. if (yyToken == null) {yyToken = new EOF();} +. +t if (yydebug != null) +t /* modified by diho, 14.04.2004 +t orig.: yydebug.lex(yyState, yyToken, yyname(yyToken), yyLex.value()); */ +t yydebug.lex(yyState, yyToken.tokennr, yyname(yyToken.tokennr), yyToken.value); +. } +. /* modified by diho, 14.04.2004 +. replaced yyToken by yyToken.tokennr*/ +. if ((yyN = YySindexClass.yySindex[yyState]) != 0 && (yyN += yyToken.tokennr) >= 0 +. /* modified by diho, 14.04.2004 +. replaced yyToken by yyToken.tokennr*/ +. && yyN < YyTableClass.yyTable.length && YyCheckClass.yyCheck[yyN] == yyToken.tokennr) { +t if (yydebug != null) +t yydebug.shift(yyState, YyTableClass.yyTable[yyN], yyErrorFlag-1); +. yyState = YyTableClass.yyTable[yyN]; // shift to yyN +. /* modified by diho, 14.04.2004 +. replaced yyLex.value() by yyToken.value*/ +. yyVal = yyToken.value; +. /* modified by diho, 14.04.2004 +. orig: yyToken = -1 */ +. yyToken = new yyTokenclass(); +. if (yyErrorFlag > 0) -- yyErrorFlag; +. continue yyLoop; +. } +. /* modified by diho, 14.04.2004 +. replaced yyToken by yyToken.tokennr*/ +. if ((yyN = YyRindexClass.yyRindex[yyState]) != 0 && (yyN += yyToken.tokennr) >= 0 +. /* modified by diho, 14.04.2004 +. replaced yyToken by yyToken.tokennr*/ +. && yyN < YyTableClass.yyTable.length && YyCheckClass.yyCheck[yyN] == yyToken.tokennr) +. yyN = YyTableClass.yyTable[yyN]; // reduce (yyN) +. else +. switch (yyErrorFlag) { +. +. case 0: +. yyerror("syntax error", yyExpecting(yyState)); +t if (yydebug != null) yydebug.error("syntax error"); +. +. case 1: case 2: +. yyErrorFlag = 3; +. do { +. if ((yyN = YySindexClass.yySindex[yyStates[yyTop]]) != 0 +. && (yyN += yyErrorCode) >= 0 && yyN < YyTableClass.yyTable.length +. && YyCheckClass.yyCheck[yyN] == yyErrorCode) { +t if (yydebug != null) +t yydebug.shift(yyStates[yyTop], YyTableClass.yyTable[yyN], 3); +. yyState = YyTableClass.yyTable[yyN]; +. /* modified by diho, 14.04.2004 +. replaced yyLex.value by yyToken.value*/ +. yyVal = yyToken.value; +. continue yyLoop; +. } +t if (yydebug != null) yydebug.pop(yyStates[yyTop]); +. } while (-- yyTop >= 0); +t if (yydebug != null) yydebug.reject(); +. throw new yyException("irrecoverable syntax error"); +. +. case 3: +. /* modified by diho, 14.04.2004 +. orig.: if (yyToken == 0)*/ +. if (yyToken == null) { +t if (yydebug != null) yydebug.reject(); +. throw new yyException("irrecoverable syntax error at end-of-file"); +. } +t if (yydebug != null) +. /* modified by diho, 14.04.2004 +. replaced yyToken by yyToken.tokennr, yyLex.value by yyToken.value*/ +t yydebug.discard(yyState, yyToken.tokennr, yyname(yyToken.tokennr), +t yyToken.value); +. /* modified by diho, 14.04.2004 +. orig: yyToken = -1*/ +. yyToken = new yyTokenclass(); +. continue yyDiscarded; // leave stack alone +. } +. } +. int yyV = yyTop + 1-YyLenClass.yyLen[yyN]; +t if (yydebug != null) +t yydebug.reduce(yyState, yyStates[yyV-1], yyN, YyRuleClass.yyRule[yyN], YyLenClass.yyLen[yyN]); +. yyVal = yyDefault(yyV > yyTop ? null : yyVals[yyV]); +. switch (yyN) { + + actions ## code from the actions within the grammar + +. } +. yyTop -= YyLenClass.yyLen[yyN]; +. yyState = yyStates[yyTop]; +. int yyM = YyLhsClass.yyLhs[yyN]; +. if (yyState == 0 && yyM == 0) { +t if (yydebug != null) yydebug.shift(0, yyFinal); +. yyState = yyFinal; +. /* modified by diho, 14.04.2004 +. replaced yyToken by yyToken.tokennr*/ +. if (yyToken.tokennr < 0) { +. /** modified by diho, 10.04.2004 +. */ +. yyToken = yyLex.advance(); /* ? yyLex.token() : 0;*/ +. /* modified by diho, 14.04.2004 +. if "empty token", get next token */ +. if (yyToken == null) {yyToken = new EOF();} +t if (yydebug != null) +. /* modified by diho, 14.04.2004 +. replaced yyToken by yyToken.tokennr, yyLex.value() by yyToken.value*/ +t yydebug.lex(yyState, yyToken.tokennr,yyname(yyToken.tokennr), yyToken.value); +. } +. /* modified by diho, 14.04.2004 +. orig.: if (yyToken == 0) */ +. if (yyToken.tokennr == 0) { +t if (yydebug != null) yydebug.accept(yyVal); +. return yyVal; +. } +. continue yyLoop; +. } +. if ((yyN = YyGindexClass.yyGindex[yyM]) != 0 && (yyN += yyState) >= 0 +. && yyN < YyTableClass.yyTable.length && YyCheckClass.yyCheck[yyN] == yyState) +. yyState = YyTableClass.yyTable[yyN]; +. else +. yyState = YyDgotoClass.yyDgoto[yyM]; +t if (yydebug != null) yydebug.shift(yyStates[yyTop], yyState); +. continue yyLoop; +. } +. } +. } +. + tables ## tables for rules, default reduction, and action calls +. + debug ## tables for debugging support +. + epilog ## text following second %% + +# modified by diho, 11.02.2004 +.class yyTokenclass { +. public int tokennr; +. public Object value; +. +. yyTokenclass () { +. this.tokennr=-1; +. } +. yyTokenclass (Object o) { +. this.value = o; +. } +.} +.class EOF extends yyTokenclass { +. +. EOF () { +. super(); +. this.tokennr=0; +. } +.} + + +# end of modification +.// %token constants +. +# modified by diho, 11.02.2004 + tokens final class +# end of modification diff --git a/test b/test new file mode 100644 index 0000000..d569537 --- /dev/null +++ b/test @@ -0,0 +1 @@ +4 + 3 - 2 \ No newline at end of file diff --git a/test2 b/test2 new file mode 100644 index 0000000..5580d2e --- /dev/null +++ b/test2 @@ -0,0 +1,23 @@ + + + + + + Spoon-Knife + + + + + + + + +

+ Fork me? Fork you, @octocat! +

+

+ Sean made a change +

+ + + \ No newline at end of file diff --git a/y.output b/y.output new file mode 100644 index 0000000..2f4f8dd --- /dev/null +++ b/y.output @@ -0,0 +1,128 @@ + 0 $accept : S $end + + 1 S : KLAMMERAUF S KLAMMERZU + 2 | S operationszeichen S + 3 | ZAHL + + 4 operationszeichen : PLUS + 5 | MAL + 6 | MINUS + 7 | GETEILT + +state 0 + $accept : . S $end (0) + + KLAMMERAUF shift 1 + ZAHL shift 2 + . error + + S goto 3 + + +state 1 + S : KLAMMERAUF . S KLAMMERZU (1) + + KLAMMERAUF shift 1 + ZAHL shift 2 + . error + + S goto 4 + + +state 2 + S : ZAHL . (3) + + . reduce 3 + + +state 3 + $accept : S . $end (0) + S : S . operationszeichen S (2) + + $end accept + PLUS shift 5 + MAL shift 6 + MINUS shift 7 + GETEILT shift 8 + . error + + operationszeichen goto 9 + + +state 4 + S : KLAMMERAUF S . KLAMMERZU (1) + S : S . operationszeichen S (2) + + PLUS shift 5 + MAL shift 6 + MINUS shift 7 + GETEILT shift 8 + KLAMMERZU shift 10 + . error + + operationszeichen goto 9 + + +state 5 + operationszeichen : PLUS . (4) + + . reduce 4 + + +state 6 + operationszeichen : MAL . (5) + + . reduce 5 + + +state 7 + operationszeichen : MINUS . (6) + + . reduce 6 + + +state 8 + operationszeichen : GETEILT . (7) + + . reduce 7 + + +state 9 + S : S operationszeichen . S (2) + + KLAMMERAUF shift 1 + ZAHL shift 2 + . error + + S goto 11 + + +state 10 + S : KLAMMERAUF S KLAMMERZU . (1) + + . reduce 1 + + +11: shift/reduce conflict (shift 5, reduce 2) on PLUS +11: shift/reduce conflict (shift 6, reduce 2) on MAL +11: shift/reduce conflict (shift 7, reduce 2) on MINUS +11: shift/reduce conflict (shift 8, reduce 2) on GETEILT +state 11 + S : S . operationszeichen S (2) + S : S operationszeichen S . (2) + + PLUS shift 5 + MAL shift 6 + MINUS shift 7 + GETEILT shift 8 + $end reduce 2 + KLAMMERZU reduce 2 + + operationszeichen goto 9 + + +State 11 contains 4 shift/reduce conflicts. + + +10 terminals, 3 nonterminals +8 grammar rules, 12 states diff --git a/yyError.class b/yyError.class new file mode 100644 index 0000000..0ef8f81 Binary files /dev/null and b/yyError.class differ diff --git a/yyTokenclass.class b/yyTokenclass.class new file mode 100644 index 0000000..f3780ce Binary files /dev/null and b/yyTokenclass.class differ