ANTLR:遍历if/elseif/else javascript

ANTLR:遍历if/elseif/else javascript,javascript,antlr4,abstract-syntax-tree,Javascript,Antlr4,Abstract Syntax Tree,我知道这样的问题很多,但我找不到任何解决问题的办法。因此,任何帮助都将不胜感激 我试图用java中的ANTLR解析js文件。 我正在使用antlr github中的lexer和parser g4文件 然后我使用JavaScriptListener进行解析。 我面临的问题是if/else块的嵌套构造。 例如,我有以下js代码: if (if_1) { a=b; if (nested_if_1) { nested_if_a=nested_if_b; } }

我知道这样的问题很多,但我找不到任何解决问题的办法。因此,任何帮助都将不胜感激

我试图用java中的ANTLR解析js文件。 我正在使用antlr github中的lexer和parser g4文件

然后我使用
JavaScriptListener
进行解析。 我面临的问题是if/else块的嵌套构造。 例如,我有以下js代码:

if (if_1) {
    a=b;
    if (nested_if_1) {
        nested_if_a=nested_if_b;
    }
} else if (else_if_1) {
    else_if_1_a = else_if_1_b;
}
这里的问题是如何找出is块所属的
else?
或者,如果第二个在第一个里面,我怎么知道呢

As listener只有两个与if相关的方法:

enterIfStatement(JavaScriptParser.IfStatementContext ctx)

exitIfStatement(JavaScriptParser.IfStatementContext ctx)

更新

为了更好地理解,这里是walker输出

if语句的侦听器入口/出口输出

+enterIfStatement: if(if_1){a=b;if(nested_if_1){nested_if_a=nested_if_b;}}elseif(else_if_1){else_if_1_a=else_if_1_b;}
    enterStatement: {a=b;if(nested_if_1){nested_if_a=nested_if_b;}}
        +enterIfStatement: if(nested_if_1){nested_if_a=nested_if_b;}
        -exitIfStatement: if(nested_if_1){nested_if_a=nested_if_b;}
        exitStatement: if(nested_if_1){nested_if_a=nested_if_b;}
    exitStatement: {a=b;if(nested_if_1){nested_if_a=nested_if_b;}}
    enterStatement: if(else_if_1){else_if_1_a=else_if_1_b;}
        +enterIfStatement: if(else_if_1){else_if_1_a=else_if_1_b;}
        -exitIfStatement: if(else_if_1){else_if_1_a=else_if_1_b;}
    exitStatement: if(else_if_1){else_if_1_a=else_if_1_b;}
-exitIfStatement: if(if_1){a=b;if(nested_if_1){nested_if_a=nested_if_b;}}elseif(else_if_1){else_if_1_a=else_if_1_b;}

我们正在考虑以下关于语法的语法规则:

ifStatement
    : If '(' expressionSequence ')' statement (Else statement)?
    ;
这就是为什么要按以下顺序调用
ifStatement
侦听器方法:

  • 如果_1
  • 如果_1
  • 如果_1
  • 如果1
  • else\u输入,如果\u 1
  • 如果_1

  • 谢谢你的回答,伊万。老实说,我不明白我怎么能分辨出是哪一个进入的?我更新了问题的入口/出口输出,以便您可以指出比输出。因为只有当阻塞时,我才能以某种方式区分“如果”和“如果”