Bonjour,

Etudiant en informatique, je travaille actuellement sur un analyseur d'un langage inventé transformant ce langage en du c++.

J'ai pris la documentation qu'il me faut aussi bien sur le net que dans des livres, pour autant je ne trouve pas d'explication (nullepart) sur mon problème de typage.

Mon fichier lex sert d'analyseur et envoie au fichier yacc les données que celui ci analysera grammaticalement avant d'écrire du c++.

Exemple d'une règle qui me pose problème:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
definition_fonction : "FONCTION" IDENTIFIANT "PARAMETRES" parametres "DEBUT{" instructions "}RETOUR" expression ";" "FIN_FONCTION"
Içi, la regle definition_fonction contient des instructions, qui peuvent elles même être n'importe quel règle, dont justement definition_fonction.

Je ne peux donc pas donner comme gestion un :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
printf("function %s (%s) { %s \n return %d;\n }\n",$8,$6,$4,$1);
car mon $6 (instructions) ne renverra pas forcément une string, mais pourra être un affichage en printf comme dans le cas d'une règle definition_fonction.

Mes deux idées :
1) faire une regle
Code : Sélectionner tout - Visualiser dans une fenêtre à part
%start program : instructions { printf("%s",$1); }
et amener toutes les sous règles à renvoyer au final des string grâce à $$=...

Mais dans ce cas, je me retrouve avec des problèmes de types dans tous les sens !

2) Donc j'ai imaginé une 2nde possibilité, avoir un appel au sein même d'une règle de yacc sur une partie de son contenu.

ex:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
definition_fonction : "FONCTION" IDENTIFIANT "PARAMETRES" parametres "DEBUT{" instructions "}RETOUR" expression ";" "FIN_FONCTION" 
{ printf("function %s (%s) { ",$4,$1);
  // içi on parse les regles instructions
  printf("return %d;\n }\n",$8); }
Sauf que je ne sais pas comment demander au parseur de yacc de travailler uniquement sur les instructions présentes entre ce "DEBUT{" et "}RETOUR" !
J'ai regardé le fonctionnement de yyparse() mais il ne semble pas convenir.


Si une âme charitable comprend mon soucis et peut m'aider, ce serait génial !
Merci en tout cas d'avoir lu mon message.
Hugo T.