如何为语法的动作 class 添加默认方法?
How to add a default method for an action class of a grammar?
最近,我尝试了一些语法来修改a的小部分
文件。在那些测试用例中,我会保留很多
文件的原样,只在这里和那里修改小块,请参阅
this 查看示例问题。
所以我需要一个(或几个)动作方法(即动作 class 中的方法
语法),我会将文件的修改部分附加到
使用其匹配对象
制作方法。问题是语法本身会有更多
token/rules/regex复杂
嵌套。因此,需要传播(通过连续调用
make()
) 小零钱(目前附在
令牌的匹配对象)直到操作 class 中的 TOP()
方法
这样一切
文件中的其他(所有其他 tokens/rules/regexes)保持不变
在语法的 .parse()
调用返回的结果中。
所以操作 class 中的所有方法除了一个之外,都是完全相同的形式:
method make-data ($match-data) {
$match-data.make( [~] $match-data.chunks.map: {$_.value.?made // $_.value} );
}
现在,这种对所有操作方法的相同代码的显式重复似乎
对我来说非常冗长,也违反了 DRY 编程原则。
有没有办法告诉语法 class 如果一个动作方法
(对应文法中的记号)是
未指定,将默认为上面的 make-data
方法(或类似方法)?
所以在这种情况下,我设想在操作 class:
中使用 DEFAULT()
方法
method DEFAULT ($match-data) {
$match-data.make( [~] $match-data.chunks.map: {$_.value.?made // $_.value} );
}
如果语法 class 中的标记没有
动作中对应的方法class.
Perl 6 的类型系统将调用 FALLBACK 方法,如果它存在于 class 中并且进行了未知方法调用。
以下解决方案将默认构造方法添加到 Calculations
操作 class。
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;
最近,我尝试了一些语法来修改a的小部分 文件。在那些测试用例中,我会保留很多 文件的原样,只在这里和那里修改小块,请参阅 this 查看示例问题。
所以我需要一个(或几个)动作方法(即动作 class 中的方法
语法),我会将文件的修改部分附加到
使用其匹配对象
制作方法。问题是语法本身会有更多
token/rules/regex复杂
嵌套。因此,需要传播(通过连续调用
make()
) 小零钱(目前附在
令牌的匹配对象)直到操作 class 中的 TOP()
方法
这样一切
文件中的其他(所有其他 tokens/rules/regexes)保持不变
在语法的 .parse()
调用返回的结果中。
所以操作 class 中的所有方法除了一个之外,都是完全相同的形式:
method make-data ($match-data) {
$match-data.make( [~] $match-data.chunks.map: {$_.value.?made // $_.value} );
}
现在,这种对所有操作方法的相同代码的显式重复似乎 对我来说非常冗长,也违反了 DRY 编程原则。
有没有办法告诉语法 class 如果一个动作方法
(对应文法中的记号)是
未指定,将默认为上面的 make-data
方法(或类似方法)?
所以在这种情况下,我设想在操作 class:
中使用DEFAULT()
方法
method DEFAULT ($match-data) {
$match-data.make( [~] $match-data.chunks.map: {$_.value.?made // $_.value} );
}
如果语法 class 中的标记没有 动作中对应的方法class.
Perl 6 的类型系统将调用 FALLBACK 方法,如果它存在于 class 中并且进行了未知方法调用。
以下解决方案将默认构造方法添加到 Calculations
操作 class。
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;