Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parsing 转换\“;变成;使用Haskell/Parsec_Parsing_Haskell_Parsec - Fatal编程技术网

Parsing 转换\“;变成;使用Haskell/Parsec

Parsing 转换\“;变成;使用Haskell/Parsec,parsing,haskell,parsec,Parsing,Haskell,Parsec,我正在复习教程,有一个练习我无法解决 我们的字符串并不完全符合R5RS,因为它们不支持字符串内部引号的转义。更改parseString,以便\“给出一个文字引号字符,而不是终止字符串。您可能希望将noneOf“\”替换为一个新的解析器操作,该操作接受非引号字符或反斜杠后跟引号 实际的ParseString代码函数是: parseString :: Parser LispVal parseString = do char '"' x <- many (none

我正在复习教程,有一个练习我无法解决

我们的字符串并不完全符合R5RS,因为它们不支持字符串内部引号的转义。更改
parseString
,以便\“给出一个文字引号字符,而不是终止字符串。您可能希望将
noneOf“\”
替换为一个新的解析器操作,该操作接受非引号字符或反斜杠后跟引号

实际的ParseString代码函数是:

parseString :: Parser LispVal
parseString = do
        char '"'
        x <- many (noneOf "\"")
        char '"'
        return $ String x
parseString::Parser LispVal
parseString=do
字符''
x>return'”
将使用一个由\”组成的字符串,并返回一个双引号字符,但它没有按预期工作。我也在internet上进行了研究,但没有找到解决方案。

在Haskell中编写
“\”
将生成一个包含单个元素的字符串。这是因为Haskell解析器正在使用反斜杠,而它永远不会到达您的程序。您需要双重转义它,以便Haskell和您的解析器都满意

noneOf "\"\\" <|> (string "\\\"" >> return '"')
noneOf“\\”(字符串“\\\”>>return')

与您的问题无关,但我建议将
中的许多内容分解成一个单独的(可能是非导出的)函数。你的
parseString
看起来有点单一,这将是一个很好的模块化地方。谢谢你的提示!我会做一个小的语法改进,而不是
string“\\\\”>>return'”
你应该能够编写
”,为什么要使用
anyChar
?如果您使用“\”\\“
中的
noneOf,则顺序无关紧要。公平点。已编辑。唯一可能的问题是这不会(当前)如果后面没有引用的话,就要解析反斜杠。但我想OP正在修复添加其他反斜杠转义序列,所以这可能是我们希望它看起来的方式。谢谢你的建议!:)非常有魅力!谢谢你的回答
noneOf "\"\\" <|> (string "\\\"" >> return '"')