2009-03-30 13 views
4

Comment analyser de manière simple un .h fichier écrit en C pour commentaires et les noms d'entités en utilisant Python?Un moyen facile d'analyser le fichier .h pour les commentaires en utilisant Python?

Nous supposons pour une écriture ultérieure le contenu dans le fichier de mots déjà développé.

Les commentaires de source sont mis en forme à l'aide d'une simple règle de style de balise. Balises de commentaire utilisées pour distinguer facilement un commentaire d'entité de l'autre et commentaires non documentés. Un commentaire peut être sous forme multiligne. Un chaque commentaire ont tout droit sur la définition de l'entité:

//ENUM My comment bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla 
//  could be multi-line. Bla bla bla bla bla bla bla bla bla. 
enum my_enum 
{ 
    //EITEM My enum item 1. 
    //  Just could be multi-line too. 
    MY_ENUM_ITEM_1, 

    //EITEM My enum item 2 
    MY_ENUM_ITEM_2, 
}; 

//STRUCT My struct 
struct my_struct { 

    //MEMBER struct member 1 
    int m_1_; 
}; 

//FUNC my function 1 description. 
//  Could be multi-line also. 
//INPUT arg1 - first argument 
//RETURN pointer to an allocated my_struct instance. 
my_struct* func_1(int arg1); 

Un arbre de code-et-commentaires devrait sortir à la suite de cette analyse.

Comment le faire rapidement et sans utiliser de bibliothèques tierces?

Répondre

3

Voici une solution rapide et sale. Il ne gérera pas les commentaires dans les chaînes, mais puisque ceci est juste pour les fichiers d'en-tête, cela ne devrait pas poser de problème.

S_CODE,S_INLINE,S_MULTLINE = range (3) 
f = open (sys.argv[1]) 
state = S_CODE 
comments = '' 
i = iter (lambda: f.read (1), '') 
while True: 
    try: 
     c = i.next() 
    except StopIteration: 
     break 
    if state == S_CODE: 
     if c == '/': 
      c = i.next() 
      if c == '*': 
       state = S_MULTLINE 
      elif c == '/': 
       state = S_INLINE 
    elif state == S_INLINE: 
     comments += c 
     if c == '\n': 
      state == S_CODE 
    elif state == S_MULTLINE: 
     if c == '*': 
      c = i.next() 
      if c == '/': 
       comments += '\n' 
       state = S_CODE 
      else: 
       comments += '*%s' % c 
     else: 
      comments += c 
print comments 
+0

Juste curieux: avez-vous écrit cela tout à l'heure? –

+0

ouais .. eu le temps de tuer. Juste pris 5 minutes. – eduffy

+0

Soyez conscient du bogue 'if c == '\ n': state == S_CODE' – klimkin

4

Cela a déjà été fait. Plusieurs fois.

Voici un analyseur pour le langage C écrit en Python. Commence avec ça.

http://wiki.python.org/moin/SeeGramWrap

Autres. Parseurs

http://wiki.python.org/moin/LanguageParsing

http://nedbatchelder.com/text/python-parsers.html

Vous pouvez probablement télécharger une grammaire ANSI C Yacc et retravailler en format PLY sans trop de difficultés et l'utiliser comme un point d'arrêt de saut.

+0

Autre: http://code.google.com/p/pycparser/. Je ne pense pas que "rapidement et sans bibliothèques tierces" est réalisable: C a une grammaire complexe qui ne se prête pas à l'analyse de méthodes naïves comme la correspondance de chaînes et regex. – bobince

+0

Je ne comprends pas le "sans utiliser les bibliothèques tierces" considération. Tout est open source; Quels sont les problèmes, préoccupations ou problèmes de tierces parties qui les préoccupent? –

Questions connexes