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

时间:2010-12-03 23:12:57

标签: javascript python c preprocessor

是否已经在Python或JavaScript中实现了C预处理器工具?我正在寻找一种方法来强大地预处理C(和C之类)源代码,并希望能够处理,例如,条件编译和宏,而无需调用外部CPP工具或本机代码图书馆。另一个潜在的用例是在Web浏览器中的Web应用程序内进行预处理。

到目前为止,我已经在JavaPerl,当然还有CC中找到了实施方案。使用现在可用的C to JavaScript编译器之一可能是合理的。

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

5 个答案:

答案 0 :(得分:7)

查看pypreprocessor

它也可以在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

如果没有,无论如何它可能是一个好的开始 - 只需将其转换为您最喜欢的解析器生成器所理解的语法。