使用Haskell / Parsec将\“转换为”

时间:2018-08-02 02:53:16

标签: parsing haskell parsec

我正在阅读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>

1 个答案:

答案 0 :(得分:2)

在Haskell中编写"\""会生成一个包含单个元素的字符串。那是因为Haskell解析器正在消耗反斜杠,并且它永远不会进入您的程序。您需要对其进行两次转义,以使Haskell和您的解析器都满意。

noneOf "\"\\" <|> (string "\\\"" >> return '"')