簡體   English   中英

使用Haskell / Parsec將\\“轉換為”

[英]Transforming \“ into ” using Haskell / Parsec

我正在閱讀“ 自己編寫計划”教程,並且有一個我無法解決的練習。

我們的字符串不完全符合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進行了研究,但沒有找到了解決方案。

在Haskell中寫"\\""會產生一個帶有單個元素的字符串,這是因為Haskell解析器消耗了反斜杠,並且它永遠不會進入程序。您需要對其進行兩次轉義,以使Haskell和您的解析器都滿意。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM