在Perl 6

时间:2017-10-30 08:00:36

标签: perl6

regexes abc | cde | abc | cde | cde | abc<regex1> | <regex2> | <regex3> | <regex4> | <regex5> | <regex6>中处理重复的最佳方法是什么,其中regexN的许多文字都是相同的?

为了解释我的意思,我将举一个德国人的例子。这是一个样本grammar,可以解析几个现在紧张的口头形式。

grammar Verb {
    token TOP {
        <base>
        <ending>
    }
    token base {
        geh   |
        spiel |
        mach
    }
    token ending {
        e     |  # 1sg
        st    |  # 2sg
        t     |  # 3sg
        en    |  # 1pl
        t     |  # 2pl
        en       # 3pl
    }
}

my @verbs = <gehe spielst machen>;
for @verbs -> $verb {
  my $match = Verb.parse($verb);
  say $match;
}

1pl和3pl(en)的结尾是相同的,但为了清楚起见,将它们放入token更方便(在我的实际数据中) inflexional范式要复杂得多,容易迷路。 token ending按预期工作,但据我所知,如果我只将en放一次,程序会更快一些(我已经用regexes进行了多次测试重复的元素,是的,性能受到很大影响)。有了我的数据,有很多这样的重复,所以我想知道对待它们的最佳方法是什么?

当然,我可以将结尾放在array之外的grammar,创建此数组.unique,然后只传递值:

my @endings = < ... >;
@endings .= unique;
...
token ending { @endings }

但从grammar中取出数据会使其不那么清晰。此外,在某些情况下,可能有必要使每个结尾都成为一个单独的标记(token ending {<ending_1sg> | <ending_2sg> ... <ending_3pl>},如果它们是在grammar之外定义的话,这是不可能的。

1 个答案:

答案 0 :(得分:2)

如果我理解你,为了清楚起见,你想要用一个评论来重复正则表达式术语,这个评论描述了哪个音符是一个单独的概念?只需对该行进行评论。

顺便说一下,由于在这种情况下会忽略空正则表达式,所以可以使用分支运算符开始行,而不是将其放在最后。它使事情变得更容易,特别是当您需要添加和删除行时。所以我建议这样的事情:

grammar Verb {
    # ...
    token ending {
        | e       # 1sg
        | st      # 2sg
        | t       # 3sg
        | en      # 1pl
        #| t       # 2pl
        #| en      # 3pl
    }
}

因为你所写的内容专门针对人类,而不是针对解析器。现在,如果你想使用不同的正则表达式进入不同的解析匹配,那么你可以将结尾作为$<_3sg>$<_2p1>(命名的正则表达式,因此两者都会成功)访问,你不能评论它出来,你将不得不强迫电脑做额外的工作。显然,您需要使用:exhaustive:overlap。相反,我建议你制作一个代表3sg和2p1的命名正则表达式,并像上面所做的那样定义它:写两个但是注释掉它。