case expr rules

This commit is contained in:
crumbtoo
2023-12-06 10:22:38 -07:00
parent 23f9f726fa
commit 22a27dca3b
2 changed files with 18 additions and 3 deletions

View File

@@ -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 }

View File

@@ -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)