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



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

在解析器语法中

相关内容

  • 没有找到相关文章

最新更新