Вы можете сделать это с помощью нашего набора инструментов для реинжиниринга программного обеспечения DMS, используя преобразования источника в источник DMS.
DMS выполняет синтаксический анализ (C++17/VisualStudio2015) исходного кода в AST, применяет преобразования между исходными кодами, которые изменяют дерево, и результирующий AST распечатывается для повторной генерации (модифицированного) исходного кода. Это позволяет надежно автоматизировать изменения кода в больших базах кода.
Правила перезаписи DMS для примеров OP будут выглядеть так:
rule add_true_to_hello_world()
:functioncall->functioncall
= "myFunction( \"hello\", \"world\");"
-> "myFunction( \"hello\", true, \"world\");";
rule add_true_to_call_with_literal_string(s: STRING)
: functioncall->functioncall
= "myFunction(\s)"
-> "myFunction(\s, true);"
rule add_true_when_char_star(i:IDENTIFIER,s:STRING, a:argument):
:functioncall->functioncall
= "\i(\s,\a);"
-> "\i(\s, true, \a)"
if IsCharStart(a);
ruleset replace_deprecated_calls =
{ add_true_to_hello_world,
add_true_to_call_with_literal_string,
add_true_when_char_star
}
Краткое пояснение: правила имеют вид
rule name(metavariable): syntaxclass->syntaxclass
lefthandside -> righthandside if condition ;
У правил есть имена, поэтому люди и наборы правил могут удобно обращаться к ним; иногда могут быть тысячи правил для выполнения очень сложных преобразований. У правила есть параметры, указывающие, какие метапеременные (обозначаемые как \v) разрешены внутри правила. Обозначение «вызов функции->вызов функции» означает, что мы преобразуем вызовы функций в вызовы функций, а не во что-то еще. Кавычки вокруг текста C++ — это метакавычки, отделяющие текст C++ от текста правил DMS, из-за чего нам приходится экранировать кавычки фактических литеральных строк C++ с помощью \". [Да, возможно, мы разработали DMS для этого случай без экранирования; не всегда может быть достаточно умным].
Набор правил просто группирует правила, чтобы все они могли применяться как группа. Не показан тривиальный вызов DMS для применения набора правил.
Подробнее о синтаксисе правил можно прочитать по ссылке выше.
Я реализовал его правила иначе, чем выразился ОП. Его примеры показывают только вызов функции как оператор (обратите внимание на «;» в его примерах), который изменяется, но он пишет в тексте, что хочет заменить все вызовы функций. Таким образом, эти правила касаются изменений вызовов функций, а не операторов. Первое правило OP, которое я закодировал точно так же, как он показал в своем примере; это будет работать только в том случае, если вызов функции имеет буквально эти литера строки аргумента. Его второе правило я обобщил, чтобы разрешить произвольную литеральную строку, а не просто «мир». Третье правило я обобщил, разрешив произвольное имя функции, и добавил проверку типа, как он указал.
Обратите внимание, что совпадения шаблонов на самом деле происходят в синтаксических деревьях, а не в необработанном тексте. DMS нельзя обмануть вызовами функций внутри комментариев или другими пробелами/форматированием.
person
Ira Baxter
schedule
11.10.2017
[[deprecated]]
(чтобы компилятор мог предупредить об использовании и помочь найти звонки)? - person Some programmer dude   schedule 04.10.2017