Как получить все вхождения моего правила синтаксического анализатора во время выполнения Java ANTLRs? - PullRequest
0 голосов
/ 27 июня 2019

Я работаю над средством форматирования кода в Java для своей собственной ANTLR грамматики и теперь хочу работать над форматированием одного специального правила.

Я хочу как-то перебрать все экземпляров одного из моих правил синтаксического анализа (конкретнее if_stmt). Я работаю с ANTLR4 и средой исполнения Java.


Это самая маленькая версия моей грамматики для этой проблемы:

stmt_block
:
    EOF
    | stmt_list EOF
;

stmt_list
:
    stmt
    | stmt_list stmt
;

stmt
:

    if_stmt
    |  RETURN SEMICOLON NEWLINE?
;

if_stmt
:
    IF BRACKET_OPEN expr BRACKET_CLOSED CBRACKET_OPEN stmt_list CBRACKET_CLOSED
;

expr
:
    TRUE
;

Так выглядит моя функция форматирования

private String formatCode(String input) 
{
    // Parse the input
    MyLexer lex = new MyLexer(new CaseChangingCharStream(
        CharStreams.fromString(input), true));

    CommonTokenStream tokens = new CommonTokenStream(lex);
    tokens.fill();
    MyParser pars = new MyParser(tokens);
    Stmt_blockContext stmt_blockContext = pars.stmt_block();

    stmt_blockContext.children.forEach(parseTree->{
        //Iterate over the parseTree to get all if_stmtContext's and modify them
    });


    // Then return the modified contexts text
    return stmt_blockContext.getText();
}

Вот как я дошел до этого, и я знаю, что прошу кого-то просто решить мою проблему, но я застрял в этом и понятия не имею, как поступить.

Любая помощь приветствуется!

1 Ответ

1 голос
/ 28 июня 2019

Вы не можете использовать только синтаксический анализатор для любой задачи форматирования, если только вы не хотите, чтобы он мог работать только с допустимым вводом.Форматирование - это в основном перезапись пробелов, для которых лексер гораздо лучше подходит.См. Мой плагин ANTLR4 для кода Visual Studio , где приведен пример реализации средства форматирования кода.Это для грамматик ANTLR4, но те же принципы применимы к любому другому языку программирования.

...