ANTLR 优先规则


本文向大家介绍ANTLR 优先规则,包括了ANTLR 优先规则的使用技巧和注意事项,需要的朋友参考一下

示例

几个词法分析器规则可以匹配相同的输入文本。在这种情况下,令牌类型将选择如下:

  • 首先,选择与最长输入匹配的词法分析器规则

  • 如果文本与隐式定义的标记匹配(例如'{'),请使用隐式规则

  • 如果多个词法分析器规则匹配相同的输入长度,请根据定义顺序选择一个


以下是组合语法:

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'行为就像所有其他词法分析器规则之前定义的一样