blob: 9427dc5f13f598d0099fdec3b6fd5343c19da25e [file] [log] [blame]
/* 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