Инструменты для автоматического редактирования исходного кода - PullRequest
2 голосов
/ 06 января 2011

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

Мой вопрос к сообществу: Есть ли какие-нибудь хорошие инструменты для манипулирования исходным кодом напрямую? Я хочу сделать что-то вроде

  • Замена функций
  • Добавить объявления переменных везде, где они необходимы
  • Определить, умножена ли функция на что-либо
  • Определить, какие функции вызываются в строке кода
  • Посмотреть, какие параметры переданык функции и замените их альтернативами
  • Внедрите новые вызовы функций в определенных строках кода
  • По возможности, просто оставив остальную часть кода нетронутым и запишите результаты

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

Я с минимальным успехом использовал подход flex / bison, но я не чувствую, что это такнадежный.Я ненавижу писать полноценный синтаксический анализатор, чтобы добавить новую информацию в конец строки или в начало функции.Похоже, что это будет почти , что будет требоваться, но также кажется, что должны быть какие-то инструменты, чтобы уже делать эти типы манипуляций.

Код, который нужно изменить, написан на разных языках, но я особенно заинтересован в Фортране.

Есть мысли?

Ответы [ 3 ]

2 голосов
/ 06 января 2011

Наш DMS Software Reengineering Toolkit - это система преобразования программ общего назначения, которая принимает описания произвольных языков, позволяя ей манипулировать этими языками. Он имеет внешние интерфейсы для Fortran , C ++, C, Java, C #, COBOL и многих других языков. Эти внешние интерфейсы анализируют исходный код в структурах данных компилятора (например, завершают AST) и позволяют регенерировать AST в качестве допустимого исходного текста на языке, даже сохраняя комментарии. API DMS позволяют произвольную навигацию / проверку / модификацию AST, построение анализаторов на основе атрибута-грамматики. DMS предоставляет вспомогательный механизм для построения таблиц символов для конкретного языка, а также для контроля и анализа потока данных. Наконец, для любого языка, предоставляемого для DMS, он может применять сопоставления исходных шаблонов с AST, а также преобразования на основе шаблонов от источника к источнику для сопоставления и изменения AST, где каждое преобразование может быть включено произвольным предикатом анализа. .

Одна из ваших задач - найти вызов функции, умноженный на что-то. Этот шаблон DMS распознал бы его:

   domain Fortran.
   pattern  match_multiplied_function_call(f: IDENTIFIER, a: arguments, t: term): product
   =   " \f(\a)*\t ";

, который соответствует AST, где найден соответствующий синтаксис.

DMS разрабатывается и используется более 15 лет. Он использовался для проведения анализа и преобразования продукции в очень больших целевых программных системах (для C, 25 миллионов строк, для COBOL 10 миллионов строк, для Fortran 1,5 миллиона строк и т. Д.).

Интерфейс Fortran обрабатывает F77 и F90 и обрабатывает обычный дополнительный ганк, найденный в программах на Fortran (элементы F2003, указатели Cray, ...), и даже обрабатывает директивы препроцессора C, используемые внутри текста Fortran.

1 голос
/ 06 января 2011

Точно так же, как мой предшественник, отвечая на ваш вопрос, я не уверен, что это то, что вы ищете (или даже соответствует ли он вашим требованиям), но я знаю, что есть Photran плагин для Eclipse.

Я не использую Eclipse, я никогда не использовал Photran, но я знаю некоторых людей, которые его используют, поэтому я просто подумал, что могу распространить слово ...

1 голос
/ 06 января 2011

Я не уверен, что это 100% того, что вы ищете, но посмотрите ANTLR . Кто-то даже сделал для нее грамматику Фортрана .

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

...