-<Expr> ::= <id> ['hd'|'tl'|'fst'|'snd] <Expr`>
- | <Op1> <Expr> <Expr`>
- | <int> <Expr`>
- | <char> <Expr`>
- | 'False' <Expr`>
- | 'True' <Expr`>
- | '(' <Expr> ')' <Expr`>
- | <id> '(' [<ActArgs>] ')' <Expr`>
- | '[]' <Expr> <Expr`>
- | '(' <Expr> ',' <Expr> ')' <Expr`>
-<Expr`> ::= <Op2> <Expr> <Expr`> | e
-<Op2> ::= '+' | '-' | '*' | '/' | '%' | '==' | '<' | '>' | '<=' | '>='
- | '!=' | '&&' | '||' | ':'
+<FunDecl> ::= <id> '(' <Type>* ')' ['::' <FunType] '{' <VarDecl>* <Stmt>+ '}'
+<FunType> ::= <Type>+ '->' <VoidType>
+ | <VoidType>
+<Stmt> ::= 'if' '(' <Expr> ')' '{' <Stmt>* '}' ['else' '{' <Stmt>* '}']
+ | 'while' '(' <Expr> ')' '{' <Stmt>* '}'
+ | <id> <FieldSels> '=' <Expr> ';'
+ | <FunCall> ';'
+ | 'return' [<Expr>] ';'
-<ActArgs> ::= <Expr> [',' ActArgs]
+<VarDecl> ::= (<Type> | 'var') <id> '=' <Expr> ';'
+<Expr> ::= <BinOrExpr> [':' <Expr>]
+<BinOrExpr> ::= <BinAndExpr> ['||' <BinOrExpr>]
+<BinAndExpr> ::= <CompareExpr> ['&&' <BinAndExpr>]
+<CompareExpr> ::= <PlusMinExpr> [('==' | '<' | '>' | '<=' | '>=' | '!=') <CompareExpr>]
+<PlusMinExpr> ::= <TimesDivExpr> (('+' | '-') <TimesDivExpr>)*
+<TimesDivExpr> ::= <BasicExpr> ('*' | '/' | '%'] <BasicExpr>)*
+<BasicExpr> ::= <id> <FieldSels>
+ | <Op1> <Expr>
+ | <int>
+ | <char>
+ | 'False'
+ | 'True'
+ | '(' <Expr> ')'
+ | <FunCall>
+ | '[]' <Expr>
+ | '(' <Expr> ',' <Expr> ')'
-<VarDecl> ::= (<Type> | 'var') <id> '=' <Expr> ';'
+<FieldSels> ::= ('.' ('hd'|'tl'|'fst'|'snd))*
+<FunCall> ::= <id> '(' [<ActArgs>] ')'
+<ActArgs> ::= <Expr> [',' ActArgs]
-<Type> ::= 'Int'
- | 'Bool'
- | 'Char'
- | '(' Type ',' Type ')'
- | '[' Type ']'
- | <id>
+<Type> ::= 'Int'
+ | 'Bool'
+ | 'Char'
+ | '(' Type ',' Type ')'
+ | '[' Type ']'
+ | <id>
+<VoidType> ::= 'Void' | Type