-<Prog> ::= <VarDecl>* <FunDecl>+
-
+<Prog> ::= <FunDecl>+
<FunDecl> ::= <id> '(' <Type>* ')' ['::' <FunType] '{' <VarDecl>* <Stmt>+ '}'
-<FunType> ::= <Type>+ '->' <VoidType>
- | <VoidType>
+<FunType> ::= <VoidType> ['->' <FunType>]
+ | '(' <FunType> ')'
<Stmt> ::= 'if' '(' <Expr> ')' '{' <Stmt>* '}' ['else' '{' <Stmt>* '}']
| 'while' '(' <Expr> ')' '{' <Stmt>* '}'
| <id> <FieldSels> '=' <Expr> ';'
| <FunCall> ';'
| 'return' [<Expr>] ';'
-
-<VarDecl> ::= (<Type> | 'var') <id> '=' <Expr> ';'
+<VarDecl> ::= <Type> <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>
+<BasicExpr> ::= <Op1> <Expr>
| <int>
| <char>
| 'False'
| 'True'
| '(' <Expr> ')'
- | <FunCall>
+ | <FunCall> <FieldSels>
| '[]' <Expr>
| '(' <Expr> ',' <Expr> ')'
-
<FieldSels> ::= ('.' ('hd'|'tl'|'fst'|'snd))*
-<FunCall> ::= <id> '(' [<ActArgs>] ')'
+<FunCall> ::= <id> ['(' <ActArgs>+ ')']
<ActArgs> ::= <Expr> [',' ActArgs]
-
<Type> ::= 'Int'
| 'Bool'
| 'Char'