2016-03-30 22 views
1

我需要爲我的項目標記C++文件。爲此,我使用tokenize.generate_tokens。在每行中,由於'\ r',我得到一個奇怪的字符,並將其解析爲一個標記。我需要避免那個角色來計算令牌。當我將文件傳遞給標記化時,我不知道該怎麼做。下面是我的代碼我使用:在Python中標記化C++程序

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

我試過帶(),但給給錯誤

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需要調用作爲輸入參數,你需要創建自定義的功能。

generate_tokens()發生器需要一個參數,readline,它必須是一個可調用對象,它提供相同的接口的ReadLine()方法內置的文件對象(見文件對象)。對函數的每次調用應以字符串的形式返回一行輸入。另外,readline可能是一個可調用的對象,它通過提高StopIteration來表示完成。

最簡單的方法是創建一個lambda:

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

很明顯,你會遇到解析怪異的結果,因爲tokenize模塊爲Python語法,而不是C++的語法定義。

+0

之後只有一行不會標記。 – denis

+0

你消費了發電機嗎? 'list(g)'會給你一個令牌列表。或者你可以通過'for g:'成語來進行迭代。 –

+0

是的,我做了。它只打印這個:#include 使用 命名空間 std ; – denis