優先規則
幾個詞法分析器規則可以匹配相同的輸入文字。在這種情況下,將選擇令牌型別如下:
- 首先,選擇匹配最長輸入的詞法分析器規則
- 如果文字與隱式定義的標記(如
'{'
)匹配,請使用隱式規則 - 如果多個詞法分析器規則匹配相同的輸入長度,請根據定義順序選擇第一個
以下結合語法:
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'
)就好像它們是在所有其他詞法規則之前定義的一樣。