Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/420.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Python或JavaScript实现C预处理器?_Javascript_Python_C_Preprocessor - Fatal编程技术网

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

用Python或JavaScript实现C预处理器?,javascript,python,c,preprocessor,Javascript,Python,C,Preprocessor,是否有已知的用Python或JavaScript实现的C预处理器工具的实现?我正在寻找一种可靠地预处理C(和类似C的)源代码的方法,并希望能够在不调用外部CPP工具或本机代码库的情况下处理条件编译和宏。另一个潜在的用例是在web浏览器中的web应用程序中进行预处理 到目前为止,我已经在中找到了实现,当然还有一次又一次。使用现在可用的编译器之一可能是合理的 PLY(Python Lex和Yacc)工具包括一个在中实现的cpp。如果ANTLR可以与Python/Javascript一起使用(我非常怀

是否有已知的用Python或JavaScript实现的C预处理器工具的实现?我正在寻找一种可靠地预处理C(和类似C的)源代码的方法,并希望能够在不调用外部CPP工具或本机代码库的情况下处理条件编译和宏。另一个潜在的用例是在web浏览器中的web应用程序中进行预处理

到目前为止,我已经在中找到了实现,当然还有一次又一次。使用现在可用的编译器之一可能是合理的


PLY(Python Lex和Yacc)工具包括一个在

中实现的cpp。如果ANTLR可以与Python/Javascript一起使用(我非常怀疑后者),那么您可以从ANTLR站点获得语法:


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

您可能能够围绕clang c预处理器创建python绑定。

请查看,python上的Lex和Yacc实现,其中包含使用PLY lexer的。还有一个为C语言构建在PLY之上的解析器。

Firefox构建系统为其chrome做了类似的事情。名为jar.mn的源文件列出了所需的所有XUL/JS文件,并且可以选择在发布之前对这些文件进行预处理。因此,文件也会调用迷你-签出的脚本

它也可以在上找到,因此可以使用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.input='input_file.c':

设置要处理的文件

pypreprocessor.output='output\u 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
例如,如果您需要宏替换来将源代码从一种语言更改为另一种语言,pyprocessor还不支持这一点。从理论上讲,这不需要太多的工作来添加,但首先需要扩展lexer,以跳过出现在文本字符串中的关键字

旁注:它还与python2x和python3k兼容


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

“外部CPP工具”通常内置在编译器中。你需要这个干什么?这似乎是为了很多的工作而不是很多的收获。这有什么关系?你可以自己实现——预处理器非常简单(事实上,我相信它是规则的,所以你甚至不需要上下文无关的语法来解释它)。@billy一旦考虑到宏,预处理器就不简单了:然后是行拼接、注释剥离、杂注、标记串联,并且支持算法@ira将在无法调用外部工具的上下文中执行源代码分析/操作,例如在浏览器或纯python中@卡尔:我需要一个独立于给定编译器的预处理器,因为实际上我不想编译,而是在编译器不可用时处理代码。@比利:我花费了一个多月的时间来实现C++中的大多数预处理器(我省略了一些像多字符文字和UCNs之类的东西)。全部都是超过4000行的非常简洁的C++,不包括测试套件。宏替换非常复杂。至少,您需要一个lexer、条件堆栈、宏替换器、文件管理器、表达式解析器、表达式求值器和一组较小的组件。您还必须考虑C90、C99、C++03和C++0x。不幸的是,实现预处理器的困难部分是必须为宏替换和受限范围表达式求值编写的自定义逻辑。遗憾的是,pycparser不支持C代码,除非在其上调用了预处理器。pycparser可以知道项目的新位置,因为Google code宣布它即将关闭?谢谢。@0xC000002L最终。目前,该项目已“存档”,仍然可以通过谷歌代码访问。@0xC000002L该项目已被移动,存储库已从Mercurial转换为Git。还有一点工作要做,就是更新文档并将最新版本(即0.5.0)推送到PYPI,但这些应该在明天提供。这个工具太糟糕了。它不能预处理cmacro@lbsweek感谢您的宝贵和深思熟虑的反馈。libclang现在带有Python绑定。看见