Основная идея заключается в программных преобразованиях. У Ондрея правильное представление о DMS, но я автор DMS, поэтому я, вероятно, предвзят.
Язык DMS, используемый для выполнения преобразований, называется «языком спецификации правил (DMS)» или RSL и используется для определения правил (преобразования программы). Такое правило имеет:
- имя (у нас, как правило, их много, и это удобный способ обратиться к ним)
- параметры (определяющие переменные шаблона), типизированные в соответствии с интересующей грамматикой целевого языка,
- левый шаблон "сопоставьте это"
- правая рука "заменить этим"
Шаблоны часто пишутся на поверхностном синтаксисе целевого языка, т. е. на родном синтаксисе преобразуемого языка с расширениями для переменных шаблонов. Чтобы отличить синтаксис языка RSL от целевого языка, шаблоны записываются внутри (мета) кавычек "...". Символ \ внутри шаблонов — это (мета)побег обратно в RSL. Переменная шаблона записывается как "\x". (Мета)функция foobar записывается как \foobar( ... ), обратите внимание на (мета)экранирование в аргументах (мета)функции. Вне кавычек необходимы метаэкраны, и эти конструкции пишутся без \, например, foobar(...).
Правила DMS могут быть намного сложнее, но это основы. Паттерны поверхностного синтаксиса не представляют текст; скорее, они действительно представляют собой эквивалентные AST кода в шаблонах. Правила DMS используются для сопоставления и изменения AST. Система преобразования программ, конечно же, должна иметь синтаксические анализаторы для создания AST и анти-парсеры («красивые принтеры») для преобразования AST обратно в текст. (DMS имеет большую библиотеку языковых интерфейсов для всех широко используемых языков на планете и множества необычных; мы только что добавили MUMPS).
Для конкретных примеров вам помогут следующие правила:
"... удаление заданной функции":
rule remove_function(f:IDENTIFIER,p:parameters,b:body): declarations -> declarations
" \f \p \b " -> " ; " -- replace function delcaration by empty declation
if f==target_function_name();
... добавление условия if вокруг блока кода:
rule wrap_in_if(s:statement): statement -> statement
" \s " -> " \if ( \generated_condition\(\) ) \s ";
... добавление объявления новой функции, которая ничего не делает:
rule insert_noop_function(d:declarations): delcarations -> declarations
" \d " -> " \target_function\name\(\) ( ) { } ";
Как вы заметили, вам нужно указать их куда-то; это работа «метапрограммы», которая определяет, где в вашем AST вы хотите применить правила, а затем применяет их. Для ваших правил вам нужен (с DMS) и явный процедурный метод, чтобы найти нужное место. Для некоторых правил DMS вы можете просто применить их «везде»; DMS, по сути, пройдёт весь назначенный AST и применит правила для вас.
Несколько правил никогда не производят сильного впечатления, как не впечатляют несколько строк кода. Несколько сотен или тысяч правил могут делать довольно впечатляющие вещи (например, полные языковые переводы), точно так же, как несколько сотен или тысяч строк кода могут дать довольно интересные результаты. Разница в том, что обычный код работает с числами, строками и структурами, а инструменты преобразования программ вычисляют по структурам программ (AST).
Существует полный рабочий пример, показывающий, как определить язык и правила для DMS, и как эти правила применяются для достижения «модификаций программы» (пример фактически изменяет «алгебраические выражения», но идеи точно такие же).
DMS беззастенчиво коммерческий, и это не инструмент для продажи в магазине, так что это может быть не то, что вам нужно для вашей диссертации.
Если не DMS, вы можете получить бесплатные инструменты с теми же идеями. Рассмотрим TXL (www.txl.ca) или StrategoXt (www.strategoxt.org). DMS, TXL, Stratego все выполняют преобразования программ, используя шаблоны поверхностного синтаксиса, но TXL и Stratego не могут обрабатывать массовые изменения кода так же хорошо, как DMS IMHO. (По некоторым причинам читайте об анализе потока на веб-сайте DMS). Однако TXL и Stratego хороши для изучения основ и создания сильных демонстраций.
person
Ira Baxter
schedule
14.04.2011