Antlr4 使用一个备选方案获取令牌的名称

Antlr4 使用一个备选方案获取令牌的名称,antlr4,Antlr4,现在,如果标记只包含一个替代项,则ANTLR不会返回Lexer标记名,例如,对于标记SUZY:'SUZY''Suzy'将在解析树中进行编码 现在,我使用标记名来编码一些有用的信息,例如,SUZY_GENDER_femal:'SUZY' 到目前为止,我已经找到了两种解决方案来获取令牌名称,即使令牌只包含一个备选方案: 在标记中重复相同的选项:SUZY_GENDER_femal:'SUZY'|'SUZY' 使用fragment关键字: 这两种解决方案都有效,但并不理想。我正在研究ANTLR实现,以一

现在,如果标记只包含一个替代项,则ANTLR不会返回Lexer标记名,例如,对于标记
SUZY:'SUZY'
'Suzy'
将在解析树中进行编码

现在,我使用标记名来编码一些有用的信息,例如,
SUZY_GENDER_femal:'SUZY'

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

  • 在标记中重复相同的选项:
    SUZY_GENDER_femal:'SUZY'|'SUZY'
  • 使用
    fragment
    关键字:
  • 这两种解决方案都有效,但并不理想。我正在研究ANTLR实现,以一种方式改变令牌的行为,即返回它们的名称,但代码相当复杂,即使改变可能很容易,也需要一些时间


    有人知道该在代码中查找什么吗?(可能只需在适当的位置添加一行就可以了)或者我误用了标记名,我应该使用不同的ANTLR机制来获取我想要的信息?

    您的lexer有一个静态的
    词汇表。试试这个:

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

    谢谢,就是这个。实际上,我使用了不推荐使用的方法来获取令牌名称:
    parser.getTokenNames()[token.getType()]-这就是问题所在。
    
    Token token = ...
    String tokenName = YourLexer.VOCABULARY.getSymbolicName(token.getType());