@@ -10,8 +10,9 @@ module Data.Core.Parser
1010-- Consult @doc/grammar.md@ for an EBNF grammar.
1111
1212import Control.Applicative
13+ import Control.Effect.Sum
1314import qualified Data.Char as Char
14- import Data.Core (Core )
15+ import Data.Core (Ann , Core )
1516import qualified Data.Core as Core
1617import Data.Foldable (foldl' )
1718import Data.Name
@@ -46,52 +47,52 @@ identifier = choice [quote, plain] <?> "identifier" where
4647
4748-- * Parsers (corresponding to EBNF)
4849
49- core :: (TokenParsing m , Monad m ) => m (Term Core User )
50+ core :: (TokenParsing m , Monad m ) => m (Term ( Ann :+: Core ) User )
5051core = expr
5152
52- expr :: (TokenParsing m , Monad m ) => m (Term Core User )
53+ expr :: (TokenParsing m , Monad m ) => m (Term ( Ann :+: Core ) User )
5354expr = ifthenelse <|> lambda <|> rec <|> load <|> assign
5455
55- assign :: (TokenParsing m , Monad m ) => m (Term Core User )
56+ assign :: (TokenParsing m , Monad m ) => m (Term ( Ann :+: Core ) User )
5657assign = application <**> (flip (Core. .=) <$ symbolic ' =' <*> application <|> pure id ) <?> " assignment"
5758
58- application :: (TokenParsing m , Monad m ) => m (Term Core User )
59+ application :: (TokenParsing m , Monad m ) => m (Term ( Ann :+: Core ) User )
5960application = projection `chainl1` (pure (Core. $$) )
6061
61- projection :: (TokenParsing m , Monad m ) => m (Term Core User )
62+ projection :: (TokenParsing m , Monad m ) => m (Term ( Ann :+: Core ) User )
6263projection = foldl' (Core. ...) <$> atom <*> many (namedValue <$ dot <*> name)
6364
64- atom :: (TokenParsing m , Monad m ) => m (Term Core User )
65+ atom :: (TokenParsing m , Monad m ) => m (Term ( Ann :+: Core ) User )
6566atom = choice
6667 [ comp
6768 , lit
6869 , ident
6970 , parens expr
7071 ]
7172
72- comp :: (TokenParsing m , Monad m ) => m (Term Core User )
73+ comp :: (TokenParsing m , Monad m ) => m (Term ( Ann :+: Core ) User )
7374comp = braces (Core. do' <$> sepEndByNonEmpty statement semi) <?> " compound statement"
7475
75- statement :: (TokenParsing m , Monad m ) => m (Maybe (Named User ) Core. :<- Term Core User )
76+ statement :: (TokenParsing m , Monad m ) => m (Maybe (Named User ) Core. :<- Term ( Ann :+: Core ) User )
7677statement
7778 = try ((Core. :<-) . Just <$> name <* symbol " <-" <*> expr)
7879 <|> (Nothing Core. :<- ) <$> expr
7980 <?> " statement"
8081
81- ifthenelse :: (TokenParsing m , Monad m ) => m (Term Core User )
82+ ifthenelse :: (TokenParsing m , Monad m ) => m (Term ( Ann :+: Core ) User )
8283ifthenelse = Core. if'
8384 <$ reserved " if" <*> expr
8485 <* reserved " then" <*> expr
8586 <* reserved " else" <*> expr
8687 <?> " if-then-else statement"
8788
88- rec :: (TokenParsing m , Monad m ) => m (Term Core User )
89+ rec :: (TokenParsing m , Monad m ) => m (Term ( Ann :+: Core ) User )
8990rec = Core. rec <$ reserved " rec" <*> name <* symbolic ' =' <*> expr <?> " recursive binding"
9091
91- load :: (TokenParsing m , Monad m ) => m (Term Core User )
92+ load :: (TokenParsing m , Monad m ) => m (Term ( Ann :+: Core ) User )
9293load = Core. load <$ reserved " load" <*> expr
9394
94- lvalue :: (TokenParsing m , Monad m ) => m (Term Core User )
95+ lvalue :: (TokenParsing m , Monad m ) => m (Term ( Ann :+: Core ) User )
9596lvalue = choice
9697 [ projection
9798 , ident
@@ -103,7 +104,7 @@ lvalue = choice
103104name :: (TokenParsing m , Monad m ) => m (Named User )
104105name = named' <$> identifier <?> " name"
105106
106- lit :: (TokenParsing m , Monad m ) => m (Term Core User )
107+ lit :: (TokenParsing m , Monad m ) => m (Term ( Ann :+: Core ) User )
107108lit = let x `given` n = x <$ reserved n in choice
108109 [ Core. bool True `given` " #true"
109110 , Core. bool False `given` " #false"
@@ -118,13 +119,13 @@ lit = let x `given` n = x <$ reserved n in choice
118119 , ' \t ' <$ string " t"
119120 ] <?> " escape sequence"
120121
121- record :: (TokenParsing m , Monad m ) => m (Term Core User )
122+ record :: (TokenParsing m , Monad m ) => m (Term ( Ann :+: Core ) User )
122123record = Core. record <$ reserved " #record" <*> braces (sepEndBy ((,) <$> identifier <* symbolic ' :' <*> expr) comma)
123124
124- lambda :: (TokenParsing m , Monad m ) => m (Term Core User )
125+ lambda :: (TokenParsing m , Monad m ) => m (Term ( Ann :+: Core ) User )
125126lambda = Core. lam <$ lambduh <*> name <* arrow <*> expr <?> " lambda" where
126127 lambduh = symbolic 'λ' <|> symbolic ' \\ '
127128 arrow = symbol " →" <|> symbol " ->"
128129
129- ident :: (Monad m , TokenParsing m ) => m (Term Core User )
130+ ident :: (Monad m , TokenParsing m ) => m (Term ( Ann :+: Core ) User )
130131ident = pure . namedValue <$> name <?> " identifier"
0 commit comments