case expr rules
This commit is contained in:
@@ -34,7 +34,8 @@ import Data.Default.Class (def)
|
|||||||
letrec { Located _ _ _ TokenLetrec }
|
letrec { Located _ _ _ TokenLetrec }
|
||||||
module { Located _ _ _ TokenModule }
|
module { Located _ _ _ TokenModule }
|
||||||
where { Located _ _ _ TokenWhere }
|
where { Located _ _ _ TokenWhere }
|
||||||
',' { Located _ _ _ TokenComma }
|
case { Located _ _ _ TokenCase }
|
||||||
|
of { Located _ _ _ TokenOf }
|
||||||
in { Located _ _ _ TokenIn }
|
in { Located _ _ _ TokenIn }
|
||||||
litint { Located _ _ _ (TokenLitInt $$) }
|
litint { Located _ _ _ (TokenLitInt $$) }
|
||||||
varname { Located _ _ _ (TokenVarName $$) }
|
varname { Located _ _ _ (TokenVarName $$) }
|
||||||
@@ -85,6 +86,7 @@ Expr :: { Expr }
|
|||||||
Expr : LetExpr { $1 }
|
Expr : LetExpr { $1 }
|
||||||
| 'λ' Binders '->' Expr { Lam $2 $4 }
|
| 'λ' Binders '->' Expr { Lam $2 $4 }
|
||||||
| Application { $1 }
|
| Application { $1 }
|
||||||
|
| CaseExpr { $1 }
|
||||||
| Expr1 { $1 }
|
| Expr1 { $1 }
|
||||||
|
|
||||||
LetExpr :: { Expr }
|
LetExpr :: { Expr }
|
||||||
@@ -103,6 +105,17 @@ AppArgs :: { [Expr] }
|
|||||||
AppArgs : Expr1 AppArgs { $1 : $2 }
|
AppArgs : Expr1 AppArgs { $1 : $2 }
|
||||||
| Expr1 { [$1] }
|
| Expr1 { [$1] }
|
||||||
|
|
||||||
|
CaseExpr :: { Expr }
|
||||||
|
CaseExpr : case Expr of '{' Alters '}' { Case $2 $5 }
|
||||||
|
|
||||||
|
Alters :: { [Alter] }
|
||||||
|
Alters : Alter ';' Alters { $1 : $3 }
|
||||||
|
| Alter ';' { [$1] }
|
||||||
|
| Alter { [$1] }
|
||||||
|
|
||||||
|
Alter :: { Alter }
|
||||||
|
Alter : litint ParList '->' Expr { Alter $1 $2 $4 }
|
||||||
|
|
||||||
Expr1 :: { Expr }
|
Expr1 :: { Expr }
|
||||||
Expr1 : litint { IntE $1 }
|
Expr1 : litint { IntE $1 }
|
||||||
| Id { Var $1 }
|
| Id { Var $1 }
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ module Core.Syntax
|
|||||||
, Rec(..)
|
, Rec(..)
|
||||||
, Alter(..)
|
, Alter(..)
|
||||||
, Name
|
, Name
|
||||||
|
, Tag
|
||||||
, ScDef(..)
|
, ScDef(..)
|
||||||
, Module(..)
|
, Module(..)
|
||||||
, Program(..)
|
, Program(..)
|
||||||
@@ -31,7 +32,7 @@ import Language.Haskell.TH.Syntax (Lift)
|
|||||||
----------------------------------------------------------------------------------
|
----------------------------------------------------------------------------------
|
||||||
|
|
||||||
data Expr = Var Name
|
data Expr = Var Name
|
||||||
| Con Int Int -- Con Tag Arity
|
| Con Tag Int -- Con Tag Arity
|
||||||
| Let Rec [Binding] Expr
|
| Let Rec [Binding] Expr
|
||||||
| Case Expr [Alter]
|
| Case Expr [Alter]
|
||||||
| Lam [Name] Expr
|
| Lam [Name] Expr
|
||||||
@@ -56,10 +57,11 @@ data Rec = Rec
|
|||||||
| NonRec
|
| NonRec
|
||||||
deriving (Show, Eq, Lift)
|
deriving (Show, Eq, Lift)
|
||||||
|
|
||||||
data Alter = Alter Int [Name] Expr
|
data Alter = Alter Tag [Name] Expr
|
||||||
deriving (Show, Lift, Eq)
|
deriving (Show, Lift, Eq)
|
||||||
|
|
||||||
type Name = String
|
type Name = String
|
||||||
|
type Tag = Int
|
||||||
|
|
||||||
data ScDef = ScDef Name [Name] Expr
|
data ScDef = ScDef Name [Name] Expr
|
||||||
deriving (Show, Lift, Eq)
|
deriving (Show, Lift, Eq)
|
||||||
|
|||||||
Reference in New Issue
Block a user