Индентор кода с использованием ANTLR 4

Я пишу индентор кода, используя ANTLR4 и Java. Я успешно сгенерировал лексер и парсер. И подход, который я использую, состоит в том, чтобы пройтись по сгенерированному дереву синтаксического анализа.

  ParseTreeWalker mywalker = new ParseTreeWalker();
  mywalker.walk(myListener, myTree);    

Автоматически сгенерированный *BaseListener имеет методы, подобные приведенным ниже...

@Override public void enterEveryRule(ParserRuleContext ctx) { }

Я очень новичок в ANTLR. Но, как я понимаю, мне нужно расширить *BaseListener и переопределить соответствующие методы и написать код для отступа. Итак, мой вопрос: какие методы я должен переопределить для отступа во входном файле кода? Или, если есть альтернативный подход, который я должен использовать, пожалуйста, дайте мне знать.

Спасибо!


person user7413    schedule 07.10.2017    source источник


Ответы (1)


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

person Mike Lischke    schedule 07.10.2017