Как открыть typedef в источниках C / C ++?

Я хочу проанализировать C / C ++ — код с моим примитивным парсером, чтобы получить ast-tree.

Но он не поддерживает макро и typedefs.

Можно раскрыть определения макросов в любом C / C ++-проекте с помощью опций gcc.
После этого мой собственный парсер может справиться с C / C ++ — кодом, но только в том случае, если в нем нет typedefs.

Итак, я бы хотел как-то избавиться от typedefs. Но я понятия не имею, что мне делать.

Я хочу заменить переопределенные имена типов, например:

typedef char CHAR;
typedef int& INT;
INT a;
CHAR b;

по оригиналам:

int &a;
char b;

В результате я хочу получить те же исходники, но с оригинальными типами, без typedefs.

Я думаю, это очень простая задача для компилятора, но не для студенческого проекта. 🙂

Насколько я знаю, DECL_ORIGINAL_TYPE (TYPE_NAME (t)) из g ++ указывает на узел дерева с типом исходного объекта.
Но я действительно не хотел бы погружаться в исходники g ++, чтобы принять его для своих требований.

Итак, как проще всего открыть typedefs?

Любая помощь будет принята с благодарностью.

Отредактировано:

Решение с GCCXML действительно хорошо, но я до сих пор не понимаю, как получить
C / C ++ код из его представления XML. Не могли бы вы объяснить, что я должен сделать для преобразования XML:

(an example from http://www.gccxml.org/HTML/example1out.html)

<?xml version="1.0"?>
<GCC_XML>
<Namespace id="_1" name="::" members="_2 _3 _4 "/>
<Function id="_2" name="main" returns="_5" context="_1" location="f0:8"/>
<Function id="_3" name="a_function" returns="_5" context="_1" location="f0:4">
<Argument name="f" type="_6"/>
<Argument name="e" type="_4"/>
</Function>
<Struct id="_4" name="EmptyClass" context="_1" location="f0:1" members="_7 _8 " bases=""/>
<FundamentalType id="_5" name="int"/>
<FundamentalType id="_6" name="float"/>
<Constructor id="_7" name="EmptyClass" context="_4" location="f0:1">
<Argument name="_ctor_arg" type="_9"/>
</Constructor>
<Constructor id="_8" name="EmptyClass" context="_4" location="f0:1"/>
<ReferenceType id="_9" type="_4c"/>
<File id="f0" name="example1.cxx"/>
</GCC_XML>

вернуться к C / C ++:

(an example from http://www.gccxml.org/HTML/example1in.html)

struct EmptyClass {};

int a_function(float f, EmptyClass e)
{
}

int main(void)
{
return 0;
}

Не могли бы вы объяснить это, пожалуйста?

1

Решение

поскольку типы являются большим сложным аргументом, я бы предложил использовать GCCXML. Это интерфейс, который генерирует абстрактное синтаксическое дерево из конкретного источника. Я использовал его для генерации интерфейсов Prolog / OpenGL. Если вы хотите использовать его с пользой, вам понадобится хороший XML-ридер (SWI-Prolog действительно хорош в этом).

редактировать

следующий микро файл x.c

typedef struct A {
int X, Y;
} T;

T v[100];

обработано с

gccxml -fxml=x.xml x.c

производит в x.xml (среди многих других) следующий оператор xml

...
<Variable id="_3" name="v" type="_141" context="_1" location="f0:5" file="f0" line="5"/>
...
<Struct id="_139" name="A" context="_1" mangled="1A" demangled="A" location="f0:1" file="f0" line="1" artificial="1" size="64" align="32" members="_160 _161 _162 _163 _164 _165 " bases=""/>
<Typedef id="_140" name="T" type="_139" context="_1" location="f0:3" file="f0" line="3"/>
<ArrayType id="_141" min="0" max="99u" type="_140" size="6400" align="32"/>
...
<Field id="_160" name="X" type="_147" offset="0" context="_139" access="public" location="f0:2" file="f0" line="2"/>
<Field id="_161" name="Y" type="_147" offset="32" context="_139" access="public" location="f0:2" file="f0" line="2"/>
<Destructor id="_162" name="A" artificial="1" throw="" context="_139" access="public" mangled="_ZN1AD1Ev *INTERNAL* " demangled="A::~A()" location="f0:1" file="f0" line="1" endline="1" inline="1">
</Destructor>

Вы можете видеть, что после цепочки символов type = «…» вы можете восстановить тип, присвоенный typedef.

3

Другие решения

Для разрешения макросов вы можете использовать cpp, препроцессор gcc, он печатает для вывода предварительно обработанного кода.
К сожалению, для вас typedef не являются макросами, поэтому вам придется обрабатывать их самостоятельно.

0

Мне кажется, что вы прыгаете на этапах перевода. Подстановка typedef кажется легкой по сравнению с подстановкой комментариев. Ваша программа распознает следующее как комментарии? Если нет, то я бы предложил вернуться к этапам перевода 1&2, прежде чем пытаться 3&4.

// this is a basic comment
/* this is another basic comment */

// this is a slightly\
less basic comment
/* this is a slightly
* less basic comment */

/??/
*??/
c??/
o??/
m??/
m??/
e??/
n??/
t??/
*??/
/
0

Парсинг C ++ очень сложен, он требует парсера рекурсивного спуска. Я предлагаю вам использовать GCCXML в соответствии с предложением @CapelliC или в качестве более удобной альтернативы использовать libclang. Существуют даже привязки Python, которые значительно упрощают его использование.

-1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector