Taschenrechner

This commit is contained in:
Schleicher Laurenz 2023-12-06 13:21:19 +01:00
parent d0adac4a2d
commit fa28bd24fe
41 changed files with 1565 additions and 0 deletions

BIN
EOF.class Normal file

Binary file not shown.

BIN
GETEILT.class Normal file

Binary file not shown.

BIN
JLex2.jar Normal file

Binary file not shown.

BIN
KLAMMERAUF.class Normal file

Binary file not shown.

BIN
KLAMMERZU.class Normal file

Binary file not shown.

BIN
MAL.class Normal file

Binary file not shown.

BIN
MALKLAMMERAUF.class Normal file

Binary file not shown.

BIN
MINUS.class Normal file

Binary file not shown.

BIN
Main.class Normal file

Binary file not shown.

20
Main.java Normal file
View File

@ -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();
}
}
}

15
Makefile Normal file
View File

@ -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

BIN
PLUS.class Normal file

Binary file not shown.

25
TaschenrechnerLexer Normal file
View File

@ -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");}

BIN
TaschenrechnerLexer.class Normal file

Binary file not shown.

348
TaschenrechnerLexer.java Normal file
View File

@ -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
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
TschenrechnerParser.class Normal file

Binary file not shown.

631
TschenrechnerParser.java Normal file
View File

@ -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 <a href="#yyerror(java.lang.String, java.lang.String[])">yyerror</a>
*/
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;
}
}

24
TschenrechnerParser.jay Normal file
View File

@ -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{}
%%
}

BIN
TschenrechnerScanner.class Normal file

Binary file not shown.

BIN
ZAHL.class Normal file

Binary file not shown.

BIN
jaooy Normal file

Binary file not shown.

350
skeleton.jaooy Normal file
View File

@ -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 <a href="#yyerror(java.lang.String, java.lang.String[])">yyerror</a>
. */
. 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

1
test Normal file
View File

@ -0,0 +1 @@
4 + 3 - 2

23
test2 Normal file
View File

@ -0,0 +1,23 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>Spoon-Knife</title>
<LINK href="styles.css" rel="stylesheet" type="text/css">
</head>
<body>
<img src="forkit.gif" id="octocat" alt="" />
<!-- Feel free to change this text here -->
<p>
Fork me? Fork you, @octocat!
</p>
<p>
Sean made a change
</p>
</body>
</html>

128
y.output Normal file
View File

@ -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

BIN
yyError.class Normal file

Binary file not shown.

BIN
yyTokenclass.class Normal file

Binary file not shown.