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 方法。
我正在构建一个 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 方法。