最近,我尝试使用一些语法来修改a的一小部分 文件。在那些测试用例中,我会保留很多 文件原样,只在这里和那里修改小块,看看 this回顾了一个问题的问题。
所以我需要一个(或几个)动作方法(即动作类中的方法)
语法)我将文件的修改部分附加到
使用它匹配对象
制作方法。问题是语法本身会有更多
令牌/规则/正则表达式复杂
筑巢。因此,需要传播(通过连续呼叫
make()
)小变化(目前附于
一个令牌的匹配对象),直到动作类中的TOP()
方法
这样的一切
文件中的else(所有其他标记/规则/正则表达式)保持不变
在语法的.parse()
调用返回的结果中。
因此,除了一个方法之外,动作类中的所有方法都采用完全相同的形式:
method make-data ($match-data) {
$match-data.make( [~] $match-data.chunks.map: {$_.value.?made // $_.value} );
}
现在,似乎对所有动作方法显式重复相同的代码 对我来说非常冗长,也打破了DRY编程原则。
有没有办法告诉语法类是否有动作方法
(对应于语法中的标记)是
未指定,它将默认为上面的make-data
方法(或类似方法)?
所以在这种情况下,我设想了动作类中的DEFAULT()
方法:
method DEFAULT ($match-data) {
$match-data.make( [~] $match-data.chunks.map: {$_.value.?made // $_.value} );
}
如果语法类中的标记没有,则调用动作类中的相应方法。
答案 0 :(得分:10)
Perl 6的类型系统将调用FALLBACK方法,如果它出现在类中并且进行了未知的方法调用。
以下解决方案将默认构造方法添加到Calculations
操作类。
grammar Calculator {
token TOP { [ <add> | <sub> ] }
rule add { <num> '+' <num> }
rule sub { <num> '-' <num> }
token num { \d+ }
}
class Calculations {
method ws($) {}
method FALLBACK($token, $match-data) {
$match-data.make( [~] $match-data.chunks.map: {
$_.value.?made // $_.value;
} );
}
}
say Calculator.parse('2 + 3', actions => Calculations).made;