【问题标题】:Can I change the Perl 6 slang inside a method?我可以在方法中更改 Perl 6 俚语吗?
【发布时间】:2017-12-09 19:15:43
【问题描述】:

Perl 6 RegexMethod 的一种更具体的类型,所以我想到也许我可以用常规方法做一些黑魔法来产生同样的东西。我特别好奇在不改变任何语法的情况下这样做。

然而,看着Perl6/Grammar.nqp(我几乎不明白),这真的不是继承的事情。我认为,根据我的阅读,Perl 6 语法在看到其中一个正则表达式声明符时会切换俚语(子语言)。也就是说,不同的语法会解析regex { ... }method {...} 的内容。

那么,首先,是这样吗?

然后,只是为了傻笑,我想也许我可以在一个方法块中,但告诉它使用不同的俚语(例如,参见 "Slangs" from the 2013 Perl 6 Advent Calendar"Slangs Today")。

但是,我发现的所有内容看起来都想改变语法。有没有办法做到这一点并返回一个被视为来自regex { ... }的字符串?

method actually-returns-a-regex {
     ...
     }

我对此没有任何实际用途。我只是一直在想。

【问题讨论】:

  • “所以,首先,不同的语法解析正则表达式 { ... } 和方法 {...} (?) 的内容是对的吗?”是的,MAIN P6 slang/grammar 解析 method 声明的主体,但使用 Regex slang/grammar 解析 regex 声明的主体。
  • "也许我可以在一个方法块中,但告诉它使用不同的俚语" 你可以,但是使用俚语意味着改变编译器正在使用的语法,你写道你不'不想改变语法。
  • 但是,我可以告诉它使用已经满足我要求的现有语法吗?
  • 我对你想要什么感到困惑。 (这就是我没有尝试回答的原因。你对莫里茨的回答让我更加困惑。)一些猜测试图确定你的意思:1)“我可以”暗示理智; 2)“它”是编译器; 3)“现有语法”是旨在扩展/弯曲 P6 的语法/动作对的一部分; 4)你想要的就是那个俚语的作用; 5)您愿意在编译进入正则表达式正文之前切换俚语或在之后修复 ast。如果您对这五个猜测中的每一个都说是/否,这可能会有所帮助。
  • @raiph 我也对自己想要的东西感到有些困惑,但似乎适当的术语已经超载,以至于我现在无法很好地表达它。

标签: regex raku


【解决方案1】:

首先,Perl 6 设计文档要求一个 API,其中正则表达式返回一个可能匹配的惰性列表。如果 Rakudo 遵循该 API,您可以轻松编写一个充当正则表达式的方法,但解析会非常慢(因为惰性列表的性能往往比充当回溯堆栈的字符串位置(整数)的紧凑列表差得多)。

相反,Perl 6 正则表达式返回匹配项。你也可以这样做。下面是一个在语法中像正则表达式一样调用的方法示例:

grammar Foo {
    token TOP { a <rest> }

    method rest() {
        if self.target.substr(self.pos, 1) eq 'b' {
            return Match.new(
                orig   => self.orig,
                target => self.target,
                from => self.pos,
                to   => self.target.chars,
            );
        }
        else {
            return Match.new();
        }
    }
}

say Foo.parse('abc');
say Foo.parse('axc');

方法rest 实现了正则表达式b.* 的等效项。我希望这回答了你的问题。

更新:我可能误解了这个问题。如果问题是“我如何创建一个正则表达式对象”(而不是“我如何编写像正则表达式一样的代码”,正如我所理解的那样),答案是您必须通过 rx// 引用结构:

my $str = 'ab.*';
my $re = rx/ <$str> /;

say 'fooabc' ~~ $re;       # Output: 「abc」

【讨论】:

  • 我不想匹配正则表达式,我想创建一个正则表达式。我知道我的问题需要解决一些问题,因为这是一个不可靠的想法,而且我们必须谈论的所有语言都将它推向了不同的解释。
  • 您可以通过rx// 引号运算符创建正则表达式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 2019-08-15
  • 2018-10-07
  • 1970-01-01
  • 1970-01-01
  • 2013-11-17
相关资源
最近更新 更多