我可以在antlr4中更改上下文的父类

时间:2014-02-27 09:46:39

标签: java antlr4

在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 ???

中执行此操作

3 个答案:

答案 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>>;
}

在解析器语法中