ANTLR4 控制当前节点执行

ANTLR4 controlling current node execution

我正在构建一个 Java 到 Ruby 的源代码转换器,我正在使用监听器,到目前为止我已经扩展了 BaseListener,我正在使用 Java.g4 并且我我试图在 if 之后输出 "else",但它必须正确匹配,我有这个:

@Override public void enterStatement(JavaParser.StatementContext ctx) {
    ident();
    if(ctx.getChild(0).getText().compareTo("if") == 0){
        // has a else clause
        if(ctx.getChildCount() > 3){
            // this just changes java "if( x > 5)" to ruby "if x > 5"
            System.out.println("if "+ctx.getChild(1).getChild(1).getText());
            // how ho I put the else after the execution of this statement?
        }
        else
            System.out.println("if "+ctx.getChild(1).getChild(1).getText());
        }
    }

像这样:Image.png

实现此目的的一种方法是更好地规划 enter/exit 方法的使用。这包括使用带标签的备选方案来创建可自动区分的上下文。

要实施,请将 'statement' 规则从

更改为
| 'if' parExpression statement ('else' statement)?

| 'if' parExpression statement elseStatement?  # ifStmt

并定义一个新规则

elseStatement: 'else' statement ;

enterIfStmt监听器方法中,只打印IF。无需测试您是否在 IF 语句中——上下文确保您在。在 enterElseStatement 方法中,同样只打印 ELSE。

使用 parExpression 和 statement 的 enter 和 exit 方法打印它们的内容,将其元素内容的打印委托给元素自己的 enter/exit 方法。