Лучшая практика форматирования PLSQL в Java с помощью ANTLR4 - PullRequest
0 голосов
/ 22 ноября 2018

Я создаю настраиваемый форматировщик кода на Java с помощью ANTLR4.Я смог создать парсер и лексер из файла грамматики, найденного на github (https://github.com/antlr/grammars-v4/tree/master/plsql)

Таким образом, я также узнал, почему все говорили, что это будет много работы. Я был немногосначала немного перегружен массой функций, созданных ANTLR, но через некоторое время я обнаружил, что (большая часть) триггера ввода и выхода необходимы для форматирования PLSQL.

Итак, я начинаюс этим, чтобы прочитать файл:

    CharStream s = CharStreams.fromPath(Paths.get("D:\\dev\\sample\\green3.sql"));
    CaseChangingCharStream upper = new CaseChangingCharStream(s, true);
    PlSqlLexer lexer = new PlSqlLexer(upper);
    PlSqlParser parser = new PlSqlParser(new CommonTokenStream(lexer));
    ParseTree tree = parser.sql_statement();
    //ParseTree tree = parser.sql_script();
    ParseTreeWalker walker = new ParseTreeWalker();
    PlSqlParserBaseListener listener = new PlSqlParserBaseListener();

    walker.walk(listener, tree);
    String output = listener.getOutput();
    System.out.println("[" + output +  "]");

Так что мне нужно дать ParseTree информацию, если это SQL-скрипт или просто оператор выбора. Это нормально, я хочу иметь возможность сделатьоба варианта, но с реализацией я начинаю только с операторов SELECT.

Например, SELECT и FROM не имеют специального правила для себя, поэтому я пишу "SELECT" для вывода:

    @Override public void enterFrom_clause(PlSqlParser.From_clauseContext ctx) {
        indentlevel--;
        output = output + " " + "\nFROM" + " ";
    }

Или, если я нахожу несколько выходных столбцов в, мне нужно выяснить, является ли это первым столбцом (это устанавливается в другой функции: enterSelect_list_elements)

    @Override public void enterExpression(PlSqlParser.ExpressionContext ctx) {
        if (firstcol) {
            output = output + " " + ctx.getText();
            indentlevel++;
            firstcol= false;
        }
        else {
        output = output + ", " + ctx.getText();
        }

    }

Мой PlSqlParserBaseListener выглядит какгосударственная машина сейчас.У меня есть несколько состояний, когда мне нужно сделать отступ или когда нужно выполнить определенные задачи.Это способ сделать это?Я спрашиваю, потому что это будет много работы и много вещей, и рассмотреть.Поэтому я хочу сделать это «правильным путем» и создать эффективное решение.Моя цель состоит в том, чтобы сделать возможным указывать интервалы, нижний / верхний регистр, операторы, знаки препинания, расположение списков и, возможно, выравнивание комментариев.

Спасибо за ваш отзыв!Привет из Австрии

...