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 gaaaaaAab . Évalué à 5.
# capture et parenthèses, et flex, et antlr, et...
Posté par daggett . Évalué à 3.
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 Ontologia (site web personnel) . Évalué à 1.
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 Nico . Évalué à 3.
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 Fabien Penso (site web personnel, Mastodon) . Évalué à 3.
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 Ontologia (site web personnel) . Évalué à 1.
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 Fabien Penso (site web personnel, Mastodon) . Évalué à 3.
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 Ontologia (site web personnel) . Évalué à 1.
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 totof2000 . Évalué à 2.
[^] # Re: idée
Posté par Fabien Penso (site web personnel, Mastodon) . Évalué à 2.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.