在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参考的"代币和代币工厂"部分有这样的代码
根据你发布的问题,这本书将证明物有所值。