Haskell Parsec:撤消失败的许多人

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.我想知道你如何解决它,直到它失败,如果它失败你撤消字符消耗.

kos*_*kus 5

试试这个:

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)

您需要将添加trypathPiece.否则,解析决赛/将使Parsec认为新的pathPiece已经开始,没有try,没有回溯.此外,除非你真的想需要一个最终的/,你需要使它optional.该功能try不会这样做.