【问题标题】:Parsec error - try doesn't seem to workParsec 错误 - 尝试似乎不起作用
【发布时间】: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 &lt;|&gt; assignment) 可以解决问题,但在我的情况下是不可能的。

当然,我试图进一步定位问题,在我看来,问题在于表达式解析器(由buildExpressionParser 构建),因为如果我说expr = fail "",解析就会成功。但是,我在 Parsec 来源中找不到任何可以解释这种行为的东西。

【问题讨论】:

    标签: haskell parsec


    【解决方案1】:

    您的解析器失败了,因为实际上assigment 确实 在这里成功使用了$c = $a(尝试使用普通的where p = assignment)。然后应该有eof(或expr 的其余部分来自assigment),因此会出现错误。在“分配”的参数只是var(如$c = $a)的情况下,您的“命令”的开头似乎与您的“分配”相同。 不知道为什么你不能反转 commandassignment 但另一个让这个特定示例工作的方法是:

    main = case parse p "" "$c = $a[$b]" of
          Left err -> putStrLn . show $ err
          Right r  -> putStrLn . show $ r
       where p = try (assignment <* eof) <|> (command <* eof)
    

    【讨论】:

      猜你喜欢
      • 2013-11-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-28
      • 1970-01-01
      • 2016-05-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多