In antlr4 .Context 的默认父类是 ParserRuleContext。我想在上下文中添加我的一些变量。但是我不想修改解析器规则上下文.java。所以我想创建一个新的Java类(例如MyParserRuleContext),它有一个父类ParserRuleContext,并且Context类继承自新的Class。
例如测试.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);
}
在这里,我们使用Scope
对象注释了一个BlockStmtContext
对象,将该范围对象与上下文对象相关联。
稍后,当您想要查找与上下文关联的Scope
对象时,您可以编写如下代码(这是在解析树访问者中):
public override SomeObject VisitBlockStmt(MyParser.BlockStmtContext context)
{
SomeObject somethingOrOther;
_currentScope = ScopeAnnotations.Get(context);
...
do something useful with the scope object
...
return somethingOrOther;
}
总的来说,我发现解析树注释非常有用,因为它允许您将信息传递到后续编译阶段,例如上面的例子。
目前这是不可能的。您可以将功能请求添加到问题跟踪器:
https://github.com/antlr/antlr4/issues
或对此相关问题的评论:
#30:添加规则上下文对象工厂?
回答较晚,但现在有可能(4.8),只需定义
options {
contextSuperClass=<<your class name>>;
}
在解析器语法中