優先規則

幾個詞法分析器規則可以匹配相同的輸入文字。在這種情況下,將選擇令牌型別如下:

  • 首先,選擇匹配最長輸入的詞法分析器規則
  • 如果文字與隱式定義的標記(如'{')匹配,請使用隱式規則
  • 如果多個詞法分析器規則匹配相同的輸入長度,請根據定義順序選擇一個

以下結合語法:

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 規則上是優先的。

  • barBAR 的型別

    此文字與 BAR 規則匹配,該規則在 IDENTIFIER 規則之前定義,因此具有優先權。

  • baz 的型別為 IDENTIFIER

    此文字符合 BAZ 規則,但它也符合 IDENTIFIER 規則。選擇後者,因為它是 BAR 之前定義的。

    鑑於語法,BAZ 永遠無法匹配,因為 IDENTIFIER 規則已經涵蓋了 BAZ 可以匹配的所有內容。

  • barz 的型別為 IDENTIFIER

    BAR 規則可以匹配此字串的前 3 個字元(bar),但 IDENTIFIER 規則將匹配 4 個字元。由於 IDENTIFIER 匹配較長的子字串,因此選擇 BAR

根據經驗,應更通用的規則之前定義特定規則。如果規則只能匹配先前定義的規則已涵蓋的輸入,則永遠不會使用它。

隱含定義的規則(如'foo')就好像它們是所有其他詞法規則之前定義的一樣