Подтвердить что ты не робот

AST из кода C

Я хочу выполнить некоторые преобразования в исходном коде C. Мне нужен инструмент для linux, который генерирует полный AST из исходного кода, чтобы я мог применить свои преобразования в этом AST, а затем преобразовать его в исходный код C. Я пробовал ELSA, но он не компилируется. (Я использую Ubuntu 8.4). Может ли кто-нибудь предложить лучший инструмент/приложение?

4b9b3361

Ответ 1

Я бы порекомендовал clang. Он имеет довольно полную реализацию C с большинством gcc-расширений, и код очень понятен. Их реализация на С++ является неполной, но если вы только заботитесь о создании АСТ из кода C, это должно быть хорошо. В зависимости от того, что вы хотите сделать, вы можете либо использовать clang как библиотеку, либо напрямую работать с AST, либо кларнуть их на консоль.

Ответ 2

См. pycparser - генератор чистого Python AST для C.

Ответ 3

Есть два проекта, о которых я знаю, и которые вы можете найти полезными:

Они анализируют стандартный исходный код C, чтобы обеспечить дальнейший анализ и преобразование. Я не использовал их, поэтому вам нужно проверить себя, если они соответствуют вашим потребностям.

Разумеется, предложение об использовании GCC также справедливо. Я знаю, что не так много документации по этому аспекту gcc.

Ответ 4

Чтобы получить выход XML XML, вы можете попробовать использовать cscan из MarpaX::Languages::C::AST. Результат будет выглядеть так:

xml <cscan> <typedef_hash> <typedef id="GLenum" before="unsigned int" after="" file="/usr/include/GL/gl.h"/> ...

Ответ 5

www.antlr.org

Ответ 6

Наш DMS Software Reengineering Toolkit использовался на огромных системах C, анализе, анализе, преобразовании и регенерации кода C. Работает в Windows и будет работать под Linux под Wine, но он обрабатывает код кода Linux (GCC).

Я не могу подчеркнуть достаточную возможность округлять исходный код C: анализировать, строить деревья, преобразовывать, регенерировать компилируемый C-код с комментариями и либо красиво напечатан, либо с исходным отступом программиста. Немногие из других ответов здесь предлагают системы, которые могут сделать это надежно.

Тот факт, что DMS предназначен для выполнения программных преобразований (в отличие от других систем, предложенных в ответах здесь), также является большим преимуществом. DMS обеспечивает совпадение и переписывание шаблонов дерева; он дополняет это с помощью полного контроля и анализа потока данных, которые будут использоваться для расширения условий, которые вы хотите сопоставить. Инструмент, намереваясь быть компилятором, - это просто, и вам будет очень сложно убедить его не быть компилятором, а вместо этого быть механизмом преобразования, как запросил OP.

См. fooobar.com/questions/230292/..., например, AST, созданные DMS.

Ответ 8

Я сделал небольшую работу над преобразованиями источника-источника, и я нашел CIL, чтобы быть очень сильным для этой задачи. Преимущество CIL состоит в том, что он представляет собой структуру, специально разработанную для анализа и преобразования статического источника. Он также может обрабатывать код с любым количеством уродливых специфических расширений GCC (он использовался для обработки ядра Linux, как один пример.) К сожалению, он написан в OCAML, и анализы/преобразования, построенные с использованием этого, также должны быть writtne в OCAML, что может быть проблематичным, если вы никогда не использовали его.

В качестве альтернативы clang должен иметь относительно легко взломанную кодовую базу, и это, безусловно, может быть используется для производства C AST.

Ответ 9

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

Ответ 10

Вы можете попробовать создать AST (абстрактное синтаксическое дерево) с помощью Lexx и Yacc в Linux:

lex и yacc

от lex и yacc to ast

Ответ 11

"Я попробовал ELSA, но это не получается скомпилирован. (Я использую Ubuntu 8.4)"

Исходный код Elkhound и Elsa, версия 2005.08.22b от scottmcpeak.com/elkhound/устарел (старые файлы заголовков в стиле С++.h.).

Elsa работает и часть Oink: http://www.cubewano.org/oink/#Gettingthecode Я только что начал работать сейчас под Ubuntu 9.10.