当我使用BaseListener处理它时,如何修改或插入ParserRuleContext

时间:2015-06-17 06:10:44

标签: antlr4 antlr4cs

我有以下代码扩展了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。

1 个答案:

答案 0 :(得分:1)

在惯用法中,解析树一旦生成就是不可变的。将解析树/上下文节点更改的其他内容记录为properties attached to each relevant node。请参阅嵌入式JavaDoc以了解用法。

至于为什么,Antlr提供了自己的处理分析阶段/树行走的方法,如the last few paragraphs of this answer中所述。