我正在阅读Write Yourself A Scheme教程,有一个练习无法解决。
我们的字符串不完全符合R5RS,因为它们不支持在字符串中转义内部引号。更改
parseString
,以使\“给出文字引号而不是终止字符串。您可能希望将noneOf "\""
替换为新的解析器操作,该操作可以接受非引号字符或反斜杠,后跟一个引号。
实际的ParseString代码功能是:
parseString :: Parser LispVal
parseString = do
char '"'
x <- many (noneOf "\"")
char '"'
return $ String x
我已经尝试了很多方法来做到这一点。我尝试的解决方案是:
parseString :: Parser LispVal
parseString = do
char '"'
x <- many (satisfy (/= '"') <|> (string "\"" >> return '"'))
char '"'
return $ String x
我的基本原理是(string "\"" >> return '"')
将使用\“组成的字符串并返回一个双引号字符,但是它没有按预期工作。我也通过Internet进行了研究,但没有找到解决方案。 / p>
答案 0 :(得分:2)
在Haskell中编写"\""
会生成一个包含单个元素的字符串。那是因为Haskell解析器正在消耗反斜杠,并且它永远不会进入您的程序。您需要对其进行两次转义,以使Haskell和您的解析器都满意。
noneOf "\"\\" <|> (string "\\\"" >> return '"')