program : declarationList declarationList : declarationList declaration declaration : varDeclaration | error recDeclaration : RECORD ID '{' localDeclarations '}' varDeclaration : typeSpecifier varDeclList ';' YYERROK; | error varDeclList ';' | typeSpecifier error ';' YYERROK; scopedVarDeclaration: STATIC typeSpecifier varDeclList ';' YYERROK; | typeSpecifier varDeclList ';' YYERROK; | error varDeclList ';' YYERROK; | typeSpecifier error ';' YYERROK; varDeclList : varDeclList ',' varDeclInitialize YYERROK; | varDeclList ',' error | error varDeclInitialize : varDeclId | error ':' simpleExpression YYERROK; | varDeclId ':' error varDeclId : ID | ID '[' error | error ']' YYERROK; typeSpecifier : INT funDeclaration : typeSpecifier ID '(' params ')' statement | typeSpecifier error | typeSpecifier ID '(' error | typeSpecifier ID '(' params ')' error | ID '(' error | ID '(' params ')' error params : paramList paramList : paramList ';' paramTypeList YYERROK; | paramList ';' error | error paramTypeList : typeSpecifier paramIdList | typeSpecifier error paramIdList : paramIdList ',' paramId YYERROK; | paramIdList ',' error | error paramId : ID | error ']' YYERROK; compoundStmt : '{' localDeclarations statementList '}' YYERROK; | '{' error statementList '}' YYERROK; | '{' localDeclarations error '}' YYERROK; localDeclarations : localDeclarations scopedVarDeclaration statementList : statementList statement statement : matched matched : IF '(' simpleExpression ')' matched ELSE matched | IF '(' error | IF error ')' matched ELSE matched YYERROK; | WHILE error ')' matched YYERROK; | WHILE '(' error ')' matched YYERROK; | WHILE error | error unmatched : IF '(' simpleExpression ')' statement | IF error | IF error ')' statement YYERROK; | IF error ')' matched ELSE unmatched YYERROK; | WHILE error ')' unmatched YYERROK; | WHILE '(' error ')' unmatched YYERROK; expressionStmt : expression ';' YYERROK; | ';' YYERROK; returnStmt : RETURN ';' YYERROK; | RETURN expression ';' YYERROK; breakStmt : BREAK ';' YYERROK; expression : mutable assignop expression | error assignop error | mutable INC YYERROK; | error INC YYERROK; | mutable DEC YYERROK; | error DEC YYERROK; assignop : '=' simpleExpression : simpleExpression OR orExpression | simpleExpression OR error orExpression : orExpression AND unaryRelExpression | orExpression AND error unaryRelExpression : NOT unaryRelExpression | NOT error relExpression : additiveExpression relop additiveExpression | additiveExpression relop error | error relop additiveExpression YYERROK; relop : LESSEQ additiveExpression : additiveExpression sumop term | additiveExpression sumop error YYERROK; sumop : '+' term : term mulop unaryExpression term : term mulop error mulop : '*' unaryExpression : unaryop unaryExpression | unaryop error unaryop : '-' factor : mutable mutable : ID immutable : '(' expression ')' YYERROK; | '(' error | error ')' YYERROK; call : ID '(' args ')' | error '(' YYERROK; args : argList argList : argList ',' expression YYERROK; | argList ',' error constant : NUMCONST