【问题标题】:Exporting regexes from grammars从语法中导出正则表达式
【发布时间】:2018-10-08 06:06:58
【问题描述】:

Grammars 是类,因此,它们应该遵守与其他类相同的规则。但是,从语法中导出正则表达式似乎存在问题:

grammar Word {
    token TOP { ^ <letters> $}
    regex letters   is export { <[\w] - [_]>+ };
    sub exported () is export  { return 'exported' };
}

import Word;

say exported;
say "what_ever" ~~ &letters;

import 有效地导入了exported,它不会抱怨letters。但是,最后一行出现了这个错误:

Type check failed in binding to parameter '<anon>'; expected Word but got Match (Match.new(orig => "what_ev...)

如果将&amp;letters 更改为/&lt;letters&gt;/,则会发生同样的错误,这是调用正则表达式的另一种方式。该错误似乎指出letters 在语法中声明它们时有一些隐藏的参数,因为这有效:

module Regexes {
    my regex letters   is export { <[\w] - [_]>+ };
}
import Regexes;
say "what_ever" ~~ /<letters>/;
# Output: 
# 「what」
#  letters => 「what」

那么该参数实际上是什么?我们如何有效地使用从Grammar 导出的正则表达式/令牌/规则

【问题讨论】:

    标签: grammar raku


    【解决方案1】:

    letters 正则表达式声明前加上 myour

    默认情况下,methodregextokenrule 声明符在其前面带有隐式 has 声明符。


    我仍在思考这里发生了什么,但想根据您的第一条评论更新我的答案。

    Type check failed in binding to parameter '';
    expected Word but got Match (Match.new(orig => "what_ev...)
    

    parameter '' 位绝对不是太棒了。

    奇怪的是,用my methodour method 声明的例程的签名 具有封闭类或语法作为它们的类型,如果它们在主线中声明,则假设为Mu ,而对于regextokenrule,调用者始终为Mu

    grammar g {
              method method              { ... }  # (g $: *%_)
          has method has-method          { ... }  # (g $: *%_)
          my  method my-method is export { ... }  # (g $: *%_)
    
              regex  regex               { ... }  # (g $: *%_)
          has regex  has-regex           { ... }  # (g $: *%_)
          my  regex  my-regex is export  { ... }  # (Mu $: *%_)
    
              sub    sub is export       { ... }  # ()
    #     has sub    has-sub is export   { ... }  # Cannot use 'has' with sub declaration
          my  sub    my-sub is export    { ... }  # ()
    }
    
    import g;
    
    say .signature
      for g.^lookup('method'),
          g.^lookup('has-method'),
          &my-method,
          g.^lookup('regex'),
          g.^lookup('has-regex'),
          &my-regex,
          &sub,
          &my-sub
    

    显示语法中每个例程声明的签名。我在每个例程的末尾添加了输出为 cmets。

    【讨论】:

    • 我猜那是 subs 和 regexes 之间的区别,默认范围和定义。我认为没有记录在案......
    • 范围方面记录在has。 (在这方面,正则表达式与方法相同。)我不记得看到记录的签名差异。这可能与正则表达式/令牌/规则 is 方法的方式有关,但也有所不同。我已经更新了我的答案,但我仍在思考它,可能会稍后再回来更新它。
    • 我正在通过say Word.^lookup("numbers").signature;检查regex numbers is export { &lt;[\d]&gt;+ };的签名,它恰好是(Word: *%_)。这意味着它需要由Word 调用。让我们看看它是如何被黑客入侵的......
    • 我会说 regex|token|rule 实际上是 method,而不是 subs。它们有一个隐含的has,但问题不在于范围,而在于方法在签名中具有隐式调用者这一事实。从这个意义上说,您无法从类中有意义地导入方法。从这个意义上说,在它们前面加上 my 或 our 会使它们实际上表现得像 subs,因此它们没有附加任何东西,因此它们可以被导出。
    • @jjmerelo 谢谢。 “regexes|rules|tokens 是方法,除非它们具有词法范围,在这种情况下,它们是 subs。”好吧,我完全明白你的意思,但他们的签名中仍然有一个调用者,并且仍然会作为方法而不是 subs 进行类型检查。我会睡在上面,明天可能会编辑我的答案。
    猜你喜欢
    • 2011-03-22
    • 2011-08-23
    • 2012-05-06
    • 2010-09-20
    • 2011-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-27
    相关资源
    最近更新 更多