【问题标题】:How can error reporting in grammars be improved?如何改进语法中的错误报告?
【发布时间】:2013-11-06 06:01:12
【问题描述】:

如果语法不匹配,有没有办法让 Perl 6 生成错误消息?或者至少返回它处理的最后一个数据的位置?如果我从解析器得到的只是“不匹配”,则很难修复语法错误。

【问题讨论】:

    标签: parsing grammar raku


    【解决方案1】:

    如果您的重点是为使用您的语法的用户生成消息,请参阅 Generating Good Parse Errors from a ParserGrammar::ErrorReporting

    这个答案的其余部分是关于语法的开发和调试。


    2020 年 5 月更新现在显而易见的选择是使用 the Grammar Live View featurethe Comma IDE


    首先,您可以在 Raku 规则(或标记或正则表达式)中嵌入任意闭包(代码)。只需在规则中间输入{ your code goes here }。所以你可以在有助于调试的地方撒上{ say ... } 语句。 (请注意,$/ 及其亲属$0$1 等以及命名的子捕获$<foo> 等会自动更新为引用当前Match 对象及其对应于封闭规则的子捕获在进入闭包之前。所以你可以在正则表达式中反省匹配的情况。)

    但还有更好的选择。

    您是否使用“包含电池”的 Rakudo Star 发行版? (除非您有充分的理由不这样做,否则您应该这样做。)如果是这样,您可以添加行 use Grammar::Tracer;(如幻灯片中所述 http://www.jnthn.net/papers/2011-yapceu-grammars.pdf)以获得解析的完整跟踪。

    我的个人偏好(编辑:这个答案是在 Comma 出现之前几年写的;Comma 还涵盖了非语法代码的调试;实际上还有很多其他内容)使用 Rakudo 调试器,它提供了 Grammar::Tracer 所做的一切以及更多(包括正则表达式和语法在内的所有 Raku 代码的单步执行、断点等)。这个video中介绍了调试器。

    如果您还有其他问题,我建议您访问始终友好的IRC channel #raku

    【讨论】:

      【解决方案2】:

      use Grammar::Tracer;say 为我工作(我更喜欢 vi)

      【讨论】:

        猜你喜欢
        • 2013-09-27
        • 2019-10-10
        • 2013-11-28
        • 2012-02-14
        • 1970-01-01
        • 2018-07-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多