Recent Changes - Search:

My Projects

Courses

Writings

Source Code

Social Networks

Live Traffic !

Évolution 8 : Autres boucles for

Créer son propre langage de programmation de A à Z

<< Évolution 7 : Les chaînes de caractères (Partie 2 - Concaténation et ré-allocation dynamique de la mémoire) | Évolution 8 : Autres boucles for | Évolution 9 : Les nombres décimaux >>

Petite évolution celle-là aussi. On va ajouter deux nouvelles syntaxes possibles pour la boucle for. La première permet de définir un début et une fin avec un pas par défaut de 1. La seconde est équivalente, cette fois avec un pas que l'on peut définir.

Évolution 8 du langage :

  1. <boucle_for> ::= "(" <expression_arithmetique> ")" "x" <code> ";"
  2.                | "(" <expression_arithmetique> ":" <expression_arithmetique> ")" <code> ";"
  3.                | "(" <expression_arithmetique> ":" <expression_arithmetique> ":" <expression_arithmetique> ")" <code> ";"

L'analyseur lexical ne change pas. On ne changera pas non plus le fichier d'entête. On aura le même numéro de nœud d'AST qui aura 4 enfants : début, pas, fin et du code.

Exemple :

Notre boucle for sera toujours de la forme (debut:pas:fin).

  • (10)x équivaut à (0:1:10) - Début : 0, Pas : 1, Fin : 10
  • (5:10) équivaut à (5:1:10) - Début : 5, Pas : 1, Fin : 10

On modifie surtout l'analyseur syntaxique Bison. On va construire des nœuds et les ajouter directement à la main dans le nœud de la boucle for :

syntaxe_simple.y
  1. boucle_for:                     TOK_PARG expression_arithmetique TOK_PARD TOK_CROIX bloc_code TOK_FINSTR{
  2.                                         $$=g_node_new((gpointer)BOUCLE_FOR);
  3.                                         g_node_append($$,g_node_new((gpointer)ENTIER));
  4.                                         g_node_append_data(g_node_nth_child($$,0),strdup("0"));
  5.                                         g_node_append($$,g_node_new((gpointer)ENTIER));
  6.                                         g_node_append_data(g_node_nth_child($$,1),strdup("1"));
  7.                                         g_node_append($$,$2);
  8.                                         g_node_append($$,$5);
  9.                                 }
  10.                                 |
  11.                                 TOK_PARG expression_arithmetique TOK_DOUBLE_POINT expression_arithmetique TOK_PARD bloc_code TOK_FINSTR{
  12.                                         $$=g_node_new((gpointer)BOUCLE_FOR);
  13.                                         g_node_append($$,$2);
  14.                                         g_node_append($$,g_node_new((gpointer)ENTIER));
  15.                                         g_node_append_data(g_node_nth_child($$,1),strdup("1"));
  16.                                         g_node_append($$,$4);
  17.                                         g_node_append($$,$6);
  18.                                 }
  19.                                 |
  20.                                 TOK_PARG expression_arithmetique TOK_DOUBLE_POINT expression_arithmetique TOK_DOUBLE_POINT expression_arithmetique TOK_PARD bloc_code TOK_FINSTR{
  21.                                         $$=g_node_new((gpointer)BOUCLE_FOR);
  22.                                         g_node_append($$,$2);
  23.                                         g_node_append($$,$4);
  24.                                         g_node_append($$,$6);
  25.                                         g_node_append($$,$8);
  26.                                 };

Ensuite le générateur de code :

generation_code.c
  1. case BOUCLE_FOR:
  2.                                 fprintf(fichier,"\tint i%i;\n\tfor(i%i=",nb_boucle,nb_boucle);
  3.                                 genere_code(g_node_nth_child(ast,0));
  4.                                 fprintf(fichier,";i%i<",nb_boucle);
  5.                                 genere_code(g_node_nth_child(ast,2));
  6.                                 fprintf(fichier,";i%i+=",nb_boucle);
  7.                                 genere_code(g_node_nth_child(ast,1));
  8.                                 fprintf(fichier,"){\n");
  9.                                 nb_boucle++;
  10.                                 genere_code(g_node_nth_child(ast,3));
  11.                                 fprintf(fichier,"\t}\n");
  12.                                 break;

On construit le compilateur et on teste :

programme.simple
  1. e_Monentier = 0;
  2.  
  3. (10*(e_Monentier+1))x
  4.     afficher "Je dis 10x Salut !\n";
  5. ;
  6.  
  7. e_Monentier2 = 10;
  8.  
  9. (e_Monentier:e_Monentier2)
  10.     afficher "Je dis 10x Au Revoir !\n";
  11. ;
  12.  
  13. (e_Monentier:2:e_Monentier2)
  14.     afficher "Je dis 5x Salut !\n";
  15. ;
  16.  
  17. e_pas=1;
  18. e_cumulpas=0;
  19.  
  20. afficher "(";
  21. (e_Monentier:e_pas:100)
  22.     afficher e_pas;
  23.     afficher " + ";
  24.     e_cumulpas+=e_pas;
  25.     e_pas++;
  26. ;
  27. afficher 100-e_cumulpas;
  28. afficher ") = 100\n";

Le programme en Simple sort :

Je dis 10x Salut !
Je dis 10x Salut !
Je dis 10x Salut !
Je dis 10x Salut !
Je dis 10x Salut !
Je dis 10x Salut !
Je dis 10x Salut !
Je dis 10x Salut !
Je dis 10x Salut !
Je dis 10x Salut !
Je dis 10x Au Revoir !
Je dis 10x Au Revoir !
Je dis 10x Au Revoir !
Je dis 10x Au Revoir !
Je dis 10x Au Revoir !
Je dis 10x Au Revoir !
Je dis 10x Au Revoir !
Je dis 10x Au Revoir !
Je dis 10x Au Revoir !
Je dis 10x Au Revoir !
Je dis 5x Salut !
Je dis 5x Salut !
Je dis 5x Salut !
Je dis 5x Salut !
Je dis 5x Salut !
(1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 9) = 100

Voilà pour cette courte évolution. Pour l'évolution 9, on implémentera les nombres décimaux pour plus de précisions dans les calculs mathématiques avec Simple.

<< Évolution 7 : Les chaînes de caractères (Partie 2 - Concaténation et ré-allocation dynamique de la mémoire) | Évolution 8 : Autres boucles for | Évolution 9 : Les nombres décimaux >>

Thomas Tributsch - (CC BY-NC-SA 3.0 FR)

Page last modified on August 11, 2016, at 10:25 AM EST

This page has been requested 961 times (Today : 3) - Total number of requests : 194303

Edit - History - Statistics - Print - Recent Changes - Search

Clin d'oeil aux victimes des attentats survenus dans la soirée du 13 novembre 2015. La nouvelle version du site a été installée quelques heures avant.