首页 > 解决方案 > 从语法中导出正则表达式

问题描述

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

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...)

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

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

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

标签: grammarraku

解决方案


使用或为letters正则表达式声明添加前缀。myour

默认情况下,a methodregextoken或声明符在其前面rule带有隐式声明符。has


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

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

parameter ''一点绝对不是太棒了。

奇怪的是,使用 a或封闭类或语法作为其类型声明的例程的签名,假设它们是否在主线中声明,而对于、或,调用者始终是:my methodour methodMuregextokenruleMu

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

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


推荐阅读