在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
之外定义的话,这是不可能的。
答案 0 :(得分:2)
如果我理解你,为了清楚起见,你想要用一个评论来重复正则表达式术语,这个评论描述了哪个音符是一个单独的概念?只需对该行进行评论。
顺便说一下,由于在这种情况下会忽略空正则表达式,所以可以使用分支运算符开始行,而不是将其放在最后。它使事情变得更容易,特别是当您需要添加和删除行时。所以我建议这样的事情:
grammar Verb {
# ...
token ending {
| e # 1sg
| st # 2sg
| t # 3sg
| en # 1pl
#| t # 2pl
#| en # 3pl
}
}
因为你所写的内容专门针对人类,而不是针对解析器。现在,如果你想使用不同的正则表达式进入不同的解析匹配,那么你可以将结尾作为$<_3sg>
或$<_2p1>
(命名的正则表达式,因此两者都会成功)访问,你不能评论它出来,你将不得不强迫电脑做额外的工作。显然,您需要使用:exhaustive
或:overlap
。相反,我建议你制作一个代表3sg和2p1的命名正则表达式,并像上面所做的那样定义它:写两个但是注释掉它。