1- {-# LANGUAGE TypeOperators #-}
1+ {-# LANGUAGE FlexibleContexts, TypeOperators #-}
22module Data.Core.Parser
33 ( module Text.Trifecta
44 , core
@@ -10,14 +10,13 @@ module Data.Core.Parser
1010-- Consult @doc/grammar.md@ for an EBNF grammar.
1111
1212import Control.Applicative
13- import Control.Effect.Sum
13+ import Control.Effect.Carrier
1414import qualified Data.Char as Char
15- import Data.Core (Ann , Core )
15+ import Data.Core (Core )
1616import qualified Data.Core as Core
1717import Data.Foldable (foldl' )
1818import Data.Name
1919import Data.String
20- import Data.Term
2120import qualified Text.Parser.Token as Token
2221import qualified Text.Parser.Token.Highlight as Highlight
2322import Text.Trifecta hiding (ident )
@@ -47,52 +46,52 @@ identifier = choice [quote, plain] <?> "identifier" where
4746
4847-- * Parsers (corresponding to EBNF)
4948
50- core :: (TokenParsing m , Monad m ) => m (Term ( Ann :+: Core ) User )
49+ core :: (TokenParsing m , Carrier sig t , Member Core sig , Monad m ) => m (t User )
5150core = expr
5251
53- expr :: (TokenParsing m , Monad m ) => m (Term ( Ann :+: Core ) User )
52+ expr :: (TokenParsing m , Carrier sig t , Member Core sig , Monad m ) => m (t User )
5453expr = ifthenelse <|> lambda <|> rec <|> load <|> assign
5554
56- assign :: (TokenParsing m , Monad m ) => m (Term ( Ann :+: Core ) User )
55+ assign :: (TokenParsing m , Carrier sig t , Member Core sig , Monad m ) => m (t User )
5756assign = application <**> (flip (Core. .=) <$ symbolic ' =' <*> application <|> pure id ) <?> " assignment"
5857
59- application :: (TokenParsing m , Monad m ) => m (Term ( Ann :+: Core ) User )
58+ application :: (TokenParsing m , Carrier sig t , Member Core sig , Monad m ) => m (t User )
6059application = projection `chainl1` (pure (Core. $$) )
6160
62- projection :: (TokenParsing m , Monad m ) => m (Term ( Ann :+: Core ) User )
61+ projection :: (TokenParsing m , Carrier sig t , Member Core sig , Monad m ) => m (t User )
6362projection = foldl' (Core. ...) <$> atom <*> many (namedValue <$ dot <*> name)
6463
65- atom :: (TokenParsing m , Monad m ) => m (Term ( Ann :+: Core ) User )
64+ atom :: (TokenParsing m , Carrier sig t , Member Core sig , Monad m ) => m (t User )
6665atom = choice
6766 [ comp
6867 , lit
6968 , ident
7069 , parens expr
7170 ]
7271
73- comp :: (TokenParsing m , Monad m ) => m (Term ( Ann :+: Core ) User )
72+ comp :: (TokenParsing m , Carrier sig t , Member Core sig , Monad m ) => m (t User )
7473comp = braces (Core. do' <$> sepEndByNonEmpty statement semi) <?> " compound statement"
7574
76- statement :: (TokenParsing m , Monad m ) => m (Maybe (Named User ) Core. :<- Term ( Ann :+: Core ) User )
75+ statement :: (TokenParsing m , Carrier sig t , Member Core sig , Monad m ) => m (Maybe (Named User ) Core. :<- t User )
7776statement
7877 = try ((Core. :<-) . Just <$> name <* symbol " <-" <*> expr)
7978 <|> (Nothing Core. :<- ) <$> expr
8079 <?> " statement"
8180
82- ifthenelse :: (TokenParsing m , Monad m ) => m (Term ( Ann :+: Core ) User )
81+ ifthenelse :: (TokenParsing m , Carrier sig t , Member Core sig , Monad m ) => m (t User )
8382ifthenelse = Core. if'
8483 <$ reserved " if" <*> expr
8584 <* reserved " then" <*> expr
8685 <* reserved " else" <*> expr
8786 <?> " if-then-else statement"
8887
89- rec :: (TokenParsing m , Monad m ) => m (Term ( Ann :+: Core ) User )
88+ rec :: (TokenParsing m , Carrier sig t , Member Core sig , Monad m ) => m (t User )
9089rec = Core. rec <$ reserved " rec" <*> name <* symbolic ' =' <*> expr <?> " recursive binding"
9190
92- load :: (TokenParsing m , Monad m ) => m (Term ( Ann :+: Core ) User )
91+ load :: (TokenParsing m , Carrier sig t , Member Core sig , Monad m ) => m (t User )
9392load = Core. load <$ reserved " load" <*> expr
9493
95- lvalue :: (TokenParsing m , Monad m ) => m (Term ( Ann :+: Core ) User )
94+ lvalue :: (TokenParsing m , Carrier sig t , Member Core sig , Monad m ) => m (t User )
9695lvalue = choice
9796 [ projection
9897 , ident
@@ -104,7 +103,7 @@ lvalue = choice
104103name :: (TokenParsing m , Monad m ) => m (Named User )
105104name = named' <$> identifier <?> " name"
106105
107- lit :: (TokenParsing m , Monad m ) => m (Term ( Ann :+: Core ) User )
106+ lit :: (TokenParsing m , Carrier sig t , Member Core sig , Monad m ) => m (t User )
108107lit = let x `given` n = x <$ reserved n in choice
109108 [ Core. bool True `given` " #true"
110109 , Core. bool False `given` " #false"
@@ -119,13 +118,13 @@ lit = let x `given` n = x <$ reserved n in choice
119118 , ' \t ' <$ string " t"
120119 ] <?> " escape sequence"
121120
122- record :: (TokenParsing m , Monad m ) => m (Term ( Ann :+: Core ) User )
121+ record :: (TokenParsing m , Carrier sig t , Member Core sig , Monad m ) => m (t User )
123122record = Core. record <$ reserved " #record" <*> braces (sepEndBy ((,) <$> identifier <* symbolic ' :' <*> expr) comma)
124123
125- lambda :: (TokenParsing m , Monad m ) => m (Term ( Ann :+: Core ) User )
124+ lambda :: (TokenParsing m , Carrier sig t , Member Core sig , Monad m ) => m (t User )
126125lambda = Core. lam <$ lambduh <*> name <* arrow <*> expr <?> " lambda" where
127126 lambduh = symbolic 'λ' <|> symbolic ' \\ '
128127 arrow = symbol " →" <|> symbol " ->"
129128
130- ident :: (Monad m , TokenParsing m ) => m (Term ( Ann :+: Core ) User )
129+ ident :: (Applicative t , Monad m , TokenParsing m ) => m (t User )
131130ident = pure . namedValue <$> name <?> " identifier"
0 commit comments