Создайте препроцессор C и C ++, используя ANTLR - PullRequest
0 голосов
/ 22 января 2020

Я хочу создать инструмент, который может анализировать код C и C ++ и обнаруживать нежелательное поведение на основе файла конфигурации. Я думал об использовании ANTLR для этой задачи, так как уже несколько лет с нуля создавал простой компилятор с ним go (переменные, условия, циклы и функции).

Я схватил C. g4 и CPP14.g4 из хранилища грамматик ANTLR. Однако я заметил, что они не поддерживают разбор предварительной обработки, так как это другой этап компиляции.

Я попытался найти грамматику, выполняющую часть предварительной обработки (обновлено до ANTLR4 ) без удачи. Более того, я также понял, что если я буду go с двухэтапным разбором, я не смогу сохранить исходные местоположения каждого символа, так как я уже изменил поток ввода.

I Интересно, есть ли хорошая грамматика или программа ANTLR (предпочтительно Python, но может работать и с другими языками), которая может помочь мне предварительно обработать код C. Я также думал об использовании gcc -E, но тогда я не смогу проверить определения макросов (например, я хочу предупредить, если пользователь использовал #pragma GCC (некоторые студенты в моем университете, для которых я пишу это запрограммировать, использовал это, чтобы обойти некоторые ограничения стиля кодирования курса. Более того, gcc -E будет включать содержимое заголовка библиотеки, которое я не хочу обрабатывать.

Поэтому мой вопрос, если вы может порекомендовать мне грамматику / программу, которую я могу использовать для предварительной обработки C и кода на C ++. В качестве альтернативы, если вы можете подсказать мне, как создать грамматику самостоятельно, которая была бы идеальной. Я смог написать основы c #define, #pragma и c. Обработок, но я не могу разобраться с условиями и с макрос-функциями, так как не знаю, как с ними обращаться.

Заранее спасибо !

1 Ответ

1 голос
/ 22 января 2020

Этот вопрос почти не актуален c, поскольку он запрашивает внешний ресурс. Тем не менее, он также имеет часть, которая заслуживает некоторого внимания.

Термин «препроцессор» уже указывает, что такое обработка макросов et c. около. Синтаксический анализатор никогда не видит отключенные части ввода, что также означает, что это может быть что угодно, что может не являться частью реального языка для анализа. Следовательно, хорошим подходом для синтаксического анализа C -подобных языков является отправка ввода через препроцессор (который может быть специализированным потоком ввода) для удаления всех конструкций предварительной обработки, для разрешения макросов и удаления отключенного текста. Позиция синтаксического анализа не является проблемой, поскольку вы можете определить текущую позицию токена до того, как откроете новый входной поток, и восстановите ее, когда закончите с ней. Храните сообщения об ошибках вместе с вашим стеком входного потока. Таким образом вы сохраняете правильные позиции токенов. Я использовал именно этот подход в моем Windows парсере файлов ресурсов .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...