2010-04-24 5 views

Répondre

1

Je sais que la publication est ancienne, mais j'ai rencontré le même problème et trouvé une solution beaucoup plus simple en utilisant un petit script python.

filename = "in.txt"; 
b_count = 0; 
with open("out.txt", "w") as fout: 
    with open(filename) as f: 
     while True: 
      c = f.read(1) 
      if not c: 
       print "End of file" 
       break 
      if (b_count == 0): 
       fout.write(c); 
       if (c == '{'): 
        b_count += 1 
      else : 
       if (c == '{'): 
        b_count += 1 
       if (c == '}'): 
        b_count -= 1 
       if (b_count == 0): 
        fout.write('}') 

J'espère que cela sera utile à tous!

+0

Cela ne fonctionne pas même dans des cas simples. Les accolades entre guillemets comme ''{'' et '" {"' ne démarrent pas les blocs de code et peuvent ne pas avoir de fermeture}. Idem pour les accolades dans les commentaires comme '/ * {* /'. Mais alors le symbole de commentaire peut être entre guillemets donc vous devriez compter l'accolade comme dans 'printf ("/* "); if (1) {printf ("* /"); } '...! – expz

2

Au meilleur de ma connaissance, non.

Comme vous le savez certainement, écrire votre propre outil est faisable, mais difficile. Par exemple, les caractères { et } peuvent apparaître sous la forme de constantes de caractères ou de chaînes. (Les caractères : et ;, bien sûr.)

Si vous avez des fichiers spécifiques dont vous voulez retirer les actions, vous pouvez compter sur votre propre environnement et vos contraintes (vous n'avez pas besoin de solution pour le cas général), il peut y avoir une manière relativement simple de le faire.

Si vous avez besoin d'une solution complète, il vous reste à pirater le code bison. Pas pour les faibles de cœur, je l'admets. Cela dit, une grande partie du bison est mise en œuvre ou esquissée dans le bison.

Dans les sources de bison, voir scan-gram.l et parse-gram.y pour une équipe de numériseurs/analyseurs de bisons. Le jeton à surveiller est BRACED_CODE. Maintenant, puisque ce dont vous avez besoin est essentiellement de prendre un fichier et de générer une copie quasi-exacte, et vous n'avez pas vraiment besoin de le comprendre, vous pouvez probablement faire tout votre travail dans le lexer. Vous pouvez utiliser scan-gram.l comme base pour votre travail. Une modification utile peut être d'ajouter un autre état (condition de départ) pour décrire si vous êtes dans la section prologue/déclaration, par rapport aux règles de grammaire. Tout sauf les règles de grammaire devrait être imprimé mot pour mot.

Les commentaires, les espaces, les directives, la plupart des signes de ponctuation, les identifiants, les nombres: il suffit de les imprimer mot pour mot.

Caractères et chaînes de caractères: ceux-ci nécessitent leurs propres états dans le lexeur car il est essentiel de trouver où ils se terminent. (Les caractères littéraux peuvent être plus longs qu'un caractère de clavier, pensez octal.) Mais étant donné qu'ils ont leurs propres états, imprimez-les mot pour mot. Code: comme les caractères et les chaînes, vous devez comprendre où il se termine. C'est un peu plus compliqué, aussi, car il peut contenir des chaînes et des commentaires et autres joyeusetés. Mais une fois que vous trouvez où cela se termine, vous pouvez quitter l'état du code. Rien ici n'a besoin d'être imprimé (sauf pour les accolades, bien sûr).

Bonne chance!

+0

Oui, j'ai écrit mon propre outil factice. La grammaire en cause n'a aucun de ces cas spéciaux mentionnés par vous. La tokenisation a été faite simplement en divisant avec PCRE par \ W. Ça marche. De toute façon accepté la réponse, en particulier à cause de "BRACED_CODE". Votre solution est clairement la plus propre (à moins que Bison ne fournisse elle-même une API pour obtenir l'AST de la grammaire). – Flavius

Questions connexes