Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix parseFailure in the parsers #3355

Merged
merged 7 commits into from
Mar 19, 2025
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 18 additions & 9 deletions app/Commands/Dev/Anoma/Prove/Options/ProveArg.hs
Original file line number Diff line number Diff line change
@@ -12,8 +12,7 @@ import CommonOptions
import Juvix.Data.IntegerWithBase
import Juvix.Parser.Lexer
import Juvix.Prelude.Parsing hiding (many, option)

type Parse = Parsec Void Text
import Juvix.Prelude.Parsing qualified as P

newtype ProveArg' = ProveArg'
{ _proveArg :: Sigma ProveArgTag ProveArgTypeSym0
@@ -68,6 +67,9 @@ parseProveArg = fromProveArg' <$> parseProveArg'
_argFileSpecDecoding = d
}

data NegativeError = NegativeError
deriving stock (Show)

parseProveArg' :: Parser ProveArg'
parseProveArg' =
option
@@ -78,14 +80,14 @@ parseProveArg' =
<> helpDoc ("An argument to the program:" <> line <> proveArgTagHelp)
)
where
pProveArgTag :: Parse ProveArgTag
pProveArgTag :: ParsecS r ProveArgTag
pProveArgTag =
choice
[ chunk (show a) $> a
| a :: ProveArgTag <- allElements
]

pAppPath :: Parse (AppPath File)
pAppPath :: ParsecS r (AppPath File)
pAppPath = do
i <- mkPrepath . unpack <$> takeRest
return
@@ -94,15 +96,15 @@ parseProveArg' =
_pathPath = i
}

