This is everything inside of my directory:
cecchinn@delta:\~/Desktop/COMP-2140/Assignment3$ ls
A3 A3ParserUser.class 'CUP$A3Parser$actions.class'
A3.cup A3ParserUser.java 'CUP$CalcParser$actions.class'
A3.lex A3Scanner.class java_cup
A3.lex.java JLex
A3Parser.class A3.tiny
A3Parser.java A3User.java
cecchinn@delta:\~/Desktop/COMP-2140
This is my A3.cup file:
import java.io.*;
import java_cup.runtime.*;
/* Terminals (tokens returned by the scanner). */
terminal TIMES, DIVIDE, OPAREN, CPAREN, BEGIN, END, RETURN, IF, ELSE, WRITE, READ, MAIN, Id;
terminal NEQUALTO, EQUALTO, Num, PLUS, MINUS, INT, REAL, STRING, ASSIGN, SEMI, COM, QString;
/* Non terminals */
non terminal Program, MethodDecl, Block, Statement, Type, FormalParams, FormalParam, LocalVarDecl, AssignStmt;
non terminal ReturnStmt, IfStmt, WriteStmt, ReadStmt, Expression, MultiplicativeExpr, PrimaryExpr, BoolExpression, ActualParams;
non terminal NonEmptyActualParams, StatementList, NonEmptyFormalParams;
/* Precedences */
precedence left PLUS, MINUS;
precedence left TIMES, DIVIDE;
/* The grammar */
Program ::= Program MethodDecl;
Type ::= INT | REAL | STRING;
MethodDecl ::= Type MAIN Id OPAREN FormalParams CPAREN Block
| Type Id OPAREN FormalParams CPAREN Block
;
FormalParams ::= /* empty */
| NonEmptyFormalParams
;
NonEmptyFormalParams ::= FormalParam
| NonEmptyFormalParams COM FormalParam
;
FormalParam ::= Type Id;
Block ::= BEGIN StatementList END;
StatementList ::= /* empty */
| StatementList Statement
;
Statement ::= Block
| LocalVarDecl
| AssignStmt
| ReturnStmt
| IfStmt
| WriteStmt
| ReadStmt
;
LocalVarDecl ::= Type Id SEMI | Type AssignStmt;
AssignStmt ::= Id ASSIGN Expression SEMI
| Id ASSIGN QString SEMI
;
ReturnStmt ::= RETURN Expression SEMI;
IfStmt ::= IF OPAREN BoolExpression CPAREN Statement ELSE Statement
| IF OPAREN BoolExpression CPAREN Statement
;
WriteStmt ::= WRITE OPAREN Expression COM QString CPAREN SEMI;
ReadStmt ::= READ OPAREN Expression COM QString CPAREN SEMI;
Expression ::= MultiplicativeExpr
| Expression PLUS MultiplicativeExpr
| Expression MINUS MultiplicativeExpr
;
MultiplicativeExpr ::= PrimaryExpr
| MultiplicativeExpr TIMES PrimaryExpr
| MultiplicativeExpr DIVIDE PrimaryExpr
;
This is my A3.lex file:
import java_cup.runtime.*;
%%
%implements java_cup.runtime.Scanner
%function next_token
%class A3Scanner
%eofval{ return null;
%eofval}
%state COMMENT
KEYWORDS = (WRITE|READ|IF|ELSE|RETURN|STRING|BEGIN|END|MAIN|INT|REAL)
Id = [A-Za-z][A-Za-z0-9]*
Num = [0-9]+(\.[0-9]+)?
%%
<YYINITIAL> "/**" { yybegin(COMMENT); }
<YYINITIAL>"+" { return new Symbol(A3Symbol.PLUS); }
<YYINITIAL>"-" { return new Symbol(A3Symbol.MINUS); }
<YYINITIAL>"*" { return new Symbol(A3Symbol.TIMES); }
<YYINITIAL>"/" { return new Symbol(A3Symbol.DIVIDE); }
<YYINITIAL>"MAIN" { return new Symbol(A3Symbol.MAIN); }
<YYINITIAL>"BEGIN" { return new Symbol(A3Symbol.BEGIN); }
<YYINITIAL>"END" { return new Symbol(A3Symbol.END); }
<YYINITIAL>"(" { return new Symbol(A3Symbol.OPAREN); }
<YYINITIAL>")" { return new Symbol(A3Symbol.CPAREN); }
<YYINITIAL>";" { return new Symbol(A3Symbol.SEMI); }
<YYINITIAL>{Id} { return new Symbol(A3Symbol.Id); }
<YYINITIAL>{Num} { return new Symbol(A3Symbol.Num); }
<YYINITIAL>.|\n|\r {}
<COMMENT> "**/" { yybegin(YYINITIAL); }
<COMMENT>. {}
<COMMENT>\n|\r {}
\r|\n {}
. {}
This is the code I run (inside of a script called A3):
java JLex.Main A3.lex
java java_cup.Main -parser A3Parser -symbols A3Symbol < A3.cup
javac A3.lex.java
javac A3Parser.java A3Symbol.java A3ParserUser.java
java A3ParserUser
When I run the following code (A3 script), it gives me this error:
cecchinn@delta:~/Desktop/COMP-2140/Assignment3$ ./A3
Processing first section -- user code.
Processing second section -- JLex declarations.
Processing third section -- lexical rules.
Creating NFA machine representation.
NFA comprised of 101 states.
Working on character classes.::.::..:::::::....::::::.:.:::..........
NFA has 22 distinct character classes.
Creating DFA transition table.
Working on DFA states........................................
Minimizing DFA transition table.
34 states after removal of redundant states.
Outputting lexical analyzer code.
Opening files...
Parsing specification from standard input...
Checking specification...
Building parse tables...
Computing non-terminal nullability...
Computing first sets...
Building state machine...
Filling in tables...
*** Shift/Reduce conflict found in state #75
between IfStmt ::= IF OPAREN BoolExpression CPAREN Statement (*)
and IfStmt ::= IF OPAREN BoolExpression CPAREN Statement (*) ELSE Statement
under symbol ELSE
Resolved in favor of shifting.
Checking for non-reduced productions...
*** More conflicts encountered than expected -- parser generation aborted
Closing files...
------- CUP v0.10k Parser Generation Summary -------
1 error and 1 warning
27 terminals, 22 non-terminals, and 47 productions declared,
producing 97 unique parse states.
0 terminals declared but not used.
0 non-terminals declared but not used.
0 productions never reduced.
1 conflict detected (0 expected).
No code produced.
---------------------------------------------------- (v0.10k)
A3.lex.java:245: error: cannot find symbol
public Yytoken next_token ()
^
symbol: class Yytoken
location: class A3Scanner
A3.lex.java:310: error: cannot find symbol
{ return new Symbol(A3Symbol.Id); }
^
symbol: variable Id
location: class A3Symbol
A3.lex.java:314: error: cannot find symbol
{ return new Symbol(A3Symbol.OPAREN); }
^
symbol: variable OPAREN
location: class A3Symbol
A3.lex.java:318: error: cannot find symbol
{ return new Symbol(A3Symbol.CPAREN); }
^
symbol: variable CPAREN
location: class A3Symbol
A3.lex.java:322: error: cannot find symbol
{ return new Symbol(A3Symbol.SEMI); }
^
symbol: variable SEMI
location: class A3Symbol
A3.lex.java:326: error: cannot find symbol
{ return new Symbol(A3Symbol.Num); }
^
symbol: variable Num
location: class A3Symbol
A3.lex.java:338: error: cannot find symbol
{ return new Symbol(A3Symbol.END); }
^
symbol: variable END
location: class A3Symbol
A3.lex.java:342: error: cannot find symbol
{ return new Symbol(A3Symbol.MAIN); }
^
symbol: variable MAIN
location: class A3Symbol
A3.lex.java:346: error: cannot find symbol
{ return new Symbol(A3Symbol.BEGIN); }
^
symbol: variable BEGIN
location: class A3Symbol
A3.lex.java:362: error: cannot find symbol
{ return new Symbol(A3Symbol.Id); }
^
symbol: variable Id
location: class A3Symbol
A3.lex.java:366: error: cannot find symbol
{ return new Symbol(A3Symbol.Num); }
^
symbol: variable Num
location: class A3Symbol
A3.lex.java:374: error: cannot find symbol
{ return new Symbol(A3Symbol.Id); }
^
symbol: variable Id
location: class A3Symbol
A3.lex.java:378: error: cannot find symbol
{ return new Symbol(A3Symbol.Id); }
^
symbol: variable Id
location: class A3Symbol
A3.lex.java:382: error: cannot find symbol
{ return new Symbol(A3Symbol.Id); }
^
symbol: variable Id
location: class A3Symbol
A3.lex.java:386: error: cannot find symbol
{ return new Symbol(A3Symbol.Id); }
^
symbol: variable Id
location: class A3Symbol
A3.lex.java:390: error: cannot find symbol
{ return new Symbol(A3Symbol.Id); }
^
symbol: variable Id
location: class A3Symbol
A3.lex.java:394: error: cannot find symbol
{ return new Symbol(A3Symbol.Id); }
^
symbol: variable Id
location: class A3Symbol
A3.lex.java:398: error: cannot find symbol
{ return new Symbol(A3Symbol.Id); }
^
symbol: variable Id
location: class A3Symbol
A3.lex.java:402: error: cannot find symbol
{ return new Symbol(A3Symbol.Id); }
^
symbol: variable Id
location: class A3Symbol
19 errors
error: file not found: A3Symbol.java
Usage: javac <options> <source files>
use --help for a list of possible options
It does not create a symbols.java file. I am unsure why. I experience issues with:
java java_cup.Main -parser A3Parser -symbols A3Symbol < A3.cup
It does not create the symbols.java file. It does not give me error when I run that line. Only encounters an error when looking at the lex file because no symbol file exists/created.
I have tried changing my terminals, adjusting my lex file and nothing has worked. It does not generate the file like it should. From my knowledge, everything is installed correctly.