我有以下代码扩展了ProcessBaseListener:
var myProcessListener = new MyProcessListener();
walker = new ParseTreeWalker();
walker.Walk(myProcessListener , tree);
我已经覆盖了一种方法:
public override void ExitLineNumberOrLabel(ProcessParser.LineNumberOrLabelContext context)
{
var lineNumberOrLabel = context.GetText().ToUpper();
}
如何操纵该上下文或其父上下文?所有方法都是只读的。
例如,我可能想修改lineNumberOrLabel或将其从父上下文中删除。我甚至可能想在它之前或之后插入不同类型的新上下文。
我尝试过使用TokenStreamRewriter但不会修改流。我必须调用ToString()来查看更改,然后可能再次解析它???为什么我不能只修改ParserRuleContexts?我以前基本上这样做是SableCC。
答案 0 :(得分:1)
在惯用法中,解析树一旦生成就是不可变的。将解析树/上下文节点更改的其他内容记录为properties attached to each relevant node。请参阅嵌入式JavaDoc以了解用法。
至于为什么,Antlr提供了自己的处理分析阶段/树行走的方法,如the last few paragraphs of this answer中所述。