Как написать генератор кода C ++, который принимает код C ++ в качестве входных данных? - PullRequest
1 голос
/ 10 февраля 2012

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

CORBA IDL -> раздражающий код, сгенерированный CORBA -> полезные оболочки / вспомогательные функции

Используя отражение Java, я могу проверить сгенерированный CORBA код и использовать его для генерации дополнительного кода. Однако, поскольку C ++ не имеет отражения, я не уверен, как это сделать на стороне C ++. Должен ли я использовать синтаксический анализатор C ++? Шаблоны C ++?

TLDR: Как сгенерировать код C ++, используя сгенерированный код C ++ в качестве ввода?

Ответы [ 4 ]

2 голосов
/ 12 февраля 2012

Рассматривали ли вы сделать шаг назад и использовать IDL в качестве источника для пользовательского генератора кода? Возможно, у вас есть некоторый код-обертка, который скрывает такие вещи, как duplicate, var, ptr и т. Д. У нас есть компилятор CORBA IDL на основе Ruby, который в настоящее время генерирует код Ruby и C ++. Это может быть расширено генератором клиента, см. http://www.remedy.nl для RIDL и R2CORBA.

Другой вариант - проверить отображение языка IDL на C ++ 11, над которым мы работаем, подробнее об этом http://taox11.remedy.nl. Это новое отображение языка намного проще в использовании и использует стандартные типы и контейнеры STL для работа с.

2 голосов
/ 10 февраля 2012

GCC XML может помочь в восстановлении интерфейса.

Я использую его для написания внешнего интерфейса Prolog для механизма рендеринга OpenGL и Horde3D.

ИнтерфейсыЯ заинтересован в том, чтобы ограничиваться C, но GCC XML также обрабатывает C ++.

Интерфейс исходного кода GCC для синтаксического анализа XML, а также XML и AST.Затем с помощью библиотеки XML довольно легко извлечь запрашиваемую информацию.Нюанс это потеря макро символов: AFAIK только значения выживают до разбора.Например, здесь (часть) кода Пролог, используемого для генерации FLI:

make_funcs(NameChange, Xml, FileName, Id) :-
    index_id(Xml, Indexed),

    findall(Name:Returns:ArgTypes,
        (xpath(Xml, //'Function'(@file = Id, @name = Name, @returns = ReturnsId), Function),
         typeid_indexed(Indexed, ReturnsId, Returns),
         findall(Arg:Type, (xpath(Function, //'Argument'(@name = Arg, @type = TypeId), _),
                    typeid_indexed(Indexed, TypeId, Type)), ArgTypes)
        ),
        AllFuncs),

    length(AllFuncs, LAllFuncs),
    writeln(FileName:LAllFuncs),

    fat('prolog/h3dplfi/~s.cpp', [FileName], Cpp),
    open(Cpp, write, Stream),
    maplist(\X^((X = K-A -> true ; K = X, A = []), format(Stream, K, A), nl(Stream)),
        ['#include "swi-uty.h"',
         '#include <~@>'-[call(NameChange, FileName)]
        ]),

    forall(member(F, AllFuncs), make_func(Stream, F)),
    close(Stream).

xpath (как вы догадываетесь), это библиотека SWI-Prolog, которая упрощает анализ...

0 голосов
/ 12 февраля 2012

Взгляните на Clang compiler . Помимо того, что он является автономным компилятором, он также предназначен для использования в качестве библиотеки в ситуациях, подобных описанной вами. Он предоставит вам дерево разбора, на котором вы могли бы провести анализ и преобразования

0 голосов
/ 10 февраля 2012

Если вы хотите надежно обрабатывать исходный код C ++, вам нужен инструмент преобразования программ, который понимает синтаксис и семантику C ++, может анализировать код C ++, преобразовывать проанализированное представление и восстанавливать действительный код C ++ (включая исходные комментарии). Такой инструмент фактически обеспечивает произвольное метапрограммирование, оперируя вне языка, поэтому он не ограничен встроенными в язык средствами "отражения" или "метапрограммирования".

Наш инструментарий реинжиниринга программного обеспечения DMS с C ++ Front End *1008* может сделать это.

Он использовался в ряде задач автоматического преобразования C ++, оба (случайно) связанных с действиями на основе CORBA. Первый включал изменение интерфейсов для проприетарной распределенной системы в CORBA-совместимые аспекты. Второй изменил большое приложение на основе CORBA перед лицом изменений IDL; такие изменения в действительности приводят к перемещению кода и изменению подписи. Вы можете найти технические документы на веб-сайте, которые описывают первый вид деятельности; второе было сделано для крупного оборонного подрядчика.

...