Индентор кода с использованием ANTLR 4
Я пишу индентор кода, используя ANTLR4 и Java. Я успешно сгенерировал лексер и парсер. И подход, который я использую, состоит в том, чтобы пройти через сгенерированное дерево разбора.
ParseTreeWalker mywalker = new ParseTreeWalker();
mywalker.walk(myListener, myTree);
У автоматически сгенерированного *BaseListener есть методы как ниже...
@Override public void enterEveryRule(ParserRuleContext ctx) { }
Я очень новичок в ANTLR. Но, как я понимаю, мне нужно расширить *BaseListener и переопределить соответствующие методы и написать код для отступа, поэтому мой вопрос в том, какие методы мне следует переопределить для отступа файла входного кода? Или, если я выберу альтернативный подход, пожалуйста, дайте мне знать.
Спасибо!
1 ответ
Никто. Для этой задачи вам не нужен синтаксический анализатор, и вы ограничиваете себя допустимым кодом, когда вам требуется синтаксический анализатор (следовательно, вы не можете переформатировать код с синтаксической ошибкой). Вместо этого возьмите лексер и переберите все токены. Сохраняйте состояние, чтобы знать, где вы находитесь (блок, функция и т. Д.) И делайте отступ в соответствии с этим.