1

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

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

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

// ->

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

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

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

我的骨架就像:(在 Scala 中,但与 Java 几乎相同)

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

我在实施// TODO. 我尝试使用但没有成功addChildgetParent抛出空指针。

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

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

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

4

1 回答 1

1

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

  1. CommonToken实现类的IWritableToken

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

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

这会修改解析树。

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

于 2014-07-11T06:39:56.977 回答