如果语法不匹配,有没有办法让 Perl 6 生成错误消息?或者至少返回它处理的最后一个数据的位置?如果我从解析器得到的只是“不匹配”,则很难修复语法错误。
2 回答
如果您的重点是为语法的用户生成消息,请参阅从解析器和Grammar::ErrorReporting生成良好的解析错误。
这个答案的其余部分是关于语法的开发和调试。
2020 年 5 月更新现在显而易见的选择是使用Comma IDE的Grammar 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。
use Grammar::Tracer;
为say
我工作(我更喜欢 vi)