【发布时间】:2011-09-08 22:12:13
【问题描述】:
我目前正在使用Text.Parsec.Expr 模块来解析脚本语言的一个子集。
基本上,这种语言有两种命令:$var = expr 形式的赋值和$var = $array[$index] 形式的命令 - 当然还有其他命令,但这足以解释我的问题。
我创建了一个类型 Command 来表示它以及相应的解析器,其中分配的 expr 由 Parsec 的 buildExpressionParser 处理。
现在,问题来了。先上解析代码:
main = case parse p "" "$c = $a[$b]" of
Left err -> putStrLn . show $ err
Right r -> putStrLn . show $ r
where p = (try assignment <|> command) <* eof -- (1)
整个代码(50 行)粘贴在这里:Link(如果你安装了 parsec,应该编译)
问题是,解析失败,因为assignment 没有成功解析,即使之前有一个try。颠倒解析顺序 (try command <|> assignment) 可以解决问题,但在我的情况下是不可能的。
当然,我试图进一步定位问题,在我看来,问题在于表达式解析器(由buildExpressionParser 构建),因为如果我说expr = fail "",解析就会成功。但是,我在 Parsec 来源中找不到任何可以解释这种行为的东西。
【问题讨论】: