2011-08-07 30 views
0

我正在爲我的C文件論文工作。我需要拆分一個C頭來操作構成它的單個單詞。我有所有這些字符分割線:C文件在Python中分裂?

  1. 空間和標籤
  2. 新線;\n
  3. 單行註釋和多行註釋// /* */
  4. 指針*
  5. 陣列支架[][dimension]

因此,舉例來說,如果我有這幾行:

/* This is a 
    multiline comment. 
*/ 

typedef int rocket; 

// This is a single line comment. 
typedef double* pi[10]; 

分割函數返回像這樣的列表(或一切):

["/*","This","is","a","\n","multiline","comment.","\n","*/","\n","\n","typedef","int","rocket",";","\n","\n","//","This","is","a","single","line","comment.","\n","typedef","double","*","pi","[10]",";"] 

,這應該在Python做!

我試過這個,但是我的關於正則表達式的小知識暗示我發現了一個可怕的解決方案! :)

謝謝, 達里奧。

+6

你可能會得到一個C語法分析器... –

+0

不會放棄評論,空行嗎? –

+1

@yi_H:這取決於解析器。我已經在Delphi中編寫了一個簡單的C語言分析器(並不是完整的,但足夠用於我的目的),它保留了註釋,甚至在正確的位置將它們格式化爲Delphi的結果。大多數C和C++編譯器附帶的*預處理器*可能會刪除註釋。 –

回答

1

你有文法分析器,完成你想要的工作。你可以在這裏找到它們的列表: http://wiki.python.org/moin/LanguageParsing 它會讓你的生活更輕鬆。

+0

我終於找到了一個使用[ModGrammar](http://pypi.python.org/pypi/modgrammar)的解決方案!謝謝你,也感謝所有回答這個問題的人! – Dario

-1

您可以使用re.split得到你想要的東西:

c_code = """ 
/* This is a 
    multiline comment. 
*/ 

typedef int rocket; 

// This is a single line comment. 
typedef double* pi[10]; 
""" 

import re 

def split_c(c_code): 
    tok_re = r"(\n)|\s|(;|/\*|//|\*/|\*|\[\d*\])" 
    return [t for t in re.split(tok_re, c_code) if t] 

print split_c(c_code) 

這將產生:

['\n', '/*', 'This', 'is', 'a', '\n', 'multiline', 'comment.', '\n', '*/', 
'\n', '\n', 'typedef', 'int', 'rocket', ';', '\n', '\n', 
'//', 'This', 'is', 'a', 'single', 'line', 'comment.', '\n', 
'typedef', 'double', '*', 'pi', '[10]', ';', '\n'] 

請注意你的需求變得更加複雜(我擔心的是,[10]例如纔會真正例如需要更復雜一些),這種技術可能需要完全取代。

+1

並且可以預測'pi [10]'失敗。當然你也可以解決這個問題,然後繼續下去,直到你已經覆蓋了整個c標準(在這種情況下甚至可能是這樣),但實際上這就是解析器的用途。 – Voo

+1

正如思考的食物一樣,請注意,'pi [/ * yep'是允許的*/10]'是完全有效的C代碼 - 在正則表達式中獲得樂趣以獲得正確的表達。 – Voo

+0

非常感謝您的回答,它的效果非常好! :) – Dario

4

也許你應該考慮玩弄pycparser。 (不知道你在做什麼,我不能說更多,對不起),

+1

我會看看pycparser,它看起來很有趣!謝謝。 – Dario