/**
This class is a top-down, recursive-descent parser for the following
syntactic categories:
<E> --> <term> { (+|-) <term> }
<term> --> <primary> { (*|/) <primary> }
<primary> --> <id> | <int> | <float> | "(" <E> ")"
The definitions of <id>, <int>, <float> are given in the lexical analyzer
class file "lexArith.java". The following variables and functions
of the "lexArith" class are used:
static String t // holds an extracted token
static State state // the current state of the finite automaton
static int getToken() // extracts the next token
static void display(String s)
static void displayln(String s)
static void setIO(String inFile, String outFile)
static void closeIO()
The program will display the parse tree in linearly indented form.
Each syntactic category name labeling a node is
displayed on a separate line, prefixed with the integer i representing
the node's depth and indented by i blanks. The arithmetic operators are
displayed in the same way. The string variable "indent"
will keep track of the correct number of blanks for indentation and
will be passed to parse functions corresponding to syntactic categories.
**/
public abstract class Parser extends LexicalAnalyzer
{
public static void funDefs
(String indent
){
displayln(indent + indent.length() + " <fun defs>");
indent = indent + " ";
funDef(indent);
while(state == State.LParen || state == State.Id)
funDef(indent);
} // End funDefs
public static void funDef
(String indent
){
displayln(indent + indent.length() + " <fun def>");
indent = indent + " ";
switch( state ){
case Id:
displayln(" " + t);
getToken();
return;
case LParen:
getToken();
if(state == State.Keyword_Define){
getToken();
funHeader(indent);
exp(indent);
if(state == State.RParen){
getToken();
return;
}
}else{
errorMsg(1);
return;
}
default:
errorMsg(2);
return;
}
} // End funDef
public static void funHeader
(String indent
){
displayln(indent + indent.length() + " <fun header>");
indent = indent + " ";
if(state == State.LParen){
getToken();
funName(indent);
parameterList(indent);
if(state == State.RParen)
getToken();
else{
errorMsg(1);
}
}
} // end funHeader
public static void funName
(String indent
){
displayln(indent + indent.length() + " <fun name> " + t);
indent = indent + " ";
if(state == State.Id)
getToken();
} // end funName
public static void parameterList
(String indent
){
if(state == State.Id){
//displayln(indent + indent.length() + " <parameter list> " + t);
//getToken();
while(state == State.Id){
//displayln(" " + t);
//indent = indent + " ";
getToken();
saved_t = saved_t + " " + t;
}
displayln(indent + indent.length() + " <parameter list> " + saved_t);
}else{
displayln(indent + indent.length() + " <parameter list>");
indent = indent + " ";
}
} // end parameterList
public static void exp
(String indent
){
switch( state ){
case Id
: case Int
: case Float: case FloatE
: displayln(indent + indent.length() + " <exp> " + t);
indent = indent + " ";
getToken();
return;
default:
displayln(indent + indent.length() + " <exp>");
indent = indent + " ";
listExp(indent);
return;
}
} // end exp
public static void listExp
(String indent
){
displayln(indent + indent.length() + " <list exp>");
indent = indent + " ";
if(state == State.LParen){
getToken();
listExpInside(indent);
if(state == State.RParen){
getToken();
return;
}
}
} // end listExp
public static void listExpInside
(String indent
){
displayln(indent + indent.length() + " <list exp inside>");
indent = indent + " ";
switch( state ){
case Keyword_If:
displayln(indent + indent.length() + " " + t);
getToken();
for(int i = 0; i < 3; i++)
exp(indent);
case Keyword_Cond:
displayln(indent + indent.length() + " " + t);
getToken();
cases(indent);
default:
funOp(indent);
while(state == State.Id || state == State.LParen){
//displayln(indent + indent.length() + " " + t);
exp(indent);
}
//displayln(indent + indent.length() + " " + t);
//getToken();
return;
}
} // end listExpInside
public static void cases
(String indent
){ displayln(indent + indent.length() + " <cases>");
indent = indent + " ";
// getToken();
// cases(indent);
//
// if(state == State.Id)
// cases(indent);
} // end cases
public static void casesExp
(String indent
){ displayln(indent + indent.length() + " <case exp>");
indent = indent + " ";
if(state == State.LParen){
getToken();
if(state == State.Keyword_Else){
getToken();
funOp(indent);
}else{
getToken();
exp(indent);
}
exp(indent);
if(state == State.RParen){
getToken();
return;
}
}
} // end cases exp
public static void funOp
(String indent
){
switch( state ){
case Add: case Sub: case Mul: case Div:
arithOp(indent);
return;
case Keyword_And: case Keyword_Or: case Keyword_Not:
boolOp(indent);
return;
case Lt: case Le: case Gt: case Ge: case Eq:
compOp(indent);
return;
default:
getToken();
return;
}
} // end funOp
public static void arithOp
(String indent
){
switch( state ){
case Add:
displayln(indent + indent.length() + " +");
return;
case Sub:
displayln(indent + indent.length() + " -");
return;
case Mul:
getToken();
displayln(indent + indent.length() + " *");
return;
case Div:
displayln(indent + indent.length() + " /");
return;
default:
break;
}
} // end arithOp
public static void boolOp
(String indent
){
switch( state ){
case Keyword_And:
displayln(indent + indent.length() + " and");
return;
case Keyword_Or:
displayln(indent + indent.length() + " or");
return;
case Keyword_Not:
displayln(indent + indent.length() + " not");
return;
default:
break;
}
} // end boolOp
public static void compOp
(String indent
){
switch( state ){
case Lt:
displayln(indent + indent.length() + " <");
return;
case Le:
displayln(indent + indent.length() + " <=");
return;
case Gt:
displayln(indent + indent.length() + " >");
return;
case Ge:
displayln(indent + indent.length() + " >=");
return;
case Eq:
displayln(indent + indent.length() + " =");
return;
default:
break;
}
} // end compOp
public static void errorMsg(int i){
display(t + ": unexpected symbol where");
switch( i ){
case 1:
displayln(" arith op or ) expected");
return;
case 2:
displayln(" id, int, float, or ( expected");
return;
}
}
/**
* @param args
*/
public static void main
(String[] args
) {
setLex( "C:\\Users\\jmiele\\Desktop\\eclipse\\in1.txt", "C:\\Users\\jmiele\\Desktop\\eclipse\\out1.txt" );
getToken();
funDefs(indent);
if ( !t.isEmpty() )
displayln(t + " -- unexpected symbol here");
closeIO();
}
}