在Parsec有什么办法表达结束吗?

时间:2016-08-02 09:43:41

标签: haskell parsec

我正在尝试实现一些parse函数,它只接受这个字符串末尾的某个特定字符,如果使用正则表达式给出字符为.*!$,则该字符为!

我尝试使用以下函数,但它不起作用,因为它会在匹配结束之前使用字符。

endWith :: Char -> Parser ()
endWith x = many anyChar >> char x >> return ()

需要注意的一点是:"ab!cd!"的预期输出为("ab!cd!", ""),此解析器根本不应使用"ab!cd",因为它不会以{{1}结尾}。使用!

时,全部或北向非常重要

是否可以使用Parsec?我想一些高级组合是需要的。

3 个答案:

答案 0 :(得分:3)

manyTill这样做。

endWith :: Char -> Parser String
endWith x = anyChar `manyTill` char x

答案 1 :(得分:3)

这是一个成功解析"ab!""ab!cd!"但拒绝"ab""ab!cd"的人:

import Text.Parsec
import Text.Parsec.String

endWith :: Char -> Parser String
endWith c = manyTill anyChar (try $ char c <* eof)

(请注意,返回的结果不包括尾随c):

"ab!"      Succeeds with "ab"
"ab!cd!"   Succeeds with "ab!cd"
"ab"       Fails
"ab!cd"    Fails

答案 2 :(得分:0)

这是你在找什么?

import Text.Parsec
import Text.Parsec.String

endWith :: Char -> Parser String
endWith x = do cs <- many anyChar -- consume rest of input
               case cs of
                 [] -> fail "expecting !"
                 _  -> if last cs == '!' then return cs
                                         else fail "did not end in !"

test1 = parseTest (endWith '!') "This is a test!"
test2 = parseTest (endWith '!') "ab!cd!"
test3 = parseTest (endWith '!') "ab!cd"