Это легко сделать с помощью системы преобразования программ.
DMS Software Reengineering Toolkit является общей программой преобразования программ и может использоваться со многими языками (C#, COBOL, Java, EcmaScript, Fortran, ..), а также специально с C++.
DMS анализирует исходный код (используя полный интерфейс langauge, в данном случае для C++), создает абстрактные деревья синтаксиса и позволяет применять шаблоны источника к источнику для преобразования кода из одной программы на C# в другую с помощью любые свойства, которые вы пожелаете. Правило преобразования для выполнения именно задачи вы определили бы:
domain CSharp.
insert_trace():function->function
"\visibility \returntype \fnname(int \parametername)
{ \body } "
->
"\visibility \returntype \fnname(int \parametername)
{ Heidigger(\CppString\(\methodname\),
\CppString\(\parametername\),
\parametername);
\body } "
Кавычки (") не C++ кавычки, скорее, они являются„кавычки домена“, и указывает, что содержимое внутри кавычек это синтаксис C++ (потому что мы сказали «домен CSharp»). Обозначения \ foo являются метасигналистами.
Это правило соответствует AST, представляющему функцию, и переписывает AST в прослеживаемую форму. вернитесь в исходную форму, которую вы можете скомпилировать. Вероятно, вам нужны другие правила для обработки других комбинаций аргументов, на самом деле вы бы, вероятно, обобщили обработку аргументов, чтобы произвести (где практически) строковое значение для каждого sc alar аргумент.
Должно быть ясно, что вы можете сделать намного больше, чем просто вести журнал с этим, и намного больше, чем просто аспектно-ориентированное программирование, поскольку вы можете выражать произвольные преобразования, а не только до-после действий.
Примечание: код C++ не является обычным языком, поэтому требование «для всех синтаксически законных C/C++» не достигается посредством регулярных выражений. – Svante
«Регулярные выражения» на языке Perl на самом деле не являются регулярными выражениями. Однако синтаксический анализ C++ все еще тяжелый. – jrockway
@svante: Это не вопрос. Регулу не нужно проверять, является ли код синтаксически законным. Он должен только найти определения функций и предположить, что весь код является законным. – Niki