是否已经在Python或JavaScript中实现了C预处理器工具?我正在寻找一种方法来强大地预处理C(和C之类)源代码,并希望能够处理,例如,条件编译和宏,而无需调用外部CPP工具或本机代码图书馆。另一个潜在的用例是在Web浏览器中的Web应用程序内进行预处理。
到目前为止,我已经在Java,Perl,当然还有C和C中找到了实施方案。使用现在可用的C to JavaScript编译器之一可能是合理的。
PLY(Python Lex和Yacc)工具包含Python 中实现的 cpp。
答案 0 :(得分:7)
它也可以在PYPI (Python Package Index)找到,因此可以使用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( '调试'):强>
与向文件添加“#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
如果您需要宏替换,例如,将源从一种语言更改为另一种语言处理器尚不支持此功能。从理论上讲,添加它不需要太多工作,但是需要首先扩展词法分析器以跳过出现在文本字符串中的关键字。
SideNote:它也兼容python2x和python3k。
免责声明:我是pypreprocessor的作者。
答案 1 :(得分:6)
查看PLY,这是Python上的Lex和Yacc的实现,其中包含使用PLY词法分析器的cpp tool implemented in python。还有pycparser,一个基于PLY的C语言构建的解析器。
答案 2 :(得分:1)
您可以在clang c预处理器周围创建一个python绑定。
答案 3 :(得分:1)
Firefox构建系统为其chrome做了类似的事情。名为jar.mn的源文件列出了所需的所有XUL / JS文件,并且可选地在发货之前对这些文件进行预处理。因此ships文件也会调用迷你文件的脚本 - preprocessor。
答案 4 :(得分:0)
如果ANTLR可以与Python / Javascript一起使用(我非常怀疑后者),你可以从ANTLR网站获得语法:http://www.antlr.org/grammar/1166665121622/Cpp.tar
如果没有,无论如何它可能是一个好的开始 - 只需将其转换为您最喜欢的解析器生成器所理解的语法。