簡體   English   中英

如何為語法的動作類添加默認方法?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM