Skip to content
This repository was archived by the owner on Apr 1, 2025. It is now read-only.

Commit 4fdef93

Browse files
committed
Generalize the parser to arbitrary carriers for Core.
1 parent e2db378 commit 4fdef93

File tree

1 file changed

+19
-20
lines changed

1 file changed

+19
-20
lines changed

semantic-core/src/Data/Core/Parser.hs

Lines changed: 19 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
{-# LANGUAGE TypeOperators #-}
1+
{-# LANGUAGE FlexibleContexts, TypeOperators #-}
22
module 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

1212
import Control.Applicative
13-
import Control.Effect.Sum
13+
import Control.Effect.Carrier
1414
import qualified Data.Char as Char
15-
import Data.Core (Ann, Core)
15+
import Data.Core (Core)
1616
import qualified Data.Core as Core
1717
import Data.Foldable (foldl')
1818
import Data.Name
1919
import Data.String
20-
import Data.Term
2120
import qualified Text.Parser.Token as Token
2221
import qualified Text.Parser.Token.Highlight as Highlight
2322
import 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)
5150
core = 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)
5453
expr = 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)
5756
assign = 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)
6059
application = 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)
6362
projection = 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)
6665
atom = 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)
7473
comp = 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)
7776
statement
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)
8382
ifthenelse = 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)
9089
rec = 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)
9392
load = 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)
9695
lvalue = choice
9796
[ projection
9897
, ident
@@ -104,7 +103,7 @@ lvalue = choice
104103
name :: (TokenParsing m, Monad m) => m (Named User)
105104
name = 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)
108107
lit = 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)
123122
record = 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)
126125
lambda = 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)
131130
ident = pure . namedValue <$> name <?> "identifier"

0 commit comments

Comments
 (0)