当前位置: 首页 > 知识库问答 >
问题:

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

潘宸
2023-03-14

最近,我尝试了一些语法来修改文件的小部分。在这些测试用例中,我会保持大部分文件的原样,只是在这里和那里修改一些小的部分,请参见这个回顾问题的示例。

因此,我需要一个(或几个)动作方法(即语法的action类中的方法),在这里我将使用make方法将文件的修改部分附加到match对象。问题是语法本身会有更多的标记/规则/正则表达式,并且嵌套复杂。因此,需要(通过依次调用make())将小更改(当前附加到令牌的匹配对象)传播到action类中的TOP()方法,以便文件中的所有其他内容(所有其他令牌/规则/正则表达式)在语法的返回的结果中保持不变。parse()调用。

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

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

现在,在我看来,对所有动作方法显式重复相同的代码似乎非常冗长,而且也违反了干式编程原则。

有没有办法告诉语法类,如果没有指定操作方法(对应于语法中的令牌),它将默认为上面的make-data方法(或类似的方法)?

因此,在本例中,我设想action类中有一个DEFAULT()方法:

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

如果语法类中的令牌在操作类中没有相应的方法,则调用该方法。

共有1个答案

杨晓博
2023-03-14

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

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

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;
 类似资料:
  • 问题内容: 我正在寻找与C#扩展方法功能等效的Java。现在,我一直在阅读有关Java 8的默认方法的信息,但据我所知,我只能将它们添加到接口中。 …是否有任何语言功能可让我为未实现接口的最终类​​编写扩展方法?(我宁愿不必包装它…) 问题答案: 对于以扩展类型作为第一个参数的静态方法,C#扩展方法只是语法糖。Java默认方法完全不同。要模仿C#扩展方法,只需编写常用的静态方法。但是,您将不会食用

  • 问题内容: 我修改了一个表格,以这种方式向其中添加状态列 但是,对于创建的任何新ITEM,SQLite似乎都不会将N添加到该列中。语法是否错误,或者SQLite及其对默认值的支持是否存在任何问题。 我正在使用SQLite 3.6.22 问题答案: 对我来说看上去很好。 这是文档。 转储您的模式,并 在调用ALTER TABLE之后但在INSERT之前 验证 表结构是否存在。如果它在事务中,请 确保

  • 我正在尝试加密laravel默认加密中的json编码字符串。但我不确定它使用的是AES-256-CBC。这背后的原因是,我还在尝试从AES自定义类进行相同的加密。 我所做的。 > json_编码数组 在AES自定义类中设置密钥、模式和块大小并生成令牌。 加密令牌。 使用setData设置加密令牌 使用AES自定义类解密 结果与我在步骤1中的结果相同。当我尝试加密(Crypt::encrypt($R

  • 我有简单的对象客户端

  • 本文向大家介绍js添加select下默认的option的value和text的方法,包括了js添加select下默认的option的value和text的方法的使用技巧和注意事项,需要的朋友参考一下 <pre name="code" class="java"> jsp 中的下拉框标签: <s:select name="sjx" id="sjx" list="sjxList" listKey="BM

  • 我在下面输入< code>JSON: 但是,输出 应类似,并且仅添加默认值: 这是我的规范: 我应该编辑<code>JOLT</code>规范,但我不明白(默认字段名、姓和状态如何工作。created可以添加为“created”:“@(3,ninjaed in time)”