作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
最近,我尝试了一些语法来修改 a 的小部分 文件。在那些测试用例中,我会保留很多文件的原样,只修改了一些小部分,请参阅 this以复习问题为例。
所以我需要一个(或几个)操作方法(即操作类中的方法) 语法),我将文件的修改部分附加到 使用其匹配对象制作方法。问题是语法本身还有更多 token /规则/正则表达式复杂嵌套。因此,需要传播(通过连续调用 make()
) 小改动(当前附加到 token 的匹配对象)直到操作类中的 TOP()
方法使得一切 文件中的其他(所有其他标记/规则/正则表达式)保持不变 在语法的 .parse()
调用返回的结果中。
因此,除了一个之外,操作类中的所有方法都采用完全相同的形式:
method make-data ($match-data) {
$match-data.make( [~] $match-data.chunks.map: {$_.value.?made // $_.value} );
}
现在,对所有操作方法显式重复相同的代码似乎对我来说非常冗长,而且也违反了 DRY 编程原则。
有没有办法告诉语法类,如果一个 Action 方法(对应于语法中的标记)是未指定,它将默认为上面的 make-data
方法(或类似的方法)?
因此,在这种情况下,我设想在操作类中使用 DEFAULT()
方法:
method DEFAULT ($match-data) {
$match-data.make( [~] $match-data.chunks.map: {$_.value.?made // $_.value} );
}
如果语法类中的标记没有操作类中相应的方法。
最佳答案
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;
关于grammar - 如何为语法的 Action 类添加默认方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49198631/
我是一名优秀的程序员,十分优秀!