Sib*_*ibi 5 parsing haskell parsec
我想像这样解析输入字符串: "this is \"test \" message \"sample\" text"
现在,我编写了一个解析器来解析单个文本而没有任何引号:
parseString :: Parser String
parseString = do
char '"'
x <- (many $ noneOf "\"")
char '"'
return x
Run Code Online (Sandbox Code Playgroud)
这解析简单的字符串,如下所示: "test message"
然后我为引用的字符串编写了一个解析器:
quotedString :: Parser String
quotedString = do
initial <- string "\\\""
x <- many $ noneOf "\\\""
end <- string "\\\""
return $ initial ++ x ++ end
Run Code Online (Sandbox Code Playgroud)
这个解析器的字符串是这样的: \"test message\"
有没有办法可以将两个解析器结合起来,以便获得我想要的目标?究竟解决这个问题的方法究竟是什么?
Aad*_*hah 20
这就是我要做的:
escape :: Parser String
escape = do
d <- char '\\'
c <- oneOf "\\\"0nrvtbf" -- all the characters which can be escaped
return [d, c]
nonEscape :: Parser Char
nonEscape = noneOf "\\\"\0\n\r\v\t\b\f"
character :: Parser String
character = fmap return nonEscape <|> escape
parseString :: Parser String
parseString = do
char '"'
strings <- many character
char '"'
return $ concat strings
Run Code Online (Sandbox Code Playgroud)
现在您需要做的就是调用它:
parse parseString "test" "\"this is \\\"test \\\" message \\\"sample\\\" text\""
Run Code Online (Sandbox Code Playgroud)
Parser组合器起初有点难以理解,但是一旦掌握了它,它们就比编写BNF语法更容易.
| 归档时间: |
|
| 查看次数: |
3595 次 |
| 最近记录: |