#include "yyerror.h" program : declList : decl : | error { $$ = NULL; } varDecl : varDecl : typeSpec varDeclList ';' { $$ = $2; setType($2, $1, false); yyerrok; } | error varDeclList ';' { $$ = NULL; } | typeSpec error ';' { $$ = NULL; yyerrok; } scopedVarDecl : scopedVarDecl : STATIC typeSpec varDeclList ';' { $$ = $3; setType($3, $2, true); yyerrok; } | typeSpec varDeclList ';' { $$ = $2; setType($2, $1, false); yyerrok; } | error varDeclList ';' { $$ = NULL; yyerrok; } varDeclList : varDeclList : varDeclList ',' varDeclInit { $$ = addSibling($1, $3); yyerrok; } | varDeclList ',' error { $$ = NULL; } | error { $$ = NULL; } varDeclInit : | error ':' simpleExp { $$ = NULL; yyerrok; } | varDeclId ':' error { $$ = NULL; } varDeclId : | ID '[' error { $$ = NULL; } | error ']' { $$ = NULL; yyerrok; } typeSpec : funDecl : | typeSpec error { $$ = NULL; } | typeSpec ID '(' error { $$ = NULL; } | typeSpec ID '(' params ')' error { $$ = NULL; } | ID '(' error { $$ = NULL; } | ID '(' params ')' error { $$ = NULL; } params : paramList : | paramList ';' error { $$ = NULL; } | error { $$ = NULL; } paramTypeList : | typeSpec error { $$ = NULL; } paramIdList : paramIdList : paramIdList ',' paramId { $$ = addSibling($1, $3); yyerrok; } | paramIdList ',' error { $$ = NULL; } | error { $$ = NULL; } paramId : | error ']' {yyerrok; $$ = NULL; } compoundStmt : yyerrok; | '{' error stmtList '}' { $$ = NULL; yyerrok; } | '{' localDecls error '}' { $$ = NULL; yyerrok; } localDecls : stmtList : stmt : matched : | IF error { $$ = NULL; } | IF error ELSE matched { $$ = NULL; yyerrok; } | IF error ')' matched ELSE matched { $$ = NULL; yyerrok; } | WHILE error ')' matched { $$ = NULL; yyerrok; } | WHILE error { $$ = NULL; } | FOR error ')' matched { $$ = NULL; yyerrok; } | FOR error { $$ = NULL; } unmatched : | IF error ')' stmt { $$ = NULL; yyerrok; } | IF error ELSE unmatched { $$ = NULL; yyerrok; } | IF error ')' matched ELSE unmatched { $$ = NULL; yyerrok; } | WHILE error ')' unmatched { $$ = NULL; yyerrok; } | FOR error ')' unmatched { $$ = NULL; yyerrok; } expStmt : expStmt : exp ';' { $$ = $1; yyerrok; } | error ';' { $$ = NULL; yyerrok; } | ';' { $$ = NULL; yyerrok; } returnStmt : | RETURN exp ';' { $$ = newStmtNode(ReturnK, $1); yyerrok; breakStmt : exp : | error assignOp error { $$ = NULL; } | error INC { $$=NULL; yyerrok; } | error DEC { $$=NULL; yyerrok; } assignOp : simpleExp : | simpleExp '|' error { $$=NULL; }; andExp : | andExp '&' error { $$ = NULL; } unaryRelExp : | '!' error { $$ = NULL; } relExp : | sumExp relOp error { $$ = NULL; } relOp : sumExp : | sumExp sumOp error { $$ = NULL; yyerrok; } sumOp : mulExp : | mulExp mulOp error { $$ = NULL; } mulOp : unaryExp : | unaryOp error { $$ = NULL; } unaryOp : factor : mutable : immutable : immutable : '(' exp ')' { $$ = $2; yyerrok; } | '(' error { $$ = NULL; } | error ')' { $$ = NULL; yyerrok; } call : | error '(' { $$ = NULL; yyerrok; } args : argList : argList : argList ',' exp { $$ = addSibling($1, $3); yyerrok; } | argList ',' error { $$=NULL; } constant :