我目前正在使用Text.Parsec.Expr模块来解析脚本语言的子集。
基本上,这种语言有两种命令:形式的赋值和形式$var = expr
的命令$var = $array[$index]
——当然还有其他命令,但这足以解释我的问题。
我创建了一个 typeCommand
来表示它,以及相应的解析器,其中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 行)粘贴在这里:链接(如果你安装了解析器,应该编译)
问题是,解析失败,因为assignment
没有成功解析,即使try
之前有。颠倒解析顺序 ( try command <|> assignment
) 可以解决问题,但在我的情况下是不可能的。
当然,我试图进一步定位问题,在我看来,问题在于表达式解析器(由 构建buildExpressionParser
),因为如果我说expr = fail ""
. 但是,我在 Parsec 来源中找不到任何可以解释这种行为的东西。