JavaCUP Parser Generator; My program will not generate my symbols file for some reason

78 views Asked by At

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.

0

There are 0 answers