优先规则
几个词法分析器规则可以匹配相同的输入文本。在这种情况下,将选择令牌类型如下:
- 首先,选择匹配最长输入的词法分析器规则
- 如果文本与隐式定义的标记(如
'{'
)匹配,请使用隐式规则 - 如果多个词法分析器规则匹配相同的输入长度,请根据定义顺序选择第一个
以下结合语法:
grammar LexerPriorityRulesExample;
// Parser rules
randomParserRule: 'foo'; // Implicitly declared token type
// Lexer rules
BAR: 'bar';
IDENTIFIER: [A-Za-z]+;
BAZ: 'baz';
WS: [ \t\r\n]+ -> skip;
鉴于以下输入:
aaa foo bar baz barz
将从词法分析器生成以下标记序列:
IDENTIFIER 'foo' BAR IDENTIFIER IDENTIFIER
-
aaa
的类型为IDENTIFIER
只有
IDENTIFIER
规则可以匹配此令牌,没有歧义。 -
foo
属于'foo'
解析器规则
randomParserRule
引入了隐含的'foo'
令牌类型,它在IDENTIFIER
规则上是优先的。 -
bar
是BAR
的类型此文本与
BAR
规则匹配,该规则在IDENTIFIER
规则之前定义,因此具有优先权。 -
baz
的类型为IDENTIFIER
此文本符合
BAZ
规则,但它也符合IDENTIFIER
规则。选择后者,因为它是在BAR
之前定义的。鉴于语法,
BAZ
永远无法匹配,因为IDENTIFIER
规则已经涵盖了BAZ
可以匹配的所有内容。 -
barz
的类型为IDENTIFIER
BAR
规则可以匹配此字符串的前 3 个字符(bar
),但IDENTIFIER
规则将匹配 4 个字符。由于IDENTIFIER
匹配较长的子字符串,因此选择BAR
。
根据经验,应在更通用的规则之前定义特定规则。如果规则只能匹配先前定义的规则已涵盖的输入,则永远不会使用它。
隐含定义的规则(如'foo'
)就好像它们是在所有其他词法规则之前定义的一样。