Использование antlr для удаления мертвого кода - PullRequest
1 голос
/ 13 сентября 2010

В настоящее время я обслуживаю старое приложение VBA (Visual Basic для приложений). У меня есть устаревший инструмент, который анализирует это приложение и печатает мертвые переменные. Поскольку их более 2000, я не хочу делать это вручную.

Поэтому у меня была идея преобразовать отдельные кодовые файлы, которые содержат мертвую переменную в соответствии с вышеупомянутым инструментом, в AST и удалить их таким образом.

Мой вопрос: есть ли рекомендуемый способ сделать это? Я не хочу использовать StringTemplate, так как мне нужно было бы создавать шаблоны для всех правил, и если бы у меня была рекомендация по скрытому каналу, она была бы потеряна, верно? Все, что мне нужно, это удалить части этого кода и распечатать остальные, как они были прочитаны.

У кого-нибудь есть рекомендации, пожалуйста?

1 Ответ

0 голосов
/ 20 мая 2011

Немного теории

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

Алгоритм

Можно предложить следующий алгоритм:

  1. Токенизация исходного кода с помощью лексера. Поскольку вы хотите сохранить весь правильный код - не пропускайте и не скрывайте его токены. Обязательно определите отдельные токены для частей, которые могут быть удалены или которые будут использоваться для определения мертвого кода, все другие символы могут быть собраны под одним типом токена. Здесь вы можете использовать выходные данные вашего вспомогательного инструмента в предикатах, чтобы уменьшить количество генерируемых токенов. Я полагаю, токенизация antlr (как и любая другая токенизация) выражена на обычном языке, поэтому вы не можете удалить весь мертвый код на этом шаге.

  2. Построить AST с парсером. Здесь можно применить все возможности языка без контекста - определить разделы мертвого кода в правилах синтаксического анализатора и удалить его из создаваемого AST.

  3. Конвертировать AST в исходный код. Здесь вы можете использовать какой-то синтаксический анализатор дерева, но я думаю, что есть более простой способ, который можно найти, наблюдая toString и возвращая аналогичные методы типа дерева парсером.

...