使用一种替代方法获取令牌的名称

Getting name of the token with one alternative

现在,ANTLR 不会 return Lexer 令牌名称,如果该令牌仅包含一个替代项,例如对于令牌 SUZY : 'Suzy'; 'Suzy' 将在解析树中进行编码。

现在,我使用令牌名称来编码一些有用的信息,例如SUZY_GENDER_FEMALE : 'Suzy';

到目前为止,我已经找到了两种解决方案来获取令牌名称,即使令牌仅包含一个备选方案:

  1. 在令牌中重复相同的选择:SUZY_GENDER_FEMALE : 'Suzy' | 'Suzy';
  2. 使用fragment关键字:
SUZY_GENDER_FEMALE : SUZY_FRAGMENT;
fragment SUZY_FRAGMENT : 'Suzy';

这两种解决方案都有效,但并不理想。我正在研究 ANTLR 实现,以使用一种替代方法来更改令牌的行为,其名称将被 return 编辑,但代码非常复杂,即使更改可能非常容易,也需要一些时间。

有人知道在哪里查看代码吗? (也许就像在适当的地方添加一行一样简单)或者我可能滥用了令牌名称,我应该使用不同的 ANTLR 机制来获取我想要的信息?

你的词法分析器有一个静态 VOCABULARY。试试这个:

Token token = ...
String tokenName = YourLexer.VOCABULARY.getSymbolicName(token.getType());