在课堂上,我们通过定义自己的Parser类型来编写解析器,这给了我们很大的灵活性。例如,如果我们想制作代码并解析出来,那就是#34; [at]"作为' @',我们可以写
atParser = Parser $ \s ->
case s of
w:x:y:z:zs ->
| (w:x:y:z:[]) == "[at]" = ['@',zs]
| otherwise = []
zs -> []
但是,我无法弄清楚如何使用Text.ParserCombinators实现这种解析器。有可能吗?
由于
答案 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 '@'