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 }
module { Located _ _ _ TokenModule }
where { Located _ _ _ TokenWhere }
',' { Located _ _ _ TokenComma }
case { Located _ _ _ TokenCase }
of { Located _ _ _ TokenOf }
in { Located _ _ _ TokenIn }
litint { Located _ _ _ (TokenLitInt $$) }
varname { Located _ _ _ (TokenVarName $$) }
@@ -85,6 +86,7 @@ Expr :: { Expr }
Expr : LetExpr { $1 }
| 'λ' Binders '->' Expr { Lam $2 $4 }
| Application { $1 }
| CaseExpr { $1 }
| Expr1 { $1 }
LetExpr :: { Expr }
@@ -103,6 +105,17 @@ AppArgs :: { [Expr] }
AppArgs : Expr1 AppArgs { $1 : $2 }
| 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 : litint { IntE $1 }
| Id { Var $1 }

View File

@@ -11,6 +11,7 @@ module Core.Syntax
, Rec(..)
, Alter(..)
, Name
, Tag
, ScDef(..)
, Module(..)
, Program(..)
@@ -31,7 +32,7 @@ import Language.Haskell.TH.Syntax (Lift)
----------------------------------------------------------------------------------
data Expr = Var Name
| Con Int Int -- Con Tag Arity
| Con Tag Int -- Con Tag Arity
| Let Rec [Binding] Expr
| Case Expr [Alter]
| Lam [Name] Expr
@@ -56,10 +57,11 @@ data Rec = Rec
| NonRec
deriving (Show, Eq, Lift)
data Alter = Alter Int [Name] Expr
data Alter = Alter Tag [Name] Expr
deriving (Show, Lift, Eq)
type Name = String
type Tag = Int
data ScDef = ScDef Name [Name] Expr
deriving (Show, Lift, Eq)