Forum Programmation.perl [débutant]Regexp sur chaîne de longueur inconnu

Posté par  (site web personnel) .
Étiquettes : aucune
0
27
jan.
2005
Bonjour, je suis en train de coder un petit programme qui transforme certaines séquences de code C en code d'un autre langage, lisaac, pour le besoin d'un ami qui doit traduire 50000 lignes de C en ce langage.

J'en ai profité pour découvrir Perl.

Je travaille sur le problème suivant :

traiter int a,*b,c,*d; qui se tranforme en

+ a,c : INTEGER;
+ b,d : ARRAY[INTEGER];

mon problème est de détecter et séparer les tableau des entiers statiques.

j'ai donc fait ça(je vous épargne tout le code) :

while (my $line = ) {
if ($line =~ m/int\s+([\w,\*]+)([;]+)/)


en $2 je récupère "a,*b,c,*d".

ensuite j'aimerai séparer les $2, je fait donc

if ($tab[1] =~ /(([\w\*]+)([,]+))+/)
{
print $1,"\n";
print $2,"\n";
print $3,"\n";
print $4,"\n";
print $5,"\n";
print $6,"\n";
print $7,"\n";

print "C'etait\n";
}
Et là ça marche pas, et je vois pas comment faire...


Le man perlre me dit rien de très interessant à ce sujet...


Question, aussi, comment puis-je connaitre le maximum des occurenres, $1,$2, ya t il un mot/symbole réservé ?



merci !
  • # liste ?

    Posté par  . Évalué à 5.

    Je suis pas sur d'avoir bien compris, mais je ferais un split sur ton $2 ("a,*b,c,*d") en prenant la virgule comme séparateur, et ensuite deux grep pour construire la liste des éléments avec * et celle des éléments sans.
  • # capture et parenthèses, et flex, et antlr, et...

    Posté par  . Évalué à 3.

    avec ton exemple, ton code renvoie chez moi "c," "c" et ",".
    En fait, les parties de chaines capturées par les () dans ta regexps sont accessibles par $1, $2... dans l'ordre des parenthèses ouvrantes; dans ton cas, tu as 3 blocs, dont 2 sont inclus dans le premiers, qu'on pourrait décrire comme ça: (1 (2) (3) ) dont $1 va contenir tout ce qui est dans la première zone parenthésée, soit $1 = $2$3

    A part ça, je ne m'y connais pas trop en perl donc je laisse la suite à d'autres... Cela dit, écrire un parseur de code C en perl, je dis quand même "bon courage" ! Cherche quand même si quelqu'un n'en aurait pas déja écrit un... Ou explore d'autres voies, comme utiliser le parseur flex/bison (il faudra trouver/écrire une syntaxe/grammaire du C )

    Tiens, je ne sais absolument pas ce que c'est (site trouvé sur un autre journal linuxfr en cherchant sur le sujet) http://antlr.org/(...) et http://www.antlr.org/grammar/cgram(...) , apparemment un générateur de compilos/traducteurs de langages... c'est peut-être une bonne base de départ !
    • [^] # Re: capture et parenthèses, et flex, et antlr, et...

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

      J'ai déjà cherché des parseurs. J'ai trouvé un truc en caml, un truc en perl (rec::parse), j'ai testé des exemples et au mieux ça marche uniquement sur du code ultra basique de 3 lignes.

      De toutes façon, c'est urgent et les trucs à modifier sont :
      - les déclarations de variables
      - les boucles for
      - les while
      - changer les -> en . et mettre des parenthèse qd il y en a plusieurs. Lisaac étant un langage intégralement objet, produire du code fonctionnel demanderai une IA. Je le ferai peut être un jour, mais dans ce cas ce sera probablement en caml, voire en lisaac.

      ----
      Pourt rappel, car j'étais pressé et (donc) pas clair, je veux récupérer séparément
      a
      *b
      c
      *d

      « Il n’y a pas de choix démocratiques contre les Traités européens » - Jean-Claude Junker

    • [^] # Re: capture et parenthèses, et flex, et antlr, et...

      Posté par  . Évalué à 3.

      Si dans des parenthèses tu mets ?: au début, alors ces parenthèses n'enregistreront rien dans $1, $2, etc...

      En clair, si tu écrit (?:([\w\*]+)([,]+)) pour reprendre l'exemple, alors ça revient à ( (1) (2) ) et non à (1 (2) (3) ) comme avant. Sinon, je suis aussi d'avis qu'un split serait bien.
  • # idée

    Posté par  (site web personnel, Mastodon) . Évalué à 3.

    Il faut faire un analyseur qui comprend le C (bonne chance) pour générer un arbre abstrait. Ensuite il sufit de faire un bout de code qui prend cet arbre pour générer ton code en lisaac.

    Si tu veux juste comprendre des bouts de C c'est sans doute plus facile. Sinon j'imagine qu'il suffit de prendre gcc, de touiller le tout pour générer tes besoins.
    • [^] # Re: idée

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

      J'ai bien tenté...

      J'ai cherché du côté de camlyacc, j'ai trouvé des trucs interessants, mais ça demande beaucoup de temps... de découverte..

      J'ai ensuite trouvé perl:recDescent, j'ai même trouvé des grammaires c, mais aucune n'est exploitable. Une ne fonctionne pas, l'autre fonctionne pour des programmes très simples.

      Je dois réaliser ce petit programme en urgence où j'ai une liste de chose à automatiser. J'en ai discuté avec le bénéficiaire (celui qui va faire la traduction) et il a juste besoin d'une liste de choses :

      -transformation des majuscules en minuscules pr variables et fonctions.
      -récritures des déclarations de variables (int i -> i : INTEGER)
      - inversion des if et while do (if (condition) -> (condition).if ) et remplacement des parenthèse par des accolades pour les while_do
      - remplacement du for en for "objet ( " for(v1=v2; v1 < limite;v1++)" en "v2.to limite do { v1 : INTEGER;" )
      - etc...
      Des petites choses

      A l'avenir, je ferai un parser avec la méthode que tu préconnise. Mais il ya du boulot...
      Et je ne sais pas si Gcc est à conseiller, je prefèrerai Cil qui est un logiciel écrit en caml, capable de comprendre le c gcc, de l'analyser, etc...

      Si on veut faire un compilateur complet, produisant du lisaac compilable, il faudra faire une IA derrière....

      « Il n’y a pas de choix démocratiques contre les Traités européens » - Jean-Claude Junker

      • [^] # Re: idée

        Posté par  (site web personnel, Mastodon) . Évalué à 3.

        C'est urgent mais le truc que tu demandes prend du temps à être fait correctement. De toute manière s'il doit passer ce code sur une grande quantité de code, il est surement plus intéressant d'en passer pour macher le boulot de manière automatique.

        De toute facon vouloir faire un truc urgent en peu de temps qui dans tous les cas prend du temps à être fait correctement, il y a un soucis :)

        Sinon je ne vois pas ou il faudrait une IA, tu m'expliques ?
        • [^] # Re: idée

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

          Pourquoi il faut faire une IA ?

          C est un langage procédural.
          Lisaac est un langage intégralement objet. Ce n'est même plus un langage "orienté" objet. C'est un langage objet.

          Tout, absolument tout, en lisaac, est objet :
          Les types de bases (entiers, char, chaînes), les types élaborés( listes chaînées, tables de hashage (Dictionnary), ensembles, etc...). Lisaac a été conçu pour créer Isaac, un système entièrement et uniquement constitué d'objets dialoguant enrte eux, sans VM.

          La difficulté de la traduction de C vers lisaac est de reconnaîtres des structures.

          En C tu crée une liste chainée en déclarant une structure, son contenu, et en y définissant un pointeur sur la prochaine structure, d'où l'appelation Liste Chainée.

          En lisaac, tu fait

          + mavariable : LINKED_LIST[MONOBJET];
          mavariable := LINKED_LIST[MONOBJET].create;

          mavariable.add_last monobj1;
          mavariable.add_last monobj2;

          (mavariable.item 1).print;

          Une liste chainée, est un tableau infini, contenant ce que tu veux.

          Faire une IA qui traduise du C standard, ya pas de problème, mais il est de notoriété publique que beaucoup de logiciel sont codés "à la barbare", avec des astuces, des subtilités difficilement "compréhensibles" pour un logiciel automatique.

          Regarde un peu les sources de certains codecs que l'on trouve dans MPlayer pour t'en convaincre...

          J'en ai pas mal discuté avec Benoit (Sonntag), le chercheur qui a mis au point lisaac pendant sa thèse, et il lui semble à peu près illusoire de faire un compilateur C vers lisaac. Etant donné qu'il est un des meilleurs chercheurs dans le domaine de la compilation justement, je craint que son avis, même s'il est intuitif, soit assez fondé...

          Et c'est vrai qu'à la réflexion, quand tu vois certains sources, tu te pose des questions...

          Cela dit, c'est surement possible, mais il y a AMHA plusieurs mois de travail pour un spécialiste chevronné.
          Il serait interessant de récupérer le langage intermédiaire de GCC, mais du coup on perdrait les commentaires, les constantes (car inlinée), etc...

          Bref, c'est un peu cornellien comme problème.

          cela dit il ya peut être des solution auxquelles on a pas pensé...

          « Il n’y a pas de choix démocratiques contre les Traités européens » - Jean-Claude Junker

    • [^] # Re: idée

      Posté par  . Évalué à 2.

      Peux-tu développer ton idée, ou fournir une URL qui expliquerait ce que tu as dit?

Suivre le flux des commentaires

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