在ANTLR中规范化令牌文本

时间:2014-09-12 16:17:27

标签: antlr antlr4

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"。

1 个答案:

答案 0 :(得分:2)

以下任何选项均有效:

  1. 实现您自己的方法以获取解析树或令牌范围的文本,并将处理放置在那里。

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

  3. 创建自己的TokenStream实现,以覆盖默认行为。

  4. 明确指定在创建令牌之前运行的操作中的文本:

    FOO : [Ff] [Oo] [Oo] { _text = "Foo"; };
    
  5. 也可能有其他选择。