Я знаю, что о такой проблеме много, но я не могу найти решение своей проблемы. Поэтому любая помощь будет высоко ценится.
Я пытаюсь проанализировать файл js с ANTLR в java. Я использую файлы lexer и parser g4 из antlr-github
JavaScriptLexer.g4 JavaScriptParser.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;
}
Здесь проблема в том, как узнать else if
, к которому относятся блоки? Или как мне выяснить, что это вторая секунда, если она находится внутри первой?
Поскольку у слушателя есть только два метода, связанных с if:
enterIfStatement (JavaScriptParser.IfStatementContext ctx)
exitIfStatement (JavaScriptParser.IfStatementContext ctx)
ОБНОВЛЕНИЕ
Для лучшего понимания здесь вывод Уокера
вход / выход для прослушивателя для оператора 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;}