Реализация предварительного процессора C в Python или JavaScript?

Существует ли известная реализация препроцессорного инструмента C, реализованного либо в Python, либо в JavaScript? Я ищу способ надежного предварительного создания исходного кода C (и C) и хочу иметь возможность обрабатывать, например, условную компиляцию и макросы, не вызывая внешний инструмент CPP или собственную библиотеку кода. Другим потенциальным вариантом использования является предварительная обработка в веб-приложении в веб-браузере.

До сих пор я нашел реализации в Java, Perl, и, конечно, C и C снова. Возможно, будет возможно использовать один из C для JavaScript, которые теперь становятся доступными.

Инструменты PLY (Python Lex и Yacc) включают cpp, реализованный в Python.

Ответы

Ответ 2

Отъезд pypreprocessor

Его также можно найти на PYPI (индекс пакета Python), чтобы его можно было загрузить напрямую с помощью pip.

Если вы хотите использовать инструкции #define и #ifdef для выполнения простой условной компиляции, она должна отвечать вашим потребностям. Вы можете запустить его как автономный script и указать входной файл (который может быть на любом языке) для обработки, или вы можете импортировать его как модуль python и использовать его для самостоятельного потребления источника python.

pypreprocessor поддерживает не:

  • замена макроса
  • логические операции (Ie. || & &)
  • математические операции (Ie. + - */)
  • многострочные директивы препроцессора

Это инструмент, разработанный специально для условной компиляции, а не метапрограммирования.

Вот пример того, как обрабатывать файл C с помощью pypreprocessor в качестве автономного script:

from pypreprocessor import pypreprocessor

pypreprocessor.defines.append('debug')
pypreprocessor.input = 'input_file.c'
pypreprocessor.output = 'output_file.c'
pypreprocessor.removeMeta = True

pypreprocessor.parse()

Реализация довольно проста.

defines.append( 'отладки'):

Имеет такой же эффект, как добавление директивы'dedeine debug 'в файл. Это просто удобный способ установки определяет.

pypreprocessor.input = 'input_file.c':

Устанавливает файл, который вы хотите обработать.

pypreprocessor.output = 'output_file.c':

Устанавливает, куда будет выводиться файл.

pypreprocessor.removeMeta = True:

Удаляет все директивы препроцессора, найденные в файле. Сюда входят все #define, #ifdef, #undefine, #else и т.д. Из исходного файла. Это полезно для создания "чистой" производственной версии источника минус все условные коды и директивы, которые не используются. Этот шаг также полностью необязателен. Если вы не добавите этот код, который не попадает в определенное условие, будет автоматически прокомментирован.

Например:

#define debug

#ifdef debug
print('this will appear in the postprocessed code')
#else
#print('this will be commented out in the postprocessed code')
#endif

Если вам нужна замена макросов, например, сменить источник с одного языка на другой, pyprocessor пока не поддерживает. Теоретически, это не займет много работы, но lexer нужно будет расширить, чтобы пропустить ключевые слова, которые появляются в текстовых строках.

SideNote: он также совместим как с python2x, так и с python3k.

Отказ от ответственности: я являюсь автором pypreprocessor.

Ответ 3

Возможно, вы сможете создать привязку python вокруг препроцессора clang c.

Ответ 4

Система сборки Firefox делает что-то подобное для своего хром. Исходный файл с именем jar.mn содержит список всех необходимых файлов XUL/JS, и, при необходимости, эти файлы предварительно обрабатываются до их отправки. Таким образом, script, который отправляет, файлы также вызывают mini- preprocessor.

Ответ 5

Если ANTLR можно использовать с Python/Javascript (я очень сомневаюсь в последнем), вы можете получить грамматику с сайта ANTLR: http://www.antlr.org/grammar/1166665121622/Cpp.tar

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