用Python或JavaScript实现C预处理器?

13 投票
5 回答
9480 浏览
提问于 2025-04-16 08:00

有没有人知道有没有用Python或JavaScript实现的C预处理工具?我想找一种方法,能够稳妥地处理C(以及类似C的)源代码,特别是想处理条件编译和宏,而不想调用外部的CPP工具或本地代码库。另一个可能的使用场景是在网页应用中,直接在浏览器里进行预处理。

到目前为止,我找到了一些实现,分别是用JavaPerl,当然还有用CC的实现。现在也许可以考虑使用一些C转JavaScript的编译器。

PLY(Python Lex和Yacc)工具中包含一个Python实现的cpp

5 个回答

2

Firefox的构建系统对它的界面做了类似的处理。有一个叫做jar.mn的源文件,里面列出了所有需要的XUL和JS文件,此外,这些文件在发布之前可以选择进行预处理。因此,负责发布这些文件的脚本也会调用一个小型的预处理器。

7

可以看看 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 的作者。

5

可以看看 PLY,这是一个用Python实现的Lex和Yacc工具,里面有一个用PLY词法分析器实现的 cpp工具。另外,还有一个叫 pycparser 的解析器,它是基于PLY为C语言开发的。

撰写回答