ANTLR4中的令牌名称

时间:2013-09-06 18:11:18

标签: c# regex lexer antlr4

我在AnTLR4中有以下词法规则

TRY: 'try';
FINALLY: 'finally';
EXCEPT: 'except';
IF: [i][f];
...

并且C#中生成的代码是:

public static readonly string[] tokenNames = { 
  "<INVALID>", "TRY", "'finally'", "'except'", "IF", ... }

我的问题:

  1. 为什么TRY令牌的规则名称为TRY,但FINALLY令牌的名称为'finally'

  2. 此外,我注意到<INVALID>之后的第一个标记始终以大写字母命名

  3. 当我们写[i][f]if时,rulenames的任何原因都不同?

  4. 非常感谢

1 个答案:

答案 0 :(得分:1)

文字标记名称仅在非常有限的情况下使用,其中满足以下条件的所有

  1. 词法分析器规则的右侧只包含一个字符串文字(仅此而已,仅此而已)。
  2. 语法中只有一个规则由该字符串文字组成。如果两种不同模式中的两个不同规则使用相同的字符串文字,则中的都不会在tokenNames数组中显示该字符串文字。
  3. 回答你的问题:

    1. TRY规则在您的问题中缩写(即您的实际语法包含规则的谓词或操作),或者语法中某处的另一个词法分析器规则使用右侧的'try'
    2. 名称来自词法分析器规则名称。如果您的规则被命名为Try而不是TRY,那么它将在Try数组中显示为tokenNames
    3. 此规则不包含字符串文字,因此tokenNames数组使用规则名称而不是文字。