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 !
# Maintenant, je comprends mieux pourquoi Perl se plaint
Posté par Pascal . Évalué à 1.
http://linuxfr.org/~Houbaa/15453.html(...)
Pauvre perl....
# s///
Posté par polux14 . Évalué à 2.
$a = 'tototititoto';
$a =~ s/titi/toto/;
print $a;
totototototo
[^] # Re: s///
Posté par Ontologia (site web personnel) . Évalué à 1.
« Il n’y a pas de choix démocratiques contre les Traités européens » - Jean-Claude Junker
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.