2011-08-07 9 views
0

私はCファイルに関する私の論文のために働いています。私はそれを構成するシングルワードを操作するためにCヘッダを分割する必要があります。私はこれらすべての文字で行を分割する必要があります。PythonでCファイルを分割していますか?

  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:それはパーサーによって異なります。私は、デルファイでは、コメントを保持し、適切な場所で、デルファイへの変換の結果をうまく整形するための、シンプルなCパーサー(ほぼ完成していませんが、私の目的には十分です)を書いています。ほとんどのCおよびC++コンパイラに付属するA *プリプロセッサ*はおそらくコメントを削除します。 –

答えて

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 that allowed/*]は完全に有効なCコードです。 – Voo

+0

本当にありがとう、それは素晴らしい作品です! :) – Dario

4

多分pycparserとおもてなしすることを検討する必要があります。 (実際に何をしているのかわからなくても、それ以上のことは言えません)

+1

私はpycparserを見てみましょう、それは織りなすように見えます!どうも。 – Dario

関連する問題