MOïRA et YACC
MOïRA est une méthode implémentée dans un outil. Son but est d'intégrer de façon optimale le traitement des données textuelles dans une application.

Cette page compare le fonctionnement de YACC à celui de  MOïRA.

Contact :    alain.buhsing@free.fr


o Contenu de cette page :
 

oCe qu'est YACC
oComparaison YACC & MOïRA
oConclusion

Retour à MOïRA


oCe qu'est YACC

YACC (Yet Another Compiler of Compiler) est le constructeur syntaxique standard de UNIX. Il existe le produit GNU BISON qui reprend les mêmes spécifications, tout en étant  plus efficace.

YACC est associé au constructeur lexical LEX. Le but d'un analyseur lexical est de constituer des mots qu'il va transmettre à l'analyseur syntaxique qui, lui va constituer des phrases.

Un constructeur lexical comme LEX permet de définir les différentes unités lexicales au moyen d'une pseudo-grammaire : mots clés du langage, séparateurs, expressions régulières lexicales  (entiers, réels, identifieurs, chaines de caractères). C'est aussi dans LEX qu'on définit les commentaires du langage.

Retour au début



oYACC et MOïRA

A titre d'exemple, on peut observer la traduction en YACC de la grammaire MOïRA des expressions arithmétiques. Il s'agit d'une traduction automatique produite par l'outil YACCA .Les instruction C qui décorent la grammaire YACC correspondent à des instructions de création d'un arbre abstrait.

L'exemple complet :

oPremier exemple :
Un élément de tableau s'écrit au moyen d'un identifieur suivi d'une expression délimitée par des crochets. En MOïRA, on écrit  :
 
       Tableau  ::=   Identifieur  "[" expression "]"

Traduite en YACC, cette règle devient :
 

%token SP_CROCG SP_CROCD

tableau   : identifieur SP_CROCG expression SP_CROCD
          {create_node (KN_Tableau, 2);}
          ;

Quelques remarques :

Un appel de fonction s'écrit au moyen d'un identifieur suivi d'une liste d'arguments. Les arguments sont délimités par des parenthèses et sont séparés par des virgules  :
 
       AppelFonction  ::=   Identifieur  "(" { expression }*, ")"

 
%token SP_PARG SP_PARD SP_VIRG

appel_fonction : identifieur SP_PARG { create_list (); } L1_expression 
                             SP_PARD { create_node (KN_AppelFonction, 2);}
                                   ;
L1_expression  : /* regle vide */
               | expression { append_list ();}
               | expression SP_VIRG { append_list ();} L1_expression
               ;

Quelques remarques :


Retour au début



oConclusion

L'amalgame "grammaire" + "bout de programme" dans un même texte n'est pas forcément un gage  de  programmation efficace ou de lisibilité, sauf si l'on est à la fois bon programmeur et bon linguiste, ce qui est rare. Mais après tout, il y a bien des poissons volants …

Néanmoins, on l'a vu, on peut implémenter la méthode sémantique de MOïRA en s'appuyant sur YACC. Et même si l'outil peut paraître mois puissant qu'avec le constructeur/analyseur d'origine, il est quand même appréciable de mettre en oeuvre cette méthodologie.

Retour au début