几个词法分析器规则可以匹配相同的输入文本。在这种情况下,令牌类型将选择如下:
首先,选择与最长输入匹配的词法分析器规则
如果文本与隐式定义的标记匹配(例如'{'),请使用隐式规则
如果多个词法分析器规则匹配相同的输入长度,请根据定义顺序选择第一个
以下是组合语法:
grammar LexerPriorityRulesExample; // 解析器规则 randomParserRule: 'foo'; // 隐式声明的令牌类型 // Lexer规则 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规则可以匹配此字符串(bar)的前3个字符,但是该IDENTIFIER规则将匹配4个字符。当IDENTIFIER匹配更长的子字符串时,将选择BAR。
根据经验,应在更通用的规则之前定义特定的规则。如果规则只能匹配先前定义的规则已覆盖的输入,则将永远不会使用该规则。
隐式定义的规则(例如)的'foo'行为就像在所有其他词法分析器规则之前定义的一样。