ANTLR: создать исходный файл из AST
Я изменил парсер PLSQL, предоставленный [Porcelli] ( https://github.com/porcelli/plsql-parser). Я использую этот парсер для разбора файлов PlSql. После успешного разбора я печатаю АСТ. Теперь я хочу отредактировать AST и распечатать исходный исходный код plsql с отредактированной информацией. Как мне этого добиться? Как я могу получить исходный файл из AST с комментариями, новой строкой и пробелами. Кроме того, форматирование также должно оставаться в исходном файле. Любое руководство к этому было бы полезно.
2 ответа
Простой ответ - "пройтись по дереву и выплюнуть текст, соответствующий узлам". ANTLR предлагает "StringTemplates" в качестве основного вида помощи, но на самом деле есть много мелких деталей, которые необходимо учитывать: отступы, литералы и их форматы, комментарии,...
Смотрите мой SO-ответ по Компиляции AST обратно к исходному коду для более подробной информации.
Единственное, что не решено, это общая необходимость воспроизвести исходную кодировку символов файла (если вы можете, иногда вы не можете, например, у вас был файл ASCII, но вставлена строка, содержащая символ Unicode).
Каждый узел в AST имеет индексный элемент, который дает вам позицию токена во входном потоке (фактически, токен). Когда вы изучите индексы в вашем AST, вы увидите, что там не все индексы появляются (есть дыры в существующих индексах). Это позиции, которые были отфильтрованы (обычно пробелы и комментарии).
Однако ваш входной поток может дать вам токен с заданным индексом и, что важно, дать вам каждый найденный токен, независимо от того, в каком канале он находится. Таким образом, ваша стратегия может заключаться в том, чтобы перебирать токены из вашего потока токенов и распечатайте их, когда они придут. Кроме того, вы можете проверить свой AST на предмет текущего индекса и посмотреть, должен ли вместо этого генерироваться другой вывод или должен добавляться дополнительный вывод.