2009-06-15 4 views
1

J'ai un très gros projet de programmation C qui utilise des milliers de variables struct avec cette convention de nommage:Regex pour refactoring aux tableaux

specificstruct->x = specificstruct->y + specificstruct->z

Je veux faire un peu de refactoring lourd, la conversion à savoir la plupart de ces membres de struct tableaux. Le code ci-dessus serait ressembler à ceci:

specificstruct->x[i] = specificstruct->y[i] + specificstruct->z[i]

... et je ne me sens pas comme perdre une journée entière à faire tout cela manuellement. Quelqu'un at-il une regex convenable en magasin?

EDIT: C'est toujours la même structure, mais les équations varient.

Merci d'avance!

Cordialement, P. Nilsson

+0

est-ce toujours le même nom/struct? la même inscruction? l'implémentation de regex de votre IDE supporte-t-elle la référence captée (ou "submatch recur", comme \ 1 dans l'expression de recherche)? –

Répondre

0

Pour une approche généralisée quelque chose comme cela devrait faire - l'hypothèse est que vous avez un espacement constant entre vos expressions

(.*?->.) = (.*?->.) \+ (.*?->.) 

Vous pouvez alors écrire votre nouvelle structure de tableau comme:

\1[i] = \2[i] + \3[i] 
0

s/\(specificstruct->x\) = \(specificstruct->y\)\+ \(specificstruct->z\)/\1[i] = \2[i] + \3[i]/g

0

Si vous êtes à la recherche du nom suivi -> puis un seul caractère, vous pouvez essayer

(?<struct>\w+)\s?->\s?(?<var>\w{1}) //single char after -> 
(?<struct>\w+)\s?->\s?(?<var>\w+) //multiple char after -> 

De cette façon, vous avez des groupes afin que vous puissiez comparer les noms avant de faire des remplacements. Le \ s? aide à faire correspondre même si vous avez ajouté l'espacement entre certains mais pas d'autres.

2

Je ne suis pas sûr de votre cas particulier, mais peut-être Coccinelle peut vous aider. C'est un système pour patcher le code source, basé sur des règles comme "si x est une expression sans invocations de fonction, changer x + x en 2 * x" etc.

+0

Cela ressemble exactement à un cas que coccinelle a été faite pour gérer. – hlovdal