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

Commit e9b21f6

Browse files
committed
Generate terms capable of annotation in the parser.
1 parent 01f1176 commit e9b21f6

File tree

1 file changed

+18
-17
lines changed

1 file changed

+18
-17
lines changed

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

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,9 @@ module Data.Core.Parser
1010
-- Consult @doc/grammar.md@ for an EBNF grammar.
1111

1212
import Control.Applicative
13+
import Control.Effect.Sum
1314
import qualified Data.Char as Char
14-
import Data.Core (Core)
15+
import Data.Core (Ann, Core)
1516
import qualified Data.Core as Core
1617
import Data.Foldable (foldl')
1718
import 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)
5051
core = expr
5152

52-
expr :: (TokenParsing m, Monad m) => m (Term Core User)
53+
expr :: (TokenParsing m, Monad m) => m (Term (Ann :+: Core) User)
5354
expr = 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)
5657
assign = 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)
5960
application = 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)
6263
projection = 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)
6566
atom = 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)
7374
comp = 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)
7677
statement
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)
8283
ifthenelse = 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)
8990
rec = 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)
9293
load = 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)
9596
lvalue = choice
9697
[ projection
9798
, ident
@@ -103,7 +104,7 @@ lvalue = choice
103104
name :: (TokenParsing m, Monad m) => m (Named User)
104105
name = 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)
107108
lit = 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)
122123
record = 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)
125126
lambda = 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)
130131
ident = pure . namedValue <$> name <?> "identifier"

0 commit comments

Comments
 (0)