AST из кода C

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

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

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

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

    • CIL
    • трансформеры

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

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

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

    xml ...

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

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

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

    См. https://stackoverflow.com/a/2173477/120163, например, AST, выпускаемые DMS.

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

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

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

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

    lex и yacc

    от lex и yacc до ast

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

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

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