entrypoints Module, Exp ; layout "let", "where", "of","rec", "sig", "do" ; layout stop "in" ; layout toplevel ; comment "--" ; comment "{-" "-}" ; Module. Module ::= [Import] [Decl] ; Import. Import ::= "import" Ident ; separator Import ";" ; DataDecl. Decl ::= "data" Ident ":" Exp "where" "{" [ConsDecl] "}" ; TypeDecl. Decl ::= Ident ":" Exp ; ValueDecl. Decl ::= Ident [Pattern] "=" Exp ; DeriveDecl. Decl ::= "derive" Ident Ident ; separator Decl ";" ; ConsDecl. ConsDecl ::= Ident ":" Exp ; separator ConsDecl ";" ; -- Disjunctive patterns. POr. Pattern ::= Pattern1 "||" Pattern ; -- List constructor patterns PListCons. Pattern1 ::= Pattern2 "::" Pattern1 ; -- Hack: constructor applied to at least one pattern -- this is to separate it from variable patterns PConsTop. Pattern2 ::= Ident Pattern3 [Pattern] ; -- Real constructor pattern internal PCons. Pattern3 ::= "(" Ident [Pattern] ")" ; -- Record patterns PRec. Pattern3 ::= "rec" "{" [FieldPattern] "}"; -- List patterns PList. Pattern3 ::= "[" [PListElem] "]" ; PListElem. PListElem ::= Pattern ; separator PListElem "," ; -- The pattern matching the Type constant PType. Pattern3 ::= "Type" ; -- String literal patterns PStr. Pattern3 ::= String ; -- Integer literal patterns PInt. Pattern3 ::= Integer ; -- Variable patterns PVar. Pattern3 ::= Ident ; -- Wild card patterns PWild. Pattern3 ::= "_" ; coercions Pattern 3 ; []. [Pattern] ::= ; (:). [Pattern] ::= Pattern3 [Pattern] ; FieldPattern. FieldPattern ::= Ident "=" Pattern ; separator FieldPattern ";" ; ELet. Exp ::= "let" "{" [LetDef] "}" "in" Exp ; LetDef. LetDef ::= Ident ":" Exp "=" Exp ; separator LetDef ";" ; ECase. Exp ::= "case" Exp "of" "{" [Case] "}" ; Case. Case ::= Pattern "->" Exp ; separator Case ";" ; EIf. Exp ::= "if" Exp "then" Exp "else" Exp ; EDo. Exp ::= "do" "{" [Bind] Exp "}" ; BindVar. Bind ::= VarOrWild "<-" Exp ; BindNoVar. Bind ::= Exp ; terminator Bind ";" ; EAbs. Exp2 ::= "\\" VarOrWild "->" Exp ; EPi. Exp2 ::= "(" VarOrWild ":" Exp ")" "->" Exp ; EPiNoVar. Exp2 ::= Exp3 "->" Exp ; VVar. VarOrWild ::= Ident ; VWild. VarOrWild ::= "_" ; EBind. Exp3 ::= Exp3 ">>=" Exp4 ; EBindC. Exp3 ::= Exp3 ">>" Exp4 ; EOr. Exp4 ::= Exp5 "||" Exp4 ; EAnd. Exp5 ::= Exp6 "&&" Exp5 ; EEq. Exp6 ::= Exp7 "==" Exp7 ; ENe. Exp6 ::= Exp7 "/=" Exp7 ; ELt. Exp6 ::= Exp7 "<" Exp7 ; ELe. Exp6 ::= Exp7 "<=" Exp7 ; EGt. Exp6 ::= Exp7 ">" Exp7 ; EGe. Exp6 ::= Exp7 ">=" Exp7 ; EListCons. Exp7 ::= Exp8 "::" Exp7 ; EAdd. Exp8 ::= Exp8 "+" Exp9 ; ESub. Exp8 ::= Exp8 "-" Exp9 ; EMul. Exp9 ::= Exp9 "*" Exp10 ; EDiv. Exp9 ::= Exp9 "/" Exp10 ; EMod. Exp9 ::= Exp9 "%" Exp10 ; ENeg. Exp10 ::= "-" Exp10 ; EApp. Exp11 ::= Exp11 Exp12 ; EProj. Exp12 ::= Exp12 "." Ident ; ERecType. Exp13 ::= "sig" "{" [FieldType] "}" ; FieldType. FieldType ::= Ident ":" Exp ; separator FieldType ";" ; ERec. Exp13 ::= "rec" "{" [FieldValue] "}" ; FieldValue.FieldValue ::= Ident "=" Exp ; separator FieldValue ";" ; EList. Exp13 ::= "[" [Exp] "]" ; EVar. Exp13 ::= Ident ; EType. Exp13 ::= "Type" ; EStr. Exp13 ::= String ; EInteger. Exp13 ::= Integer ; EDouble. Exp13 ::= Double ; EMeta. Exp13 ::= "?" ; coercions Exp 13 ; separator Exp "," ;