我正在构建一个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
答案 0 :(得分:0)
这样做的一种方法是更好地计划使用进入/退出方法。这包括使用标记的替代方法来创建自动可区分的上下文。
要实施,请从
更改“声明”规则| 'if' parExpression statement ('else' statement)?
到
| 'if' parExpression statement elseStatement? # ifStmt
并定义新规则
elseStatement: 'else' statement ;
在enterIfStmt
侦听器方法中,只需打印IF即可。无需测试您是否在IF语句中 - 上下文确保您是。在enterElseStatement
方法中,同样只打印ELSE。
使用parExpression和statement的enter和exit方法打印其内容,将元素内容的打印委托给元素自己的输入/退出方法。