Added default functions, isEmpty does not typecheck...
[cc1516.git] / grammar / grammar.txt
index f78b879..98bb06e 100644 (file)
@@ -1,36 +1,31 @@
-<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'