我正在使用 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)如何避免这种行为?.