2009-10-31 41 views
1

我在使用python函数解析LOC文件中的C文件。 我从第一行函数定义开始,跳过所有行,直到遇到第一个“{”。读取文件时避免C风格的注释

问题是“{”也可以作为评论的一部分。我只想跳过评论中的所有“{”。

e.g

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

最新最好的Python的方式来达致这。

回答

3

你会发现,如果没有真正的词法分析器和解析器,就很难做到这一点。

这会找到你要找的左括号:

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

但例如,你可以有字符串文本内的双斜线等

+1

+1对于真正的词法分析器和解析器。你在这里忽略了很多复杂性。那么包含/ *的字符串文字呢?那么以//开头的行呢?或用// * /? – 2009-10-31 15:13:23

0

如果你有GCC,你可以使用gcc -E input_file作为预处理器,它可以剥离注释(但也可以扩展宏 - 可能会改变LOC)。对于您的示例输出为:

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


int func(
     int i, 
     float f, 
     char c 

     ) 
{ 
+0

虽然这改变了LOC计数。 – 2009-10-31 16:12:36

7

下面是评论剥离也应该理解引号的字符串中的评论介绍人:

from pyparsing import cppStyleComment,dblQuotedString 

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

print src 

有了您的原始片段作为SRC,这个打印:

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

您可以在内存中执行所有操作,因此您不必首先创建无注释文件。