Ключевая идея - программные преобразования . У Ондрея есть правильная идея с DMS, но я автор DMS, поэтому я, вероятно, предвзятый.
Язык DMS, используемый для выполнения преобразований, называется «Язык спецификации правил (DMS)», или RSL, и используется для указания правил (преобразования программ). Такое правило имеет:
- имя (у нас их много, и это удобный способ ссылаться на них)
- параметры (определяющие переменные шаблона), набранные в соответствии с интересующей грамматикой целевого языка,
- левая комбинация "match-this"
- правая рука "заменить на этот" шаблон
Шаблоны часто пишутся в поверхностном синтаксисе целевого языка, то есть родном синтаксисе преобразовываемого языка с расширениями для переменных шаблона. Различать
синтаксис языка RSL из целевого языка, шаблоны записываются в (мета) кавычках "...". Символ \ внутри паттернов - это (мета) выход обратно в RSL. Переменная шаблона пишется "\ x". (Мета) функция foobar
записывается как \ foobar (...), обратите внимание на (мета) экранирование в аргументах (мета) функций. Вне кавычек необходимы мета-экранированные символы, и эти конструкции пишутся без \, например, foobar (...).
Правила DMS могут быть намного более сложными, чем это, но это основы. Шаблоны синтаксиса поверхности не представляют текст; скорее они действительно представляют эквивалентные AST-коды кода в шаблонах. Правила DMS используются для сопоставления и изменения AST. Конечно, система преобразования программ должна иметь парсеры для создания AST и анти-парсеры ("prettyprinters") для преобразования 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 беззастенчиво коммерческое, и это не Dimestore инструмента, поэтому он не может быть то, что вам нужно для вашего тезиса.
Если не DMS, вы можете получить бесплатные инструменты с такими же идеями. Рассмотрим TXL (www.txl.ca) или StrategoXt (www.strategoxt.org). DMS, TXL, Stratego все выполняют программные преобразования, используя шаблоны поверхностного синтаксиса, но TXL и Stratego не могут обрабатывать значительные изменения в коде, а также DMS IMHO. (Читайте об анализе потока на веб-сайте DMS по некоторым причинам). Тем не менее, TXL и Stratego хороши для изучения основ и создания сильных демонстраций.