Вопрос по c, compiler-construction, abstract-syntax-tree – Как автоматически вставить прагмы в вашу программу

4

Мне нужно написать инструмент, который может взять код C и положитьpragmas поверх некоторых функций. Какой фреймворк компилятора проще всего выполнить с такой задачей. Также, если вы можете привести пример, я был бы очень признателен.

Я мог бы написать это как плагин clang Flexo♦
@nhahtdh: Нормальные функции Си. Мне нужно вставить прагмы перед определением функции. Вы можете предположить, что мы не используем определения функций K & amp; R в стиле C. pythonic
Каковы свойства тех функций, над которыми вы хотите поместить прагму? Вы можете получить другой способ сделать это, начиная от полноценного парсера C и заканчивая bash-скриптом. nhahtdh
Нужно ли прагме идти внутрь или вне функциональных органов? Вы систематически форматируете свой код? Ваши функции начинаются с{ в левом поле? Что происходит, если прагма заканчивается определением структуры или инициализацией переменной? Если вы дадите соответствующие ответы на них, вы можете использовать простые регулярные выражения, возможно, даже простоsed, Если вам нужно проанализировать код, чтобы определить, что вставить и куда его вставить, у вас гораздо больше работы. Из любопытства, зачем вам нужно добавлять прагмы автоматически? Как они будут вам полезны? И сколько кода вы модифицируете? Jonathan Leffler

Ваш Ответ

3   ответа
2

вам нужен полноценный C-интерфейс и возможность изменять анализируемый код.

нашDMS Software Reengineering Toolkit с этимиC Front End может, вероятно, делать то, что вы хотите. DMS может анализировать, создавать AST и выполнять пользовательские преобразования исходного текста, как процедурного, так и поверхностного синтаксического преобразования.

Есть некоторые проблемы с макросами и директивами препроцессора; если вы анализируете и сохраняете их, это может быть сделано во многих случаях, но оно распространяется на такие директивы, где они не «структурированы». Сохранение означает, что вы не получили таблицу символов. Если вы развернете все директивы, после синтаксического анализа вы можете получить таблицу символов с тем же содержимым, что и компилятор Си.

Для конкретной задачи OP он хотел бы написать преобразование источника в источник, что-то вроде следующего:

 rule decorate_function_definition_with_pragma(fh:function_head, b: block): declaration -> declaration
       =  " \fh \b " ->
          " \fh 
            #pragma  my_pragma 
            \b "
         if some_condiiton(fh);

где & quot; my_pragma & quot; является по существу заменой нужного ему текста прагмы, а some_condition является пользовательским предикатом, который фильтрует совпадающие заголовки function_headers, для которых должна быть вставлена прагма.

Шаблон совпадает с синтаксическим деревом, поэтому он не может не соответствовать, как sed или регулярное выражение. Секрет этого в том, что переменные шаблона ссылаются на правила грамматики в интерфейсе C; переменная шаблона типа function_head может соответствовать только тем деревьям, которым могут удовлетворять правила грамматики function_head.

Требуется некоторая тривиальная логика управления, чтобы выполнить это преобразование только один раз для каждого обнаруженного определения функции.

Чем ваш инструмент отличается от ROSE Framework? pythonic
ROSE ограничен C / C ++ (потому что он использует EDG) или Fortran (U анализатора Иллинойса). DMS обрабатывает гораздо больше языков. DMS обрабатывает преобразования источник-источник (например, выше); ROSE документыsay это так, но другие части документации ROSE говорят, что это ненадежно. ROSE в основном реализован на C ++; DMS реализуется самостоятельно с использованием PARLANSE (язык параллельного программирования) и набора DSL. Похоже, у нас обоих есть хорошие анализаторы потока для C. Анализ потока C ++ в DMS ограничен потоком управления на данный момент, но мы продвигаемся к потоку данных; не знаю, если Роуз делает любой поток данных C ++.
... Я думаю, что ROSE плохо справляется с обработкой и сохранением комментариев, поскольку использует внешний интерфейс компилятора EDG, который отбрасывает комментарии, как это делает большинство внешних интерфейсов компилятора. Если вы намереваетесь взять программу на C ++ и оптимизировать ее перед компиляцией, вам может не потребоваться сохранение комментариев. Если вы намереваетесь автоматизировать постоянные изменения кода, ROSE может усложнить это: как он будет сохранять комментарии в результирующем коде, если он выбрасывает их при анализе? Цель DMS - включить автоматические преобразования в код, который вы хотите сохранить.
0
Регулярное выражение не может анализировать контекстно-свободный язык, поскольку в особом случае он не может найти совпадающие скобки с вложенными скобками. Если он не может этого сделать, он не может быть использован сам по себе для выбора частей программы на Си, которые имеют вложенные скобки.
Я не понимаю отношения между регулярным выражением и C. Регулярное выражение работает со строками. Таким образом, мы можем рассматривать содержимое файла как длинную строку.
Регулярные выражения действительно не могут надежно анализировать C.
0
Ах, я знаю о lex / flex. Я думаю, они слишком примитивны для моей цели. pythonic
Не могли бы вы объяснить свою цель более глубоко?
Посмотри на вопрос. Просто написать удаленно полезный синтаксический анализатор C - сложная задача, с [f] lex / yacc / bison, как и с любым другим набором инструментов.

Похожие вопросы