读取文件时避免C风格注释

1 投票
3 回答
577 浏览
提问于 2025-04-15 15:33

我正在用Python解析一个C语言文件,目的是计算一个函数的代码行数(LOC)。

我从函数定义的第一行开始,跳过所有行,直到遇到第一个"{"为止。

但问题是,"{"也可能出现在注释中。我只想跳过注释里的所有"{"。

比如:

100: int func(
102:         int i, // some comment { ....
103:         float f,
104:         char c /* some comment here { ...
105:                .... more comment */
106:         )
107:{

有没有什么好的Python方法可以做到这一点?

3 个回答

0

如果你有安装gcc这个工具,可以使用命令 gcc -E input_file 来处理你的代码。这个命令会去掉代码中的注释(同时也会展开一些宏定义,这可能会改变代码行数)。举个例子,运行这个命令后,你会得到这样的结果:

# 1 "_.c"
# 1 ""
# 1 ""
# 1 "_.c"


 int func(
         int i,
         float f,
         char c

         )
{
3

你会发现,要做到这一点非常困难,没有一个真正的词法分析器和解析器。

这个代码可以帮你找到你想要的开括号:

f = open("myfile.c")
for l in f.readlines():
    l = l.split('//')[0]
    if '{' in l:
        break

但是,比如说,你在字符串里面可能会有双斜杠等等。

7

这里有一个可以去掉注释的代码,它还能理解在字符串中的注释引入符:

from pyparsing import cppStyleComment,dblQuotedString

cppStyleComment.ignore(dblQuotedString)
src = cppStyleComment.suppress().transformString(src)

print src

用你原来的代码片段作为源代码,这段代码会输出:

int func(
             int i, 
             float f,
             char c 
             )
    {

你可以在内存中完成所有这些操作,所以不需要先创建一个没有注释的文件。

撰写回答