2016-02-05 3 views
2

Je souhaite supprimer automatiquement les spécifications d'exception obsolètes de mon code C++ et essayer d'utiliser sed pour cette tâche.Supprimer les spécifications d'exception du code C++ avec sed

format de spécification d'exception est throw suivante avec la liste des exceptions (mots) entre parenthèses j'ai donc écrit cette sed:

sed -r 's,throw\s*[(].*[)],,g' foo.cpp 

Il fonctionne pour les spécifications oneline mais ne fonctionne pas pour une multiligne de.

Il semble que dot ne correspond pas à des sauts de ligne althougth selon la documentation, il devra: https://www.gnu.org/software/sed/manual/html_node/Regular-Expressions.html

J'ai essayé cette solution de contournement, mais cela ne fonctionne pas non plus (en fait il ne fonctionne même pas pour les spécifications oneline):

sed -r 's,throw\s*[(][\s\S]*[)],,g' 

Comment le faire fonctionner correctement?

ÉDITÉ:

exemple de spécification d'exception:

void foo() throw (std::runtime_error); //oneline 

void bar() throw (std::runtime_error, 
        std::logic_error); //multiline 
+0

Fournissez des exemples de données. – sat

+2

Le '.' correspondrait à des retours à la ligne, mais sed est un éditeur de ligne qui ne peut donc afficher qu'une seule ligne. Regardez [ici] (http://www.grymoire.com/Unix/Sed.html#uh-51) pour savoir comment faire correspondre plusieurs lignes. Bien que tbh je n'utiliserais pas sed pour analyser le code C++. – 123

+0

Sed n'est pas obligatoire J'ai besoin de toute solution qui fonctionnera correctement. –

Répondre

3

De nombreux éditeurs de texte (par exemple jEdit) soutenir la recherche regex multi-fichiers & remplacer. Cependant, il n'y a pas de distinction syntaxique entre une spécification de projection et une expression de lancement jetant une variable entre parenthèses. Les deux se distinguent principalement en ne figurant pas dans le même contexte syntaxique. Vous pouvez également les distinguer en résolvant le nom. Mais cela ne fonctionnera pas pour distinguer l'expression de lancement throw(foo()), qui lance un objet construit par défaut de type foo, et la spécification de lancement throw(foo()), ce qui rend l'affirmation absurde mais techniquement valide que la fonction annotée peut lancer une exception de type "fonction cela ne prend aucun argument et renvoie un foo ".

Si vous voulez un moyen fiable de supprimer les spécifications d'exception, le mieux serait d'écrire un contrôle Clang Tidy.

+0

Thx, j'ai utilisé mon IDE (QtCreator) à cet effet. –