program -> definition restdefs . restdefs -> definition restdefs | . definition -> fun IDENTIFIER LPAREN parameters RPAREN funcassign . funcassign -> ASSIGN statements | . definition -> var IDENTIFIER ASSING initializers . parameters -> IDENTIFIER restparams | . restparams -> COMMA parameters | . statements -> statement reststmts . reststmts -> COMMA statements | . statement -> expression exprassign . exprassign -> ASSIGN expression | . statement -> if expression then statements elsestmt end . elsestmt -> else statements | . statement -> while expression do statements end . statement -> let definition reststmtdefs in statements end . reststmtdefs -> definition reststmtdefs | . expression -> conjexpr restdisj . restdisj -> OR expression | . conjexpr -> cmpexpr restconj . restconj -> AND conjexpr | . cmpexpr -> addexpr restcmp . restcmp -> cmpop cmpexpr | . cmpop -> EQ | NEQ | LTH | GTH | LEQ | GEQ . addexpr -> multexpr restadd . restadd -> addop addexpr | . addop -> ADD | SUB . multexpr -> prefixexpr restmult . restmult -> multop multexpr | . multop -> MUL | DIV | MOD . prefixexpr -> prefixop postfixexpr . prefixop -> NOT prefixop | ADD prefixop | SUB prefixop | PTR prefixop | . postfixexpr -> primary postfixop . postfixop -> PTR postfixop | . primary -> const | LPAREN expression RPAREN | IDENTIFIER exprargs . exprargs -> LPAREN arguments RPAREN | . arguments -> expression restargs | . restargs -> COMMA restargs | . initializers -> initializer restinits | . restinits -> COMMA initializers | . initializer -> INTCONST intconstmul | CHARCONST | STRINGCONST . intconstmul -> MUL const | . const -> INTCONST | CHARCONST | STRINGCONST .