是否可以格式化antlr4中的令牌输出



在antlr中,当我运行以下测试命令来获取令牌时:

$ grun TestLexer tokens -tokens myfile.sql
[@0,0:5='SELECT',<'SELECT'>,1:0]
[@1,7:7='1',<NUMBER>,1:7]
[@2,9:12='with',<'WITH'>,2:0]
[@3,14:20='my_data',<IDENTIFIER>,2:5]
[@4,22:23='as',<'AS'>,2:13]
[@5,25:25='(',<'('>,2:16]
[@6,27:32='select',<'SELECT'>,2:18]
[@7,34:40=''text1'',<STRING_TOKEN>,2:25]
[@8,41:42='::',<'::'>,2:32]

有没有一种方法可以让它真正命名或格式化令牌,比如最后一个:

[@8,41:42='::',<'TYPECAST(::)'>,2:32]

正如在我的TextLexer.g4文件中声明的那样:

// Cast operator, '2014-01-01'::DATE
TYPECAST
:'::'
;                       

您需要创建一个新的Token接口实现(Wavest将是CommonToken的子类,并覆盖toString()方法。您还需要创建新的TokenFactory来创建您类型的Token。此时,您可以编写自己的代码来打印出令牌。没有办法覆盖`TestRig类中的TokenFactory

在最终ANTLR 4参考的"代币和代币工厂"部分有这样的代码

根据你发布的问题,这本书将证明物有所值。

最新更新