代码之家  ›  专栏  ›  技术社区  ›  Håkon Hægland

如何为语法的动作类添加默认方法?

  •  9
  • Håkon Hægland  · 技术社区  · 6 年前

    最近,我尝试了一些语法来修改 文件在这些测试案例中,我会保留很多 仅在此处和那里修改小块,请参见 this 复习问题以获取示例。

    所以我需要一个(或几个)动作方法(即 语法)我将文件的修改部分附加到 使用其匹配对象 make方法。问题是语法本身会有更多 令牌/规则/正则表达式 嵌套。因此,需要传播(通过连续调用 make() )小更改(当前附加到 令牌的匹配对象)直到 TOP() action类中的方法 这样一切 文件中的else(所有其他令牌/规则/正则表达式)保持不变 在语法返回的结果中 .parse() 呼叫

    因此,action类中的所有方法(除了一个)都是完全相同的形式:

    method make-data ($match-data) {
        $match-data.make( [~] $match-data.chunks.map: {$_.value.?made // $_.value} );
    }
    

    现在,所有动作方法都显式重复相同的代码 对我来说非常冗长,也违背了干式编程的原则。

    有没有办法告诉语法类如果一个动作方法 (对应于语法中的标记)是 未指定,它将默认为 make-data 上述方法(或类似方法)?

    所以在这种情况下,我设想 DEFAULT() action类中的方法:

    method DEFAULT ($match-data) {
        $match-data.make( [~] $match-data.chunks.map: {$_.value.?made // $_.value} );
    }
    

    如果语法类中的标记没有 action类中的相应方法。

    1 回复  |  直到 5 年前
        1
  •  11
  •   dwarring    6 年前

    Perl 6的类型系统将调用 FALLBACK 方法,如果它存在于类中并且进行了未知的方法调用。

    以下解决方案将默认构造方法添加到 Calculations actions类。

    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;