ANTLR4-如何将令牌类型作为ANTLR中的令牌文本获取?

ANTLR4-如何将令牌类型作为ANTLR中的令牌文本获取?,antlr,antlr4,Antlr,Antlr4,假设我的语法中有这样的标记: AND : 'AND' | 'and' | '&&' | '&'; OR : 'OR' | 'or' | '||' | '|' ; NOT : 'NOT' | 'not' | '~' | '!'; 当我使用TreeViewer可视化ParseTree或使用tree.toStringTree()打印树时,每个节点的文本都与匹配的文本相同 因此,如果我解析“A和B或C”,两个二进制运算符将是“和”/“

假设我的语法中有这样的标记:

AND        : 'AND' | 'and' | '&&' | '&';
OR         : 'OR' | 'or' | '||' | '|' ;
NOT        : 'NOT' | 'not' | '~' | '!';
当我使用TreeViewer可视化ParseTree或使用tree.toStringTree()打印树时,每个节点的文本都与匹配的文本相同

因此,如果我解析“A和B或C”,两个二进制运算符将是“和”/“或”。 如果我解析“A&&B||C”,它们将是“&&&”/“||”


我希望它们总是“AND”/“OR/“NOT”,不管匹配的是什么文字符号。这可能吗?

这就是词汇表的用途。使用
yourLexer.get词汇表()
yourlparser.get词汇表()
,然后使用
词汇表.getSymbolicName(tokenType)
获取令牌类型的文本表示形式。如果返回空字符串,请尝试作为第二步
词汇表。getLiteralName(令牌类型)
,它返回用于定义令牌的文本。

ToString Tree
只是一个调试功能,您可以在自己的代码中执行您想要的操作。我真的不明白您的问题是什么。也许?换句话说,当遍历ParseTree并打印与节点关联的文本时,它是原始文字符号l(&&)而不是令牌类型(“AND”)。