2016-03-30 1 views
1

J'ai besoin de tokenize le fichier C++ pour mon projet. Pour cela, j'utilise tokenize.generate_tokens. Dans chaque ligne, je reçois un caractère étrange en raison de '\ r' et il est analysé comme un jeton. Je dois éviter que ce personnage compte le jeton. Je ne suis pas sûr de savoir comment faire quand je passe le fichier à tokenize. ci-dessous est mon code J'utilise:tokenize programme C++ en python

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

J'ai essayé bande() mais donne donne erreur

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

Ce n'est pas le problème que vous rencontrez actuellement, mais vous découvrirez plus tard que 'tokenize.generate_tokens' est pour le code source Python, pas pour le code source C++. – orlp

+2

Pourrait vouloir vérifier [ce lien] (http://eli.thegreenplace.net/2011/07/03/parsing-c-in-python-with-clang). –

Répondre

2

Depuis generate_tokens exigent appelable comme argument d'entrée, vous devez créer votre fonction personnalisée.

Le générateur generate_tokens() nécessite un argument, readline, qui doit être un objet appelable qui fournit la même interface que la méthode readline() de objets intégrés de fichiers (voir la section Objets de fichier). Chaque appel à la fonction doit renvoyer une ligne d'entrée sous la forme d'une chaîne. Alternativement, readline peut être un objet appelable qui signale l'achèvement en augmentant StopIteration.

plus simple est de créer un lambda:

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

De toute évidence, vous rencontrerez des problèmes étranges de l'analyse syntaxique, car le module tokenize est défini pour la syntaxe Python, pas C++ syntaxe.

+0

Il ne passe que par une ligne ne marque pas après cela. – denis

+0

avez-vous consommé le générateur? 'list (g)' vous donnera la liste des jetons. Ou vous pouvez itérer sur eux par 'pour jeton dans g:' idiome. –

+0

Oui, je l'ai fait.Il imprime seulement ceci: #include en utilisant namespace std ; – denis