2008-10-27 3 views
22

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

+0

Я считаю OpenC++ так близко, как вы получите прямо сейчас. – 2008-11-04 06:52:21

ответ

0

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

+1

И как вы собираетесь получить его для восстановления исходного кода после применения преобразований? – 2009-11-09 02:48:22

2

www.antlr.org

+0

В то время как в дистрибутиве ANTLR по умолчанию нет синтаксического анализатора C, существует множество из них, которые плавают вокруг, а просто google. С уважением, Sebastiaan – 2009-07-12 11:52:30

+2

Существуют синтаксические анализаторы на основе ANTLR. Я не знаю, может ли кто-нибудь из них восстановить источник из (модифицированного) АСТ. – 2009-11-09 02:38:00

5

Есть два проекта, которые я знаю, и что вы могли бы оказаться полезными:

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

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

+0

CIL не восстанавливает исходный код, AFAIK. – 2009-11-09 02:37:04

+0

Из того, что я могу почерпнуть, CIL требует, чтобы вы записывали ваши анализы AST в OCaml; Планируется поддержка C. – 2016-04-23 15:40:14

0

Вы можете попробовать сгенерировать AST (Abstract Syntax Tree) с использованием Lexx и Yacc на Linux:

lex and yacc

from lex and yacc to ast

+0

Проблема заключалась бы в том, чтобы иметь довольно полную лексическую грамматику для C, которая не является легкой задачей из-за препроцессора C, правил ввода и т. Д. – 2008-10-27 14:27:25

+0

Да, я знаю, но lex и yacc - очень мощные инструменты, поэтому я немного с ними справился поэтому я подумал, что это поможет кому-то с этим вопросом. Потому что C является примитивным и, конечно, это непростая задача, я полностью согласен с вами. – milot 2008-10-27 14:29:22

+0

Требуется, чтобы вы спустились и начали грязно писать [MELT] (http://gcc-melt.org/) расширения. – 2016-04-23 15:45:36

17

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

2

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

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

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

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

1

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

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

0

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

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

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

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"/> ...