带有冲突令牌的ANTLR行为

时间:2016-01-04 13:18:50

标签: antlr antlr4 lexer

在令牌冲突的情况下,如何定义ANTLR词法分析器行为? 让我解释一下“冲突”令牌的含义。 例如,假设定义了以下内容:

INT_STAGE       :   '1'..'6';
INT             :   '0'..'9'+;

这里存在冲突,因为在读取一系列数字后,词法分析器将不知道是否存在一个INT或多个INT_STAGE标记(或两者的不同组合)。 在测试之后,看起来如果在INT_STAGE之后定义了INT,那么词法分析器更愿意找到INT_STAGE,但是可能不是INT呢?否则,将找不到INT_STAGE。

另一个例子是:

FOOL: ' fool'
FOO: 'foo'
ID              :   ('a'..'z'|'A'..'Z'|'_'|'%') ('a'..'z'|'A'..'Z'|'0'..'9'|'_'|'%')*;

我被告知这是识别所有令牌的“正确”命令: 在阅读“傻瓜”时,词法分析者会找到一个FOOL令牌,而不是FOO ID或其他东西。

1 个答案:

答案 0 :(得分:2)

以下逻辑适用:

  1. 词法分析器匹配尽可能多的字符
  2. 如果在应用规则1后,有2个或更多规则匹配相同数量的字符,则首先定义的规则将" win"
  3. 考虑到这一点,输入"1""2",...,"6"被标记为INT_STAGEINT_STAGE和{{ 1}}匹配相同数量的字符,但首先定义INT

    输入INT_STAGE被标记为"12",因为它与大多数字符匹配。

      

    我被告知这是"对"为了识别所有的代币:在阅读"傻瓜"词法分析器将找到一个FOOL令牌而不是FOO ID或其他东西。

    这是正确的。