如果多个正则表达式匹配剩余输入的前缀怎么办?
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
.
我在尝试使用在其词法分析中实现正则表达式的 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
.