在进行规范化ANTLR令牌文本(Canonicalizing token text in ANTLR

2019-10-20 22:56发布

是否有一个ANTLR的方式来标记特定的标记具有典型输出?

例如,给定的语法(摘录)

words : FOO BAR BAZ
FOO : [Ff] [Oo] [Oo]
BAR : [Bb] [Aa] [Rr]
BAZ : [Bb] [Aa] [Zz]
SP : [ ] -> channel(HIDDEN);

words将匹配“FOO BAR BAZ”, “富酒吧巴兹”, “富酒吧巴兹”,等等。

当我打电话TokenStream#getText(Context) ,它会返回标记的实际文本连接在一起。

有没有办法“规范化”这个输出,使得无论什么输入,所有FOO令牌呈现为“富”, BAR标记渲染为“栏”,并BAZ令牌呈现为“巴兹”(例如)?

鉴于以上任何投入,我想有输出“富酒吧巴兹”。

Answer 1:

凡有下列选项将工作:

  1. 实现自己的方法来获取解析树或标记的范围中的文本,并将其放置于某些已知的标记类型有处理。

  2. 创建您自己的Token ,它知道返回某些令牌的规范形式类,并创建一个TokenFactory创建该类型的令牌实现。 然后使用setTokenFactory方法使你的词法分析器产生这些令牌。

  3. 创建您自己TokenStream覆盖缺省行为的实现。

  4. 明确指定之前创建令牌的运行动作全文:

     FOO : [Ff] [Oo] [Oo] { _text = "Foo"; }; 

其他选项可能可用。



文章来源: Canonicalizing token text in ANTLR
标签: antlr antlr4