MCH*_*MCH 3 parsing haskell parsec
我在这里有一些代码用于将URI路径解析为字符串列表.例如/user/home会成为["user", "home"].
pathPiece :: Parser String
pathPiece = do
char '/'
path <- many1 urlBaseChar
return path
uriPath :: Parser [String]
uriPath = do
pieces <- many pathPiece
try $ char '/'
return pieces
parseUriPath :: String -> [String]
parseUriPath input = case parse uriPath "(unknown)" input of
Left _ -> []
Right xs -> xs
Run Code Online (Sandbox Code Playgroud)
但是,如果路径以另一个路径结束,/例如/user/home/应该是合法路径,则解析器将失败.这是因为pathPiece无法解析最后一个,/因为没有后续的urlBaseChars.我想知道你如何解决它,直到它失败,如果它失败你撤消字符消耗.
试试这个:
pathPiece :: Parser String
pathPiece = try $ do
char '/'
many1 urlBaseChar
uriPath :: Parser [String]
uriPath = do
pieces <- many pathPiece
optional (char '/')
return pieces
Run Code Online (Sandbox Code Playgroud)
您需要将添加try到pathPiece.否则,解析决赛/将使Parsec认为新的pathPiece已经开始,没有try,没有回溯.此外,除非你真的想需要一个最终的/,你需要使它optional.该功能try不会这样做.