| |
| /* A Bison parser, made from parse.y.in */ |
| |
| #line 1 "parse.y.in" |
| |
| #include <malloc.h> |
| #include <string.h> |
| #include "attr.h" |
| int yylex(); |
| void yyerror(char* s); |
| #include "symtab.h" |
| /* Global variables */ |
| scopeEntry current = NULL; /* Points to current scope */ |
| scopeEntry temp = NULL; /* Used temporarily for adding and/or |
| removing scopes */ |
| |
| #line 14 "parse.y.in" |
| typedef union { int number; |
| tokentype token; |
| BaseType basetype; |
| typeinfo totaltype; |
| namelist names; |
| expnode exps; |
| explist elist;} YYSTYPE; |
| |
| #ifndef YYLTYPE |
| typedef |
| struct yyltype |
| { |
| int first_line; |
| int first_column; |
| int last_line; |
| int last_column; |
| } |
| yyltype; |
| |
| #define YYLTYPE yyltype |
| #endif |
| |
| #define YYACCEPT goto yyaccept |
| #define YYABORT goto yyabort |
| #define YYERROR goto yyerrlab |
| #define yytext (*_yytext) |
| extern char **_yytext; |
| #define yylval (*_yylval) |
| extern YYSTYPE *_yylval; |
| #define yylloc (*_yylloc) |
| extern YYLTYPE *_yylloc; |
| #define yyppval (*_yyppval) |
| extern int *_yyppval; |
| |
| switch (yyn) { |
| |
| case 1: |
| #line 40 "parse.y.in" |
| { enterblock(); ; |
| break;} |
| case 2: |
| #line 42 "parse.y.in" |
| {leaveblock();; |
| break;} |
| case 3: |
| #line 45 "parse.y.in" |
| { |
| /* Seen all the variables so declare them in the current scope */ |
| symTabEntry s; |
| namenode tmpnode; |
| |
| tmpnode = yyp->yyvsp[0].names.firstname; |
| while ( tmpnode != NULL ) |
| { |
| if ( lookup( tmpnode -> name , current ) == NULL ) |
| { |
| s = declare(tmpnode -> name,tmpnode -> idtype.basetype, |
| tmpnode -> idtype.gentype,tmpnode -> ptype, |
| tmpnode -> idtype.number, tmpnode -> idtype.endnum); |
| } |
| else |
| printf("\n***Error: duplicate declaration of %s\n", tmpnode -> |
| name); |
| tmpnode = tmpnode -> next; |
| } |
| ; |
| break;} |
| case 7: |
| #line 70 "parse.y.in" |
| { |
| symTabEntry find; |
| |
| if (lookup(yyp->yyvsp[0].token.str,current) == NULL) |
| find = declare(yyp->yyvsp[0].token.str,VOIDTYPE,PROCTYPE,NOTPARM,-1,-1); |
| /* Just make a spot in the outerscope to hold the name of the */ |
| /* procedure */ |
| else |
| printf("\n***Error: duplicate declaration of %s\n",yyp->yyvsp[0].token.str); |
| enterblock(); |
| procentry(yyp->yyvsp[0].token.str,PROCTYPE); |
| ; |
| break;} |
| case 8: |
| #line 83 "parse.y.in" |
| { /* After we have seen the parmlist, install it and */ |
| int n; /* update the number field */ |
| |
| n = installparms(yyp->yyvsp[0].names); |
| current -> procedure -> number = n; |
| ; |
| break;} |
| case 9: |
| #line 90 "parse.y.in" |
| { |
| symTabEntry find; |
| |
| find = lookup(yyp->yyvsp[-6].token.str, current -> outerscope); /* Before we leave the block */ |
| if ( find != NULL ) /* We must transfer the link */ |
| { /* to the outer scope */ |
| find -> number = current -> procedure -> number; |
| find -> formals = current -> procedure -> formals; |
| } |
| leaveblock(); |
| ; |
| break;} |
| case 10: |
| #line 102 "parse.y.in" |
| { /* Same as above up until where 'stype' is */ |
| symTabEntry find; |
| if (lookup(yyp->yyvsp[0].token.str,current) == NULL) |
| find = declare(yyp->yyvsp[0].token.str,VOIDTYPE,FUNCTYPE,NOTPARM,-1,-1); |
| else |
| printf("\n***Error: duplicate declaration of %s\n",yyp->yyvsp[0].token.str); |
| enterblock(); |
| procentry(yyp->yyvsp[0].token.str,FUNCTYPE); |
| ; |
| break;} |
| case 11: |
| #line 112 "parse.y.in" |
| { |
| int n; |
| |
| n = installparms(yyp->yyvsp[0].names); |
| current -> procedure -> number = n; |
| ; |
| break;} |
| case 12: |
| #line 119 "parse.y.in" |
| { finishfunc(yyp->yyvsp[-1].basetype); |
| /* We NOW know what type it returns so record it */; |
| break;} |
| case 13: |
| #line 122 "parse.y.in" |
| { |
| symTabEntry find; |
| |
| find = lookup(yyp->yyvsp[-9].token.str, current -> outerscope ); |
| if ( find != NULL ) |
| { /* Before we leave the block, we must make the link in the outer scope */ |
| find -> number = current -> procedure -> number; |
| find -> basetype = current -> procedure -> basetype; |
| find -> formals = current -> procedure -> formals; |
| } |
| leaveblock(); |
| ; |
| break;} |
| case 14: |
| #line 136 "parse.y.in" |
| { yyval.names = yyp->yyvsp[-1].names; ; |
| break;} |
| case 15: |
| #line 138 "parse.y.in" |
| { yyval.names.firstname = NULL; /* There are no params so the list is NULL */ |
| yyval.names.lastname = NULL; ; |
| break;} |
| case 16: |
| #line 142 "parse.y.in" |
| { /* Link the current list to the new parmlist and send it up */ |
| yyp->yyvsp[-2].names.lastname -> next = yyp->yyvsp[0].names.firstname; |
| yyval.names.firstname = yyp->yyvsp[-2].names.firstname; |
| yyval.names.lastname = yyp->yyvsp[0].names.lastname; |
| ; |
| break;} |
| case 17: |
| #line 148 "parse.y.in" |
| { yyval.names = yyp->yyvsp[0].names; ; |
| break;} |
| case 18: |
| #line 151 "parse.y.in" |
| { /* We know that these are pass by reference so record |
| it in all the nodes */ |
| namenode tmpnode; |
| |
| tmpnode = yyp->yyvsp[0].names.firstname; |
| while ( tmpnode != NULL ) |
| { |
| tmpnode -> ptype = REFPARM; |
| tmpnode = tmpnode -> next; |
| } |
| yyval.names = yyp->yyvsp[0].names; /* Send up the new list */ |
| ; |
| break;} |
| case 19: |
| #line 164 "parse.y.in" |
| { /* We know that these are pass by value so record |
| it in all the nodes */ |
| namenode tmpnode; |
| |
| tmpnode = yyp->yyvsp[0].names.firstname; |
| while ( tmpnode != NULL ) |
| { |
| tmpnode -> ptype = VALPARM; |
| tmpnode = tmpnode -> next; |
| } |
| yyval.names = yyp->yyvsp[0].names; /* Send up the new list */ |
| ; |
| break;} |
| case 20: |
| #line 178 "parse.y.in" |
| { yyval.names.firstname = NULL; /* No variables = no list */ |
| yyval.names.lastname = NULL; ; |
| break;} |
| case 21: |
| #line 181 "parse.y.in" |
| { yyval.names = yyp->yyvsp[0].names; ; |
| break;} |
| case 22: |
| #line 184 "parse.y.in" |
| { /* Concatenates the 2 namelists */ |
| yyp->yyvsp[-2].names.lastname -> next = yyp->yyvsp[-1].names.firstname; |
| yyval.names.firstname = yyp->yyvsp[-2].names.firstname; |
| yyval.names.lastname = yyp->yyvsp[-1].names.lastname; |
| ; |
| break;} |
| case 23: |
| #line 190 "parse.y.in" |
| { yyval.names = yyp->yyvsp[-1].names; ; |
| break;} |
| case 24: |
| #line 192 "parse.y.in" |
| { /* We have a list of IDs and we have their type so |
| we can now record them to be all of the same type */ |
| namenode tmpnode; |
| |
| tmpnode = yyp->yyvsp[-2].names.firstname; |
| while ( tmpnode != NULL ) |
| { |
| tmpnode->idtype.basetype = yyp->yyvsp[0].totaltype.basetype; |
| tmpnode->idtype.gentype = yyp->yyvsp[0].totaltype.gentype; |
| tmpnode->idtype.number = yyp->yyvsp[0].totaltype.number; |
| tmpnode->idtype.endnum = yyp->yyvsp[0].totaltype.endnum; |
| tmpnode->ptype = NOTPARM; |
| tmpnode = tmpnode -> next; |
| } |
| yyval.names = yyp->yyvsp[-2].names; /* Send up the new list */ |
| ; |
| break;} |
| case 25: |
| #line 209 "parse.y.in" |
| { /* Hook the new ID to the current list of IDs */ |
| namenode tmpname1 = NULL; |
| |
| tmpname1 = (namenode) malloc(sizeof(struct _namenode)); |
| tmpname1 -> name = yyp->yyvsp[0].token.str; |
| tmpname1 -> next = NULL; |
| yyp->yyvsp[-2].names.lastname -> next = tmpname1; |
| yyval.names.firstname = yyp->yyvsp[-2].names.firstname; |
| yyval.names.lastname = tmpname1; |
| ; |
| break;} |
| case 26: |
| #line 220 "parse.y.in" |
| { /* Start the linked list with the first ID */ |
| namenode tmpname1 = NULL; |
| |
| tmpname1 = (namenode) malloc(sizeof(struct _namenode)); |
| tmpname1 -> name = yyp->yyvsp[0].token.str; |
| tmpname1 -> next = NULL; |
| yyval.names.firstname = tmpname1; |
| yyval.names.lastname = tmpname1; |
| ; |
| break;} |
| case 27: |
| #line 231 "parse.y.in" |
| { if (yyp->yyvsp[-5].token.num > yyp->yyvsp[-3].token.num) |
| { |
| printf("\n***Error: lower bound exceeds upper bound\n"); |
| yyval.totaltype.basetype = yyp->yyvsp[0].basetype; /* Basetype is whatever 'stype' was */ |
| yyval.totaltype.gentype = ARRAYTYPE; |
| yyval.totaltype.number = yyp->yyvsp[-3].token.num; |
| yyval.totaltype.endnum = yyp->yyvsp[-5].token.num; |
| } |
| else |
| { |
| yyval.totaltype.basetype = yyp->yyvsp[0].basetype; /* Basetype is whatever 'stype' was */ |
| yyval.totaltype.gentype = ARRAYTYPE; |
| yyval.totaltype.number = yyp->yyvsp[-5].token.num; |
| yyval.totaltype.endnum = yyp->yyvsp[-3].token.num; |
| } |
| ; |
| break;} |
| case 28: |
| #line 248 "parse.y.in" |
| { |
| yyval.totaltype.basetype = yyp->yyvsp[0].basetype; |
| yyval.totaltype.gentype = NOTYPE; |
| yyval.totaltype.number = -1; |
| yyval.totaltype.endnum = -1; |
| ; |
| break;} |
| case 29: |
| #line 255 "parse.y.in" |
| { yyval.basetype = INTTYPE; /* Send up the basetypes */ ; |
| break;} |
| case 30: |
| #line 256 "parse.y.in" |
| { yyval.basetype = CHARTYPE; ; |
| break;} |
| case 31: |
| #line 257 "parse.y.in" |
| { yyval.basetype = BOOLTYPE; ; |
| break;} |
| case 32: |
| #line 259 "parse.y.in" |
| { ; |
| break;} |
| case 33: |
| #line 260 "parse.y.in" |
| { ; |
| break;} |
| case 34: |
| #line 262 "parse.y.in" |
| { ; |
| break;} |
| case 35: |
| #line 263 "parse.y.in" |
| { ; |
| break;} |
| case 36: |
| #line 264 "parse.y.in" |
| { ; |
| break;} |
| case 37: |
| #line 265 "parse.y.in" |
| { ; |
| break;} |
| case 38: |
| #line 266 "parse.y.in" |
| { ; |
| break;} |
| case 39: |
| #line 267 "parse.y.in" |
| { ; |
| break;} |
| case 40: |
| #line 270 "parse.y.in" |
| { if (( yyp->yyvsp[-1].totaltype.basetype == INTTYPE ) || ( yyp->yyvsp[-1].totaltype.basetype == STRINGTYPE )) |
| { /* Must be a string or int */ |
| if ( yyp->yyvsp[-1].totaltype.gentype != NOTYPE ) |
| printf("\n***Error: illegal type for writeln\n"); /* No arrays or such */ |
| } |
| else |
| printf("\n***Error: illegal type for writeln\n"); /* Only ints and strings */ |
| ; |
| break;} |
| case 41: |
| #line 280 "parse.y.in" |
| { |
| symTabEntry s; |
| |
| s = lookupALL(yyp->yyvsp[-1].token.str); |
| if ( s == NULL ) /* ID not found */ |
| printf("\n***Error: undeclared identifier %s\n",yyp->yyvsp[-1].token.str); |
| else |
| { |
| if ( s -> gentype != PROCTYPE ) /* Found, but not a procedure */ |
| printf("\n***Error: id %s is not a procedure\n",yyp->yyvsp[-1].token.str); |
| else |
| { /* Found and it is a procedure so check the parameters */ |
| int check; |
| check = checkparams( s -> formals , yyp->yyvsp[0].elist ); |
| } |
| } |
| ; |
| break;} |
| case 44: |
| #line 302 "parse.y.in" |
| { /* only booleans */ |
| if (yyp->yyvsp[0].totaltype.basetype != BOOLTYPE) |
| printf("\n***Error: exp in if stmt must be boolean\n"); |
| ; |
| break;} |
| case 46: |
| #line 310 "parse.y.in" |
| { /* only booleans */ |
| if (yyp->yyvsp[0].totaltype.basetype != BOOLTYPE) |
| printf("\n***Error: exp in while stmt must be boolean\n"); |
| ; |
| break;} |
| case 48: |
| #line 318 "parse.y.in" |
| { /* Make sure the assignment types match */ |
| if (!(match(yyp->yyvsp[-1].totaltype,yyp->yyvsp[0].totaltype))) |
| printf("\n***Error: assignment types do not match\n"); |
| ; |
| break;} |
| case 49: |
| #line 324 "parse.y.in" |
| { yyval.totaltype = yyp->yyvsp[-1].totaltype; ; |
| break;} |
| case 50: |
| #line 327 "parse.y.in" |
| { yyval.elist.firstexp = NULL; /* No optexplist = NULL list */ |
| yyval.elist.lastexp = NULL; ; |
| break;} |
| case 51: |
| #line 330 "parse.y.in" |
| { yyval.elist = yyp->yyvsp[-1].elist; ; |
| break;} |
| case 52: |
| #line 333 "parse.y.in" |
| { /* Hook the new expression type to the current list */ |
| expnode tmpnode; |
| |
| tmpnode = makeexp(yyp->yyvsp[0].totaltype); |
| yyp->yyvsp[-2].elist.lastexp -> next = tmpnode; |
| yyval.elist.firstexp = yyp->yyvsp[-2].elist.firstexp; |
| yyval.elist.lastexp = tmpnode; |
| ; |
| break;} |
| case 53: |
| #line 342 "parse.y.in" |
| { /* Start the list with the first expression */ |
| expnode tmpnode; |
| |
| tmpnode = makeexp(yyp->yyvsp[0].totaltype); |
| yyval.elist.firstexp = tmpnode; |
| yyval.elist.lastexp = tmpnode; |
| ; |
| break;} |
| case 54: |
| #line 351 "parse.y.in" |
| { /* '+' requires integers */ |
| |
| if (( yyp->yyvsp[-2].totaltype.basetype != INTTYPE ) || ( yyp->yyvsp[0].totaltype.basetype != INTTYPE ) || |
| ( yyp->yyvsp[-2].totaltype.gentype != NOTYPE ) || ( yyp->yyvsp[0].totaltype.gentype != NOTYPE )) |
| printf("\n***Error: operands of '+' must be integers\n"); |
| yyval.totaltype.basetype = INTTYPE; |
| yyval.totaltype.gentype = NOTYPE; |
| yyval.totaltype.number = -1; |
| yyval.totaltype.endnum = -1; |
| ; |
| break;} |
| case 55: |
| #line 362 "parse.y.in" |
| { /* '-' requires integers */ |
| |
| if (( yyp->yyvsp[-2].totaltype.basetype != INTTYPE ) || ( yyp->yyvsp[0].totaltype.basetype != INTTYPE ) || |
| ( yyp->yyvsp[-2].totaltype.gentype != NOTYPE ) || ( yyp->yyvsp[0].totaltype.gentype != NOTYPE )) |
| printf("\n***Error: operands of '-' must be integers\n"); |
| yyval.totaltype.basetype = INTTYPE; |
| yyval.totaltype.gentype = NOTYPE; |
| yyval.totaltype.number = -1; |
| yyval.totaltype.endnum = -1; |
| ; |
| break;} |
| case 56: |
| #line 373 "parse.y.in" |
| { /* unary '-' requires an integer */ |
| |
| if (( yyp->yyvsp[0].totaltype.basetype != INTTYPE ) || ( yyp->yyvsp[0].totaltype.gentype != NOTYPE )) |
| printf("\n***Error: right operand of '-' must be an integer\n"); |
| yyval.totaltype.basetype = INTTYPE; |
| yyval.totaltype.gentype = NOTYPE; |
| yyval.totaltype.number = -1; |
| yyval.totaltype.endnum = -1; |
| ; |
| break;} |
| case 57: |
| #line 383 "parse.y.in" |
| { /* '*' requires integers */ |
| |
| if (( yyp->yyvsp[-2].totaltype.basetype != INTTYPE ) || ( yyp->yyvsp[0].totaltype.basetype != INTTYPE ) || |
| ( yyp->yyvsp[-2].totaltype.gentype != NOTYPE ) || ( yyp->yyvsp[0].totaltype.gentype != NOTYPE )) |
| printf("\n***Error: operands of '*' must be integers\n"); |
| yyval.totaltype.basetype = INTTYPE; |
| yyval.totaltype.gentype = NOTYPE; |
| yyval.totaltype.number = -1; |
| yyval.totaltype.endnum = -1; |
| ; |
| break;} |
| case 58: |
| #line 394 "parse.y.in" |
| { /* DIV requires integers */ |
| |
| if (( yyp->yyvsp[-2].totaltype.basetype != INTTYPE ) || ( yyp->yyvsp[0].totaltype.basetype != INTTYPE ) || |
| ( yyp->yyvsp[-2].totaltype.gentype != NOTYPE ) || ( yyp->yyvsp[0].totaltype.gentype != NOTYPE )) |
| printf("\n***Error: operands of div must be integers\n"); |
| yyval.totaltype.basetype = INTTYPE; |
| yyval.totaltype.gentype = NOTYPE; |
| yyval.totaltype.number = -1; |
| yyval.totaltype.endnum = -1; |
| ; |
| break;} |
| case 59: |
| #line 405 "parse.y.in" |
| { /* '<>' requires the same types AND only base types */ |
| |
| if ( yyp->yyvsp[-2].totaltype.basetype != yyp->yyvsp[0].totaltype.basetype ) |
| printf("\n***Error: operands of '<>' have different types\n"); |
| if (( yyp->yyvsp[-2].totaltype.gentype != NOTYPE ) || ( yyp->yyvsp[0].totaltype.gentype != NOTYPE )) |
| printf("\n***Error: operands of '<>' must be base types\n"); |
| yyval.totaltype.basetype = BOOLTYPE; |
| yyval.totaltype.gentype = NOTYPE; |
| yyval.totaltype.number = -1; |
| yyval.totaltype.endnum = -1; |
| ; |
| break;} |
| case 60: |
| #line 417 "parse.y.in" |
| { /* '=' requires the same types AND only base types */ |
| |
| if ((yyp->yyvsp[-2].totaltype.basetype != yyp->yyvsp[0].totaltype.basetype ) || ( yyp->yyvsp[-2].totaltype.gentype != NOTYPE ) || |
| ( yyp->yyvsp[0].totaltype.gentype != NOTYPE )) |
| printf("\n***Error: operands of '=' have different types\n"); |
| yyval.totaltype.basetype = BOOLTYPE; |
| yyval.totaltype.gentype = NOTYPE; |
| yyval.totaltype.number = -1; |
| yyval.totaltype.endnum = -1; |
| ; |
| break;} |
| case 61: |
| #line 428 "parse.y.in" |
| { /* '>=' requires integers */ |
| |
| if (( yyp->yyvsp[-2].totaltype.basetype != INTTYPE ) || ( yyp->yyvsp[0].totaltype.basetype != INTTYPE ) || |
| ( yyp->yyvsp[-2].totaltype.gentype != NOTYPE ) || ( yyp->yyvsp[0].totaltype.gentype != NOTYPE )) |
| printf("\n***Error: operands of '>=' must be integers\n"); |
| yyval.totaltype.basetype = BOOLTYPE; |
| yyval.totaltype.gentype = NOTYPE; |
| yyval.totaltype.number = -1; |
| yyval.totaltype.endnum = -1; |
| ; |
| break;} |
| case 62: |
| #line 439 "parse.y.in" |
| { /* '>' requires integers */ |
| |
| if (( yyp->yyvsp[-2].totaltype.basetype != INTTYPE ) || ( yyp->yyvsp[0].totaltype.basetype != INTTYPE ) || |
| ( yyp->yyvsp[-2].totaltype.gentype != NOTYPE ) || ( yyp->yyvsp[0].totaltype.gentype != NOTYPE )) |
| printf("\n***Error: operands of '>' must be integers\n"); |
| yyval.totaltype.basetype = BOOLTYPE; |
| yyval.totaltype.gentype = NOTYPE; |
| yyval.totaltype.number = -1; |
| yyval.totaltype.endnum = -1; |
| ; |
| break;} |
| case 63: |
| #line 450 "parse.y.in" |
| { /* '<' requires integers */ |
| |
| if (( yyp->yyvsp[-2].totaltype.basetype != INTTYPE ) || ( yyp->yyvsp[0].totaltype.basetype != INTTYPE ) || |
| ( yyp->yyvsp[-2].totaltype.gentype != NOTYPE ) || ( yyp->yyvsp[0].totaltype.gentype != NOTYPE )) |
| printf("\n***Error: operands of '<' must be integers\n"); |
| yyval.totaltype.basetype = BOOLTYPE; |
| yyval.totaltype.gentype = NOTYPE; |
| yyval.totaltype.number = -1; |
| yyval.totaltype.endnum = -1; |
| ; |
| break;} |
| case 64: |
| #line 461 "parse.y.in" |
| { /* '<=' requires integers */ |
| |
| if (( yyp->yyvsp[-2].totaltype.basetype != INTTYPE ) || ( yyp->yyvsp[0].totaltype.basetype != INTTYPE ) || |
| ( yyp->yyvsp[-2].totaltype.gentype != NOTYPE ) || ( yyp->yyvsp[0].totaltype.gentype != NOTYPE )) |
| printf("\n***Error: operands of '<=' must be integers\n"); |
| yyval.totaltype.basetype = BOOLTYPE; |
| yyval.totaltype.gentype = NOTYPE; |
| yyval.totaltype.number = -1; |
| yyval.totaltype.endnum = -1; |
| ; |
| break;} |
| case 65: |
| #line 472 "parse.y.in" |
| { /* AND requires booleans */ |
| |
| if (( yyp->yyvsp[-2].totaltype.basetype != BOOLTYPE ) || ( yyp->yyvsp[0].totaltype.basetype != BOOLTYPE ) || |
| ( yyp->yyvsp[-2].totaltype.gentype != NOTYPE ) || ( yyp->yyvsp[0].totaltype.gentype != NOTYPE )) |
| printf("\n***Error: operands of AND must be boolean\n"); |
| yyval.totaltype.basetype = BOOLTYPE; |
| yyval.totaltype.gentype = NOTYPE; |
| yyval.totaltype.number = -1; |
| yyval.totaltype.endnum = -1; |
| ; |
| break;} |
| case 66: |
| #line 483 "parse.y.in" |
| { /* OR requires booleans */ |
| |
| if (( yyp->yyvsp[-2].totaltype.basetype != BOOLTYPE ) || ( yyp->yyvsp[0].totaltype.basetype != BOOLTYPE ) || |
| ( yyp->yyvsp[-2].totaltype.gentype != NOTYPE ) || ( yyp->yyvsp[0].totaltype.gentype != NOTYPE )) |
| printf("\n***Error: operands of OR must be boolean\n"); |
| yyval.totaltype.basetype = BOOLTYPE; |
| yyval.totaltype.gentype = NOTYPE; |
| yyval.totaltype.number = -1; |
| yyval.totaltype.endnum = -1; |
| ; |
| break;} |
| case 67: |
| #line 494 "parse.y.in" |
| { /* NOT requires a boolean */ |
| |
| if (( yyp->yyvsp[0].totaltype.basetype != BOOLTYPE ) || ( yyp->yyvsp[0].totaltype.gentype != NOTYPE )) |
| printf("\n***Error: right operand of NOT must be boolean\n"); |
| yyval.totaltype.basetype = yyp->yyvsp[0].totaltype.basetype; |
| yyval.totaltype.gentype = NOTYPE; |
| yyval.totaltype.number = -1; |
| yyval.totaltype.endnum = -1; |
| ; |
| break;} |
| case 68: |
| #line 504 "parse.y.in" |
| { /* Simply pass up the type of the expression within the |
| parentheses */ |
| |
| yyval.totaltype.basetype = yyp->yyvsp[-1].totaltype.basetype; |
| yyval.totaltype.gentype = yyp->yyvsp[-1].totaltype.gentype; |
| yyval.totaltype.number = yyp->yyvsp[-1].totaltype.number; |
| yyval.totaltype.endnum = yyp->yyvsp[-1].totaltype.endnum; |
| ; |
| break;} |
| case 69: |
| #line 513 "parse.y.in" |
| { /* This should be a function in an expression */ |
| |
| symTabEntry s; |
| |
| s = lookupALL(yyp->yyvsp[-3].token.str); |
| if ( s == NULL ) |
| { |
| printf("\n***Error: undeclared identifier: %s\n",yyp->yyvsp[-3].token.str); |
| yyval.totaltype.basetype = VOIDTYPE; |
| yyval.totaltype.gentype = NOTYPE; |
| yyval.totaltype.number = -1; |
| yyval.totaltype.endnum = -1; |
| } |
| else |
| { |
| if ( s -> gentype == FUNCTYPE ) /* Make sure it is a function */ |
| { |
| int check; |
| |
| check = checkparams( s -> formals , yyp->yyvsp[-1].elist ); |
| yyval.totaltype.basetype = s -> basetype; /* Take the return type */ |
| yyval.totaltype.gentype = NOTYPE; /* of the function */ |
| yyval.totaltype.number = -1; |
| yyval.totaltype.endnum = -1; |
| } |
| else |
| { /* Not a function : ERROR !! */ |
| |
| printf("\n***Error: id %s is not a function\n",yyp->yyvsp[-3].token.str); |
| yyval.totaltype.basetype = VOIDTYPE; |
| yyval.totaltype.gentype = NOTYPE; |
| yyval.totaltype.number = -1; |
| yyval.totaltype.endnum = -1; |
| } |
| } |
| ; |
| break;} |
| case 70: |
| #line 550 "parse.y.in" |
| { /* This can be a variable or a function with no parameters */ |
| |
| symTabEntry s; |
| |
| s = lookupALL(yyp->yyvsp[0].token.str); |
| if ( s == NULL) |
| { |
| printf("\n***Error: undeclared identifier: %s\n",yyp->yyvsp[0].token.str); |
| yyval.totaltype.basetype = VOIDTYPE; |
| yyval.totaltype.gentype = NOTYPE; |
| yyval.totaltype.number = -1; |
| yyval.totaltype.endnum = -1; |
| } |
| else |
| { /* No procedures allowed in expressions */ |
| |
| if (s -> gentype == PROCTYPE ) |
| { |
| printf("\n***Error: illegal type for expression\n"); |
| yyval.totaltype.basetype = VOIDTYPE; |
| yyval.totaltype.gentype = NOTYPE; |
| yyval.totaltype.number = -1; |
| yyval.totaltype.endnum = 1; |
| } |
| if ( s -> gentype == ARRAYTYPE ) |
| { |
| yyval.totaltype.basetype = s -> basetype; |
| yyval.totaltype.gentype = ARRAYTYPE; |
| yyval.totaltype.number = s -> number; |
| yyval.totaltype.endnum = s -> endnum; |
| } |
| if ( s -> gentype == FUNCTYPE ) |
| { /* Can be a function ONLY if there are no formal parameters */ |
| |
| if ( s -> formals != NULL ) |
| printf("\n***Error: too few actual parameters\n"); |
| yyval.totaltype.basetype = s -> basetype; |
| yyval.totaltype.gentype = NOTYPE; |
| yyval.totaltype.number = -1; |
| yyval.totaltype.endnum = -1; |
| } |
| if ( s -> gentype == NOTYPE ) |
| { |
| yyval.totaltype.basetype = s -> basetype; |
| yyval.totaltype.gentype = NOTYPE; |
| yyval.totaltype.number = -1; |
| yyval.totaltype.endnum = -1; |
| } |
| } |
| ; |
| break;} |
| case 71: |
| #line 601 "parse.y.in" |
| { /* This should be an array only */ |
| |
| symTabEntry s; |
| |
| s = lookupALL(yyp->yyvsp[-3].token.str); |
| if ( s == NULL) |
| { |
| printf("\n***Error: undeclared identifier: %s\n",yyp->yyvsp[-3].token.str); |
| yyval.totaltype.basetype = VOIDTYPE; |
| yyval.totaltype.gentype = NOTYPE; |
| yyval.totaltype.number = -1; |
| yyval.totaltype.endnum = -1; |
| } |
| else |
| { /* Check variable AND the subscript */ |
| |
| if ( s -> gentype != ARRAYTYPE ) |
| printf("\n***Error: id %s is not an array\n",yyp->yyvsp[-3].token.str); |
| if (( yyp->yyvsp[-1].totaltype.basetype != INTTYPE ) || ( yyp->yyvsp[-1].totaltype.gentype != NOTYPE )) |
| printf("\n***Error: subscript exp not type integer\n"); |
| yyval.totaltype.basetype = s -> basetype; |
| yyval.totaltype.gentype = NOTYPE; |
| yyval.totaltype.number = -1; |
| yyval.totaltype.endnum = -1; |
| } |
| ; |
| break;} |
| case 72: |
| #line 627 "parse.y.in" |
| { yyval.totaltype = yyp->yyvsp[0].totaltype; /* Simply send up the constant's type */ ; |
| break;} |
| case 73: |
| #line 630 "parse.y.in" |
| { /* Left hand side without '[' and ']' can ONLY be a variable OR |
| the function from the CURRENT scope */ |
| |
| symTabEntry s; |
| |
| s = lookupALL(yyp->yyvsp[0].token.str); |
| if ( s == NULL) |
| { |
| printf("\n***Error: undeclared identifier: %s\n",yyp->yyvsp[0].token.str); |
| yyval.totaltype.basetype = VOIDTYPE; |
| yyval.totaltype.gentype = NOTYPE; |
| yyval.totaltype.number = -1; |
| yyval.totaltype.endnum = -1; |
| } |
| else |
| { /* Function can only be on the left side if it is |
| defining the current function */ |
| |
| if ( s -> gentype == FUNCTYPE ) |
| { |
| if ( s == current -> procedure ) |
| { |
| yyval.totaltype.basetype = s -> basetype; |
| yyval.totaltype.gentype = NOTYPE; |
| yyval.totaltype.number = -1; |
| yyval.totaltype.endnum = -1; |
| } |
| else |
| { /* Otherwise, it is an error */ |
| |
| printf("\n***Error: function name on left side of :=\n"); |
| yyval.totaltype.basetype = VOIDTYPE; |
| yyval.totaltype.gentype = NOTYPE; |
| yyval.totaltype.number = -1; |
| yyval.totaltype.number = -1; |
| } |
| } |
| else |
| { |
| if ( s -> gentype == NOTYPE ) |
| { |
| yyval.totaltype.basetype = s -> basetype; |
| yyval.totaltype.gentype = NOTYPE; |
| yyval.totaltype.number = s -> number; |
| yyval.totaltype.endnum = s -> endnum; |
| } |
| else |
| { /* No arrays or procedures on the left side */ |
| |
| printf("\n***Error: assignment to nonscalar\n"); |
| yyval.totaltype.basetype = VOIDTYPE; |
| yyval.totaltype.gentype = NOTYPE; |
| yyval.totaltype.number = -1; |
| yyval.totaltype.endnum = -1; |
| } |
| } |
| } |
| ; |
| break;} |
| case 74: |
| #line 689 "parse.y.in" |
| { /* This should be an array AND an index */ |
| |
| symTabEntry s; |
| |
| s = lookupALL(yyp->yyvsp[-3].token.str); |
| if ( s == NULL ) |
| { |
| printf("\n***Error: undeclared identifier: %s\n",yyp->yyvsp[-3].token.str); |
| yyval.totaltype.basetype = VOIDTYPE; |
| yyval.totaltype.gentype = NOTYPE; |
| yyval.totaltype.number = -1; |
| yyval.totaltype.endnum = -1; |
| } |
| else |
| { /* Check to make sure it IS an array and the index is |
| an integer */ |
| |
| if ( s -> gentype == ARRAYTYPE ) |
| { |
| if (( yyp->yyvsp[-1].totaltype.basetype != INTTYPE ) || ( yyp->yyvsp[-1].totaltype.gentype != NOTYPE )) |
| printf("\n***Error: subscript exp is not type integer\n"); |
| yyval.totaltype.basetype = s -> basetype; |
| yyval.totaltype.gentype = NOTYPE; |
| yyval.totaltype.number = -1; |
| yyval.totaltype.endnum = -1; |
| } |
| else |
| { /* This is not an array */ |
| printf("\n***Error: id %s is not an array\n",yyp->yyvsp[-3].token.str); |
| yyval.totaltype.basetype = VOIDTYPE; |
| yyval.totaltype.gentype = NOTYPE; |
| yyval.totaltype.number = -1; |
| yyval.totaltype.endnum = -1; |
| } |
| } |
| ; |
| break;} |
| case 75: |
| #line 727 "parse.y.in" |
| { yyval.totaltype.basetype = INTTYPE; /* Basic integer */ |
| yyval.totaltype.gentype = NOTYPE; |
| yyval.totaltype.number = -1; |
| yyval.totaltype.endnum = -1; ; |
| break;} |
| case 76: |
| #line 732 "parse.y.in" |
| { |
| if ( strlen(yyp->yyvsp[0].token.str) == 3 ) /* Single character */ |
| yyval.totaltype.basetype = CHARTYPE; |
| else |
| yyval.totaltype.basetype = STRINGTYPE; /* String */ |
| yyval.totaltype.gentype = NOTYPE; |
| yyval.totaltype.number = -1; |
| yyval.totaltype.endnum = -1; ; |
| break;} |
| case 77: |
| #line 741 "parse.y.in" |
| { yyval.totaltype.basetype = BOOLTYPE; /* TRUE and FALSE are both booleans */ |
| yyval.totaltype.gentype = NOTYPE; |
| yyval.totaltype.number = -1; |
| yyval.totaltype.endnum = -1; ; |
| break;} |
| case 78: |
| #line 746 "parse.y.in" |
| { yyval.totaltype.basetype = BOOLTYPE; |
| yyval.totaltype.gentype = NOTYPE; |
| yyval.totaltype.number = -1; |
| yyval.totaltype.endnum = -1; ; |
| break;} |
| } |
| #define PROG 258 |
| #define PERIOD 259 |
| #define PROC 260 |
| #define FUNC 261 |
| #define VAR 262 |
| #define ARRAY 263 |
| #define RANGE 264 |
| #define OF 265 |
| #define INT 266 |
| #define CHAR 267 |
| #define BOOL 268 |
| #define WRITELN 269 |
| #define THEN 270 |
| #define ELSE 271 |
| #define IF 272 |
| #define DO 273 |
| #define WHILE 274 |
| #define BEG 275 |
| #define END 276 |
| #define ASG 277 |
| #define NOT 278 |
| #define TRUE_TOK 279 |
| #define FALSE_TOK 280 |
| #define ID 281 |
| #define CCONST 282 |
| #define ICONST 283 |
| #define NEQ 284 |
| #define LT 285 |
| #define LEQ 286 |
| #define GEQ 287 |
| #define GT 288 |
| #define OR 289 |
| #define AND 290 |
| #define DIV 291 |
| |
| Conflict in state 80 between rule 67 and token '=' resolved as reduce. |
| Conflict in state 80 between rule 67 and token NEQ resolved as reduce. |
| Conflict in state 80 between rule 67 and token LT resolved as reduce. |
| Conflict in state 80 between rule 67 and token LEQ resolved as reduce. |
| Conflict in state 80 between rule 67 and token GEQ resolved as reduce. |
| Conflict in state 80 between rule 67 and token GT resolved as reduce. |
| Conflict in state 80 between rule 67 and token '+' resolved as reduce. |
| Conflict in state 80 between rule 67 and token '-' resolved as reduce. |
| Conflict in state 80 between rule 67 and token OR resolved as reduce. |
| Conflict in state 80 between rule 67 and token '*' resolved as reduce. |
| Conflict in state 80 between rule 67 and token AND resolved as reduce. |
| Conflict in state 80 between rule 67 and token DIV resolved as reduce. |
| Conflict in state 83 between rule 56 and token '=' resolved as reduce. |
| Conflict in state 83 between rule 56 and token NEQ resolved as reduce. |
| Conflict in state 83 between rule 56 and token LT resolved as reduce. |
| Conflict in state 83 between rule 56 and token LEQ resolved as reduce. |
| Conflict in state 83 between rule 56 and token GEQ resolved as reduce. |
| Conflict in state 83 between rule 56 and token GT resolved as reduce. |
| Conflict in state 83 between rule 56 and token '+' resolved as reduce. |
| Conflict in state 83 between rule 56 and token '-' resolved as reduce. |
| Conflict in state 83 between rule 56 and token OR resolved as reduce. |
| Conflict in state 83 between rule 56 and token '*' resolved as reduce. |
| Conflict in state 83 between rule 56 and token AND resolved as reduce. |
| Conflict in state 83 between rule 56 and token DIV resolved as reduce. |
| Conflict in state 114 between rule 60 and token '=' resolved as an error. |
| Conflict in state 114 between rule 60 and token NEQ resolved as an error. |
| Conflict in state 114 between rule 60 and token LT resolved as an error. |
| Conflict in state 114 between rule 60 and token LEQ resolved as an error. |
| Conflict in state 114 between rule 60 and token GEQ resolved as an error. |
| Conflict in state 114 between rule 60 and token GT resolved as an error. |
| Conflict in state 114 between rule 60 and token '+' resolved as shift. |
| Conflict in state 114 between rule 60 and token '-' resolved as shift. |
| Conflict in state 114 between rule 60 and token OR resolved as shift. |
| Conflict in state 114 between rule 60 and token '*' resolved as shift. |
| Conflict in state 114 between rule 60 and token AND resolved as shift. |
| Conflict in state 114 between rule 60 and token DIV resolved as shift. |
| Conflict in state 115 between rule 59 and token '=' resolved as an error. |
| Conflict in state 115 between rule 59 and token NEQ resolved as an error. |
| Conflict in state 115 between rule 59 and token LT resolved as an error. |
| Conflict in state 115 between rule 59 and token LEQ resolved as an error. |
| Conflict in state 115 between rule 59 and token GEQ resolved as an error. |
| Conflict in state 115 between rule 59 and token GT resolved as an error. |
| Conflict in state 115 between rule 59 and token '+' resolved as shift. |
| Conflict in state 115 between rule 59 and token '-' resolved as shift. |
| Conflict in state 115 between rule 59 and token OR resolved as shift. |
| Conflict in state 115 between rule 59 and token '*' resolved as shift. |
| Conflict in state 115 between rule 59 and token AND resolved as shift. |
| Conflict in state 115 between rule 59 and token DIV resolved as shift. |
| Conflict in state 116 between rule 63 and token '=' resolved as an error. |
| Conflict in state 116 between rule 63 and token NEQ resolved as an error. |
| Conflict in state 116 between rule 63 and token LT resolved as an error. |
| Conflict in state 116 between rule 63 and token LEQ resolved as an error. |
| Conflict in state 116 between rule 63 and token GEQ resolved as an error. |
| Conflict in state 116 between rule 63 and token GT resolved as an error. |
| Conflict in state 116 between rule 63 and token '+' resolved as shift. |
| Conflict in state 116 between rule 63 and token '-' resolved as shift. |
| Conflict in state 116 between rule 63 and token OR resolved as shift. |
| Conflict in state 116 between rule 63 and token '*' resolved as shift. |
| Conflict in state 116 between rule 63 and token AND resolved as shift. |
| Conflict in state 116 between rule 63 and token DIV resolved as shift. |
| Conflict in state 117 between rule 64 and token '=' resolved as an error. |
| Conflict in state 117 between rule 64 and token NEQ resolved as an error. |
| Conflict in state 117 between rule 64 and token LT resolved as an error. |
| Conflict in state 117 between rule 64 and token LEQ resolved as an error. |
| Conflict in state 117 between rule 64 and token GEQ resolved as an error. |
| Conflict in state 117 between rule 64 and token GT resolved as an error. |
| Conflict in state 117 between rule 64 and token '+' resolved as shift. |
| Conflict in state 117 between rule 64 and token '-' resolved as shift. |
| Conflict in state 117 between rule 64 and token OR resolved as shift. |
| Conflict in state 117 between rule 64 and token '*' resolved as shift. |
| Conflict in state 117 between rule 64 and token AND resolved as shift. |
| Conflict in state 117 between rule 64 and token DIV resolved as shift. |
| Conflict in state 118 between rule 61 and token '=' resolved as an error. |
| Conflict in state 118 between rule 61 and token NEQ resolved as an error. |
| Conflict in state 118 between rule 61 and token LT resolved as an error. |
| Conflict in state 118 between rule 61 and token LEQ resolved as an error. |
| Conflict in state 118 between rule 61 and token GEQ resolved as an error. |
| Conflict in state 118 between rule 61 and token GT resolved as an error. |
| Conflict in state 118 between rule 61 and token '+' resolved as shift. |
| Conflict in state 118 between rule 61 and token '-' resolved as shift. |
| Conflict in state 118 between rule 61 and token OR resolved as shift. |
| Conflict in state 118 between rule 61 and token '*' resolved as shift. |
| Conflict in state 118 between rule 61 and token AND resolved as shift. |
| Conflict in state 118 between rule 61 and token DIV resolved as shift. |
| Conflict in state 119 between rule 62 and token '=' resolved as an error. |
| Conflict in state 119 between rule 62 and token NEQ resolved as an error. |
| Conflict in state 119 between rule 62 and token LT resolved as an error. |
| Conflict in state 119 between rule 62 and token LEQ resolved as an error. |
| Conflict in state 119 between rule 62 and token GEQ resolved as an error. |
| Conflict in state 119 between rule 62 and token GT resolved as an error. |
| Conflict in state 119 between rule 62 and token '+' resolved as shift. |
| Conflict in state 119 between rule 62 and token '-' resolved as shift. |
| Conflict in state 119 between rule 62 and token OR resolved as shift. |
| Conflict in state 119 between rule 62 and token '*' resolved as shift. |
| Conflict in state 119 between rule 62 and token AND resolved as shift. |
| Conflict in state 119 between rule 62 and token DIV resolved as shift. |
| Conflict in state 120 between rule 54 and token '=' resolved as reduce. |
| Conflict in state 120 between rule 54 and token NEQ resolved as reduce. |
| Conflict in state 120 between rule 54 and token LT resolved as reduce. |
| Conflict in state 120 between rule 54 and token LEQ resolved as reduce. |
| Conflict in state 120 between rule 54 and token GEQ resolved as reduce. |
| Conflict in state 120 between rule 54 and token GT resolved as reduce. |
| Conflict in state 120 between rule 54 and token '+' resolved as reduce. |
| Conflict in state 120 between rule 54 and token '-' resolved as reduce. |
| Conflict in state 120 between rule 54 and token OR resolved as reduce. |
| Conflict in state 120 between rule 54 and token '*' resolved as shift. |
| Conflict in state 120 between rule 54 and token AND resolved as shift. |
| Conflict in state 120 between rule 54 and token DIV resolved as shift. |
| Conflict in state 121 between rule 55 and token '=' resolved as reduce. |
| Conflict in state 121 between rule 55 and token NEQ resolved as reduce. |
| Conflict in state 121 between rule 55 and token LT resolved as reduce. |
| Conflict in state 121 between rule 55 and token LEQ resolved as reduce. |
| Conflict in state 121 between rule 55 and token GEQ resolved as reduce. |
| Conflict in state 121 between rule 55 and token GT resolved as reduce. |
| Conflict in state 121 between rule 55 and token '+' resolved as reduce. |
| Conflict in state 121 between rule 55 and token '-' resolved as reduce. |
| Conflict in state 121 between rule 55 and token OR resolved as reduce. |
| Conflict in state 121 between rule 55 and token '*' resolved as shift. |
| Conflict in state 121 between rule 55 and token AND resolved as shift. |
| Conflict in state 121 between rule 55 and token DIV resolved as shift. |
| Conflict in state 122 between rule 66 and token '=' resolved as reduce. |
| Conflict in state 122 between rule 66 and token NEQ resolved as reduce. |
| Conflict in state 122 between rule 66 and token LT resolved as reduce. |
| Conflict in state 122 between rule 66 and token LEQ resolved as reduce. |
| Conflict in state 122 between rule 66 and token GEQ resolved as reduce. |
| Conflict in state 122 between rule 66 and token GT resolved as reduce. |
| Conflict in state 122 between rule 66 and token '+' resolved as reduce. |
| Conflict in state 122 between rule 66 and token '-' resolved as reduce. |
| Conflict in state 122 between rule 66 and token OR resolved as reduce. |
| Conflict in state 122 between rule 66 and token '*' resolved as shift. |
| Conflict in state 122 between rule 66 and token AND resolved as shift. |
| Conflict in state 122 between rule 66 and token DIV resolved as shift. |
| Conflict in state 123 between rule 57 and token '=' resolved as reduce. |
| Conflict in state 123 between rule 57 and token NEQ resolved as reduce. |
| Conflict in state 123 between rule 57 and token LT resolved as reduce. |
| Conflict in state 123 between rule 57 and token LEQ resolved as reduce. |
| Conflict in state 123 between rule 57 and token GEQ resolved as reduce. |
| Conflict in state 123 between rule 57 and token GT resolved as reduce. |
| Conflict in state 123 between rule 57 and token '+' resolved as reduce. |
| Conflict in state 123 between rule 57 and token '-' resolved as reduce. |
| Conflict in state 123 between rule 57 and token OR resolved as reduce. |
| Conflict in state 123 between rule 57 and token '*' resolved as reduce. |
| Conflict in state 123 between rule 57 and token AND resolved as reduce. |
| Conflict in state 123 between rule 57 and token DIV resolved as reduce. |
| Conflict in state 124 between rule 65 and token '=' resolved as reduce. |
| Conflict in state 124 between rule 65 and token NEQ resolved as reduce. |
| Conflict in state 124 between rule 65 and token LT resolved as reduce. |
| Conflict in state 124 between rule 65 and token LEQ resolved as reduce. |
| Conflict in state 124 between rule 65 and token GEQ resolved as reduce. |
| Conflict in state 124 between rule 65 and token GT resolved as reduce. |
| Conflict in state 124 between rule 65 and token '+' resolved as reduce. |
| Conflict in state 124 between rule 65 and token '-' resolved as reduce. |
| Conflict in state 124 between rule 65 and token OR resolved as reduce. |
| Conflict in state 124 between rule 65 and token '*' resolved as reduce. |
| Conflict in state 124 between rule 65 and token AND resolved as reduce. |
| Conflict in state 124 between rule 65 and token DIV resolved as reduce. |
| Conflict in state 125 between rule 58 and token '=' resolved as reduce. |
| Conflict in state 125 between rule 58 and token NEQ resolved as reduce. |
| Conflict in state 125 between rule 58 and token LT resolved as reduce. |
| Conflict in state 125 between rule 58 and token LEQ resolved as reduce. |
| Conflict in state 125 between rule 58 and token GEQ resolved as reduce. |
| Conflict in state 125 between rule 58 and token GT resolved as reduce. |
| Conflict in state 125 between rule 58 and token '+' resolved as reduce. |
| Conflict in state 125 between rule 58 and token '-' resolved as reduce. |
| Conflict in state 125 between rule 58 and token OR resolved as reduce. |
| Conflict in state 125 between rule 58 and token '*' resolved as reduce. |
| Conflict in state 125 between rule 58 and token AND resolved as reduce. |
| Conflict in state 125 between rule 58 and token DIV resolved as reduce. |
| State 101 contains 1 shift/reduce conflict. |
| parse.y.in contains 1 shift/reduce conflict. |
| |
| |
| token types: |
| type -1 is $ |
| type 40 is '(' |
| type 41 is ')' |
| type 42 is '*' |
| type 43 is '+' |
| type 44 is ',' |
| type 45 is '-' |
| type 58 is ':' |
| type 59 is ';' |
| type 61 is '=' |
| type 91 is '[' |
| type 93 is ']' |
| type 256 is error |
| type 258 is PROG |
| type 259 is PERIOD |
| type 260 is PROC |
| type 261 is FUNC |
| type 262 is VAR |
| type 263 is ARRAY |
| type 264 is RANGE |
| type 265 is OF |
| type 266 is INT |
| type 267 is CHAR |
| type 268 is BOOL |
| type 269 is WRITELN |
| type 270 is THEN |
| type 271 is ELSE |
| type 272 is IF |
| type 273 is DO |
| type 274 is WHILE |
| type 275 is BEG |
| type 276 is END |
| type 277 is ASG |
| type 278 is NOT |
| type 279 is TRUE_TOK |
| type 280 is FALSE_TOK |
| type 281 is ID |
| type 282 is CCONST |
| type 283 is ICONST |
| type 284 is NEQ |
| type 285 is LT |
| type 286 is LEQ |
| type 287 is GEQ |
| type 288 is GT |
| type 289 is OR |
| type 290 is AND |
| type 291 is DIV |
| |
| |
| state 0 |
| |
| PROG shift 1 |
| program shift 150 |
| |
| |
| |
| state 1 |
| |
| program -> PROG . ID @1 ';' block PERIOD (2) |
| |
| ID shift 2 |
| |
| |
| |
| state 2 |
| |
| program -> PROG ID . @1 ';' block PERIOD (2) |
| |
| @1 shift 3 |
| |
| $default reduce 1 (@1) |
| |
| |
| |
| state 3 |
| |
| program -> PROG ID @1 . ';' block PERIOD (2) |
| |
| ';' shift 4 |
| |
| |
| |
| state 4 |
| |
| program -> PROG ID @1 ';' . block PERIOD (2) |
| |
| VAR shift 5 |
| block shift 6 |
| variables shift 7 |
| |
| $default reduce 20 (variables) |
| |
| |
| |
| state 5 |
| |
| variables -> VAR . vardcls (21) |
| |
| ID shift 8 |
| vardcls shift 9 |
| vardcl shift 10 |
| idlist shift 11 |
| |
| |
| |
| state 6 |
| |
| program -> PROG ID @1 ';' block . PERIOD (2) |
| |
| PERIOD shift 12 |
| |
| |
| |
| state 7 |
| |
| block -> variables . @2 procdcls cmpdstmt (4) |
| |
| @2 shift 13 |
| |
| $default reduce 3 (@2) |
| |
| |
| |
| state 8 |
| |
| idlist -> ID . (26) |
| |
| $default reduce 26 (idlist) |
| |
| |
| |
| state 9 |
| |
| variables -> VAR vardcls . (21) |
| vardcls -> vardcls . vardcl ';' (22) |
| |
| ID shift 8 |
| vardcl shift 14 |
| idlist shift 11 |
| |
| $default reduce 21 (variables) |
| |
| |
| |
| state 10 |
| |
| vardcls -> vardcl . ';' (23) |
| |
| ';' shift 15 |
| |
| |
| |
| state 11 |
| |
| vardcl -> idlist . ':' type (24) |
| idlist -> idlist . ',' ID (25) |
| |
| ':' shift 16 |
| ',' shift 17 |
| |
| |
| |
| state 12 |
| |
| program -> PROG ID @1 ';' block PERIOD . (2) |
| |
| $default reduce 2 (program) |
| |
| |
| |
| state 13 |
| |
| block -> variables @2 . procdcls cmpdstmt (4) |
| |
| procdcls shift 18 |
| |
| $default reduce 6 (procdcls) |
| |
| |
| |
| state 14 |
| |
| vardcls -> vardcls vardcl . ';' (22) |
| |
| ';' shift 19 |
| |
| |
| |
| state 15 |
| |
| vardcls -> vardcl ';' . (23) |
| |
| $default reduce 23 (vardcls) |
| |
| |
| |
| state 16 |
| |
| vardcl -> idlist ':' . type (24) |
| |
| ARRAY shift 20 |
| INT shift 21 |
| CHAR shift 22 |
| BOOL shift 23 |
| type shift 24 |
| stype shift 25 |
| |
| |
| |
| state 17 |
| |
| idlist -> idlist ',' . ID (25) |
| |
| ID shift 26 |
| |
| |
| |
| state 18 |
| |
| block -> variables @2 procdcls . cmpdstmt (4) |
| procdcls -> procdcls . procdcl (5) |
| |
| PROC shift 27 |
| FUNC shift 28 |
| BEG shift 29 |
| procdcl shift 30 |
| cmpdstmt shift 31 |
| |
| |
| |
| state 19 |
| |
| vardcls -> vardcls vardcl ';' . (22) |
| |
| $default reduce 22 (vardcls) |
| |
| |
| |
| state 20 |
| |
| type -> ARRAY . '[' ICONST RANGE ICONST ']' OF stype (27) |
| |
| '[' shift 32 |
| |
| |
| |
| state 21 |
| |
| stype -> INT . (29) |
| |
| $default reduce 29 (stype) |
| |
| |
| |
| state 22 |
| |
| stype -> CHAR . (30) |
| |
| $default reduce 30 (stype) |
| |
| |
| |
| state 23 |
| |
| stype -> BOOL . (31) |
| |
| $default reduce 31 (stype) |
| |
| |
| |
| state 24 |
| |
| vardcl -> idlist ':' type . (24) |
| |
| $default reduce 24 (vardcl) |
| |
| |
| |
| state 25 |
| |
| type -> stype . (28) |
| |
| $default reduce 28 (type) |
| |
| |
| |
| state 26 |
| |
| idlist -> idlist ',' ID . (25) |
| |
| $default reduce 25 (idlist) |
| |
| |
| |
| state 27 |
| |
| procdcl -> PROC . ID @3 parmlist @4 ';' block ';' (9) |
| |
| ID shift 33 |
| |
| |
| |
| state 28 |
| |
| procdcl -> FUNC . ID @5 parmlist @6 ':' stype ';' @7 block ';' (13) |
| |
| ID shift 34 |
| |
| |
| |
| state 29 |
| |
| cmpdstmt -> BEG . stmtlist END (47) |
| |
| WRITELN shift 35 |
| IF shift 36 |
| WHILE shift 37 |
| BEG shift 29 |
| ID shift 38 |
| stmtlist shift 39 |
| stmt shift 40 |
| writestmt shift 41 |
| procstmt shift 42 |
| ifstmt shift 43 |
| ifhead shift 44 |
| wstmt shift 45 |
| whead shift 46 |
| cmpdstmt shift 47 |
| astmt shift 48 |
| lhs shift 49 |
| var shift 50 |
| |
| |
| |
| state 30 |
| |
| procdcls -> procdcls procdcl . (5) |
| |
| $default reduce 5 (procdcls) |
| |
| |
| |
| state 31 |
| |
| block -> variables @2 procdcls cmpdstmt . (4) |
| |
| $default reduce 4 (block) |
| |
| |
| |
| state 32 |
| |
| type -> ARRAY '[' . ICONST RANGE ICONST ']' OF stype (27) |
| |
| ICONST shift 51 |
| |
| |
| |
| state 33 |
| |
| procdcl -> PROC ID . @3 parmlist @4 ';' block ';' (9) |
| |
| @3 shift 52 |
| |
| $default reduce 7 (@3) |
| |
| |
| |
| state 34 |
| |
| procdcl -> FUNC ID . @5 parmlist @6 ':' stype ';' @7 block ';' (13) |
| |
| @5 shift 53 |
| |
| $default reduce 10 (@5) |
| |
| |
| |
| state 35 |
| |
| writestmt -> WRITELN . '(' exp ')' (40) |
| |
| '(' shift 54 |
| |
| |
| |
| state 36 |
| |
| ifhead -> IF . exp (44) |
| |
| NOT shift 55 |
| TRUE_TOK shift 56 |
| FALSE_TOK shift 57 |
| ID shift 58 |
| CCONST shift 59 |
| ICONST shift 60 |
| '-' shift 61 |
| '(' shift 62 |
| exp shift 63 |
| constant shift 64 |
| |
| |
| |
| state 37 |
| |
| whead -> WHILE . exp (46) |
| |
| NOT shift 55 |
| TRUE_TOK shift 56 |
| FALSE_TOK shift 57 |
| ID shift 58 |
| CCONST shift 59 |
| ICONST shift 60 |
| '-' shift 61 |
| '(' shift 62 |
| exp shift 65 |
| constant shift 64 |
| |
| |
| |
| state 38 |
| |
| procstmt -> ID . optexplist (41) |
| var -> ID . (73) |
| var -> ID . '[' exp ']' (74) |
| |
| '(' shift 66 |
| '[' shift 67 |
| optexplist shift 68 |
| |
| ASG reduce 73 (var) |
| $default reduce 50 (optexplist) |
| |
| |
| |
| state 39 |
| |
| stmtlist -> stmtlist . ';' stmt (32) |
| cmpdstmt -> BEG stmtlist . END (47) |
| |
| END shift 69 |
| ';' shift 70 |
| |
| |
| |
| state 40 |
| |
| stmtlist -> stmt . (33) |
| |
| $default reduce 33 (stmtlist) |
| |
| |
| |
| state 41 |
| |
| stmt -> writestmt . (39) |
| |
| $default reduce 39 (stmt) |
| |
| |
| |
| state 42 |
| |
| stmt -> procstmt . (37) |
| |
| $default reduce 37 (stmt) |
| |
| |
| |
| state 43 |
| |
| stmt -> ifstmt . (34) |
| |
| $default reduce 34 (stmt) |
| |
| |
| |
| state 44 |
| |
| ifstmt -> ifhead . THEN stmt ELSE stmt (42) |
| ifstmt -> ifhead . THEN stmt (43) |
| |
| THEN shift 71 |
| |
| |
| |
| state 45 |
| |
| stmt -> wstmt . (35) |
| |
| $default reduce 35 (stmt) |
| |
| |
| |
| state 46 |
| |
| wstmt -> whead . DO stmt (45) |
| |
| DO shift 72 |
| |
| |
| |
| state 47 |
| |
| stmt -> cmpdstmt . (38) |
| |
| $default reduce 38 (stmt) |
| |
| |
| |
| state 48 |
| |
| stmt -> astmt . (36) |
| |
| $default reduce 36 (stmt) |
| |
| |
| |
| state 49 |
| |
| astmt -> lhs . exp (48) |
| |
| NOT shift 55 |
| TRUE_TOK shift 56 |
| FALSE_TOK shift 57 |
| ID shift 58 |
| CCONST shift 59 |
| ICONST shift 60 |
| '-' shift 61 |
| '(' shift 62 |
| exp shift 73 |
| constant shift 64 |
| |
| |
| |
| state 50 |
| |
| lhs -> var . ASG (49) |
| |
| ASG shift 74 |
| |
| |
| |
| state 51 |
| |
| type -> ARRAY '[' ICONST . RANGE ICONST ']' OF stype (27) |
| |
| RANGE shift 75 |
| |
| |
| |
| state 52 |
| |
| procdcl -> PROC ID @3 . parmlist @4 ';' block ';' (9) |
| |
| '(' shift 76 |
| parmlist shift 77 |
| |
| $default reduce 15 (parmlist) |
| |
| |
| |
| state 53 |
| |
| procdcl -> FUNC ID @5 . parmlist @6 ':' stype ';' @7 block ';' (13) |
| |
| '(' shift 76 |
| parmlist shift 78 |
| |
| $default reduce 15 (parmlist) |
| |
| |
| |
| state 54 |
| |
| writestmt -> WRITELN '(' . exp ')' (40) |
| |
| NOT shift 55 |
| TRUE_TOK shift 56 |
| FALSE_TOK shift 57 |
| ID shift 58 |
| CCONST shift 59 |
| ICONST shift 60 |
| '-' shift 61 |
| '(' shift 62 |
| exp shift 79 |
| constant shift 64 |
| |
| |
| |
| state 55 |
| |
| exp -> NOT . exp (67) |
| |
| NOT shift 55 |
| TRUE_TOK shift 56 |
| FALSE_TOK shift 57 |
| ID shift 58 |
| CCONST shift 59 |
| ICONST shift 60 |
| '-' shift 61 |
| '(' shift 62 |
| exp shift 80 |
| constant shift 64 |
| |
| |
| |
| state 56 |
| |
| constant -> TRUE_TOK . (77) |
| |
| $default reduce 77 (constant) |
| |
| |
| |
| state 57 |
| |
| constant -> FALSE_TOK . (78) |
| |
| $default reduce 78 (constant) |
| |
| |
| |
| state 58 |
| |
| exp -> ID . '(' explist ')' (69) |
| exp -> ID . (70) |
| exp -> ID . '[' exp ']' (71) |
| |
| '(' shift 81 |
| '[' shift 82 |
| |
| $default reduce 70 (exp) |
| |
| |
| |
| state 59 |
| |
| constant -> CCONST . (76) |
| |
| $default reduce 76 (constant) |
| |
| |
| |
| state 60 |
| |
| constant -> ICONST . (75) |
| |
| $default reduce 75 (constant) |
| |
| |
| |
| state 61 |
| |
| exp -> '-' . exp (56) |
| |
| NOT shift 55 |
| TRUE_TOK shift 56 |
| FALSE_TOK shift 57 |
| ID shift 58 |
| CCONST shift 59 |
| ICONST shift 60 |
| '-' shift 61 |
| '(' shift 62 |
| exp shift 83 |
| constant shift 64 |
| |
| |
| |
| state 62 |
| |
| exp -> '(' . exp ')' (68) |
| |
| NOT shift 55 |
| TRUE_TOK shift 56 |
| FALSE_TOK shift 57 |
| ID shift 58 |
| CCONST shift 59 |
| ICONST shift 60 |
| '-' shift 61 |
| '(' shift 62 |
| exp shift 84 |
| constant shift 64 |
| |
| |
| |
| state 63 |
| |
| ifhead -> IF exp . (44) |
| exp -> exp . '+' exp (54) |
| exp -> exp . '-' exp (55) |
| exp -> exp . '*' exp (57) |
| exp -> exp . DIV exp (58) |
| exp -> exp . NEQ exp (59) |
| exp -> exp . '=' exp (60) |
| exp -> exp . GEQ exp (61) |
| exp -> exp . GT exp (62) |
| exp -> exp . LT exp (63) |
| exp -> exp . LEQ exp (64) |
| exp -> exp . AND exp (65) |
| exp -> exp . OR exp (66) |
| |
| '=' shift 85 |
| NEQ shift 86 |
| LT shift 87 |
| LEQ shift 88 |
| GEQ shift 89 |
| GT shift 90 |
| '+' shift 91 |
| '-' shift 92 |
| OR shift 93 |
| '*' shift 94 |
| AND shift 95 |
| DIV shift 96 |
| |
| $default reduce 44 (ifhead) |
| |
| |
| |
| state 64 |
| |
| exp -> constant . (72) |
| |
| $default reduce 72 (exp) |
| |
| |
| |
| state 65 |
| |
| whead -> WHILE exp . (46) |
| exp -> exp . '+' exp (54) |
| exp -> exp . '-' exp (55) |
| exp -> exp . '*' exp (57) |
| exp -> exp . DIV exp (58) |
| exp -> exp . NEQ exp (59) |
| exp -> exp . '=' exp (60) |
| exp -> exp . GEQ exp (61) |
| exp -> exp . GT exp (62) |
| exp -> exp . LT exp (63) |
| exp -> exp . LEQ exp (64) |
| exp -> exp . AND exp (65) |
| exp -> exp . OR exp (66) |
| |
| '=' shift 85 |
| NEQ shift 86 |
| LT shift 87 |
| LEQ shift 88 |
| GEQ shift 89 |
| GT shift 90 |
| '+' shift 91 |
| '-' shift 92 |
| OR shift 93 |
| '*' shift 94 |
| AND shift 95 |
| DIV shift 96 |
| |
| $default reduce 46 (whead) |
| |
| |
| |
| state 66 |
| |
| optexplist -> '(' . explist ')' (51) |
| |
| NOT shift 55 |
| TRUE_TOK shift 56 |
| FALSE_TOK shift 57 |
| ID shift 58 |
| CCONST shift 59 |
| ICONST shift 60 |
| '-' shift 61 |
| '(' shift 62 |
| explist shift 97 |
| exp shift 98 |
| constant shift 64 |
| |
| |
| |
| state 67 |
| |
| var -> ID '[' . exp ']' (74) |
| |
| NOT shift 55 |
| TRUE_TOK shift 56 |
| FALSE_TOK shift 57 |
| ID shift 58 |
| CCONST shift 59 |
| ICONST shift 60 |
| '-' shift 61 |
| '(' shift 62 |
| exp shift 99 |
| constant shift 64 |
| |
| |
| |
| state 68 |
| |
| procstmt -> ID optexplist . (41) |
| |
| $default reduce 41 (procstmt) |
| |
| |
| |
| state 69 |
| |
| cmpdstmt -> BEG stmtlist END . (47) |
| |
| $default reduce 47 (cmpdstmt) |
| |
| |
| |
| state 70 |
| |
| stmtlist -> stmtlist ';' . stmt (32) |
| |
| WRITELN shift 35 |
| IF shift 36 |
| WHILE shift 37 |
| BEG shift 29 |
| ID shift 38 |
| stmt shift 100 |
| writestmt shift 41 |
| procstmt shift 42 |
| ifstmt shift 43 |
| ifhead shift 44 |
| wstmt shift 45 |
| whead shift 46 |
| cmpdstmt shift 47 |
| astmt shift 48 |
| lhs shift 49 |
| var shift 50 |
| |
| |
| |
| state 71 |
| |
| ifstmt -> ifhead THEN . stmt ELSE stmt (42) |
| ifstmt -> ifhead THEN . stmt (43) |
| |
| WRITELN shift 35 |
| IF shift 36 |
| WHILE shift 37 |
| BEG shift 29 |
| ID shift 38 |
| stmt shift 101 |
| writestmt shift 41 |
| procstmt shift 42 |
| ifstmt shift 43 |
| ifhead shift 44 |
| wstmt shift 45 |
| whead shift 46 |
| cmpdstmt shift 47 |
| astmt shift 48 |
| lhs shift 49 |
| var shift 50 |
| |
| |
| |
| state 72 |
| |
| wstmt -> whead DO . stmt (45) |
| |
| WRITELN shift 35 |
| IF shift 36 |
| WHILE shift 37 |
| BEG shift 29 |
| ID shift 38 |
| stmt shift 102 |
| writestmt shift 41 |
| procstmt shift 42 |
| ifstmt shift 43 |
| ifhead shift 44 |
| wstmt shift 45 |
| whead shift 46 |
| cmpdstmt shift 47 |
| astmt shift 48 |
| lhs shift 49 |
| var shift 50 |
| |
| |
| |
| state 73 |
| |
| astmt -> lhs exp . (48) |
| exp -> exp . '+' exp (54) |
| exp -> exp . '-' exp (55) |
| exp -> exp . '*' exp (57) |
| exp -> exp . DIV exp (58) |
| exp -> exp . NEQ exp (59) |
| exp -> exp . '=' exp (60) |
| exp -> exp . GEQ exp (61) |
| exp -> exp . GT exp (62) |
| exp -> exp . LT exp (63) |
| exp -> exp . LEQ exp (64) |
| exp -> exp . AND exp (65) |
| exp -> exp . OR exp (66) |
| |
| '=' shift 85 |
| NEQ shift 86 |
| LT shift 87 |
| LEQ shift 88 |
| GEQ shift 89 |
| GT shift 90 |
| '+' shift 91 |
| '-' shift 92 |
| OR shift 93 |
| '*' shift 94 |
| AND shift 95 |
| DIV shift 96 |
| |
| $default reduce 48 (astmt) |
| |
| |
| |
| state 74 |
| |
| lhs -> var ASG . (49) |
| |
| $default reduce 49 (lhs) |
| |
| |
| |
| state 75 |
| |
| type -> ARRAY '[' ICONST RANGE . ICONST ']' OF stype (27) |
| |
| ICONST shift 103 |
| |
| |
| |
| state 76 |
| |
| parmlist -> '(' . parms ')' (14) |
| |
| VAR shift 104 |
| ID shift 8 |
| parms shift 105 |
| parm shift 106 |
| vardcl shift 107 |
| idlist shift 11 |
| |
| |
| |
| state 77 |
| |
| procdcl -> PROC ID @3 parmlist . @4 ';' block ';' (9) |
| |
| @4 shift 108 |
| |
| $default reduce 8 (@4) |
| |
| |
| |
| state 78 |
| |
| procdcl -> FUNC ID @5 parmlist . @6 ':' stype ';' @7 block ';' (13) |
| |
| @6 shift 109 |
| |
| $default reduce 11 (@6) |
| |
| |
| |
| state 79 |
| |
| writestmt -> WRITELN '(' exp . ')' (40) |
| exp -> exp . '+' exp (54) |
| exp -> exp . '-' exp (55) |
| exp -> exp . '*' exp (57) |
| exp -> exp . DIV exp (58) |
| exp -> exp . NEQ exp (59) |
| exp -> exp . '=' exp (60) |
| exp -> exp . GEQ exp (61) |
| exp -> exp . GT exp (62) |
| exp -> exp . LT exp (63) |
| exp -> exp . LEQ exp (64) |
| exp -> exp . AND exp (65) |
| exp -> exp . OR exp (66) |
| |
| '=' shift 85 |
| NEQ shift 86 |
| LT shift 87 |
| LEQ shift 88 |
| GEQ shift 89 |
| GT shift 90 |
| '+' shift 91 |
| '-' shift 92 |
| OR shift 93 |
| '*' shift 94 |
| AND shift 95 |
| DIV shift 96 |
| ')' shift 110 |
| |
| |
| |
| state 80 |
| |
| exp -> exp . '+' exp (54) |
| exp -> exp . '-' exp (55) |
| exp -> exp . '*' exp (57) |
| exp -> exp . DIV exp (58) |
| exp -> exp . NEQ exp (59) |
| exp -> exp . '=' exp (60) |
| exp -> exp . GEQ exp (61) |
| exp -> exp . GT exp (62) |
| exp -> exp . LT exp (63) |
| exp -> exp . LEQ exp (64) |
| exp -> exp . AND exp (65) |
| exp -> exp . OR exp (66) |
| exp -> NOT exp . (67) |
| |
| |
| $default reduce 67 (exp) |
| |
| |
| |
| state 81 |
| |
| exp -> ID '(' . explist ')' (69) |
| |
| NOT shift 55 |
| TRUE_TOK shift 56 |
| FALSE_TOK shift 57 |
| ID shift 58 |
| CCONST shift 59 |
| ICONST shift 60 |
| '-' shift 61 |
| '(' shift 62 |
| explist shift 111 |
| exp shift 98 |
| constant shift 64 |
| |
| |
| |
| state 82 |
| |
| exp -> ID '[' . exp ']' (71) |
| |
| NOT shift 55 |
| TRUE_TOK shift 56 |
| FALSE_TOK shift 57 |
| ID shift 58 |
| CCONST shift 59 |
| ICONST shift 60 |
| '-' shift 61 |
| '(' shift 62 |
| exp shift 112 |
| constant shift 64 |
| |
| |
| |
| state 83 |
| |
| exp -> exp . '+' exp (54) |
| exp -> exp . '-' exp (55) |
| exp -> '-' exp . (56) |
| exp -> exp . '*' exp (57) |
| exp -> exp . DIV exp (58) |
| exp -> exp . NEQ exp (59) |
| exp -> exp . '=' exp (60) |
| exp -> exp . GEQ exp (61) |
| exp -> exp . GT exp (62) |
| exp -> exp . LT exp (63) |
| exp -> exp . LEQ exp (64) |
| exp -> exp . AND exp (65) |
| exp -> exp . OR exp (66) |
| |
| |
| $default reduce 56 (exp) |
| |
| |
| |
| state 84 |
| |
| exp -> exp . '+' exp (54) |
| exp -> exp . '-' exp (55) |
| exp -> exp . '*' exp (57) |
| exp -> exp . DIV exp (58) |
| exp -> exp . NEQ exp (59) |
| exp -> exp . '=' exp (60) |
| exp -> exp . GEQ exp (61) |
| exp -> exp . GT exp (62) |
| exp -> exp . LT exp (63) |
| exp -> exp . LEQ exp (64) |
| exp -> exp . AND exp (65) |
| exp -> exp . OR exp (66) |
| exp -> '(' exp . ')' (68) |
| |
| '=' shift 85 |
| NEQ shift 86 |
| LT shift 87 |
| LEQ shift 88 |
| GEQ shift 89 |
| GT shift 90 |
| '+' shift 91 |
| '-' shift 92 |
| OR shift 93 |
| '*' shift 94 |
| AND shift 95 |
| DIV shift 96 |
| ')' shift 113 |
| |
| |
| |
| state 85 |
| |
| exp -> exp '=' . exp (60) |
| |
| NOT shift 55 |
| TRUE_TOK shift 56 |
| FALSE_TOK shift 57 |
| ID shift 58 |
| CCONST shift 59 |
| ICONST shift 60 |
| '-' shift 61 |
| '(' shift 62 |
| exp shift 114 |
| constant shift 64 |
| |
| |
| |
| state 86 |
| |
| exp -> exp NEQ . exp (59) |
| |
| NOT shift 55 |
| TRUE_TOK shift 56 |
| FALSE_TOK shift 57 |
| ID shift 58 |
| CCONST shift 59 |
| ICONST shift 60 |
| '-' shift 61 |
| '(' shift 62 |
| exp shift 115 |
| constant shift 64 |
| |
| |
| |
| state 87 |
| |
| exp -> exp LT . exp (63) |
| |
| NOT shift 55 |
| TRUE_TOK shift 56 |
| FALSE_TOK shift 57 |
| ID shift 58 |
| CCONST shift 59 |
| ICONST shift 60 |
| '-' shift 61 |
| '(' shift 62 |
| exp shift 116 |
| constant shift 64 |
| |
| |
| |
| state 88 |
| |
| exp -> exp LEQ . exp (64) |
| |
| NOT shift 55 |
| TRUE_TOK shift 56 |
| FALSE_TOK shift 57 |
| ID shift 58 |
| CCONST shift 59 |
| ICONST shift 60 |
| '-' shift 61 |
| '(' shift 62 |
| exp shift 117 |
| constant shift 64 |
| |
| |
| |
| state 89 |
| |
| exp -> exp GEQ . exp (61) |
| |
| NOT shift 55 |
| TRUE_TOK shift 56 |
| FALSE_TOK shift 57 |
| ID shift 58 |
| CCONST shift 59 |
| ICONST shift 60 |
| '-' shift 61 |
| '(' shift 62 |
| exp shift 118 |
| constant shift 64 |
| |
| |
| |
| state 90 |
| |
| exp -> exp GT . exp (62) |
| |
| NOT shift 55 |
| TRUE_TOK shift 56 |
| FALSE_TOK shift 57 |
| ID shift 58 |
| CCONST shift 59 |
| ICONST shift 60 |
| '-' shift 61 |
| '(' shift 62 |
| exp shift 119 |
| constant shift 64 |
| |
| |
| |
| state 91 |
| |
| exp -> exp '+' . exp (54) |
| |
| NOT shift 55 |
| TRUE_TOK shift 56 |
| FALSE_TOK shift 57 |
| ID shift 58 |
| CCONST shift 59 |
| ICONST shift 60 |
| '-' shift 61 |
| '(' shift 62 |
| exp shift 120 |
| constant shift 64 |
| |
| |
| |
| state 92 |
| |
| exp -> exp '-' . exp (55) |
| |
| NOT shift 55 |
| TRUE_TOK shift 56 |
| FALSE_TOK shift 57 |
| ID shift 58 |
| CCONST shift 59 |
| ICONST shift 60 |
| '-' shift 61 |
| '(' shift 62 |
| exp shift 121 |
| constant shift 64 |
| |
| |
| |
| state 93 |
| |
| exp -> exp OR . exp (66) |
| |
| NOT shift 55 |
| TRUE_TOK shift 56 |
| FALSE_TOK shift 57 |
| ID shift 58 |
| CCONST shift 59 |
| ICONST shift 60 |
| '-' shift 61 |
| '(' shift 62 |
| exp shift 122 |
| constant shift 64 |
| |
| |
| |
| state 94 |
| |
| exp -> exp '*' . exp (57) |
| |
| NOT shift 55 |
| TRUE_TOK shift 56 |
| FALSE_TOK shift 57 |
| ID shift 58 |
| CCONST shift 59 |
| ICONST shift 60 |
| '-' shift 61 |
| '(' shift 62 |
| exp shift 123 |
| constant shift 64 |
| |
| |
| |
| state 95 |
| |
| exp -> exp AND . exp (65) |
| |
| NOT shift 55 |
| TRUE_TOK shift 56 |
| FALSE_TOK shift 57 |
| ID shift 58 |
| CCONST shift 59 |
| ICONST shift 60 |
| '-' shift 61 |
| '(' shift 62 |
| exp shift 124 |
| constant shift 64 |
| |
| |
| |
| state 96 |
| |
| exp -> exp DIV . exp (58) |
| |
| NOT shift 55 |
| TRUE_TOK shift 56 |
| FALSE_TOK shift 57 |
| ID shift 58 |
| CCONST shift 59 |
| ICONST shift 60 |
| '-' shift 61 |
| '(' shift 62 |
| exp shift 125 |
| constant shift 64 |
| |
| |
| |
| state 97 |
| |
| optexplist -> '(' explist . ')' (51) |
| explist -> explist . ',' exp (52) |
| |
| ')' shift 126 |
| ',' shift 127 |
| |
| |
| |
| state 98 |
| |
| explist -> exp . (53) |
| exp -> exp . '+' exp (54) |
| exp -> exp . '-' exp (55) |
| exp -> exp . '*' exp (57) |
| exp -> exp . DIV exp (58) |
| exp -> exp . NEQ exp (59) |
| exp -> exp . '=' exp (60) |
| exp -> exp . GEQ exp (61) |
| exp -> exp . GT exp (62) |
| exp -> exp . LT exp (63) |
| exp -> exp . LEQ exp (64) |
| exp -> exp . AND exp (65) |
| exp -> exp . OR exp (66) |
| |
| '=' shift 85 |
| NEQ shift 86 |
| LT shift 87 |
| LEQ shift 88 |
| GEQ shift 89 |
| GT shift 90 |
| '+' shift 91 |
| '-' shift 92 |
| OR shift 93 |
| '*' shift 94 |
| AND shift 95 |
| DIV shift 96 |
| |
| $default reduce 53 (explist) |
| |
| |
| |
| state 99 |
| |
| exp -> exp . '+' exp (54) |
| exp -> exp . '-' exp (55) |
| exp -> exp . '*' exp (57) |
| exp -> exp . DIV exp (58) |
| exp -> exp . NEQ exp (59) |
| exp -> exp . '=' exp (60) |
| exp -> exp . GEQ exp (61) |
| exp -> exp . GT exp (62) |
| exp -> exp . LT exp (63) |
| exp -> exp . LEQ exp (64) |
| exp -> exp . AND exp (65) |
| exp -> exp . OR exp (66) |
| var -> ID '[' exp . ']' (74) |
| |
| '=' shift 85 |
| NEQ shift 86 |
| LT shift 87 |
| LEQ shift 88 |
| GEQ shift 89 |
| GT shift 90 |
| '+' shift 91 |
| '-' shift 92 |
| OR shift 93 |
| '*' shift 94 |
| AND shift 95 |
| DIV shift 96 |
| ']' shift 128 |
| |
| |
| |
| state 100 |
| |
| stmtlist -> stmtlist ';' stmt . (32) |
| |
| $default reduce 32 (stmtlist) |
| |
| |
| |
| state 101 |
| |
| ifstmt -> ifhead THEN stmt . ELSE stmt (42) |
| ifstmt -> ifhead THEN stmt . (43) |
| |
| ELSE shift 129 |
| |
| ELSE [reduce 43 (ifstmt)] |
| $default reduce 43 (ifstmt) |
| |
| |
| |
| state 102 |
| |
| wstmt -> whead DO stmt . (45) |
| |
| $default reduce 45 (wstmt) |
| |
| |
| |
| state 103 |
| |
| type -> ARRAY '[' ICONST RANGE ICONST . ']' OF stype (27) |
| |
| ']' shift 130 |
| |
| |
| |
| state 104 |
| |
| parm -> VAR . vardcl (18) |
| |
| ID shift 8 |
| vardcl shift 131 |
| idlist shift 11 |
| |
| |
| |
| state 105 |
| |
| parmlist -> '(' parms . ')' (14) |
| parms -> parms . ';' parm (16) |
| |
| ';' shift 132 |
| ')' shift 133 |
| |
| |
| |
| state 106 |
| |
| parms -> parm . (17) |
| |
| $default reduce 17 (parms) |
| |
| |
| |
| state 107 |
| |
| parm -> vardcl . (19) |
| |
| $default reduce 19 (parm) |
| |
| |
| |
| state 108 |
| |
| procdcl -> PROC ID @3 parmlist @4 . ';' block ';' (9) |
| |
| ';' shift 134 |
| |
| |
| |
| state 109 |
| |
| procdcl -> FUNC ID @5 parmlist @6 . ':' stype ';' @7 block ';' (13) |
| |
| ':' shift 135 |
| |
| |
| |
| state 110 |
| |
| writestmt -> WRITELN '(' exp ')' . (40) |
| |
| $default reduce 40 (writestmt) |
| |
| |
| |
| state 111 |
| |
| explist -> explist . ',' exp (52) |
| exp -> ID '(' explist . ')' (69) |
| |
| ')' shift 136 |
| ',' shift 127 |
| |
| |
| |
| state 112 |
| |
| exp -> exp . '+' exp (54) |
| exp -> exp . '-' exp (55) |
| exp -> exp . '*' exp (57) |
| exp -> exp . DIV exp (58) |
| exp -> exp . NEQ exp (59) |
| exp -> exp . '=' exp (60) |
| exp -> exp . GEQ exp (61) |
| exp -> exp . GT exp (62) |
| exp -> exp . LT exp (63) |
| exp -> exp . LEQ exp (64) |
| exp -> exp . AND exp (65) |
| exp -> exp . OR exp (66) |
| exp -> ID '[' exp . ']' (71) |
| |
| '=' shift 85 |
| NEQ shift 86 |
| LT shift 87 |
| LEQ shift 88 |
| GEQ shift 89 |
| GT shift 90 |
| '+' shift 91 |
| '-' shift 92 |
| OR shift 93 |
| '*' shift 94 |
| AND shift 95 |
| DIV shift 96 |
| ']' shift 137 |
| |
| |
| |
| state 113 |
| |
| exp -> '(' exp ')' . (68) |
| |
| $default reduce 68 (exp) |
| |
| |
| |
| state 114 |
| |
| exp -> exp . '+' exp (54) |
| exp -> exp . '-' exp (55) |
| exp -> exp . '*' exp (57) |
| exp -> exp . DIV exp (58) |
| exp -> exp . NEQ exp (59) |
| exp -> exp . '=' exp (60) |
| exp -> exp '=' exp . (60) |
| exp -> exp . GEQ exp (61) |
| exp -> exp . GT exp (62) |
| exp -> exp . LT exp (63) |
| exp -> exp . LEQ exp (64) |
| exp -> exp . AND exp (65) |
| exp -> exp . OR exp (66) |
| |
| '+' shift 91 |
| '-' shift 92 |
| OR shift 93 |
| '*' shift 94 |
| AND shift 95 |
| DIV shift 96 |
| |
| '=' error (nonassociative) |
| NEQ error (nonassociative) |
| LT error (nonassociative) |
| LEQ error (nonassociative) |
| GEQ error (nonassociative) |
| GT error (nonassociative) |
| |
| $default reduce 60 (exp) |
| |
| |
| |
| state 115 |
| |
| exp -> exp . '+' exp (54) |
| exp -> exp . '-' exp (55) |
| exp -> exp . '*' exp (57) |
| exp -> exp . DIV exp (58) |
| exp -> exp . NEQ exp (59) |
| exp -> exp NEQ exp . (59) |
| exp -> exp . '=' exp (60) |
| exp -> exp . GEQ exp (61) |
| exp -> exp . GT exp (62) |
| exp -> exp . LT exp (63) |
| exp -> exp . LEQ exp (64) |
| exp -> exp . AND exp (65) |
| exp -> exp . OR exp (66) |
| |
| '+' shift 91 |
| '-' shift 92 |
| OR shift 93 |
| '*' shift 94 |
| AND shift 95 |
| DIV shift 96 |
| |
| '=' error (nonassociative) |
| NEQ error (nonassociative) |
| LT error (nonassociative) |
| LEQ error (nonassociative) |
| GEQ error (nonassociative) |
| GT error (nonassociative) |
| |
| $default reduce 59 (exp) |
| |
| |
| |
| state 116 |
| |
| exp -> exp . '+' exp (54) |
| exp -> exp . '-' exp (55) |
| exp -> exp . '*' exp (57) |
| exp -> exp . DIV exp (58) |
| exp -> exp . NEQ exp (59) |
| exp -> exp . '=' exp (60) |
| exp -> exp . GEQ exp (61) |
| exp -> exp . GT exp (62) |
| exp -> exp . LT exp (63) |
| exp -> exp LT exp . (63) |
| exp -> exp . LEQ exp (64) |
| exp -> exp . AND exp (65) |
| exp -> exp . OR exp (66) |
| |
| '+' shift 91 |
| '-' shift 92 |
| OR shift 93 |
| '*' shift 94 |
| AND shift 95 |
| DIV shift 96 |
| |
| '=' error (nonassociative) |
| NEQ error (nonassociative) |
| LT error (nonassociative) |
| LEQ error (nonassociative) |
| GEQ error (nonassociative) |
| GT error (nonassociative) |
| |
| $default reduce 63 (exp) |
| |
| |
| |
| state 117 |
| |
| exp -> exp . '+' exp (54) |
| exp -> exp . '-' exp (55) |
| exp -> exp . '*' exp (57) |
| exp -> exp . DIV exp (58) |
| exp -> exp . NEQ exp (59) |
| exp -> exp . '=' exp (60) |
| exp -> exp . GEQ exp (61) |
| exp -> exp . GT exp (62) |
| exp -> exp . LT exp (63) |
| exp -> exp . LEQ exp (64) |
| exp -> exp LEQ exp . (64) |
| exp -> exp . AND exp (65) |
| exp -> exp . OR exp (66) |
| |
| '+' shift 91 |
| '-' shift 92 |
| OR shift 93 |
| '*' shift 94 |
| AND shift 95 |
| DIV shift 96 |
| |
| '=' error (nonassociative) |
| NEQ error (nonassociative) |
| LT error (nonassociative) |
| LEQ error (nonassociative) |
| GEQ error (nonassociative) |
| GT error (nonassociative) |
| |
| $default reduce 64 (exp) |
| |
| |
| |
| state 118 |
| |
| exp -> exp . '+' exp (54) |
| exp -> exp . '-' exp (55) |
| exp -> exp . '*' exp (57) |
| exp -> exp . DIV exp (58) |
| exp -> exp . NEQ exp (59) |
| exp -> exp . '=' exp (60) |
| exp -> exp . GEQ exp (61) |
| exp -> exp GEQ exp . (61) |
| exp -> exp . GT exp (62) |
| exp -> exp . LT exp (63) |
| exp -> exp . LEQ exp (64) |
| exp -> exp . AND exp (65) |
| exp -> exp . OR exp (66) |
| |
| '+' shift 91 |
| '-' shift 92 |
| OR shift 93 |
| '*' shift 94 |
| AND shift 95 |
| DIV shift 96 |
| |
| '=' error (nonassociative) |
| NEQ error (nonassociative) |
| LT error (nonassociative) |
| LEQ error (nonassociative) |
| GEQ error (nonassociative) |
| GT error (nonassociative) |
| |
| $default reduce 61 (exp) |
| |
| |
| |
| state 119 |
| |
| exp -> exp . '+' exp (54) |
| exp -> exp . '-' exp (55) |
| exp -> exp . '*' exp (57) |
| exp -> exp . DIV exp (58) |
| exp -> exp . NEQ exp (59) |
| exp -> exp . '=' exp (60) |
| exp -> exp . GEQ exp (61) |
| exp -> exp . GT exp (62) |
| exp -> exp GT exp . (62) |
| exp -> exp . LT exp (63) |
| exp -> exp . LEQ exp (64) |
| exp -> exp . AND exp (65) |
| exp -> exp . OR exp (66) |
| |
| '+' shift 91 |
| '-' shift 92 |
| OR shift 93 |
| '*' shift 94 |
| AND shift 95 |
| DIV shift 96 |
| |
| '=' error (nonassociative) |
| NEQ error (nonassociative) |
| LT error (nonassociative) |
| LEQ error (nonassociative) |
| GEQ error (nonassociative) |
| GT error (nonassociative) |
| |
| $default reduce 62 (exp) |
| |
| |
| |
| state 120 |
| |
| exp -> exp . '+' exp (54) |
| exp -> exp '+' exp . (54) |
| exp -> exp . '-' exp (55) |
| exp -> exp . '*' exp (57) |
| exp -> exp . DIV exp (58) |
| exp -> exp . NEQ exp (59) |
| exp -> exp . '=' exp (60) |
| exp -> exp . GEQ exp (61) |
| exp -> exp . GT exp (62) |
| exp -> exp . LT exp (63) |
| exp -> exp . LEQ exp (64) |
| exp -> exp . AND exp (65) |
| exp -> exp . OR exp (66) |
| |
| '*' shift 94 |
| AND shift 95 |
| DIV shift 96 |
| |
| $default reduce 54 (exp) |
| |
| |
| |
| state 121 |
| |
| exp -> exp . '+' exp (54) |
| exp -> exp . '-' exp (55) |
| exp -> exp '-' exp . (55) |
| exp -> exp . '*' exp (57) |
| exp -> exp . DIV exp (58) |
| exp -> exp . NEQ exp (59) |
| exp -> exp . '=' exp (60) |
| exp -> exp . GEQ exp (61) |
| exp -> exp . GT exp (62) |
| exp -> exp . LT exp (63) |
| exp -> exp . LEQ exp (64) |
| exp -> exp . AND exp (65) |
| exp -> exp . OR exp (66) |
| |
| '*' shift 94 |
| AND shift 95 |
| DIV shift 96 |
| |
| $default reduce 55 (exp) |
| |
| |
| |
| state 122 |
| |
| exp -> exp . '+' exp (54) |
| exp -> exp . '-' exp (55) |
| exp -> exp . '*' exp (57) |
| exp -> exp . DIV exp (58) |
| exp -> exp . NEQ exp (59) |
| exp -> exp . '=' exp (60) |
| exp -> exp . GEQ exp (61) |
| exp -> exp . GT exp (62) |
| exp -> exp . LT exp (63) |
| exp -> exp . LEQ exp (64) |
| exp -> exp . AND exp (65) |
| exp -> exp . OR exp (66) |
| exp -> exp OR exp . (66) |
| |
| '*' shift 94 |
| AND shift 95 |
| DIV shift 96 |
| |
| $default reduce 66 (exp) |
| |
| |
| |
| state 123 |
| |
| exp -> exp . '+' exp (54) |
| exp -> exp . '-' exp (55) |
| exp -> exp . '*' exp (57) |
| exp -> exp '*' exp . (57) |
| exp -> exp . DIV exp (58) |
| exp -> exp . NEQ exp (59) |
| exp -> exp . '=' exp (60) |
| exp -> exp . GEQ exp (61) |
| exp -> exp . GT exp (62) |
| exp -> exp . LT exp (63) |
| exp -> exp . LEQ exp (64) |
| exp -> exp . AND exp (65) |
| exp -> exp . OR exp (66) |
| |
| |
| $default reduce 57 (exp) |
| |
| |
| |
| state 124 |
| |
| exp -> exp . '+' exp (54) |
| exp -> exp . '-' exp (55) |
| exp -> exp . '*' exp (57) |
| exp -> exp . DIV exp (58) |
| exp -> exp . NEQ exp (59) |
| exp -> exp . '=' exp (60) |
| exp -> exp . GEQ exp (61) |
| exp -> exp . GT exp (62) |
| exp -> exp . LT exp (63) |
| exp -> exp . LEQ exp (64) |
| exp -> exp . AND exp (65) |
| exp -> exp AND exp . (65) |
| exp -> exp . OR exp (66) |
| |
| |
| $default reduce 65 (exp) |
| |
| |
| |
| state 125 |
| |
| exp -> exp . '+' exp (54) |
| exp -> exp . '-' exp (55) |
| exp -> exp . '*' exp (57) |
| exp -> exp . DIV exp (58) |
| exp -> exp DIV exp . (58) |
| exp -> exp . NEQ exp (59) |
| exp -> exp . '=' exp (60) |
| exp -> exp . GEQ exp (61) |
| exp -> exp . GT exp (62) |
| exp -> exp . LT exp (63) |
| exp -> exp . LEQ exp (64) |
| exp -> exp . AND exp (65) |
| exp -> exp . OR exp (66) |
| |
| |
| $default reduce 58 (exp) |
| |
| |
| |
| state 126 |
| |
| optexplist -> '(' explist ')' . (51) |
| |
| $default reduce 51 (optexplist) |
| |
| |
| |
| state 127 |
| |
| explist -> explist ',' . exp (52) |
| |
| NOT shift 55 |
| TRUE_TOK shift 56 |
| FALSE_TOK shift 57 |
| ID shift 58 |
| CCONST shift 59 |
| ICONST shift 60 |
| '-' shift 61 |
| '(' shift 62 |
| exp shift 138 |
| constant shift 64 |
| |
| |
| |
| state 128 |
| |
| var -> ID '[' exp ']' . (74) |
| |
| $default reduce 74 (var) |
| |
| |
| |
| state 129 |
| |
| ifstmt -> ifhead THEN stmt ELSE . stmt (42) |
| |
| WRITELN shift 35 |
| IF shift 36 |
| WHILE shift 37 |
| BEG shift 29 |
| ID shift 38 |
| stmt shift 139 |
| writestmt shift 41 |
| procstmt shift 42 |
| ifstmt shift 43 |
| ifhead shift 44 |
| wstmt shift 45 |
| whead shift 46 |
| cmpdstmt shift 47 |
| astmt shift 48 |
| lhs shift 49 |
| var shift 50 |
| |
| |
| |
| state 130 |
| |
| type -> ARRAY '[' ICONST RANGE ICONST ']' . OF stype (27) |
| |
| OF shift 140 |
| |
| |
| |
| state 131 |
| |
| parm -> VAR vardcl . (18) |
| |
| $default reduce 18 (parm) |
| |
| |
| |
| state 132 |
| |
| parms -> parms ';' . parm (16) |
| |
| VAR shift 104 |
| ID shift 8 |
| parm shift 141 |
| vardcl shift 107 |
| idlist shift 11 |
| |
| |
| |
| state 133 |
| |
| parmlist -> '(' parms ')' . (14) |
| |
| $default reduce 14 (parmlist) |
| |
| |
| |
| state 134 |
| |
| procdcl -> PROC ID @3 parmlist @4 ';' . block ';' (9) |
| |
| VAR shift 5 |
| block shift 142 |
| variables shift 7 |
| |
| $default reduce 20 (variables) |
| |
| |
| |
| state 135 |
| |
| procdcl -> FUNC ID @5 parmlist @6 ':' . stype ';' @7 block ';' (13) |
| |
| INT shift 21 |
| CHAR shift 22 |
| BOOL shift 23 |
| stype shift 143 |
| |
| |
| |
| state 136 |
| |
| exp -> ID '(' explist ')' . (69) |
| |
| $default reduce 69 (exp) |
| |
| |
| |
| state 137 |
| |
| exp -> ID '[' exp ']' . (71) |
| |
| $default reduce 71 (exp) |
| |
| |
| |
| state 138 |
| |
| explist -> explist ',' exp . (52) |
| exp -> exp . '+' exp (54) |
| exp -> exp . '-' exp (55) |
| exp -> exp . '*' exp (57) |
| exp -> exp . DIV exp (58) |
| exp -> exp . NEQ exp (59) |
| exp -> exp . '=' exp (60) |
| exp -> exp . GEQ exp (61) |
| exp -> exp . GT exp (62) |
| exp -> exp . LT exp (63) |
| exp -> exp . LEQ exp (64) |
| exp -> exp . AND exp (65) |
| exp -> exp . OR exp (66) |
| |
| '=' shift 85 |
| NEQ shift 86 |
| LT shift 87 |
| LEQ shift 88 |
| GEQ shift 89 |
| GT shift 90 |
| '+' shift 91 |
| '-' shift 92 |
| OR shift 93 |
| '*' shift 94 |
| AND shift 95 |
| DIV shift 96 |
| |
| $default reduce 52 (explist) |
| |
| |
| |
| state 139 |
| |
| ifstmt -> ifhead THEN stmt ELSE stmt . (42) |
| |
| $default reduce 42 (ifstmt) |
| |
| |
| |
| state 140 |
| |
| type -> ARRAY '[' ICONST RANGE ICONST ']' OF . stype (27) |
| |
| INT shift 21 |
| CHAR shift 22 |
| BOOL shift 23 |
| stype shift 144 |
| |
| |
| |
| state 141 |
| |
| parms -> parms ';' parm . (16) |
| |
| $default reduce 16 (parms) |
| |
| |
| |
| state 142 |
| |
| procdcl -> PROC ID @3 parmlist @4 ';' block . ';' (9) |
| |
| ';' shift 145 |
| |
| |
| |
| state 143 |
| |
| procdcl -> FUNC ID @5 parmlist @6 ':' stype . ';' @7 block ';' (13) |
| |
| ';' shift 146 |
| |
| |
| |
| state 144 |
| |
| type -> ARRAY '[' ICONST RANGE ICONST ']' OF stype . (27) |
| |
| $default reduce 27 (type) |
| |
| |
| |
| state 145 |
| |
| procdcl -> PROC ID @3 parmlist @4 ';' block ';' . (9) |
| |
| $default reduce 9 (procdcl) |
| |
| |
| |
| state 146 |
| |
| procdcl -> FUNC ID @5 parmlist @6 ':' stype ';' . @7 block ';' (13) |
| |
| @7 shift 147 |
| |
| $default reduce 12 (@7) |
| |
| |
| |
| state 147 |
| |
| procdcl -> FUNC ID @5 parmlist @6 ':' stype ';' @7 . block ';' (13) |
| |
| VAR shift 5 |
| block shift 148 |
| variables shift 7 |
| |
| $default reduce 20 (variables) |
| |
| |
| |
| state 148 |
| |
| procdcl -> FUNC ID @5 parmlist @6 ':' stype ';' @7 block . ';' (13) |
| |
| ';' shift 149 |
| |
| |
| |
| state 149 |
| |
| procdcl -> FUNC ID @5 parmlist @6 ':' stype ';' @7 block ';' . (13) |
| |
| $default reduce 13 (procdcl) |
| |
| |
| |
| state 150 |
| |
| $ shift 151 |
| |
| |
| |
| state 151 |
| |
| $ shift 152 |
| |
| |
| |
| state 152 |
| |
| NO ACTIONS |
| #include <stdio.h> |
| |
| #ifndef __STDC__ |
| #define const |
| #endif |
| |
| |
| |
| #define YYFINAL 152 |
| #define YYFLAG -32768 |
| #define YYNTBASE 48 |
| |
| #define YYTRANSLATE(x) ((unsigned)(x) <= 291 ? yytranslate[x] : 84) |
| |
| static const char yytranslate[] = { 0, |
| 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
| 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
| 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
| 2, 2, 2, 2, 2, 2, 2, 2, 2, 43, |
| 44, 38, 35, 45, 36, 2, 2, 2, 2, 2, |
| 2, 2, 2, 2, 2, 2, 2, 42, 41, 2, |
| 29, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
| 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
| 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
| 46, 2, 47, 2, 2, 2, 2, 2, 2, 2, |
| 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
| 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
| 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
| 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
| 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
| 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
| 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
| 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
| 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
| 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
| 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
| 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
| 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
| 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
| 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
| 2, 2, 2, 2, 2, 1, 2, 3, 4, 5, |
| 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, |
| 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, |
| 26, 27, 28, 30, 31, 32, 33, 34, 37, 39, |
| 40 |
| }; |
| |
| static const short yyrline[] = { 0, |
| 39, 41, 44, 65, 67, 67, 69, 83, 89, 101, |
| 112, 118, 121, 135, 137, 141, 147, 150, 163, 177, |
| 180, 183, 189, 191, 208, 219, 230, 247, 255, 256, |
| 257, 259, 260, 262, 263, 264, 265, 266, 267, 269, |
| 279, 298, 299, 301, 307, 309, 315, 317, 323, 326, |
| 329, 332, 341, 350, 361, 372, 382, 393, 404, 416, |
| 427, 438, 449, 460, 471, 482, 493, 503, 512, 549, |
| 600, 627, 629, 688, 726, 731, 740, 745 |
| }; |
| |
| static const char * const yytname[] = { 0, |
| "error","$illegal.","PROG","PERIOD","PROC","FUNC","VAR","ARRAY","RANGE","OF", |
| "INT","CHAR","BOOL","WRITELN","THEN","ELSE","IF","DO","WHILE","BEG", |
| "END","ASG","NOT","TRUE_TOK","FALSE_TOK","ID","CCONST","ICONST","'='","NEQ", |
| "LT","LEQ","GEQ","GT","'+'","'-'","OR","'*'","AND","DIV", |
| "';'","':'","'('","')'","','","'['","']'","program" |
| }; |
| |
| static const short yyr1[] = { 0, |
| 49, 48, 51, 50, 52, 52, 54, 55, 53, 56, |
| 57, 58, 53, 59, 59, 60, 60, 61, 61, 62, |
| 62, 63, 63, 64, 65, 65, 66, 66, 67, 67, |
| 67, 68, 68, 69, 69, 69, 69, 69, 69, 70, |
| 71, 72, 72, 73, 74, 75, 76, 77, 78, 79, |
| 79, 80, 80, 81, 81, 81, 81, 81, 81, 81, |
| 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, |
| 81, 81, 82, 82, 83, 83, 83, 83 |
| }; |
| |
| static const short yyr2[] = { 0, |
| 0, 6, 0, 4, 2, 0, 0, 0, 8, 0, |
| 0, 0, 11, 3, 0, 3, 1, 2, 1, 0, |
| 2, 3, 2, 3, 3, 1, 8, 1, 1, 1, |
| 1, 3, 1, 1, 1, 1, 1, 1, 1, 4, |
| 2, 5, 3, 2, 3, 2, 3, 2, 2, 0, |
| 3, 3, 1, 3, 3, 2, 3, 3, 3, 3, |
| 3, 3, 3, 3, 3, 3, 2, 3, 4, 1, |
| 4, 1, 1, 4, 1, 1, 1, 1 |
| }; |
| |
| static const short yydefact[] = { 0, |
| 0, 1, 0, 20, 0, 0, 3, 26, 21, 0, |
| 0, 2, 6, 0, 23, 0, 0, 0, 22, 0, |
| 29, 30, 31, 24, 28, 25, 0, 0, 0, 5, |
| 4, 0, 7, 10, 0, 0, 0, 50, 0, 33, |
| 39, 37, 34, 0, 35, 0, 38, 36, 0, 0, |
| 0, 15, 15, 0, 0, 77, 78, 70, 76, 75, |
| 0, 0, 44, 72, 46, 0, 0, 41, 47, 0, |
| 0, 0, 48, 49, 0, 0, 8, 11, 0, 67, |
| 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, |
| 0, 0, 0, 0, 0, 0, 0, 53, 0, 32, |
| 43, 45, 0, 0, 0, 17, 19, 0, 0, 40, |
| 0, 0, 68, 60, 59, 63, 64, 61, 62, 54, |
| 55, 66, 57, 65, 58, 51, 0, 74, 0, 0, |
| 18, 0, 14, 20, 0, 69, 71, 52, 42, 0, |
| 16, 0, 0, 27, 9, 12, 20, 0, 13, 0, |
| 0, 0 |
| }; |
| |
| static const short yydefgoto[] = { 150, |
| 3, 6, 13, 18, 30, 52, 108, 53, 109, 147, |
| 77, 105, 106, 7, 9, 107, 11, 24, 25, 39, |
| 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, |
| 68, 97, 98, 50, 64 |
| }; |
| |
| static const short yypact[] = { 8, |
| -2,-32768, 7, 21, 20, 69,-32768,-32768, 20, 45, |
| -30,-32768,-32768, 55,-32768, 76, 56, 11,-32768, 51, |
| -32768,-32768,-32768,-32768,-32768,-32768, 72, 86, 57,-32768, |
| -32768, 85,-32768,-32768, 73, 42, 42, -13, -18,-32768, |
| -32768,-32768,-32768, 99,-32768, 97,-32768,-32768, 42, 95, |
| 122, 89, 89, 42, 42,-32768,-32768, -21,-32768,-32768, |
| 42, 42, 125,-32768, 125, 42, 42,-32768,-32768, 57, |
| 57, 57, 125,-32768, 105, 3,-32768,-32768, 5,-32768, |
| 42, 42,-32768, 109, 42, 42, 42, 42, 42, 42, |
| 42, 42, 42, 42, 42, 42, 18, 125, 71,-32768, |
| 118,-32768, 88, 20, 31,-32768,-32768, 110, 94,-32768, |
| 46, 90,-32768, 137, 137, 137, 137, 137, 137, 41, |
| 41, 41,-32768,-32768,-32768,-32768, 42,-32768, 57, 140, |
| -32768, 3,-32768, 21, 82,-32768,-32768, 125,-32768, 82, |
| -32768, 111, 138,-32768,-32768,-32768, 21, 139,-32768, 178, |
| 181,-32768 |
| }; |
| |
| static const short yypgoto[] = {-32768, |
| -32768, -126,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, |
| 129,-32768, 52,-32768,-32768, -5,-32768,-32768, -122,-32768, |
| -65,-32768,-32768,-32768,-32768,-32768,-32768, 165,-32768,-32768, |
| -32768, 104, -35,-32768,-32768 |
| }; |
| |
| |
| #define YYLAST 185 |
| |
| |
| static const short yytable[] = { 10, |
| 63, 65, 69, 14, 100, 101, 102, 142, -73, 104, |
| 1, 16, 143, 73, 17, 27, 28, 144, 79, 80, |
| 148, 81, 70, 2, 82, 83, 84, 5, 8, 66, |
| 29, 99, 67, 85, 86, 87, 88, 89, 90, 91, |
| 92, 93, 94, 95, 96, 8, 112, 4, 110, 114, |
| 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, |
| 125, 126, 127, 139, 55, 56, 57, 58, 59, 60, |
| 35, 132, 12, 36, 133, 37, 29, 61, 94, 95, |
| 96, 26, 38, 20, 62, 15, 21, 22, 23, 136, |
| 127, 138, 21, 22, 23, 19, 32, 33, 131, 85, |
| 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, |
| 96, 34, 51, 71, 72, 54, 74, 128, 85, 86, |
| 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, |
| 75, 76, 103, 129, 130, 135, 137, 85, 86, 87, |
| 88, 89, 90, 91, 92, 93, 94, 95, 96, 140, |
| 134, 145, 113, 85, 86, 87, 88, 89, 90, 91, |
| 92, 93, 94, 95, 96,-32768,-32768,-32768,-32768,-32768, |
| -32768, 91, 92, 93, 94, 95, 96, 151, 146, 149, |
| 152, 78, 31, 141, 111 |
| }; |
| |
| static const short yycheck[] = { 5, |
| 36, 37, 21, 9, 70, 71, 72, 134, 22, 7, |
| 3, 42, 135, 49, 45, 5, 6, 140, 54, 55, |
| 147, 43, 41, 26, 46, 61, 62, 7, 26, 43, |
| 20, 67, 46, 29, 30, 31, 32, 33, 34, 35, |
| 36, 37, 38, 39, 40, 26, 82, 41, 44, 85, |
| 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, |
| 96, 44, 45, 129, 23, 24, 25, 26, 27, 28, |
| 14, 41, 4, 17, 44, 19, 20, 36, 38, 39, |
| 40, 26, 26, 8, 43, 41, 11, 12, 13, 44, |
| 45, 127, 11, 12, 13, 41, 46, 26, 104, 29, |
| 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, |
| 40, 26, 28, 15, 18, 43, 22, 47, 29, 30, |
| 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, |
| 9, 43, 28, 16, 47, 42, 47, 29, 30, 31, |
| 32, 33, 34, 35, 36, 37, 38, 39, 40, 10, |
| 41, 41, 44, 29, 30, 31, 32, 33, 34, 35, |
| 36, 37, 38, 39, 40, 29, 30, 31, 32, 33, |
| 34, 35, 36, 37, 38, 39, 40, 0, 41, 41, |
| 0, 53, 18, 132, 81 |
| }; |
| #define YYPURE 1 |
| |
| #line 751 "parse.y.in" |
| |
| |
| void |
| yyerror(char* s) { |
| fprintf(stderr,"%s\n",s); |
| } |
| |
| int |
| main() { |
| printf("1\t"); |
| yyparse(); |
| return 1; |
| } |
| exit 0 |