123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592 |
- # define ID 257
- # define CON 258
- # define UNARYMINUS 259
- #define yyclearin yychar = -1
- #define yyerrok yyerrflag = 0
- extern int yychar;
- extern short yyerrflag;
- #ifndef YYMAXDEPTH
- #define YYMAXDEPTH 150
- #endif
- #ifndef YYSTYPE
- #define YYSTYPE int
- #endif
- YYSTYPE yylval, yyval;
- # define YYERRCODE 256
- #include <stdio.h>
- # define U(x) x
- # define NLSTATE yyprevious=YYNEWLINE
- # define BEGIN yybgin = yysvec + 1 +
- # define INITIAL 0
- # define YYLERR yysvec
- # define YYSTATE (yyestate-yysvec-1)
- # define YYOPTIM 1
- # define YYLMAX 200
- # define output(c) (void)putc(c,yyout)
- # define input() (((yytchar=yysptr>yysbuf?U(*--yysptr):getc(yyin))==10?(yylineno++,yytchar):yytchar)==EOF?0:yytchar)
- # define unput(c) {yytchar= (c);if(yytchar=='\n')yylineno--;*yysptr++=yytchar;}
- # define yymore() (yymorfg=1)
- # define ECHO fprintf(yyout, "%s",yytext)
- # define REJECT { nstr = yyreject(); goto yyfussy;}
- int yyleng; extern char yytext[];
- int yymorfg;
- extern char *yysptr, yysbuf[];
- int yytchar;
- FILE *yyin ={stdin}, *yyout ={stdout};
- extern int yylineno;
- struct yysvf {
- struct yywork *yystoff;
- struct yysvf *yyother;
- int *yystops;};
- struct yysvf *yyestate;
- extern struct yysvf yysvec[], *yybgin;
- # define YYNEWLINE 10
- yylex(){
- int nstr; extern int yyprevious;
- while((nstr = yylook()) >= 0)
- yyfussy: switch(nstr){
- case 0:
- if(yywrap()) return(0); break;
- case 1:
- return ID;
- break;
- case 2:
- return CON;
- break;
- case 3:
- ;
- break;
- case 4:
- return yytext[0];
- break;
- case -1:
- break;
- default:
- fprintf(yyout,"bad switch yylook %d",nstr);
- } return(0); }
- /* end of yylex */
- int yyvstop[] ={
- 0,
- 4,
- 0,
- 3,
- 4,
- 0,
- 2,
- 4,
- 0,
- 1,
- 4,
- 0,
- 2,
- 0,
- 1,
- 0,
- 0};
- # define YYTYPE char
- struct yywork { YYTYPE verify, advance; } yycrank[] ={
- 0,0, 0,0, 1,3, 0,0,
- 0,0, 0,0, 0,0, 0,0,
- 0,0, 0,0, 1,4, 1,3,
- 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, 1,5, 5,7, 5,7,
- 5,7, 5,7, 5,7, 5,7,
- 5,7, 5,7, 5,7, 5,7,
- 0,0, 0,0, 0,0, 0,0,
- 0,0, 0,0, 1,6, 6,8,
- 6,8, 6,8, 6,8, 6,8,
- 6,8, 6,8, 6,8, 6,8,
- 6,8, 0,0, 0,0, 0,0,
- 0,0, 0,0, 0,0, 0,0,
- 6,8, 6,8, 6,8, 6,8,
- 6,8, 6,8, 6,8, 6,8,
- 6,8, 6,8, 6,8, 6,8,
- 6,8, 6,8, 6,8, 6,8,
- 6,8, 6,8, 6,8, 6,8,
- 6,8, 6,8, 6,8, 6,8,
- 6,8, 6,8, 0,0, 0,0,
- 0,0, 0,0, 6,8, 0,0,
- 6,8, 6,8, 6,8, 6,8,
- 6,8, 6,8, 6,8, 6,8,
- 6,8, 6,8, 6,8, 6,8,
- 6,8, 6,8, 6,8, 6,8,
- 6,8, 6,8, 6,8, 6,8,
- 6,8, 6,8, 6,8, 6,8,
- 6,8, 6,8, 0,0, 0,0,
- 0,0};
- struct yysvf yysvec[] ={
- 0, 0, 0,
- yycrank+-1, 0, 0,
- yycrank+0, yysvec+1, 0,
- yycrank+0, 0, yyvstop+1,
- yycrank+0, 0, yyvstop+3,
- yycrank+2, 0, yyvstop+6,
- yycrank+19, 0, yyvstop+9,
- yycrank+0, yysvec+5, yyvstop+12,
- yycrank+0, yysvec+6, yyvstop+14,
- 0, 0, 0};
- struct yywork *yytop = yycrank+141;
- struct yysvf *yybgin = yysvec+1;
- char yymatch[] ={
- 00 ,01 ,01 ,01 ,01 ,01 ,01 ,01 ,
- 01 ,011 ,012 ,01 ,01 ,01 ,01 ,01 ,
- 01 ,01 ,01 ,01 ,01 ,01 ,01 ,01 ,
- 01 ,01 ,01 ,01 ,01 ,01 ,01 ,01 ,
- 011 ,01 ,01 ,01 ,01 ,01 ,01 ,01 ,
- 01 ,01 ,01 ,01 ,01 ,01 ,01 ,01 ,
- '0' ,'0' ,'0' ,'0' ,'0' ,'0' ,'0' ,'0' ,
- '0' ,'0' ,01 ,01 ,01 ,01 ,01 ,01 ,
- 01 ,'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,
- 'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,
- 'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,
- 'A' ,'A' ,'A' ,01 ,01 ,01 ,01 ,'A' ,
- 01 ,'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,
- 'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,
- 'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,
- 'A' ,'A' ,'A' ,01 ,01 ,01 ,01 ,01 ,
- 0};
- char yyextra[] ={
- 0,0,0,0,0,0,0,0,
- 0};
- /* ncform 4.1 83/08/11 */
- int yylineno =1;
- # define YYU(x) x
- # define NLSTATE yyprevious=YYNEWLINE
- char yytext[YYLMAX];
- struct yysvf *yylstate [YYLMAX], **yylsp, **yyolsp;
- char yysbuf[YYLMAX];
- char *yysptr = yysbuf;
- int *yyfnd;
- extern struct yysvf *yyestate;
- int yyprevious = YYNEWLINE;
- yylook(){
- register struct yysvf *yystate, **lsp;
- register struct yywork *yyt;
- struct yysvf *yyz;
- int yych;
- struct yywork *yyr;
- # ifdef LEXDEBUG
- int debug;
- # endif
- char *yylastch;
- /* start off machines */
- # ifdef LEXDEBUG
- debug = 0;
- # endif
- if (!yymorfg)
- yylastch = yytext;
- else {
- yymorfg=0;
- yylastch = yytext+yyleng;
- }
- for(;;){
- lsp = yylstate;
- yyestate = yystate = yybgin;
- if (yyprevious==YYNEWLINE) yystate++;
- for (;;){
- # ifdef LEXDEBUG
- if(debug)fprintf(yyout,"state %d\n",yystate-yysvec-1);
- # endif
- yyt = yystate->yystoff;
- if(yyt == yycrank){ /* may not be any transitions */
- yyz = yystate->yyother;
- if(yyz == 0)break;
- if(yyz->yystoff == yycrank)break;
- }
- *yylastch++ = yych = input();
- tryagain:
- # ifdef LEXDEBUG
- if(debug){
- fprintf(yyout,"char ");
- allprint(yych);
- putchar('\n');
- }
- # endif
- yyr = yyt;
- if ( yyt > yycrank){
- yyt = yyr + yych;
- if (yyt <= yytop && yyt->verify+yysvec == yystate){
- if(yyt->advance+yysvec == YYLERR) /* error transitions */
- {unput(*--yylastch);break;}
- *lsp++ = yystate = yyt->advance+yysvec;
- goto contin;
- }
- }
- # ifdef YYOPTIM
- else if(yyt < yycrank) { /* r < yycrank */
- yyt = yyr = yycrank+(yycrank-yyt);
- # ifdef LEXDEBUG
- if(debug)fprintf(yyout,"compressed state\n");
- # endif
- yyt = yyt + yych;
- if(yyt <= yytop && yyt->verify+yysvec == yystate){
- if(yyt->advance+yysvec == YYLERR) /* error transitions */
- {unput(*--yylastch);break;}
- *lsp++ = yystate = yyt->advance+yysvec;
- goto contin;
- }
- yyt = yyr + YYU(yymatch[yych]);
- # ifdef LEXDEBUG
- if(debug){
- fprintf(yyout,"try fall back character ");
- allprint(YYU(yymatch[yych]));
- putchar('\n');
- }
- # endif
- if(yyt <= yytop && yyt->verify+yysvec == yystate){
- if(yyt->advance+yysvec == YYLERR) /* error transition */
- {unput(*--yylastch);break;}
- *lsp++ = yystate = yyt->advance+yysvec;
- goto contin;
- }
- }
- if ((yystate = yystate->yyother) && (yyt= yystate->yystoff) != yycrank){
- # ifdef LEXDEBUG
- if(debug)fprintf(yyout,"fall back to state %d\n",yystate-yysvec-1);
- # endif
- goto tryagain;
- }
- # endif
- else
- {unput(*--yylastch);break;}
- contin:
- # ifdef LEXDEBUG
- if(debug){
- fprintf(yyout,"state %d char ",yystate-yysvec-1);
- allprint(yych);
- putchar('\n');
- }
- # endif
- ;
- }
- # ifdef LEXDEBUG
- if(debug){
- fprintf(yyout,"stopped at %d with ",*(lsp-1)-yysvec-1);
- allprint(yych);
- putchar('\n');
- }
- # endif
- while (lsp-- > yylstate){
- *yylastch-- = 0;
- if (*lsp != 0 && (yyfnd= (*lsp)->yystops) && *yyfnd > 0){
- yyolsp = lsp;
- if(yyextra[*yyfnd]){ /* must backup */
- while(yyback((*lsp)->yystops,-*yyfnd) != 1 && lsp > yylstate){
- lsp--;
- unput(*yylastch--);
- }
- }
- yyprevious = YYU(*yylastch);
- yylsp = lsp;
- yyleng = yylastch-yytext+1;
- yytext[yyleng] = 0;
- # ifdef LEXDEBUG
- if(debug){
- fprintf(yyout,"\nmatch ");
- sprint(yytext);
- fprintf(yyout," action %d\n",*yyfnd);
- }
- # endif
- return(*yyfnd++);
- }
- unput(*yylastch);
- }
- if (yytext[0] == 0 /* && feof(yyin) */)
- {
- yysptr=yysbuf;
- return(0);
- }
- yyprevious = yytext[0] = input();
- if (yyprevious>0)
- output(yyprevious);
- yylastch=yytext;
- # ifdef LEXDEBUG
- if(debug)putchar('\n');
- # endif
- }
- }
- yyback(p, m)
- int *p;
- {
- if (p==0) return(0);
- while (*p)
- {
- if (*p++ == m)
- return(1);
- }
- return(0);
- }
- /* the following are only used in the lex library */
- yyinput(){
- return(input());
- }
- yyoutput(c)
- int c; {
- output(c);
- }
- yyunput(c)
- int c; {
- unput(c);
- }
- main() {
- yyparse();
- return 0;
- }
- /* yyerror - issue error message */
- yyerror(s) char *s; {
- printf("%s\n", s);
- }
- short yyexca[] ={
- -1, 1,
- 0, -1,
- -2, 0,
- };
- # define YYNPROD 15
- # define YYLAST 249
- short yyact[]={
- 12, 2, 9, 8, 17, 11, 25, 17, 15, 18,
- 16, 10, 18, 17, 15, 7, 16, 13, 18, 5,
- 3, 1, 0, 19, 20, 0, 0, 21, 22, 23,
- 24, 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, 6, 14, 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, 4, 6 };
- short yypact[]={
- -1000, -9,-1000, 5, -7, -59,-1000,-1000,-1000, -40,
- -29, -40, -40,-1000,-1000, -40, -40, -40, -40, -38,
- -35, -38, -38,-1000,-1000,-1000 };
- short yypgo[]={
- 0, 21, 20, 17, 11 };
- short yyr1[]={
- 0, 1, 1, 1, 1, 2, 4, 4, 4, 4,
- 4, 4, 4, 4, 3 };
- short yyr2[]={
- 0, 0, 2, 3, 3, 3, 3, 3, 3, 3,
- 2, 3, 1, 1, 1 };
- short yychk[]={
- -1000, -1, 10, -2, 256, -3, 257, 10, 10, 61,
- -4, 45, 40, -3, 258, 43, 45, 42, 47, -4,
- -4, -4, -4, -4, -4, 41 };
- short yydef[]={
- 1, -2, 2, 0, 0, 0, 14, 3, 4, 0,
- 5, 0, 0, 12, 13, 0, 0, 0, 0, 10,
- 0, 6, 7, 8, 9, 11 };
- #ifndef lint
- #endif
- # define YYFLAG -1000
- # define YYERROR goto yyerrlab
- # define YYACCEPT return(0)
- # define YYABORT return(1)
- /* parser for yacc output */
- #ifdef YYDEBUG
- int yydebug = 0; /* 1 for debugging */
- #endif
- YYSTYPE yyv[YYMAXDEPTH]; /* where the values are stored */
- int yychar = -1; /* current input token number */
- int yynerrs = 0; /* number of errors */
- short yyerrflag = 0; /* error recovery flag */
- yyparse() {
- short yys[YYMAXDEPTH];
- short yyj, yym;
- register YYSTYPE *yypvt;
- register short yystate, *yyps, yyn;
- register YYSTYPE *yypv;
- register short *yyxi;
- yystate = 0;
- yychar = -1;
- yynerrs = 0;
- yyerrflag = 0;
- yyps= &yys[-1];
- yypv= &yyv[-1];
- yystack: /* put a state and value onto the stack */
- #ifdef YYDEBUG
- if( yydebug ) printf( "state %d, char 0%o\n", yystate, yychar );
- #endif
- if( ++yyps> &yys[YYMAXDEPTH] ) { yyerror( "yacc stack overflow" ); return(1); }
- *yyps = yystate;
- ++yypv;
- *yypv = yyval;
- yynewstate:
- yyn = yypact[yystate];
- if( yyn<= YYFLAG ) goto yydefault; /* simple state */
- if( yychar<0 ) if( (yychar=yylex())<0 ) yychar=0;
- if( (yyn += yychar)<0 || yyn >= YYLAST ) goto yydefault;
- if( yychk[ yyn=yyact[ yyn ] ] == yychar ){ /* valid shift */
- yychar = -1;
- yyval = yylval;
- yystate = yyn;
- if( yyerrflag > 0 ) --yyerrflag;
- goto yystack;
- }
- yydefault:
- /* default state action */
- if( (yyn=yydef[yystate]) == -2 ) {
- if( yychar<0 ) if( (yychar=yylex())<0 ) yychar = 0;
- /* look through exception table */
- for( yyxi=yyexca; (*yyxi!= (-1)) || (yyxi[1]!=yystate) ; yyxi += 2 ) ; /* VOID */
- while( *(yyxi+=2) >= 0 ){
- if( *yyxi == yychar ) break;
- }
- if( (yyn = yyxi[1]) < 0 ) return(0); /* accept */
- }
- if( yyn == 0 ){ /* error */
- /* error ... attempt to resume parsing */
- switch( yyerrflag ){
- case 0: /* brand new error */
- yyerror( "syntax error" );
- yyerrlab:
- ++yynerrs;
- case 1:
- case 2: /* incompletely recovered error ... try again */
- yyerrflag = 3;
- /* find a state where "error" is a legal shift action */
- while ( yyps >= yys ) {
- yyn = yypact[*yyps] + YYERRCODE;
- if( yyn>= 0 && yyn < YYLAST && yychk[yyact[yyn]] == YYERRCODE ){
- yystate = yyact[yyn]; /* simulate a shift of "error" */
- goto yystack;
- }
- yyn = yypact[*yyps];
- /* the current yyps has no shift onn "error", pop stack */
- #ifdef YYDEBUG
- if( yydebug ) printf( "error recovery pops state %d, uncovers %d\n", *yyps, yyps[-1] );
- #endif
- --yyps;
- --yypv;
- }
- /* there is no state on the stack with an error shift ... abort */
- yyabort:
- return(1);
- case 3: /* no shift yet; clobber input char */
- #ifdef YYDEBUG
- if( yydebug ) printf( "error recovery discards char %d\n", yychar );
- #endif
- if( yychar == 0 ) goto yyabort; /* don't discard EOF, quit */
- yychar = -1;
- goto yynewstate; /* try again in the same state */
- }
- }
- /* reduction by production yyn */
- #ifdef YYDEBUG
- if( yydebug ) printf("reduce %d\n",yyn);
- #endif
- yyps -= yyr2[yyn];
- yypvt = yypv;
- yypv -= yyr2[yyn];
- yyval = yypv[1];
- yym=yyn;
- /* consult goto table to find next state */
- yyn = yyr1[yyn];
- yyj = yypgo[yyn] + *yyps + 1;
- if( yyj>=YYLAST || yychk[ yystate = yyact[yyj] ] != -yyn ) yystate = yyact[yypgo[yyn]];
- switch(yym){
-
- case 4:
- { yyerrok; } break;
- case 5:
- { printf("store\n"); } break;
- case 6:
- { printf("add\n"); } break;
- case 7:
- { printf("negate\nadd\n"); } break;
- case 8:
- { printf("multiply\n"); } break;
- case 9:
- { printf("divide\n"); } break;
- case 10:
- { printf("negate\n"); } break;
- case 12:
- { printf("load\n"); } break;
- case 13:
- { printf("push %s\n", yytext); } break;
- case 14:
- { printf("%s\n", yytext); } break;
- }
- goto yystack; /* stack new state and value */
- }
- int yywrap() { return 1; }
|