[英]perl6 Grammar action class method seems not inherited, named capture seems not made
[英]How to add a default method for an action class of a grammar?
最近,我嘗試了一些語法來修改文件的小部分。 在這些測試用例中,我會保留大部分文件,只在這里和那里修改小部分,請參閱此審查問題的示例。
所以我需要一個(或幾個)動作方法(即語法動作類中的方法),我將使用它的 make 方法將文件的修改部分附加到匹配對象。 問題是語法本身會有更多帶有復雜嵌套的標記/規則/正則表達式。 因此,需要將(通過連續調用make()
)小的更改(當前附加到標記的匹配對象)傳播到操作類中的TOP()
方法,以便其他所有內容(所有其他標記/規則/文件中的正則表達式)在語法的.parse()
調用返回的結果中保持不變。
所以除了一個之外,動作類中的所有方法都采用完全相同的形式:
method make-data ($match-data) {
$match-data.make( [~] $match-data.chunks.map: {$_.value.?made // $_.value} );
}
現在,對於所有操作方法的相同代碼的這種顯式重復在我看來非常冗長,並且也違反了 DRY 編程原則。
有沒有辦法告訴語法類,如果沒有指定action方法(對應語法中的一個token),它會默認為上面的make-data
方法(或類似的)?
所以在這種情況下,我設想在 action 類中有一個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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.