【问题标题】:how to modify ANTLR4 ParseTree?如何修改 ANTLR4 ParseTree?
【发布时间】:2014-07-10 08:02:04
【问题描述】:

我想修改 Java SytaxTree,在变量前面加上一些 prefix(使用 ANTLR4)

例如myVar++ -> prefix.myVar++

expression
 |-- expression
 |    |-- primary
 |         |-- myVar
 |-- ++

// ->

expression
 |-- expression
 |     |-- expression
 |          |-- primary
 |               |-- prefix
 |     |-- .
 |     |-- myVar
 |-- ++

假设我的函数获取SyntaxTree 并返回修改后的SyntaxTree,我不能使用简单的TokenStreamRewriter,因为它只产生String,不是吗?还给出了Java8 grammar,不得修改。

我需要修改树本身(如果可能的话)。

我的 Skeleton 是这样的:(在 Scala 中,但它几乎与 Java 相同)

class MyVisitor extends Java8BaseVisitor[Unit] {
    // ...
    override def visitPrimary(ctx: Java8Parser.PrimaryContext) = {
        if (isVariable(ctx)) {    // this condition works
            // TODO
        }
    }
}

我很难实现// TODO。我尝试使用 addChildgetParent 但没有成功并抛出空指针。

我想我根本不了解 ParseTree 的构造/修改,因为我没有找到合适的来源。

你能给我一个提示或一些来源吗?

根据github issuesimilar question,它似乎不受支持 - 您会推荐哪些其他解决方案?我想到了TokenStreamRewritergetText,然后再次解析(变成新的ParseTree),但这可能非常无效(我将要多次添加前缀)。

【问题讨论】:

标签: antlr antlr4 parse-tree


【解决方案1】:

如果您只想更改变量的文本,我会这样做:

  1. 实现IWritableToken类的CommonToken

  2. 或者您创建自己的可写 Token 类

IToken 接口转换为此类并设置令牌文本(例如,添加前缀)。

这会修改解析树。

如果你想在变量前面添加一个不同的标记,这是行不通的。

【讨论】:

  • 我明白了,谢谢你的帮助,我希望我们可以在以下版本的 ANTLR 中修改树
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-10
相关资源
最近更新 更多