String Haskell:字符串分析器无法识别转义双引号
我有这个解析器(在48小时内编写Lisp的练习):String Haskell:字符串分析器无法识别转义双引号,string,haskell,parsec,String,Haskell,Parsec,我有这个解析器(在48小时内编写Lisp的练习): import Text.ParserCombinators.Parsec 进口管制 data LispVal=字符串派生显示 parseString::Parser LispVal parseString=do char'' x'\n' 'r'->'\r' 't'->'\t' 因此,这段代码似乎适用于包含所有转义字符的字符串,只有当字符为\“时,它似乎才结束字符串 我收到一个警告,因为模式匹配不是详尽的,一般情况下应该是什么 在“some\
import Text.ParserCombinators.Parsec
进口管制
data LispVal=字符串派生显示
parseString::Parser LispVal
parseString=do char''
x'\n'
'r'->'\r'
't'->'\t'
因此,这段代码似乎适用于包含所有转义字符的字符串,只有当字符为\“时,它似乎才结束字符串
- 我收到一个警告,因为模式匹配不是详尽的,一般情况下应该是什么
- 在“some\”string这样的情况下,代码似乎失败了,它成功了,但返回“some”
- 我看不出这方面有任何问题:
λ *Main > parseTest parseString $ show "some\"string"
String "some\"string"
λ *Main > show "some\"string"
"\"some\\\"string\""
λ *Main > parseTest parseString "\"some\\\"string\""
String "some\"string"
-- This happened? Escaping is tricky.
λ *Main > parseTest parseString "\"some\"string\""
String "some"
请使您的代码自包含。特别是,添加所需的导入。您可以忽略编译器警告,或添加一个case
->undefined
以关闭编译器(从逻辑角度看,这很好)-除此之外,您的代码对我来说很好“返回完整的内部字符串:string”\“你好”
顺便说一句:如果你写['\\','\'']
,它的可读性(比“\\\\”
)要高得多(就像你对其中一个所做的那样):你的例子也很有效,但当然你必须将它作为“\\\\\\\\\\\\\\\\\\\\\\\”someString\\\\\”
输入到GHCi中(是的,你必须逃避逃避;))请注意,'“
和'\”
是等价的。我这么说是因为你在代码中都使用了这两种方法。感谢show
的技巧,这使它更容易测试!
λ *Main > parseTest parseString $ show "some\"string"
String "some\"string"
λ *Main > show "some\"string"
"\"some\\\"string\""
λ *Main > parseTest parseString "\"some\\\"string\""
String "some\"string"
-- This happened? Escaping is tricky.
λ *Main > parseTest parseString "\"some\"string\""
String "some"