@@ -9,47 +9,48 @@ import Juvix.Extra.Paths
9
9
import Juvix.Parser.Error
10
10
import Text.Megaparsec qualified as P
11
11
12
- parseText :: Text -> Either MegaparsecError (LabelInfo , [Instruction ])
12
+ parseText :: Text -> Either ParserError (LabelInfo , [Instruction ])
13
13
parseText = runParser noFile
14
14
15
- runParser :: Path Abs File -> Text -> Either MegaparsecError (LabelInfo , [Instruction ])
15
+ runParser :: Path Abs File -> Text -> Either ParserError (LabelInfo , [Instruction ])
16
16
runParser fileName input_ =
17
- case run . runLabelInfoBuilder $ runParser' 0 (toFilePath fileName) input_ of
18
- (_, Left err) -> Left err
19
- (li, Right instrs) -> Right (li, instrs)
17
+ case run . runLabelInfoBuilder . runError @ SimpleParserError $ runParser' 0 (toFilePath fileName) input_ of
18
+ (_, Left err) -> Left (ErrSimpleParserError err)
19
+ (_, Right (Left err)) -> Left err
20
+ (li, Right (Right instrs)) -> Right (li, instrs)
20
21
21
- runParser' :: (Member LabelInfoBuilder r ) => Address -> FilePath -> Text -> Sem r (Either MegaparsecError [Instruction ])
22
+ runParser' :: (Member LabelInfoBuilder r ) => Address -> FilePath -> Text -> Sem r (Either ParserError [Instruction ])
22
23
runParser' addr fileName input_ = do
23
- e <- P. runParserT (parseToplevel addr) fileName input_
24
+ e <- runError @ SimpleParserError $ P. runParserT (parseToplevel addr) fileName input_
24
25
return $ case e of
25
- Left err -> Left (MegaparsecError err)
26
- Right instrs -> Right instrs
26
+ Left err -> Left (ErrSimpleParserError err)
27
+ Right (Left err) -> Left (ErrMegaparsec (MegaparsecError err))
28
+ Right (Right instrs) -> Right instrs
27
29
28
- parseToplevel :: (Member LabelInfoBuilder r ) => Address -> ParsecS r [Instruction ]
30
+ parseToplevel :: (Members '[ Error SimpleParserError , LabelInfoBuilder ] r ) => Address -> ParsecS r [Instruction ]
29
31
parseToplevel addr = do
30
32
instrs <- statements addr
31
33
P. eof
32
34
return instrs
33
35
34
- statements :: (Member LabelInfoBuilder r ) => Address -> ParsecS r [Instruction ]
36
+ statements :: (Members '[ Error SimpleParserError , LabelInfoBuilder ] r ) => Address -> ParsecS r [Instruction ]
35
37
statements addr = do
36
38
space
37
39
label' addr <|> statement' addr <|> return []
38
40
39
- statement' :: (Member LabelInfoBuilder r ) => Address -> ParsecS r [Instruction ]
41
+ statement' :: (Members '[ Error SimpleParserError , LabelInfoBuilder ] r ) => Address -> ParsecS r [Instruction ]
40
42
statement' addr = do
41
43
i <- instruction
42
44
(i : ) <$> statements (addr + 1 )
43
45
44
- label' :: (Member LabelInfoBuilder r ) => Address -> ParsecS r [Instruction ]
46
+ label' :: (Members '[ Error SimpleParserError , LabelInfoBuilder ] r ) => Address -> ParsecS r [Instruction ]
45
47
label' addr = do
46
48
l <- label addr
47
49
(l : ) <$> statements (addr + 1 )
48
50
49
- label :: (Member LabelInfoBuilder r ) => Address -> ParsecS r Instruction
51
+ label :: (Members '[ Error SimpleParserError , LabelInfoBuilder ] r ) => Address -> ParsecS r Instruction
50
52
label addr = P. try $ do
51
- off' <- P. getOffset
52
- txt <- identifier
53
+ (txt, loc) <- interval identifier
53
54
kw kwColon
54
55
msym <- lift $ getIdent txt
55
56
case msym of
@@ -61,12 +62,12 @@ label addr = P.try $ do
61
62
Just sym -> do
62
63
b <- lift $ hasOffset sym
63
64
if
64
- | b -> parseFailure off' " duplicate label"
65
+ | b -> parseFailure' loc " duplicate label"
65
66
| otherwise -> do
66
67
lift $ registerLabelAddress sym addr
67
68
return $ Label $ LabelRef {_labelRefSymbol = sym, _labelRefName = Just txt}
68
69
69
- instruction :: (Member LabelInfoBuilder r ) => ParsecS r Instruction
70
+ instruction :: (Members '[ Error SimpleParserError , LabelInfoBuilder ] r ) => ParsecS r Instruction
70
71
instruction =
71
72
parseHint
72
73
<|> parseNop
@@ -107,7 +108,7 @@ parseNop = do
107
108
kw kwNop
108
109
return Nop
109
110
110
- parseAlloc :: (Member LabelInfoBuilder r ) => ParsecS r Instruction
111
+ parseAlloc :: (Members '[ Error SimpleParserError , LabelInfoBuilder ] r ) => ParsecS r Instruction
111
112
parseAlloc = do
112
113
kw kwAp
113
114
kw kwPlusEq
@@ -118,7 +119,7 @@ parseAlloc = do
118
119
{ _instrAllocSize = i
119
120
}
120
121
121
- parseRValue :: forall r . (Member LabelInfoBuilder r ) => ParsecS r RValue
122
+ parseRValue :: forall r . (Members '[ Error SimpleParserError , LabelInfoBuilder ] r ) => ParsecS r RValue
122
123
parseRValue = load <|> binop <|> val
123
124
where
124
125
load :: ParsecS r RValue
@@ -166,27 +167,27 @@ parseRValue = load <|> binop <|> val
166
167
val :: ParsecS r RValue
167
168
val = Val <$> parseValue
168
169
169
- parseValue :: (Member LabelInfoBuilder r ) => ParsecS r Value
170
+ parseValue :: (Members '[ Error SimpleParserError , LabelInfoBuilder ] r ) => ParsecS r Value
170
171
parseValue = (Imm <$> parseImm) <|> (Ref <$> parseMemRef) <|> (Lab <$> parseLabel)
171
172
172
173
parseImm :: ParsecS r Immediate
173
174
parseImm = (^. withLocParam) <$> integer
174
175
175
- parseOffset :: ParsecS r Offset
176
+ parseOffset :: ( Member ( Error SimpleParserError ) r ) => ParsecS r Offset
176
177
parseOffset =
177
178
(kw kwPlus >> offset)
178
179
<|> (kw kwMinus >> (negate <$> offset))
179
180
<|> return 0
180
181
181
- parseMemRef :: ParsecS r MemRef
182
+ parseMemRef :: ( Member ( Error SimpleParserError ) r ) => ParsecS r MemRef
182
183
parseMemRef = do
183
184
lbracket
184
185
r <- register
185
186
off <- parseOffset
186
187
rbracket
187
188
return MemRef {_memRefReg = r, _memRefOff = off}
188
189
189
- parseLabel :: (Member LabelInfoBuilder r ) => ParsecS r LabelRef
190
+ parseLabel :: (Members '[ Error SimpleParserError , LabelInfoBuilder ] r ) => ParsecS r LabelRef
190
191
parseLabel = do
191
192
txt <- identifier
192
193
msym <- lift $ getIdent txt
@@ -204,7 +205,7 @@ parseIncAp = (kw delimSemicolon >> kw kwApPlusPlus >> return True) <|> return Fa
204
205
parseRel :: ParsecS r Bool
205
206
parseRel = (kw kwRel >> return True ) <|> (kw kwAbs >> return False ) <|> return True
206
207
207
- parseJump :: forall r . (Member LabelInfoBuilder r ) => ParsecS r Instruction
208
+ parseJump :: forall r . (Members '[ Error SimpleParserError , LabelInfoBuilder ] r ) => ParsecS r Instruction
208
209
parseJump = do
209
210
kw kwJmp
210
211
P. try jmpIf <|> jmp
@@ -240,7 +241,7 @@ parseJump = do
240
241
_instrJumpComment = Nothing
241
242
}
242
243
243
- parseCall :: (Member LabelInfoBuilder r ) => ParsecS r Instruction
244
+ parseCall :: (Members '[ Error SimpleParserError , LabelInfoBuilder ] r ) => ParsecS r Instruction
244
245
parseCall = do
245
246
kw kwCall
246
247
isRel <- parseRel
@@ -258,19 +259,19 @@ parseReturn = do
258
259
kw kwRet
259
260
return Return
260
261
261
- parseAssert :: ParsecS r Instruction
262
+ parseAssert :: ( Member ( Error SimpleParserError ) r ) => ParsecS r Instruction
262
263
parseAssert = do
263
264
kw kwAssert
264
265
r <- parseMemRef
265
266
return $ Assert $ InstrAssert {_instrAssertValue = r}
266
267
267
- parseTrace :: (Member LabelInfoBuilder r ) => ParsecS r Instruction
268
+ parseTrace :: (Members '[ Error SimpleParserError , LabelInfoBuilder ] r ) => ParsecS r Instruction
268
269
parseTrace = do
269
270
kw kwTrace
270
271
v <- parseRValue
271
272
return $ Trace $ InstrTrace {_instrTraceValue = v}
272
273
273
- parseAssign :: forall r . (Member LabelInfoBuilder r ) => ParsecS r Instruction
274
+ parseAssign :: forall r . (Members '[ Error SimpleParserError , LabelInfoBuilder ] r ) => ParsecS r Instruction
274
275
parseAssign = do
275
276
res <- parseMemRef
276
277
kw kwEq
0 commit comments