3. Lex et yacc, rappels

Lex et yacc sont deux outils d'analyse de syntaxe (lex) et de grammaire (yacc). En d'autres termes, yacc va trouver des mots, demander à lex de les lui traduire, puis interpréter leur sens au vu de leur organisation.

En d'autres termes encore, yacc va lire la ligne IntStr 2 bonjour. Puis il va demander à lex ce que IntStr veut dire, de même pour 2 et pour bonjour. Lex va lui répondre que IntStr veut dire INTSTR, que 2 est un entier et que bonjour est une chaîne de caractères. Et yacc sait ce que INTSTR veut dire : une ligne commençant par INTSTR doit se continuer par un entier et par une chaîne de caractères. Yacc sait donc qu'il doit attendre un entier puis une chaîne.

Le travail du programmeur est de définir ce qu'est IntStr, un entier et une chaîne quelconque. Puis il doit définir l'ordre de ces mots pour qu'ils aient une signification. Et enfin, quand il a programmé lex et yacc pour reconnaître le vocabulaire et la grammaire, il ne reste plus qu'à récupérer ce que lex et yacc ont reconnu afin de s'en servir par la suite dans son programme.

Pour bien enfoncer le clou, le helloworld de lex et yacc. La première application que l'on réalise avec lex et yacc est souvent une calculatrice 4 opérations. Ce helloworld mathématique se retrouve dans tous les cours sur lex et yacc en tant qu'illustration. Je me servirai de l'exemple juste pour signaler que lex sert à distinguer les nombres des signes et à rejeter tout autre symbole tel que les lettres. Yacc utilise ce que lex a reconnu afin d'avoir toujours nombre suivi de signe suivi de nombre, et de rejeter toutes les autres combinaisons tel que nombre puis signe, ou signe puis signe puis nombre etc. Enfin à l'intérieur du code qu'on fournit à yacc, on récupère les différents cas et pour chaque cas on effectue l'opération qu'il faut.

Pour ceux qui n'auraient pas fait de lex & yacc et qui s'y intéressent, c'est un petit exercice qui vaut le détour. L'astuce, pour se simplifier le travail, est qu'il faut mettre la fonction main() à la place de la fonction init_config() qui se trouve dans l'exemple plus bas. Et pas besoin de fichier main.c. Mais chut, je n'en dis pas plus...

En ce qui concerne lex et yacc, on en parle beaucoup, mais sur un système GNU, ce ne sont pas eux que l'on utilise, mais leur implémentation GNU : flex et bison -y.

création est mise à disposition sous un contrat Creative Commons