java - 我可以更改antlr4中context的父类吗

标签 java antlr4

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

相关文章:

java - J2Objc 类型项目的设计模式

antlrworks - 如何在ANTLR 4字符串匹配中排除“和\?

javascript - antlr语法: Lexer matches "impossible" rule

c++ - 将 antlrcpp::Any 转换为 std::string

c# - 访问 ANTLR 4 中的 channel 并分别解析它们

c# - ANTLR4 - VisitChildren 返回 null,即使 child 返回某个对象

Java小程序: monitor HTTP requests

java - 关于多线程

java - 如何在 Java 中选择标题时选择 JTable 列

java - Eclipse 中 Java Web 应用程序的结构