//### This file created by BYACC 1.8(/Java extension 0.92) //### Java capabilities added 7 Jan 97, Bob Jamison //### Updated : 27 Nov 97 -- Bob Jamison, Joe Nieten //### 01 Jan 98 -- Bob Jamison -- fixed generic semantic constructor //### 01 Jun 99 -- Bob Jamison -- added Runnable support //### Please send bug reports to rjamison@lincom-asg.com //### static char yysccsid[] = "@(#)yaccpar 1.8 (Berkeley) 01/20/90"; //#line 3 "bug.y" import java.io.*; import java.util.StringTokenizer; //#line 13 "parser.java" //##################################################################### // class: parser // does : encapsulates yacc() parser functionality in a Java // class for quick code development //##################################################################### public class parser { boolean yydebug; //do I want debug output? int yynerrs; //number of errors so far int yyerrflag; //was there an error? int yychar; //the current working character //########## MESSAGES ########## //############################################################### // method: debug //############################################################### void debug(String msg) { if (yydebug) System.out.println(msg); } //########## STATE STACK ########## final static int YYSTACKSIZE = 500; //maximum stack size int statestk[],stateptr; //state stack //############################################################### // methods: state stack push,pop,drop,peek //############################################################### void state_push(int state) { if (stateptr>=YYSTACKSIZE) //overflowed? return; statestk[++stateptr]=state; } int state_pop() { if (stateptr<0) //underflowed? return -1; return statestk[stateptr--]; } void state_drop(int cnt) { int ptr; ptr=stateptr-cnt; if (ptr<0) return; stateptr = ptr; } int state_peek(int relative) { int ptr; ptr=stateptr-relative; if (ptr<0) return -1; return statestk[ptr]; } //############################################################### // method: init_stacks : allocate and prepare stacks //############################################################### boolean init_stacks() { statestk = new int[YYSTACKSIZE]; stateptr = -1; val_init(); return true; } //############################################################### // method: dump_stacks : show n levels of the stacks //############################################################### void dump_stacks(int count) { int i; System.out.println("=index==state====value= s:"+stateptr+" v:"+valptr); for (i=0;i=YYSTACKSIZE) return; valstk[++valptr]=val; } parserval val_pop() { if (valptr<0) return new parserval(-1); return valstk[valptr--]; } void val_drop(int cnt) { int ptr; ptr=valptr-cnt; if (ptr<0) return; valptr = ptr; } parserval val_peek(int relative) { int ptr; ptr=valptr-relative; if (ptr<0) return new parserval(-1); return valstk[ptr]; } //#### end semantic value section #### public final static short ITEM=257; public final static short NAME=258; public final static short REPLACE=259; public final static short OVERRIDE=260; public final static short TERMINATOR=261; public final static short DONE=262; public final static short YYERRCODE=256; final static short yylhs[] = { -1, 0, 1, 2, 2, 2, }; final static short yylen[] = { 2, 5, 1, 0, 1, 1, }; final static short yydefred[] = { 0, 0, 0, 2, 0, 4, 5, 0, 0, 1, }; final static short yydgoto[] = { 2, 4, 7, }; final static short yysindex[] = { -255, -254, 0, 0, -259, 0, 0, -257, -7, 0, }; final static short yyrindex[] = { 0, 0, 0, 0, -256, 0, 0, 0, 0, 0, }; final static short yygindex[] = { 0, 0, 0, }; final static int YYTABLESIZE=6; final static short yytable[] = { 5, 6, 1, 9, 3, 8, 3, }; final static short yycheck[] = { 259, 260, 257, 10, 258, 262, 262, }; final static short YYFINAL=2; final static short YYMAXTOKEN=262; final static String yyname[] = { "end-of-file",null,null,null,null,null,null,null,null,null,"'\\n'",null,null, null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null, null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null, null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null, null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null, null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null, null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null, null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null, null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null, null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null, null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null, null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null, null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null, null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null, null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null, null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null, null,null,null,null,"ITEM","NAME","REPLACE","OVERRIDE","TERMINATOR","DONE", }; final static String yyrule[] = { "$accept : defn", "defn : ITEM identifier mode DONE '\\n'", "identifier : NAME", "mode :", "mode : REPLACE", "mode : OVERRIDE", }; //#line 37 "bug.y" // Code cut from the byacc demo page and modified to take // first arg as input file name String ins; StringTokenizer st; void yyerror(String s) { System.out.println("par:"+s); } boolean newline; int yylex() { String s; int tok; String tokstr; Double d; //System.out.print("yylex "); if (!st.hasMoreTokens()) if (!newline) { newline=true; System.out.println("tok: \\n"); return '\n'; //So we look like classic YACC example } else return 0; s = st.nextToken(); try { if ( s.equalsIgnoreCase("ITEM") ) { tok = ITEM; System.out.println("tok: ITEM"); } else if ( s.equalsIgnoreCase("REPLACE") ) { tok = REPLACE; System.out.println("tok: REPLACE"); } else if ( s.equalsIgnoreCase("DONE") ) { tok = DONE; System.out.println("tok: DONE"); } else if ( s.equalsIgnoreCase("OVERRIDE")) { tok = OVERRIDE; System.out.println("tok: OVERRIDE"); } else { yylval = new parserval( s ); tok = NAME; System.out.println("tok: NAME -> " + s); } } catch ( Throwable e ) { return 0; } return tok; } void dotest( String filepath ) throws java.io.FileNotFoundException { BufferedReader in = new BufferedReader(new FileReader(filepath)); // AS per the calculator demo System.out.println("Note: you will need to separate the items"); System.out.println("with spaces, i.e.: 'ITEM hello override"); while (true) { System.out.print("example item:"); try { ins = in.readLine(); } catch (Exception e) { } st = new StringTokenizer(ins); newline=false; yyparse(); } } public static void main(String args[]) throws java.io.FileNotFoundException { parser par = new parser(); par.yydebug = true; System.out.println( "parse input file: " + args[0] ); par.dotest(args[0]); } // Invoke this code with // java parser test.input // where test.input is the file containing the input text //#line 277 "parser.java" //############################################################### // method: yylexdebug : check lexer state //############################################################### void yylexdebug(int state,int ch) { String s=null; if (ch < 0) ch=0; if (ch <= YYMAXTOKEN) //check index bounds s = yyname[ch]; //now get it if (s==null) s = "illegal-symbol"; debug("state "+state+", reading "+ch+" ("+s+")"); } //############################################################### // method: yyparse : parse input and execute indicated items //############################################################### int yyparse() { int yyn; //next next thing to do int yym; // int yystate; //current parsing state from state table String yys; //current token string boolean doaction; init_stacks(); yynerrs = 0; yyerrflag = 0; yychar = -1; //impossible char forces a read yystate=0; //initial state state_push(yystate); //save it while (true) //until parsing is done, either correctly, or w/error { doaction=true; if (yydebug) debug("loop"); //#### NEXT ACTION (from reduction table) for (yyn=yydefred[yystate];yyn==0;yyn=yydefred[yystate]) { if (yydebug) debug("yyn:"+yyn+" state:"+yystate+" char:"+yychar); if (yychar < 0) //we want a char? { yychar = yylex(); //get next token //#### ERROR CHECK #### if (yychar < 0) //it it didn't work/error { yychar = 0; //change it to default string (no -1!) if (yydebug) yylexdebug(yystate,yychar); } }//yychar<0 yyn = yysindex[yystate]; //get amount to shift by (shift index) if ((yyn != 0) && (yyn += yychar) >= 0 && yyn <= YYTABLESIZE && yycheck[yyn] == yychar) { if (yydebug) debug("state "+yystate+", shifting to state "+yytable[yyn]+""); //#### NEXT STATE #### yystate = yytable[yyn];//we are in a new state state_push(yystate); //save it val_push(yylval); //push our lval as the input for next rule yychar = -1; //since we have 'eaten' a token, say we need another if (yyerrflag > 0) //have we recovered an error? --yyerrflag; //give ourselves credit doaction=false; //but don't process yet break; //quit the yyn=0 loop } yyn = yyrindex[yystate]; //reduce if ((yyn !=0 ) && (yyn += yychar) >= 0 && yyn <= YYTABLESIZE && yycheck[yyn] == yychar) { //we reduced! if (yydebug) debug("reduce"); yyn = yytable[yyn]; doaction=true; //get ready to execute break; //drop down to actions } else //ERROR RECOVERY { if (yyerrflag==0) { yyerror("syntax error"); yynerrs++; } if (yyerrflag < 3) //low error count? { yyerrflag = 3; while (true) //do until break { if (stateptr<0) //check for under & overflow here { yyerror("stack underflow. aborting..."); //note lower case 's' return 1; } yyn = yysindex[state_peek(0)]; if ((yyn != 0) && (yyn += YYERRCODE) >= 0 && yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) { if (yydebug) debug("state "+state_peek(0)+", error recovery shifting to state "+yytable[yyn]+" "); yystate = yytable[yyn]; state_push(yystate); val_push(yylval); doaction=false; break; } else { if (yydebug) debug("error recovery discarding state "+state_peek(0)+" "); if (stateptr<0) //check for under & overflow here { yyerror("Stack underflow. aborting..."); //capital 'S' return 1; } state_pop(); val_pop(); } } } else //discard this token { if (yychar == 0) return 1; //yyabort if (yydebug) { yys = null; if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; if (yys == null) yys = "illegal-symbol"; debug("state "+yystate+", error recovery discards token "+yychar+" ("+yys+")"); } yychar = -1; //read another } }//end error recovery }//yyn=0 loop if (!doaction) //any reason not to proceed? continue; //skip action yym = yylen[yyn]; //get count of terminals on rhs if (yydebug) debug("state "+yystate+", reducing "+yym+" by rule "+yyn+" ("+yyrule[yyn]+")"); if (yym>0) //if count of rhs not 'nil' yyval = val_peek(yym-1); //get current semantic value switch(yyn) { //########## USER-SUPPLIED ACTIONS ########## case 1: //#line 23 "bug.y" { System.out.println( "Item definition" ); System.out.println( " Name = " + val_peek(3).sval ); System.out.println( " mode = " + val_peek(2).ival ); } break; case 2: //#line 29 "bug.y" { yyval.sval = val_peek(0).sval; } break; case 3: //#line 31 "bug.y" { yyval.ival = OVERRIDE; } break; case 4: //#line 32 "bug.y" { yyval.ival = REPLACE; } break; case 5: //#line 33 "bug.y" { yyval.ival = OVERRIDE; } break; //#line 444 "parser.java" //########## END OF USER-SUPPLIED ACTIONS ########## }//switch //#### Now let's reduce... #### if (yydebug) debug("reduce"); state_drop(yym); //we just reduced yylen states yystate = state_peek(0); //get new state val_drop(yym); //corresponding value drop yym = yylhs[yyn]; //select next TERMINAL(on lhs) if (yystate == 0 && yym == 0)//done? 'rest' state and at first TERMINAL { debug("After reduction, shifting from state 0 to state "+YYFINAL+""); yystate = YYFINAL; //explicitly say we're done state_push(YYFINAL); //and save it val_push(yyval); //also save the semantic value of parsing if (yychar < 0) //we want another character? { yychar = yylex(); //get next character if (yychar<0) yychar=0; //clean, if necessary if (yydebug) yylexdebug(yystate,yychar); } if (yychar == 0) //Good exit (if lex returns 0 ;-) break; //quit the loop--all DONE }//if yystate else //else not done yet { //get next state and push, for next yydefred[] yyn = yygindex[yym]; //find out where to go if ((yyn != 0) && (yyn += yystate) >= 0 && yyn <= YYTABLESIZE && yycheck[yyn] == yystate) yystate = yytable[yyn]; //get new state else yystate = yydgoto[yym]; //else go to new defred debug("after reduction, shifting from state "+state_peek(0)+" to state "+yystate+""); state_push(yystate); //going again, so push state & val... val_push(yyval); //for next action } }//main loop return 0;//yyaccept!! } //## end of method parse() ###################################### } //################### END OF CLASS yaccpar ######################