用Python或JavaScript实现C预处理器?
5 个回答
Firefox的构建系统对它的界面做了类似的处理。有一个叫做jar.mn的源文件,里面列出了所有需要的XUL和JS文件,此外,这些文件在发布之前可以选择进行预处理。因此,负责发布这些文件的脚本也会调用一个小型的预处理器。
可以看看 pypreprocessor
它也可以在 PYPI (Python 包索引) 上找到,所以你可以直接用 pip 下载。
如果你想用 #define 和 #ifdef 语句来做简单的条件编译,这个工具应该能满足你的需求。你可以把它作为独立脚本运行,并指定一个输入文件(可以是任何语言的文件)来处理,或者你也可以把它作为一个 Python 模块导入,来处理 Python 源代码。
pypreprocessor 不支持:
- 宏替换
- 逻辑运算(比如 || 和 &&)
- 数学运算(比如 + - * /)
- 多行预处理指令
这个工具专门为条件编译设计的,不是用来做元编程的。
下面是一个如何使用 pypreprocessor 处理 C 文件的例子,作为独立脚本:
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('debug'):
这和在文件中添加 '#define 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
如果你需要宏替换,比如把源代码从一种语言改成另一种,pypreprocessor 目前还不支持这个。从理论上讲,添加这个功能并不复杂,但词法分析器需要先扩展,以跳过出现在文本字符串中的关键字。
附注:它兼容 python2x 和 python3k。
免责声明:我是 pypreprocessor 的作者。