如何配置Raku动作仅在解析成功后执行?
解决Raku解析动作仅在完全成功后执行的问题
当然可以实现。你遇到的问题是因为语法规则里嵌入的代码块会在该局部规则匹配成功时立即执行,哪怕后续的规则匹配失败,导致整个解析最终失败。要让动作只在整个解析完全成功后执行,有两种常用方法:
方法一:使用动作类(推荐)
Raku的语法设计支持「语法规则」和「动作逻辑」分离,通过动作类绑定到解析操作,只有当整个解析成功生成完整的解析树时,才会触发动作类中对应的方法。
修改后的代码示例
# 定义动作类,方法名与语法规则名对应 class FooActions { method name($/) { say "$/ is telling us her age...."; } } # 定义纯语法规则,移除嵌入的执行代码 grammar Foo { rule TOP { <name> is \d+ } token name { Anne | Jane } } # 解析时指定动作类 say so Foo.parse('Anne is 100', :actions(FooActions.new)); # 先输出 "Anne is telling us her age....",再输出 True say so Foo.parse('Jane is Leaf', :actions(FooActions.new)); # 仅输出 False,不会执行say语句
方法二:解析后手动判断执行
如果不想使用动作类,也可以先获取解析结果,判断整个解析是否成功,再执行对应的逻辑:
grammar Foo { rule TOP { <name> is \d+ } token name { Anne | Jane } } # 先执行解析,再判断结果 my $result = Foo.parse('Anne is 100'); if $result { say "{$result<name>} is telling us her age...."; } say so $result; # 输出 True $result = Foo.parse('Jane is Leaf'); if $result { say "{$result<name>} is telling us her age...."; } say so $result; # 输出 False
两种方法都能实现「仅解析完全成功后执行动作」的需求,其中动作类的方式更符合Raku的设计范式,尤其在复杂语法场景下更易维护。
内容的提问来源于stack exchange,提问作者user2023370
相关产品推荐
相关产品推荐

