1

我正在使用 Parsec 在 Haskell 中开发解析器。问题在于读取字符串"| "。当我尝试阅读以下内容时,

parseExpr = parseAtom
         -- | ...
         <|> do string "{|"      
                args <- try parseList <|> parseDottedList
                string "| "
                body <- try parseExpr
                string " }"
                return $ List [Atom "lambda", args, body]

我收到以下解析错误。

Lampas >> {|a b| "a" }
Parse error at "lisp" (line 1, column 12):
unexpected "}"
expecting letter, "\"", digit, "'", "(", "[", "{|" or "."   

另一个失败的案例是^以下内容。

Lampas >> {|a b^ "a" }
Parse error at "lisp" (line 1, column 12):
unexpected "}"
expecting letter, "\"", digit, "'", "(", "[", "{|" or "."                

但是,当字符串"| "替换为"} ".

parseExpr = parseAtom
     -- | ...
     <|> do string "{|"      
            args <- try parseList <|> parseDottedList
            string "} "
            body <- try parseExpr
            string " }"
            return $ List [Atom "lambda", args, body]

以下是经过上述修改的 REPL 行为。

Lampas >> {|a b} "a" }
(lambda ("a" "b") ...)                

所以问题是(a)管道在 Haskell 字符串中是否有特殊行为,也许只有在<|>链中?,以及(b)如何避免这种行为?.

4

1 回答 1

0

该字符|可能在一组保留字符中。使用其他字符进行测试,例如^,我认为它也会失败。解决此问题的唯一方法可能是更改保留字符集或解释器的结构。

于 2013-07-18T05:07:02.937 回答