Добавление синтаксиса аннотации в источник C ++ - PullRequest
3 голосов
/ 16 декабря 2010

Я хочу создать свои собственные пользовательские теги (как в стиле Java) в моем источнике C ++.Поскольку стандартный синтаксис C ++ не допускает аннотации, я хотел бы изменить / улучшить компилятор для своих собственных нужд.

Но предоставляет ли Visual Studio свои внутренние компоненты компилятора для изменения пользователями (например, вывод его лексера, абстрактного синтаксического дерева и т. Д.)?Если нет, существуют ли какие-либо сторонние инструменты для синтаксического анализа синтаксиса c ++ и позволяющие мне создавать собственную настраиваемую исходную базу c ++ на основе собственной аннотации?

Ответы [ 2 ]

9 голосов
/ 16 декабря 2010

Предоставляет ли Visual Studio свои внутренние компоненты компилятора для изменения пользователями (например, вывод его лексера, абстрактного синтаксического дерева и т. Д.)?

нет

Нет

Существуют ли какие-либо сторонние инструменты для синтаксического анализа синтаксиса C ++, позволяющие мне создавать собственную настраиваемую исходную базу C ++ под собственной аннотацией?

Clang

6 голосов
/ 16 декабря 2010

Стандартное решение такой проблемы, если оно встречается на языке программирования, отличном от 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 ++ действительно очень сложное дело.

...