我正在寻找从字符串中删除C和C++注释的Python代码.(假设字符串包含整个C源文件.)

我意识到我可以用正则表达式匹配()子字符串,但这不能解决嵌套/*问题,也不能解决/* */中有//的问题.

理想情况下,我更喜欢一个非幼稚的实现,能够正确处理尴尬的情况.

推荐答案

我不知道您是否熟悉sed,这是一个基于UNIX(但Windows可用)的文本解析程序,但我发现了一个sed脚本here,它可以从文件中删除C/C++注释.它非常聪明;例如,如果在字符串声明中找到"//"和"/*",它将忽略.在Python中,可以使用以下代码使用它:

import subprocess
from cStringIO import StringIO

input = StringIO(source_code) # source_code is a string with the source code.
output = StringIO()

process = subprocess.Popen(['sed', '/path/to/remccoms3.sed'],
    input=input, output=output)
return_code = process.wait()

stripped_code = output.getvalue()

在本程序中,source_code是保存C/C++源代码的变量,最终stripped_code将保存删除注释的C/C++代码.当然,如果您在磁盘上有文件,您可以让inputoutput变量作为指向这些文件的文件句柄(input处于读模式,output处于写模式).remccoms3.sed是上述链接中的文件,应该将其保存在磁盘上的可读位置.sed也可以在Windows上使用,并且默认安装在大多数GNU/Linux发行版和MacOSX上.

这可能比纯Python解决方案更好;不需要重新发明轮子.

C++相关问答推荐

命名信号量不会像进程之间同步中假设的那样工作

从内联程序集调用Rust函数和调用约定

如何在C中只使用一个带双方括号([i][j])访问语法的malloc来分配动态大小的2d数组?

在C中使用动态内存分配找到最小的负数

如何调试LD_PRELOAD库中的构造函数?

C++中矢量类型定义和数据保护的高效解决方案

如何在C中引发/处理自定义信号?

文件权限为0666,但即使以超级用户身份也无法打开

将uintptr_t添加到指针是否对称?

ifdef __cplusplus中的整数文字单引号

在进程之间重定向输出和输入流的问题

当内存来自Malloc时,将char*转换为另一个指针类型是否违反了严格的别名规则?

判断系统命令返回值的正确方法

GetText不适用于包含国际字符的帐户名称

如何使用calloc和snprintf

OMP并行嵌套循环

为什么我在我的代码中得到错误和退出代码-1073741819(0xC0000005),但如果我添加了一个不相关的打印语句,它仍然有效?

GnuCobol 使用 double 类型的参数调用 C 函数

const struct 成员的 typedef 中的灵活数组大小

UEFI 应用程序中的计时器回调仅在 AMI BIOS 中挂起