用Python或JavaScript实现C预处理器?[已关闭]

5jdjgkvh  于 2022-12-03  发布在  Python
关注(0)|答案(5)|浏览(107)

**已关闭。**此问题不符合Stack Overflow guidelines。当前不接受答案。

我们不允许问题寻求书籍、工具、软件库等的建议。您可以编辑问题,以便使用事实和引文来回答。
六年前就关门了。
Improve this question
是否有一个已知的C预处理器工具的实现是在Python或JavaScript中实现的?我正在寻找一种方法来健壮地预处理C(和类似C的)源代码,并希望能够处理,例如,条件编译和宏 * 而不 * 调用外部CPP工具或本机代码库。另一个潜在的用例是在Web应用程序中,在Web浏览器中进行预处理。
到目前为止,我已经在JavaPerl中找到了实现,当然,还有CC
PLY(Python Lex和Yacc)工具包括一个在Python中实现的cpp。

cbeh67ev

cbeh67ev1#

checkout 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()

实现非常简单。

定义。append('debug'):

与在文件中添加“#define debug”指令具有相同的效果。这只是一种设置定义的方便方法。

pypreprocessor.输入=“输入文件. c”:

设置要处理的文件。

pypreprocessor.output =“输出文件. c”:

设置文件输出到的位置。

pypreprocessor.removeMeta =真:

删除文件中找到的所有预处理程序指令。这包括所有#define、#ifdef、#undefine、#else等等。这对于创建一个“干净”的生产版本的源代码很有用,去掉了所有未使用的条件代码和指令。这一步也是完全可选的。如果不添加任何不t将被自动注解掉。
例如:

#define debug

#ifdef debug
print('this will appear in the postprocessed code')
#else
#print('this will be commented out in the postprocessed code')
#endif

如果你需要宏替换,比如,把源代码从一种语言转换到另一种语言,pyprocessor还不支持这个。理论上,添加宏并不需要太多的工作,但是首先需要扩展词法分析器来跳过出现在文本字符串中的关键字。

  • 注:它还兼容python 2x和python3 k。*
  • 免责声明:我是pypreprocessor的作者。*
qxsslcnc

qxsslcnc2#

看看PLY,它是Lex和Yacc在Python上的实现,包含一个使用PLY词法分析器的cpp tool implemented in python。还有pycparser,它是一个构建在PLY之上的C语言解析器。

brjng4g3

brjng4g33#

Firefox构建系统也会对chrome进行类似的处理,一个名为www.example.com的源文件jar.mn列出了所有需要的XUL/JS文件,这些文件在发布之前会进行预处理,因此ships脚本也会调用一个迷你的preprocessor

jbose2ul

jbose2ul4#

您也许能够围绕clang c预处理器创建一个python绑定。

x3naxklr

x3naxklr5#

如果ANTLR可以与Python/Javascript一起使用(我非常怀疑后者),您可以从ANTLR站点获得语法:http://www.antlr.org/grammar/1166665121622/Cpp.tar
如果没有,这可能是一个很好的开始-简单地将它转换为您最喜欢的解析器生成器所理解的语法。

相关问题