使用Text.ParserCombinators编写解析器

时间:2016-01-24 22:05:32

标签: parsing haskell

在课堂上,我们通过定义自己的Parser类型来编写解析器,这给了我们很大的灵活性。例如,如果我们想制作代码并解析出来,那就是#34; [at]"作为' @',我们可以写

atParser = Parser $ \s ->
    case s of
        w:x:y:z:zs ->
            | (w:x:y:z:[]) == "[at]" = ['@',zs]
            | otherwise = []
        zs -> []

但是,我无法弄清楚如何使用Text.ParserCombinators实现这种解析器。有可能吗?

由于

1 个答案:

答案 0 :(得分:1)

我相信你正在寻找string combinator

λ> :set -package parsec
package flags have changed, resetting and loading new packages...

λ> import Text.Parsec

λ> :t string
string :: Stream s m Char => String -> ParsecT s u m String

λ> parse (string "[at]") "" "[at]"
Right "[at]"

λ> parse (string "[at]") "" "[at"
Left (line 1, column 1):
unexpected end of input
expecting "[at]"

λ> parse ('@' <$ string "[at]") "" "[at]"
Right '@'