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

grr*_*sel 13 javascript c python preprocessor

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

到目前为止,我已经发现了Java,Perl,当然还有CC的实现.使用现在可用的C到JavaScript编译器之一可能是合理的.

PLY(Python Lex和Yacc)工具包括用Python实现cpp.

Eva*_*ice 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()
Run Code Online (Sandbox Code Playgroud)

实现非常简单.

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
Run Code Online (Sandbox Code Playgroud)

例如,如果您需要宏替换,则将源从一种语言更改为另一种语言处理器尚不支持此功能.理论上,添加不需要太多工作,但是需要首先扩展词法分析器以跳过出现在文本字符串中的关键字.

SideNote:它还兼容python2x和python3k.

免责声明:我是pypreprocessor的作者.

  • @lbsweek 感谢您提供宝贵且深思熟虑的反馈。 (2认同)

vz0*_*vz0 6

查看PLY,一个关于Python的Lex和Yacc的实现,它包含一个使用PLY词法分析器在python中实现cpp工具.还有pycparser,一个构建在PLY之上的C语言解析器.

  • 遗憾的是,pycparser不支持C代码,除非在它上面调用预处理器之后. (2认同)