如何改进语法中的错误报告?

时间:2013-10-27 12:56:48

标签: parsing grammar perl6 raku

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

2 个答案:

答案 0 :(得分:15)

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

这个答案的其余部分是关于调试的。

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

但是有更好的选择。

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

我个人的偏好是使用Rakudo调试器,它提供Grammar :: Tracer所做的一切以及更多(包括正则表达式和语法在内的所有Perl 6代码的单步执行,断点等)。调试器在此video中引入。

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

答案 1 :(得分:0)

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