2016-03-30 11 views
1

プロジェクトのC++ファイルをトークン化する必要があります。そのために、私はtokenize.generate_tokensを使用しています。それぞれの行で、私は '\ r'のために奇妙な文字を取得し、それはトークンとして解析されます。私はトークンを数えるためにその文字を避ける必要があります。私はファイルをtokenizeに渡すときにそれを行う方法がわかりません。tokenize PythonのC++プログラム

f = open("BM1A1.cpp","r") 
g = tokenize.generate_tokens(f.readline) 

私はストリップを試してみました()しかし、あなたはカスタム関数を作成する必要がgenerate_tokens以来

g = tokenize.generate_tokens(f.readline.strip()) 
error: 
'builtin_function_or_method' object has no attribute 'strip' 
+3

これは特に問題ではありませんが、 'tokenize.generate_tokens'はPythonソースコードであり、C++ソースコードではありません。 – orlp

+2

[このリンク](http://eli.thegreenplace.net/2011/07/03/parsing-c-in-python-with-clang)を参照してください。 –

答えて

2

は、入力引数として呼び出し可能な必要がエラーを与える与える:以下、私が使用しています私のコードです。

generate_tokens()発生器が内蔵ファイルオブジェクト(セクション・ファイル・オブジェクトを参照)のreadline()メソッドと同じインタフェースを提供し呼び出し可能オブジェクトでなければならない一つの引数、readlineを必要とします。関数の各呼び出しは1行の入力を文字列として返すべきです。あるいは、readlineは、StopIterationを呼び出すことによって補完を通知する呼び出し可能なオブジェクトです。

最も簡単な方法は、ラムダを作成することです:明らか

f = open("BM1A1.cpp","r") 
g = tokenize.generate_tokens(lambda: f.readline().strip()) 

tokenizeモジュールはPythonの構文ではなく、C++の構文のために定義されているので、あなたは、構文解析の奇妙な結果が発生します。

+0

それだけでは、1つの行だけがトークン化されません。 – denis

+0

発電機を使いましたか? 'list(g)'はあなたにトークンのリストを与えます。あるいは 'for token in g:'イディオムを使ってそれらを繰り返し処理することもできます。 –

+0

はい、私はそれをしました。これだけがこれを印刷します:#を含める を使用して名前空間 std ; – denis

関連する問題