如何修改ANTLR4 ParseTree?

时间:2014-07-10 08:02:04

标签: antlr antlr4 parse-tree

我想以一些SytaxTree为变量加前缀的方式修改Java prefix(使用ANTLR4)

示例myVar++ - > prefix.myVar++

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

// ->

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

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

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

My Skeleton就像:(在Scala中,但它与Java几乎相同)

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

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

我想我完全不理解ParseTree的构造/修改,因为我找不到合适的来源。

你能给我一些暗示或一些消息来源吗?

根据github issuesimilar question,它似乎不受支持 - 您会推荐哪些其他解决方案?我考虑TokenStreamRewritergetText,然后再次解析(进入新的ParseTree),但这可能非常无效(我将不止一次前缀)。

1 个答案:

答案 0 :(得分:1)

如果您只想更改变量的文本,请执行以下操作:

  1. 实现CommonToken class

  2. IWritableToken
  3. 或者您创建自己的可写令牌类

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

    这会修改现有的解析树。

    如果你想在变量前添加一个不同的标记,这不起作用。