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

gre*_*ern 12 grammar parsing perl6 raku

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

rai*_*iph 15

如果您的重点是为语法用户生成消息,请参阅从解析器语法生成良好的解析错误:: 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代码的单步执行,断点等,包括正则表达式和语法).此视频中介绍了调试器.

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