我想以一些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
。我尝试使用addChild
和getParent
但没有成功并抛出Nullpointers。
我想我完全不理解ParseTree
的构造/修改,因为我找不到合适的来源。
你能给我一些暗示或一些消息来源吗?
根据github issue和similar question,它似乎不受支持 - 您会推荐哪些其他解决方案?我考虑TokenStreamRewriter
和getText
,然后再次解析(进入新的ParseTree
),但这可能非常无效(我将不止一次前缀)。
答案 0 :(得分:1)
如果您只想更改变量的文本,请执行以下操作:
有
实现CommonToken
class
IWritableToken
类
或者您创建自己的可写令牌类
将IToken
接口强制转换为此类并设置令牌文本(例如,添加前缀)。
这会修改现有的解析树。
如果你想在变量前添加一个不同的标记,这不起作用。