【发布时间】: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。我尝试使用 addChild 和 getParent 但没有成功并抛出空指针。
我想我根本不了解 ParseTree 的构造/修改,因为我没有找到合适的来源。
你能给我一个提示或一些来源吗?
根据github issue 和similar question,它似乎不受支持 - 您会推荐哪些其他解决方案?我想到了TokenStreamRewriter 和getText,然后再次解析(变成新的ParseTree),但这可能非常无效(我将要多次添加前缀)。
【问题讨论】:
-
谢谢,很酷的网站
标签: antlr antlr4 parse-tree