separator nonempty Ident "," ; terminator Import ";" ; terminator TopDecl ";" ; terminator Decl ";" ; terminator Case "" ; terminator Guard "" ; Module. Module ::= "module" [Ident] ";" [Import] [TopDecl] ; Import. Import ::= "import" [Ident] ; Private. TopDecl ::= Decl ; Public. TopDecl ::= "public" Decl ; FunDecl. Decl ::= "fun" Ident "{" [Case] "}" ; ConstDecl. Decl ::= "const" Ident "=" Expr ; VarDecl. Decl ::= "var" Ident ":" Type ; VarPat. Pattern ::= Ident ; _. Pattern ::= "(" Pattern1 ")" ; TuplePat. Pattern1 ::= Pattern1 "," Pattern2 ; _. Pattern1 ::= Pattern2 ; ConsPat. Pattern2 ::= Ident Pattern ; _. Pattern2 ::= Pattern ; Case. Case ::= "case" Pattern [Guard] ; Guard. Guard ::= "|" Expr ":" Expr ; PlusExpr. Expr ::= Expr "+" Expr ; MinusExpr. Expr ::= Expr "-" Expr ; TimesExpr. Expr ::= Expr "*" Expr ; DivExpr. Expr ::= Expr "/" Expr ; AssignExpr. Expr ::= Ident "<-" Expr ; DeclExpr. Expr ::= Decl ; LoopExpr. Expr ::= "loop" "(" Expr ")" "{" [Case] "}" ; SwitchExpr. Expr ::= "switch" "(" Expr ")" "{" [Case] "}" ; ParExpr. Expr ::= "parallel" "(" Expr ")" "{" [Case] "}" ; Type. Type ::= "type" ;