Я хочу выполнить некоторые преобразования в исходном коде C. Мне нужен инструмент для linux, который генерирует полный AST из исходного кода, чтобы я мог применить свои преобразования в этом AST, а затем преобразовать его в исходный код C. Я пробовал ELSA, но он не компилируется. (Я использую Ubuntu 8.4). Может ли кто-нибудь предложить лучший инструмент/приложение?
AST из кода C
Ответ 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.
Ответ 7
Ответ 8
Я сделал небольшую работу над преобразованиями источника-источника, и я нашел CIL, чтобы быть очень сильным для этой задачи. Преимущество CIL состоит в том, что он представляет собой структуру, специально разработанную для анализа и преобразования статического источника. Он также может обрабатывать код с любым количеством уродливых специфических расширений GCC (он использовался для обработки ядра Linux, как один пример.) К сожалению, он написан в OCAML, и анализы/преобразования, построенные с использованием этого, также должны быть writtne в OCAML, что может быть проблематичным, если вы никогда не использовали его.
В качестве альтернативы clang должен иметь относительно легко взломанную кодовую базу, и это, безусловно, может быть используется для производства C AST.
Ответ 9
Как насчет приема gcc и написания пользовательского бэкэнда? Я никогда не делал этого и не работал над исходным кодом gcc, поэтому я не знаю, как это было бы тяжело.
Ответ 10
Вы можете попробовать создать AST (абстрактное синтаксическое дерево) с помощью Lexx и Yacc в Linux:
Ответ 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.