優先規則
幾個詞法分析器規則可以匹配相同的輸入文字。在這種情況下,將選擇令牌型別如下:
- 首先,選擇匹配最長輸入的詞法分析器規則
- 如果文字與隱式定義的標記(如'{')匹配,請使用隱式規則
- 如果多個詞法分析器規則匹配相同的輸入長度,請根據定義順序選擇第一個
以下結合語法:
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的型別為IDENTIFIERBAR規則可以匹配此字串的前 3 個字元(bar),但IDENTIFIER規則將匹配 4 個字元。由於IDENTIFIER匹配較長的子字串,因此選擇BAR。
根據經驗,應在更通用的規則之前定義特定規則。如果規則只能匹配先前定義的規則已涵蓋的輸入,則永遠不會使用它。
隱含定義的規則(如'foo')就好像它們是在所有其他詞法規則之前定義的一樣。