ANTLR4控制当前节点执行

时间:2015-06-15 08:27:32

标签: java antlr4

我正在构建一个Java to Ruby源代码转换器,我正在使用监听器,到目前为止我已经扩展了BaseListener,我正在使用Java.g4并且我正在尝试输出“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

1 个答案:

答案 0 :(得分:0)

这样做的一种方法是更好地计划使用进入/退出方法。这包括使用标记的替代方法来创建自动可区分的上下文。

要实施,请从

更改“声明”规则
| 'if' parExpression statement ('else' statement)?

| 'if' parExpression statement elseStatement?  # ifStmt

并定义新规则

elseStatement: 'else' statement ;

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

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