Стандартное решение такой проблемы, если оно встречается на языке программирования, отличном от C ++, - это написать собственный препроцессор, который понимает некоторое подмножество рассматриваемого языка и вашу аннотацию, переписывает код с удаленными аннотациями,который затем передается фактическому компилятору языка.
Это стандартный метод расширения языков: добавление шага предварительной обработки перед компилятором.
К сожалению, * 1005 практически невозможно* просто разобрать функция завершена C ++;обработка исходного кода C ++ почти всегда заканчивается созданием полного генератора AST, из-за того, что некоторые утомительно анализировать особенности языка.
Посмотрите на эти объявления:
template<bool b, class T> void foo(T &t){if(b) T.do_this(); else T.do_that();}
class foobar { public: virtual void do_this(); virtual void do_that(); };
class barfoo : public foobar { public: virtual void do_this(); virtual void do_that(); };
и теперь эта функция
void bar(float l){ barfoo t; foo<fsqrt(l) > 1, foobar>(t); }
Проблема здесь в том, что квадратные скобки имеют двойное значение для шаблона и сравнения для параметра шаблона.Единственный способ решить, к какой категории относится каждая скобка, - это полное синтаксическое дерево.
Мне известен только один такой инструмент, который вы описываете: MOC из набора инструментов Qt выполняет то, что вы предлагаете: код C ++, снабженный комментариями с ключевыми словами сигнал и слот .Qt является открытым исходным кодом, поэтому может быть хорошей идеей изучить источники MOC.
Написание и чтение C ++ действительно очень сложное дело.