0

我在 AnTLR4 中有以下词法分析器规则

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

在 C# 中生成的代码是:

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

我的问题:

  1. 为什么 TRY 令牌的规则名称是TRYFINALLY 令牌是命名的'finally'

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

  3. [i][f]当我们写或时,规则名称有什么不同的原因if吗?

非常感谢

4

1 回答 1

1

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

  1. 词法分析器规则的右侧恰好包含一个字符串文字(不多也不少)。
  2. 语法中的确切一条规则由该字符串文字组成。如果两种不同模式下的两条不同规则使用相同的字符串文字,则它们不会与该字符串文字一起出现在tokenNames数组中。

要回答您的问题:

  1. TRY规则在您的问题中被缩写(即您的实际语法包含该规则的谓词或动作),或者您的语法中某处使用的另一个词法分析器规则在'try'右侧。
  2. 这些名称取自词法分析器规则名称。如果您的规则被命名Try而不是TRY,那么它将显示TrytokenNames数组中。
  3. 此规则不包含字符串文字,因此tokenNames数组使用规则名称而不是文字。
于 2013-09-06T20:55:20.890 回答