Parsing Haskell解析器在读取“|”时失败

Parsing Haskell解析器在读取“|”时失败,parsing,haskell,interpreter,parsec,Parsing,Haskell,Interpreter,Parsec,我正在使用Parsec在Haskell中开发一个解析器。问题在于读取字符串|。当我尝试阅读以下内容时 parseExpr = parseAtom -- | ... <|> do string "{|" args <- try parseList <|> parseDottedList string "| " body <

我正在使用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" }
(lambda ("a" "b") ...)                
另一个失败的案例是^,它包含以下内容

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 "."                
Lampas >> {|a b} "a" }
(lambda ("a" "b") ...)                
但是,当字符串|替换为}时,它会按预期工作

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

因此,问题是a管道在Haskell字符串中是否有特殊行为,可能仅在链中?b如何避免这种行为?

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

什么是parseList和parseDottedList?@Ankur其他读入函数,如char或spaces。请尝试使用另一个在解析中未使用的字符(如您选择的})对其进行更改,看看是Haskell还是你的朋友grammar@chamini2我是用}而不是|工作的,你是说再试一次?我知道问题在于|和|单独。请尝试使用语法中不使用的字符,例如^或类似的字符,因为您已经在语法中使用了},这可能是因为解析器跳过了第二个}
Lampas >> {|a b| "a" }
Parse error at "lisp" (line 1, column 12):
unexpected "}"
expecting letter, "\"", digit, "'", "(", "[", "{|" or "."   
Lampas >> {|a b} "a" }
(lambda ("a" "b") ...)