ANTLR中是否有办法将某些令牌标记为具有规范输出?
例如,给定语法(摘录)
words : FOO BAR BAZ
FOO : [Ff] [Oo] [Oo]
BAR : [Bb] [Aa] [Rr]
BAZ : [Bb] [Aa] [Zz]
SP : [ ] -> channel(HIDDEN);
words
将匹配" FOO BAR BAZ",#34; foo bar baz"," Foo bAr baZ"等
当我致电TokenStream#getText(Context)
时,它会返回令牌'实际文本连接在一起。
有没有办法规范"规范化"这个输出使得无论输入什么,所有FOO
标记都呈现为" Foo",BAR
标记呈现为" Bar"和{{1} }令牌呈现为" Baz" (例如)?
鉴于上述任何输入,我希望输出" Foo Bar Baz"。
答案 0 :(得分:2)
以下任何选项均有效:
实现您自己的方法以获取解析树或令牌范围的文本,并将处理放置在那里。
创建自己的Token
类,该类知道返回某些标记的规范形式,并创建一个创建该类型标记的TokenFactory
实现。然后使用setTokenFactory
方法让词法分析器生成这些令牌。
创建自己的TokenStream
实现,以覆盖默认行为。
明确指定在创建令牌之前运行的操作中的文本:
FOO : [Ff] [Oo] [Oo] { _text = "Foo"; };
也可能有其他选择。