У меня есть исходный файл C / C++ с условной компиляцией. Прежде чем я отправлю его клиентам, я хочу удалить большинство операторов #if, чтобы моим клиентам не нужно было беспокоиться о передаче правильных параметров -D компилятору.
Я реализовал это и работаю на Python, но он правильно обрабатывает только операторы #ifdef и #ifndef. Мне нужно добавить поддержку операторов #if, но синтаксис #if намного сложнее. (Например, вы можете использовать &&, ||,!, Скобки, операторы отношения, арифметику и т. д.).
Есть ли какой-либо существующий код с открытым исходным кодом для анализа и оценки операторов #if? (Желательно на Python).
Единственная известная мне реализация - это GCC, и это слишком сложно для этой задачи.






Вы смотрели Boost.Wave?
Препроцессор GCC обычно представляет собой автономную программу, обычно называемую cpp. Конечно, это, вероятно, также уберет ваши комментарии.
Вместо того, чтобы изобретать велосипед, скачайте «unifdef». Если вы пользуетесь какой-то разновидностью Linux, вы, вероятно, можете найти для него пакет, в противном случае он находится на Свежее мясо
Как насчет того, чтобы просто пройти через препроцессор C и позволить ему выполнить свою работу. Он избавится от всех из них, поэтому вам может потребоваться этап препроцессора и этап постпрепроцессора, чтобы защитить то, что вы не хотите расширять.
Это также убивает комментарии и расширяет все определения #.
Отвечая на оба комментария, да. Вот почему есть еще один шаг, чтобы изменить #include (и #define, если необходимо) на @ include / @define. Очевидно, это добавляет сложности. Если возможно, решение Майка Б.
Как KeithB сказал, вы можете просто позволить препроцессору сделать это за вас.
Но если вы не пытаетесь что-то скрыть (например, в условно скомпилированном коде могут быть вещи, которые вы не хотите или не можете передавать кому-либо еще), гораздо более простым вариантом было бы просто поставить правильные директивы #define в глобальном заголовке.
-DДох. Иногда самое простое решение оказывается самым труднодостижимым.
Насколько я могу судить, это поддерживает только подмножество синтаксиса #if. (Довольно большое подмножество, но я надеялся на полную поддержку, чтобы избежать риска будущих «ошибок, потому что инструмент делает вещи несколько иначе», о которых упоминал Майк)