在antlr4中。 Context的默认父类是ParserRuleContext。我想在Context中添加一些变量。但我不想修改ParserRuleContext.java.so我想创建一个新的Java类(例如MyParserRuleContext),它有一个父类ParserRuleContext,而Context类继承自新类。
e.g.test.v4
expression:expression'..'Identifier'('expressionList?')'| ... | ...;
生产将创建一个ExpressionContext类.ExpressionContent的父类是MyParserRuleContext.MyParserRuleContext的父类是ParserRuleContext
可以在test.v4 ???
中执行此操作答案 0 :(得分:2)
如果您真的想要做的是将附加数据与上下文对象相关联,则可以使用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;
}
通常,我发现解析树注释非常有用,因为它允许您将信息传递到编译的后续阶段,例如上面的示例。
答案 1 :(得分:0)
目前无法实现。您可以向问题跟踪器添加功能请求:
https://github.com/antlr/antlr4/issues
或对此相关问题发表评论:
#30: add rule context object factory?
答案 2 :(得分:0)
迟到的答案,但现在可以了 (4.8),只需定义
options {
contextSuperClass=<<your class name>>;
}
在解析器语法中