ANLTR4 中的令牌名称

本文关键字:令牌 ANLTR4 | 更新日期: 2023-09-27 18:30:31

>我在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时,规则名称的任何原因都不同?

多谢

ANLTR4 中的令牌名称

文本令牌名称仅在满足以下所有条件的非常有限的情况下使用:

  1. 词法分析器规则的右侧只包含一个字符串文本(仅此而已,仅此而已)。
  2. 语法中只有一个规则由该字符串文本组成。如果两种不同模式下的两个不同规则使用相同的字符串文本,则它们都不会与该字符串文本一起出现在 tokenNames 数组中。

要回答您的问题:

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