我递归遍历一个antlr解析树,我想编辑树中的TerminalNodes文本。我希望能够为任何ParseTree执行此操作,并且我不想为我可能遇到的每个ParseTree编写特定的访问者。
我查看了The Definitive ANTLR4 Reference并发现antlr没有直接支持树重写。我正在寻找任何可能的解决方法或替代解决方案。
private void editTree(ParseTree tree){
for(int i = 0; i < tree.getChildCount();i++){
ParseTree child = tree.getChild(i);
if(child instanceof TerminalNode){
//Edit child's text
} else {
editTree(child);
}
}
}
TerminalNode
有一个成员getSymbol()
,它返回lexed标记。这通常是一个CommonToken
实例,它允许设置文本和其他属性,如行号,类型等.ParseTree.getText()
除了要求符号提供文本(这反过来是您可以设置或来自输入的内容)时别无其他流)。