Haskell 为什么这段代码在使用parsec时会产生一个解析异常,而在Graham Huttons简单示例库中却没有?

Haskell 为什么这段代码在使用parsec时会产生一个解析异常,而在Graham Huttons简单示例库中却没有?,haskell,parsec,Haskell,Parsec,我最近试着进入parsec,我偶然发现了一个解释函数式解析基本原理的视频。显示了一个简单的演示库,其语法类似于parsec。函数组合的工作原理非常相似。此代码段在库中正常工作。但是,如果我用parsec运行这段代码,它会给我一个解析错误(意外字符) 模块P,其中 导入Text.ParserCombinators.Parsec 语法分析器int int=do 你有失败的代码段吗?这两个库之间可能存在的差异是回溯:大多数示例解析器都做了大量回溯,但出于性能原因(以及因为它可以提供更好的错误消息),p

我最近试着进入parsec,我偶然发现了一个解释函数式解析基本原理的视频。显示了一个简单的演示库,其语法类似于parsec。函数组合的工作原理非常相似。此代码段在库中正常工作。但是,如果我用parsec运行这段代码,它会给我一个解析错误(意外字符)

模块P,其中
导入Text.ParserCombinators.Parsec
语法分析器int
int=do

你有失败的代码段吗?这两个库之间可能存在的差异是回溯:大多数示例解析器都做了大量回溯,但出于性能原因(以及因为它可以提供更好的错误消息),parsec没有这样做。回溯在
expr
中。两种备选方案都以
术语开始。同样地,在
术语
中,两个备选方案都以
因子
开始。
module P where

import Text.ParserCombinators.Parsec

int :: Parser Int
int = do
    x <- many digit
    return (read x)

expr = do
    x <- term
    char '+'
    y <- expr
    return (x+y)
  <|> term

term = do
    x <- factor
    char '*'
    y <- term
    return (x*y)
  <|> factor

factor = do
    char '('
    x <- expr
    char ')'
    return x
  <|> int