Parsing Haskell Parsec:撤消失败的多个

Parsing Haskell Parsec:撤消失败的多个,parsing,haskell,parsec,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 tr

我这里有一些代码,用于将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
pathPiece::解析器字符串
路径片
字符“/”
路径[]
右xs->xs
但是,如果路径以另一个
/
结尾,例如
/user/home/
,该路径应该是合法路径,则解析器将失败。这是因为pathPiece无法解析最后一个
/
,因为没有以下URLBASECHAR。我想知道如何使用many解析直到失败,如果失败,则撤消字符使用。

尝试以下方法:

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

uriPath :: Parser [String]
uriPath = do
    pieces <- many pathPiece
    optional (char '/')
    return pieces
pathPiece::解析器字符串
pathPiece=try$do
字符“/”
许多urlBaseChar
uriPath::解析器[字符串]
uriPath=do

片段我想你可以在这里使用
many1 urlBaseChar`sepEndBy`char'/'
。请参见Parsec。

感谢kosmikus的帮助。这正合适,我学到了一些关于Parsec;)关于风格的一点注记,
do{x