ANTLR: проходя, если / elseif / else javascript - PullRequest
0 голосов
/ 10 января 2020

Я знаю, что о такой проблеме много, но я не могу найти решение своей проблемы. Поэтому любая помощь будет высоко ценится.

Я пытаюсь проанализировать файл 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;}

1 Ответ

0 голосов
/ 12 января 2020

Мы рассматриваем следующее правило грамматики, соблюдаемое грамматикой:

ifStatement
    : If '(' expressionSequence ')' statement (Else statement)?
    ;

Именно поэтому ifStatement методы слушателя вызываются в следующем порядке:

  1. введите в if_1
  2. введите nested_if_1
  3. введите nested_if_1
  4. введите else_if_1
  5. введите else_if_1
  6. выход из if_1
...