为何Parsec多解析器会终止解析?Haskell解析"Hello World"失败
Parsec解析"Hello World"失败的原因及解决办法
你的问题出在Parsec的<|>解析器组合子的行为上:它会优先尝试第一个解析器,只要匹配成功就不会再尝试后面的。
当输入是"Hello World"时,p1会先匹配开头的"Hello",匹配成功后直接返回结果,剩下的" World"没有被后续解析逻辑处理,因此触发unexpected whitespace(意外的空白字符)错误。
解决方法
有两种常见处理方式:
- 调换解析器顺序,把更长的匹配放在前面:
parser = p2 <|> p1 p1 = string "Hello" p2 = string "Hello World"
这样会先尝试匹配完整的"Hello World",只有当匹配失败时才会尝试p1。
- 确保整个输入被完全解析,添加
eof验证输入结束:
import Text.Parsec (eof) parser = (p1 <|> p2) <* eof p1 = string "Hello" p2 = string "Hello World"
这种方式下,如果p1匹配后还有剩余输入(比如"Hello"后面的空格),会直接报错,避免只解析部分输入的情况。
内容的提问来源于stack exchange,提问作者Milzo
相关产品推荐
相关产品推荐

