在antlr4中。 Context 的默认父类是 ParserRuleContext。我想在上下文中添加一些变量。但我不想修改ParserRuleContext.java。所以我想创建一个新的Java类(例如MyParserRuleContext),它有一个父类ParserRuleContext,并且Context类继承自新类。
例如test.v4
表达式:表达式'..'标识符'('表达式列表?')'|...|...;
制作时会生成一个ExpressionContext类。ExpressionContent的父类是MyParserRuleContext。MyParserRuleContext的父类是ParserRuleContext
可以在 test.v4 中执行此操作吗???
最佳答案
如果您实际上想要做的是将附加数据与上下文对象相关联,您可以使用 ParseTreeProperty<T>
对象来注释您的上下文对象。这是解析树监听器中的一个简单示例(在 C# 中,但在 Java 中应该非常相似):
private ParseTreeProperty<Scope> ScopeAnnotations = new ParseTreeProperty<Scope>();
private Scope _currentScope = new GlobalScope();
public override void EnterBlockStmt(MyParser.BlockStmtContext context)
{
InnerScope innerScope = new InnerScope(_currentScope);
_currentScope = innerScope;
ScopeAnnotations.Put(context, _currentScope);
}
在这里,我们注释了BlockStmtContext
带有 Scope
的对象对象,将该范围对象与上下文对象相关联。
稍后,当您想要查找 Scope
时与上下文关联的对象,您可以编写如下代码(这是在解析树访问者中):
public override SomeObject VisitBlockStmt(MyParser.BlockStmtContext context)
{
SomeObject somethingOrOther;
_currentScope = ScopeAnnotations.Get(context);
...
do something useful with the scope object
...
return somethingOrOther;
}
总的来说,我发现解析树注释非常有用,因为它允许您将信息携带到编译的后续阶段,例如上面的示例。
关于java - 我可以更改antlr4中context的父类吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22064671/