Merge pull request #5 from msydneyslaga/dev
towards stabilising main branch
This commit was merged in pull request #5.
This commit is contained in:
@@ -68,6 +68,7 @@ rlp :-
|
|||||||
"{" { constTok TokenLBrace }
|
"{" { constTok TokenLBrace }
|
||||||
"}" { constTok TokenRBrace }
|
"}" { constTok TokenRBrace }
|
||||||
";" { constTok TokenSemicolon }
|
";" { constTok TokenSemicolon }
|
||||||
|
"@" { constTok TokenTypeApp }
|
||||||
"{-#" { constTok TokenLPragma `andBegin` pragma }
|
"{-#" { constTok TokenLPragma `andBegin` pragma }
|
||||||
|
|
||||||
"let" { constTok TokenLet }
|
"let" { constTok TokenLet }
|
||||||
@@ -133,6 +134,7 @@ data CoreToken = TokenLet
|
|||||||
| TokenLBrace
|
| TokenLBrace
|
||||||
| TokenRBrace
|
| TokenRBrace
|
||||||
| TokenSemicolon
|
| TokenSemicolon
|
||||||
|
| TokenTypeApp
|
||||||
| TokenLPragma
|
| TokenLPragma
|
||||||
| TokenRPragma
|
| TokenRPragma
|
||||||
| TokenWord String
|
| TokenWord String
|
||||||
|
|||||||
@@ -47,6 +47,7 @@ import Data.Default.Class (def)
|
|||||||
'λ' { Located _ _ _ TokenLambda }
|
'λ' { Located _ _ _ TokenLambda }
|
||||||
'->' { Located _ _ _ TokenArrow }
|
'->' { Located _ _ _ TokenArrow }
|
||||||
'=' { Located _ _ _ TokenEquals }
|
'=' { Located _ _ _ TokenEquals }
|
||||||
|
'@' { Located _ _ _ TokenTypeApp }
|
||||||
'(' { Located _ _ _ TokenLParen }
|
'(' { Located _ _ _ TokenLParen }
|
||||||
')' { Located _ _ _ TokenRParen }
|
')' { Located _ _ _ TokenRParen }
|
||||||
'{' { Located _ _ _ TokenLBrace }
|
'{' { Located _ _ _ TokenLBrace }
|
||||||
@@ -106,7 +107,6 @@ Binders : Var Binders { $1 : $2 }
|
|||||||
Application :: { Expr Name }
|
Application :: { Expr Name }
|
||||||
Application : Expr1 AppArgs { foldl' App $1 $2 }
|
Application : Expr1 AppArgs { foldl' App $1 $2 }
|
||||||
|
|
||||||
-- TODO: Application can probably be written as a single rule, without AppArgs
|
|
||||||
AppArgs :: { [Expr Name] }
|
AppArgs :: { [Expr Name] }
|
||||||
AppArgs : Expr1 AppArgs { $1 : $2 }
|
AppArgs : Expr1 AppArgs { $1 : $2 }
|
||||||
| Expr1 { [$1] }
|
| Expr1 { [$1] }
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ Description : Core ASTs and the like
|
|||||||
{-# LANGUAGE FunctionalDependencies #-}
|
{-# LANGUAGE FunctionalDependencies #-}
|
||||||
module Core.Syntax
|
module Core.Syntax
|
||||||
( Expr(..)
|
( Expr(..)
|
||||||
|
, Type(..)
|
||||||
, Literal(..)
|
, Literal(..)
|
||||||
, pattern (:$)
|
, pattern (:$)
|
||||||
, Binding(..)
|
, Binding(..)
|
||||||
@@ -36,8 +37,8 @@ import Data.List (intersperse)
|
|||||||
import Data.Function ((&))
|
import Data.Function ((&))
|
||||||
import Data.String
|
import Data.String
|
||||||
-- Lift instances for the Core quasiquoters
|
-- Lift instances for the Core quasiquoters
|
||||||
import Lens.Micro
|
|
||||||
import Language.Haskell.TH.Syntax (Lift)
|
import Language.Haskell.TH.Syntax (Lift)
|
||||||
|
import Lens.Micro
|
||||||
----------------------------------------------------------------------------------
|
----------------------------------------------------------------------------------
|
||||||
|
|
||||||
data Expr b = Var Name
|
data Expr b = Var Name
|
||||||
@@ -47,10 +48,20 @@ data Expr b = Var Name
|
|||||||
| Let Rec [Binding b] (Expr b)
|
| Let Rec [Binding b] (Expr b)
|
||||||
| App (Expr b) (Expr b)
|
| App (Expr b) (Expr b)
|
||||||
| LitE Literal
|
| LitE Literal
|
||||||
|
| Type Type
|
||||||
deriving (Show, Read, Lift)
|
deriving (Show, Read, Lift)
|
||||||
|
|
||||||
deriving instance (Eq b) => Eq (Expr b)
|
deriving instance (Eq b) => Eq (Expr b)
|
||||||
|
|
||||||
|
data Type = TyInt
|
||||||
|
| TyFun
|
||||||
|
| TyVar Name
|
||||||
|
| TyApp Type Type
|
||||||
|
| TyConApp TyCon [Type]
|
||||||
|
deriving (Show, Read, Lift, Eq)
|
||||||
|
|
||||||
|
type TyCon = Name
|
||||||
|
|
||||||
infixl 2 :$
|
infixl 2 :$
|
||||||
pattern (:$) :: Expr b -> Expr b -> Expr b
|
pattern (:$) :: Expr b -> Expr b -> Expr b
|
||||||
pattern f :$ x = App f x
|
pattern f :$ x = App f x
|
||||||
|
|||||||
@@ -57,6 +57,7 @@ floatNonStrictCases g = goE
|
|||||||
goE :: Expr' -> Floater Expr'
|
goE :: Expr' -> Floater Expr'
|
||||||
goE (Var k) = pure (Var k)
|
goE (Var k) = pure (Var k)
|
||||||
goE (LitE l) = pure (LitE l)
|
goE (LitE l) = pure (LitE l)
|
||||||
|
goE (Case e as) = pure (Case e as)
|
||||||
goE (Let Rec bs e) = Let Rec <$> bs' <*> goE e
|
goE (Let Rec bs e) = Let Rec <$> bs' <*> goE e
|
||||||
where bs' = travBs goE bs
|
where bs' = travBs goE bs
|
||||||
goE e = goC e
|
goE e = goC e
|
||||||
|
|||||||
Reference in New Issue
Block a user