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 !
  • # Maintenant, je comprends mieux pourquoi Perl se plaint

    Posté par  . Évalué à 1.

    Avec ce genre d'exemples, je comprends maintenant mieux pourquoi Perl se plaint:
    http://linuxfr.org/~Houbaa/15453.html(...)

    Pauvre perl....
  • # s///

    Posté par  . Évalué à 2.

    Si tu fais un remplacement au lieu d'une recherche/recontitution ca devrai marcher :
    $a = 'tototititoto';
    $a =~ s/titi/toto/;
    print $a;
    totototototo
    • [^] # Re: s///

      Posté par  (site web personnel) . Évalué à 1.

      j'y ai pensé, mais je suis pas sûr que ça marche, quoique, ouais tiens... Je vais essayer...

      « 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.