如果多个正则表达式匹配剩余输入的前缀怎么办?

What if more than one regular expression matches a prefix of the remaining input?

我在尝试使用在其词法分析中实现正则表达式的 javacc 时遇到了这个问题 他给了我一个例子,但我不清楚。 任何人都可以给我一个例子,以便我可以轻松理解。 ?

@编辑

来源: http://www.engr.mun.ca/~theo/JavaCC-FAQ/javacc-faq-moz.htm

有两个原则支配 JavaCC 如何选择一个正则表达式而不是另一个。

第一个通常称为 "longest match" 或 "maximal munch" 规则。这表示如果正则表达式 x 匹配剩余输入的前缀比正则表达式 y 长,则正则表达式 x 优先。

最长匹配规则示例。假设有两个正则表达式产生式

TOKEN : { <INT_LIT: ( ["1"-"9"] )+ > }
TOKEN : { <FLOAT_LIT: ( ["1"-"9"] )+ "." ( ["1"-"9"] )* > }

假设剩下的输入是"123.456abcdef"INT_LIT 正则表达式匹配前 3 个字符。 (它也匹配前 1 和 2 个字符,但我们只对表达式匹配的最大长度前缀感兴趣。) FLOAT_LIT 匹配前 7 个字符。 7 大于 3,因此 FLOAT_LIT 优于 INT_LIT

这是另一个例子:

TOKEN : { <ALL_CAPS: ( ["A"-"Z","_"] )+ > }
TOKEN : { <ALL_LOWER_CASE: ( ["a"-"z","_"] )+ > }

现在,如果剩余的输入是 "_ABC",最长匹配规则会优先选择第一个。并且如果剩余的输入是"_abc",则第二个是最长匹配规则的首选。但是假设剩下的输入是"_123"。两个规则都匹配 1 个字符前缀,所以最长的匹配规则没有帮助。

第二个原则是,当最长匹配规则因为平局而无济于事时。根据 .jj 文件中最先出现的正则表达式来打破平局。在这种情况下 ALL_CAPS 优于 ALL_LOWER_CASE.