Ответ 1
Отъезд PLY, реализация Lex и Yacc на Python, которая содержит инструмент cpp, реализованный в python, используя PLY lexer. Существует также pycparser, парсер, построенный поверх PLY для языка C.
Существует ли известная реализация препроцессорного инструмента C, реализованного либо в Python, либо в JavaScript? Я ищу способ надежного предварительного создания исходного кода C (и C) и хочу иметь возможность обрабатывать, например, условную компиляцию и макросы, не вызывая внешний инструмент CPP или собственную библиотеку кода. Другим потенциальным вариантом использования является предварительная обработка в веб-приложении в веб-браузере.
До сих пор я нашел реализации в Java, Perl, и, конечно, C и C снова. Возможно, будет возможно использовать один из C для JavaScript, которые теперь становятся доступными.
Инструменты PLY (Python Lex и Yacc) включают cpp, реализованный в Python.
Отъезд PLY, реализация Lex и Yacc на Python, которая содержит инструмент cpp, реализованный в python, используя PLY lexer. Существует также pycparser, парсер, построенный поверх PLY для языка C.
Отъезд pypreprocessor
Его также можно найти на PYPI (индекс пакета Python), чтобы его можно было загрузить напрямую с помощью pip.
Если вы хотите использовать инструкции #define и #ifdef для выполнения простой условной компиляции, она должна отвечать вашим потребностям. Вы можете запустить его как автономный script и указать входной файл (который может быть на любом языке) для обработки, или вы можете импортировать его как модуль python и использовать его для самостоятельного потребления источника python.
pypreprocessor поддерживает не:
Это инструмент, разработанный специально для условной компиляции, а не метапрограммирования.
Вот пример того, как обрабатывать файл 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.
Возможно, вы сможете создать привязку python вокруг препроцессора clang c.
Система сборки Firefox делает что-то подобное для своего хром. Исходный файл с именем jar.mn содержит список всех необходимых файлов XUL/JS, и, при необходимости, эти файлы предварительно обрабатываются до их отправки. Таким образом, script, который отправляет, файлы также вызывают mini- preprocessor.
Если ANTLR можно использовать с Python/Javascript (я очень сомневаюсь в последнем), вы можете получить грамматику с сайта ANTLR: http://www.antlr.org/grammar/1166665121622/Cpp.tar
Если нет, это может быть хорошим началом в любом случае - просто преобразуйте его в грамматику, понятную вашему любимому генератору синтаксического анализатора.