为什么 Parsec 停止使用多个解析器进行解析?

Mil*_*lzo 4 parsing haskell parsec

我正在尝试使用 Parsec 在 Haskell 中编写一个简单的解析器,但我的输入“Hello World”从未被正确解析。

我的代码如下所示:

parser = p1 <|> p2

p1 = string "Hello"
p2 = string "Hello World"
Run Code Online (Sandbox Code Playgroud)

如果我运行它,我会收到错误unexpected whitespace

Ant*_*esy 7

p1已经消耗了令牌“Hello”,因此p2立即失败,因为下一个令牌是空格。

您可以使用类似的方法try来重置消耗的令牌。

parser = try p1 <|> p2

p1 = string "Hello"
p2 = string "Hello World"
Run Code Online (Sandbox Code Playgroud)

  • 使用“try”的建议是正确的,但问题的诊断是错误的。由于 Parsec 替代方案的工作方式,当“p1”在**消耗输入后**失败时,替代方案会立即失败,而无需尝试“p2”。这是[我的旧答案](/sf/answers/4381983301/)中的一个解释。 (2认同)