【问题标题】:Canonicalizing token text in ANTLR在 ANTLR 中规范化标记文本
【发布时间】:2014-09-12 16:17:27
【问题描述】:

在 ANTLR 中有没有办法将某些标记标记为具有规范输出?

例如,给定语法(摘录)

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

words 将匹配“FOO BAR BAZ”、“foo bar baz”、“Foo bAr baZ”等。

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

有没有办法“规范化”这个输出,这样无论输入是什么,所有FOO 标记都呈现为“Foo”,BAR 标记呈现为“Bar”,BAZ 标记呈现为“巴兹”(例如)?

鉴于上述任何输入,我希望输出“Foo Bar Baz”。

【问题讨论】:

    标签: antlr antlr4


    【解决方案1】:

    以下任何选项都可以:

    1. 实现您自己的方法来获取解析树或标记范围的文本,并将某些已知标记类型的处理放在那里。

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

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

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

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

    其他选项也可能可用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-23
      • 1970-01-01
      • 1970-01-01
      • 2012-05-05
      • 2011-11-14
      • 1970-01-01
      • 1970-01-01
      • 2012-05-04
      相关资源
      最近更新 更多