使用一种替代方法获取令牌的名称
Getting name of the token with one alternative
现在,ANTLR 不会 return Lexer 令牌名称,如果该令牌仅包含一个替代项,例如对于令牌 SUZY : 'Suzy';
'Suzy'
将在解析树中进行编码。
现在,我使用令牌名称来编码一些有用的信息,例如SUZY_GENDER_FEMALE : 'Suzy';
。
到目前为止,我已经找到了两种解决方案来获取令牌名称,即使令牌仅包含一个备选方案:
- 在令牌中重复相同的选择:
SUZY_GENDER_FEMALE : 'Suzy' | 'Suzy';
- 使用
fragment
关键字:
SUZY_GENDER_FEMALE : SUZY_FRAGMENT;
fragment SUZY_FRAGMENT : 'Suzy';
这两种解决方案都有效,但并不理想。我正在研究 ANTLR 实现,以使用一种替代方法来更改令牌的行为,其名称将被 return 编辑,但代码非常复杂,即使更改可能非常容易,也需要一些时间。
有人知道在哪里查看代码吗? (也许就像在适当的地方添加一行一样简单)或者我可能滥用了令牌名称,我应该使用不同的 ANTLR 机制来获取我想要的信息?
你的词法分析器有一个静态 VOCABULARY
。试试这个:
Token token = ...
String tokenName = YourLexer.VOCABULARY.getSymbolicName(token.getType());
现在,ANTLR 不会 return Lexer 令牌名称,如果该令牌仅包含一个替代项,例如对于令牌 SUZY : 'Suzy';
'Suzy'
将在解析树中进行编码。
现在,我使用令牌名称来编码一些有用的信息,例如SUZY_GENDER_FEMALE : 'Suzy';
。
到目前为止,我已经找到了两种解决方案来获取令牌名称,即使令牌仅包含一个备选方案:
- 在令牌中重复相同的选择:
SUZY_GENDER_FEMALE : 'Suzy' | 'Suzy';
- 使用
fragment
关键字:
SUZY_GENDER_FEMALE : SUZY_FRAGMENT;
fragment SUZY_FRAGMENT : 'Suzy';
这两种解决方案都有效,但并不理想。我正在研究 ANTLR 实现,以使用一种替代方法来更改令牌的行为,其名称将被 return 编辑,但代码非常复杂,即使更改可能非常容易,也需要一些时间。
有人知道在哪里查看代码吗? (也许就像在适当的地方添加一行一样简单)或者我可能滥用了令牌名称,我应该使用不同的 ANTLR 机制来获取我想要的信息?
你的词法分析器有一个静态 VOCABULARY
。试试这个:
Token token = ...
String tokenName = YourLexer.VOCABULARY.getSymbolicName(token.getType());