有没有办法编辑 Antlr ParseTree 上的节点?

Is there a way to edit nodes on an Antlr ParseTree?

我正在递归遍历一个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(),它 returns 是词法化的标记。这通常是一个 CommonToken 实例,它允许设置文本和其他属性,如行号、类型等。 ParseTree.getText() 除了要求符号提供文本(这反过来就是你可以设置或来自输入流的内容)。