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