ANTLR:遍历if/elseif/else javascript
我知道这样的问题很多,但我找不到任何解决问题的办法。因此,任何帮助都将不胜感激 我试图用java中的ANTLR解析js文件。 我正在使用antlr github中的lexer和parser g4文件 然后我使用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; } }
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
else\u输入,如果\u 1
谢谢你的回答,伊万。老实说,我不明白我怎么能分辨出是哪一个进入的?我更新了问题的入口/出口输出,以便您可以指出比输出。因为只有当阻塞时,我才能以某种方式区分“如果”和“如果”