Haskell Parsec:撤消失败的许多人

时间:2014-04-11 04:20:39

标签: 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

但是,如果路径以另一个/结束,例如/user/home/,它应该是合法路径,则解析器将失败。这是因为pathPiece无法解析最后的/,因为没有后续的urlBaseChars。我想知道你如何解决它,直到它失败,如果它失败你撤消字符消耗。

2 个答案:

答案 0 :(得分:5)

试试这个:

pathPiece :: Parser String   
pathPiece = try $ do
    char '/'
    many1 urlBaseChar

uriPath :: Parser [String]
uriPath = do
    pieces <- many pathPiece
    optional (char '/')
    return pieces

您需要向try添加pathPiece。否则,解析最终的/将使Parsec成为可能 认为新的pathPiece已经开始,没有try,就没有回溯。也, 除非您确实想要要求最终/,否则您需要将其设为optional。该 函数try不会这样做。

答案 1 :(得分:1)

我认为你可以在这里使用many1 urlBaseChar `sepEndBy` char '/'。请参阅Parsec中的sepEndBy