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

时间:2015-04-09 11:57:38

标签: java regex javacc

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

@Edit

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

enter image description here

1 个答案:

答案 0 :(得分:4)

有两个原则可以控制JavaCC如何选择一个正则表达式而不是另一个正则表达式。

第一种通常被称为&#34;最长的匹配&#34;或者&#34;最大的咀嚼&#34;规则。这表示如果正则表达式 x 匹配剩余输入的前缀比正则表达式 y 更长,则首选正则表达式 x 。< / p>

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

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