2009-10-31 68 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 
      ) 
    { 

您可以在內存中執行所有操作,因此您不必首先創建無註釋文件。