pProveArg' :: Parse ProveArg'
pProveArg' :: (Member (Error NegativeError) r) => ParsecS r ProveArg'
pProveArg' = do
dty <- pProveArgTag
withSomeSing dty $ \ty -> do
chunk ":"
a <- pProveArgType ty
return (ProveArg' (ty :&: a))

pProveArgType :: SProveArgTag t -> Parse (ProveArgType t)
pProveArgType :: (Member (Error NegativeError) r) => SProveArgTag t -> ParsecS r (ProveArgType t)
pProveArgType p = do
ret <- case p of
SProveArgTagByteArray -> pAppPath
@@ -112,13 +114,20 @@ parseProveArg' =
SProveArgTagBase64UnJammed -> pAppPath
SProveArgTagBytesUnJammed -> pAppPath
SProveArgTagNat -> do
off <- getOffset
i <- (^. withLocParam . integerWithBaseValue) <$> integerWithBase'
if
| i < 0 -> parseFailure off "Expected a non-negative integer"
| i < 0 -> P.lift $ throw NegativeError
| otherwise -> return (fromIntegral i)
eof
return ret

pp :: ReadM ProveArg'
pp = eitherReader $ \strInput -> parseHelper pProveArg' (pack strInput)
pp = eitherReader $ \strInput ->
let e =
run
. runError @NegativeError
$ parseHelperS pProveArg' (pack strInput)
in case e of
Left _ -> Left "Expected a non-negative integer"
Right (Left s) -> Left s
Right (Right a) -> Right a
4 changes: 2 additions & 2 deletions app/Commands/Dev/Tree/Repl.hs
Original file line number Diff line number Diff line change
@@ -56,7 +56,7 @@ readProgram f = do
bs <- State.gets (^. replStateBuilderState)
txt <- readFile f
case parseText' bs txt of
Left e -> error (show e)
Left e -> error (renderTextDefault e)
Right bs' ->
State.modify (set replStateBuilderState bs')

@@ -77,7 +77,7 @@ readNode :: String -> Repl Node
readNode s = do
bs <- State.gets (^. replStateBuilderState)
case parseNodeText' bs replFile (strip (pack s)) of
Left e -> error (show e)
Left e -> error (renderTextDefault e)
Right (bs', n) -> do
State.modify (set replStateBuilderState bs')
return n
4 changes: 2 additions & 2 deletions src/Anoma/Client/Base.hs
Original file line number Diff line number Diff line change
@@ -78,9 +78,9 @@ anomaClientCreateProcess launchMode = do
setupAnomaClientProcess :: forall r. (Members '[EmbedIO, Logger, Error SimpleError] r) => Handle -> Sem r AnomaClientInfo
setupAnomaClientProcess nodeOut = do
ln <- hGetLine nodeOut
let parseError = throw (SimpleError (mkAnsiText ("Failed to parse the client grpc port when starting the anoma node and client.\nExpected a number but got " <> ln)))
let parsingError = throw (SimpleError (mkAnsiText ("Failed to parse the client grpc port when starting the anoma node and client.\nExpected a number but got " <> ln)))
let parseInt :: Text -> Sem r Int
parseInt = either (const parseError) return . readEither . unpack
parseInt = either (const parsingError) return . readEither . unpack
(grpcPort, nodeId) <- case T.words ln of
[grpcPortStr, nodeIdStr] -> (,) <$> parseInt grpcPortStr <*> pure nodeIdStr
_ -> throw (SimpleError (mkAnsiText ("Could not parse Anoma client output. Expected <grpcPort> <node_id>, got: " <> ln)))
35 changes: 17 additions & 18 deletions src/Juvix/Compiler/Asm/Translation/FromSource.hs
Original file line number Diff line number Diff line change
@@ -32,28 +32,27 @@ parseAsmSig =
_parserSigEmptyExtra = mempty
}

parseText :: Text -> Either MegaparsecError Module
parseText :: Text -> Either ParserError Module
parseText = runParser noFile

parseText' :: BuilderState -> Text -> Either MegaparsecError BuilderState
parseText' :: BuilderState -> Text -> Either ParserError BuilderState
parseText' bs = runParser' bs noFile

runParser :: Path Abs File -> Text -> Either MegaparsecError Module
runParser :: Path Abs File -> Text -> Either ParserError Module
runParser = runParserS parseAsmSig

runParser' :: BuilderState -> Path Abs File -> Text -> Either MegaparsecError BuilderState
runParser' :: BuilderState -> Path Abs File -> Text -> Either ParserError BuilderState
runParser' = runParserS' parseAsmSig

parseCode ::
(Members '[Reader ParserSig, InfoTableBuilder, State LocalParams] r) =>
(Members '[Error SimpleParserError, Error SimpleParserError, Reader ParserSig, InfoTableBuilder, State LocalParams] r) =>
ParsecS r Code
parseCode = P.sepEndBy command (kw delimSemicolon)

command ::
(Members '[Reader ParserSig, InfoTableBuilder, State LocalParams] r) =>
(Members '[Error SimpleParserError, Reader ParserSig, InfoTableBuilder, State LocalParams] r) =>
ParsecS r Command
command = do
off <- P.getOffset
(txt, i) <- identifierL
let loc = Just i
case txt of
@@ -141,10 +140,10 @@ command = do
"tsave" ->
parseSave loc True
_ ->
parseFailure off ("unknown instruction: " ++ fromText txt)
parsingError' i ("unknown instruction: " ++ fromText txt)

parseSave ::
(Members '[Reader ParserSig, InfoTableBuilder, State LocalParams] r) =>
(Members '[Error SimpleParserError, Reader ParserSig, InfoTableBuilder, State LocalParams] r) =>
Maybe Interval ->
Bool ->
ParsecS r Command
@@ -165,12 +164,12 @@ parseSave loc isTail = do
)

value ::
(Members '[Reader ParserSig, InfoTableBuilder, State LocalParams] r) =>
(Members '[Error SimpleParserError, Reader ParserSig, InfoTableBuilder, State LocalParams] r) =>
ParsecS r Value
value = (Constant <$> constant) <|> (Ref <$> memRef @Code @(Maybe FunctionInfoExtra))

instrAllocClosure ::
(Members '[Reader ParserSig, InfoTableBuilder, State LocalParams] r) =>
(Members '[Error SimpleParserError, Reader ParserSig, InfoTableBuilder, State LocalParams] r) =>
ParsecS r InstrAllocClosure
instrAllocClosure = do
sym <- funSymbol @Code @(Maybe FunctionInfoExtra) @DirectRef
@@ -183,7 +182,7 @@ instrExtendClosure = do
return $ InstrExtendClosure (fromInteger argsNum)

instrCall ::
(Members '[Reader ParserSig, InfoTableBuilder, State LocalParams] r) =>
(Members '[Error SimpleParserError, Reader ParserSig, InfoTableBuilder, State LocalParams] r) =>
ParsecS r InstrCall
instrCall = do
ct <- parseCallType
@@ -197,7 +196,7 @@ instrCall = do
return (InstrCall ct argsNum)

parseCallType ::
(Members '[Reader ParserSig, InfoTableBuilder, State LocalParams] r) =>
(Members '[Error SimpleParserError, Reader ParserSig, InfoTableBuilder, State LocalParams] r) =>
ParsecS r CallType
parseCallType = (kw kwDollar $> CallClosure) <|> (CallFun <$> funSymbol @Code @(Maybe FunctionInfoExtra) @DirectRef)

@@ -207,12 +206,12 @@ instrCallClosures = do
return (InstrCallClosures (fromInteger argsNum))

branchCode ::
(Members '[Reader ParserSig, InfoTableBuilder, State LocalParams] r) =>
(Members '[Error SimpleParserError, Reader ParserSig, InfoTableBuilder, State LocalParams] r) =>
ParsecS r Code
branchCode = braces parseCode <|> (command >>= \x -> return [x])

trueBranch ::
(Members '[Reader ParserSig, InfoTableBuilder, State LocalParams] r) =>
(Members '[Error SimpleParserError, Reader ParserSig, InfoTableBuilder, State LocalParams] r) =>
ParsecS r Code
trueBranch = do
symbol "true:"
@@ -221,7 +220,7 @@ trueBranch = do
return c

falseBranch ::
(Members '[Reader ParserSig, InfoTableBuilder, State LocalParams] r) =>
(Members '[Error SimpleParserError, Reader ParserSig, InfoTableBuilder, State LocalParams] r) =>
ParsecS r Code
falseBranch = do
symbol "false:"
@@ -230,7 +229,7 @@ falseBranch = do
return c

caseBranch ::
(Members '[Reader ParserSig, InfoTableBuilder, State LocalParams] r) =>
(Members '[Error SimpleParserError, Reader ParserSig, InfoTableBuilder, State LocalParams] r) =>
ParsecS r CaseBranch
caseBranch = do
tag <- P.try $ constrTag @Code @(Maybe FunctionInfoExtra) @DirectRef
@@ -240,7 +239,7 @@ caseBranch = do
return c

defaultBranch ::
(Members '[Reader ParserSig, InfoTableBuilder, State LocalParams] r) =>
(Members '[Error SimpleParserError, Reader ParserSig, InfoTableBuilder, State LocalParams] r) =>
ParsecS r Code
defaultBranch = do
symbol "default:"
Loading
Loading