如何修改或插入 ParserRuleContext,因为我正在使用 BaseListener 遍历它
How to modify or insert a ParserRuleContext as I am walking it with a BaseListener
我有以下扩展 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。
在惯用用法中,解析树一旦生成便不可变。记录 parse-tree/context 节点更改为 properties attached to each relevant node 的其他意图。有关用法,请参阅嵌入式 JavaDoc。
至于原因,Antlr 提供了自己的方法来处理 phase/tree 步行分析,如 中所述。
我有以下扩展 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。
在惯用用法中,解析树一旦生成便不可变。记录 parse-tree/context 节点更改为 properties attached to each relevant node 的其他意图。有关用法,请参阅嵌入式 JavaDoc。
至于原因,Antlr 提供了自己的方法来处理 phase/tree 步行分析,如