【发布时间】:2013-11-06 06:01:12
【问题描述】:
如果语法不匹配,有没有办法让 Perl 6 生成错误消息?或者至少返回它处理的最后一个数据的位置?如果我从解析器得到的只是“不匹配”,则很难修复语法错误。
【问题讨论】:
如果语法不匹配,有没有办法让 Perl 6 生成错误消息?或者至少返回它处理的最后一个数据的位置?如果我从解析器得到的只是“不匹配”,则很难修复语法错误。
【问题讨论】:
如果您的重点是为使用您的语法的用户生成消息,请参阅 Generating Good Parse Errors from a Parser 和 Grammar::ErrorReporting。
这个答案的其余部分是关于语法的开发和调试。
2020 年 5 月更新现在显而易见的选择是使用 the Grammar Live View feature 或 the 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。
【讨论】:
use Grammar::Tracer; 和 say 为我工作(我更喜欢 vi)
【讨论】: