15

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

4

2 回答 2

22

如果您的重点是为语法的用户生成消息,请参阅从解析器Grammar::ErrorReporting生成良好的解析错误。

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


2020 年 5 月更新现在显而易见的选择是使用Comma IDEGrammar Live View 功能


首先,您可以在 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 调试器,它提供了所有语法: :Tracer 除了(包括正则表达式和语法在内的所有 Raku 代码的单步执行、断点等)之外还有更多功能。该视频中介绍了调试器。

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

于 2013-10-28T16:55:22.967 回答
0

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

于 2020-12-13T21:41:48.203 回答