Forum Programmation.perl regexp en folie

Posté par (site web personnel) .
Étiquettes : aucune
0
29
mar.
2005
Engagé dans mon entreprise de réaliser un script transformant quelques séquences de langage C en langage lisaac, j'ai développé mon premier programme perl à cette fin. Globalement ça marche moyennant quelques problèmes.

Je sais, je ferai mieux d'utiliser un parser, mais je n'ai que peu de temps à y consacrer et de toutes façon on cherche juste à transformer quelques expression (inverser des if, transformer des = en :=, tranformer des tab[5][8][xio45] en tab.item 5,8,xio45, etc..).

Bref juste les trucs chiants. Les deux langages étant trop différentes on ne cherche pas à aller plus loin (Lisaac est un langage objet sans pointeurs).

Bref, je prend un cas au hasard :

if ((BlockSAD[list][i][j] = (int**)malloc (16 * sizeof(int*))) == NULL)

Afin de détecter ce genre de joyeuseté (ya bien pire) j'ai ma regexp :
\s*(if)+\s*(\(){1}\s*([\[\]\-|!'\\=\+,<>\s\.\*\/<>{}()&\w\?\:]*)(\)){1}\s*([\[\]\-|!'\\=\+,<>\s\.\*\/<>{}()&\w\?\:]*);*

( pr la petite histoire j'applique ensuite un : print '( '.3ドル.' ).if '.5ドル; pour inverser le if, ce qui donne : "((BlockSAD[list][i][j] = (int**)malloc (16 * sizeof(int*))) == NULL).if" )

Le problème est aussi de transformer BlockSAD[list][i][j] en BlockSAD.item list,i,j

Pour cela j'ai bien ma regexp qui me détecte les expressions de ce genre ([\w]+)\s*(([\[]+)\s*([\w\.-<>\s\(\)\+\*\/]*)\s*([\]]+)+)

puis adaptée à la taille \s*([\w_\.]+)\s*\[([\w_\.]+)\]\s*\[([\w_\.]+)\]\s*\[([\w_\.]+)\];*

ou je fait un : print 1ドル.'.item '.2,ドル','.3ドル.','.4ドル.' ';

Le problème c'est que faisant, je vire toute la ligne, alors que j'aimerai ne remplacer que cette séquence et rien d'autres.

Quel solutions, à part refaire une regexp pour récupérer le "n'importe quoi" avant et après (ie. "if (( " et = "(int**)malloc (16 * sizeof(int*))) == NULL)" et de pouvoir caller proprement mon print 1ドル.'.item '.2,ドル','.3ドル.','.4ドル.' '; à l'intérieur afin d'avoir

if ((BlockSAD[list][i][j] = (int**)malloc (16 * sizeof(int*))) == NULL) transformé en ((BlockSAD.item list,i,j = (int**)malloc (16 * sizeof(int*))) == NULL) .if ?

J'espère que vous avez suivi !

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.