%{ /* Ce fichier indique a l'outil "yacc" comment generer l'analyseur syntaxique du langage. Il contient donc : - une decription de la grammaire du langage - un description des actions que doit effectuer l'analyseur lorsqu'il "reconnait" une regle de la grammaire (par exemple afficher un message, effectuer un calcul, construire un fragment d'arbre abstrait, etc.). Sur l'exemple l'analyseur devra evaluer l'expression booleenne qu'il est en train de reconnaitre (calculer sa valeur). */ int val ; /* valeur de l'expression booleenne */ %} /* la definition des tokens : ce sont des numeros uniques associes aux lexemes. les lexemes reduits a un caratere ont pour token leur code ascii, les autres ont un code debutant a 256, dans l'ordre de leur apparition; voir le fichier y.tab.h */ /* on indique ici les lexemes qui ne sont pas reduits a un seul caractere, yacc leur affectera un numero unique */ %token True %token False %token Erreur_lexicale /* on indique ici l'axiome de la grammaire */ %start EXP_BOOL %% /* la definition de la grammaire du langage : la liste des regles avec les actions correspondantes pour evaluer l'expression booleenne. Dans les actions le non-terminal correspondant a la partie droite de la regle est note $$, le symbole apparaissant en i-eme position dans la partie gauche de la regle est note $i. (voir les exemples ci-dessous). */ /* Regle 1 */ EXP_BOOL : E {val=$1;YYACCEPT;} /* la valeur de EXP_BOOL est celle de E ($1) */ /* YYACCEPT indique que la chaine d'entree est reconnue */ ; /* Regles 2 */ E : E '+' T {$$=$1 || $3;} /* la valeur retournee ($$) est le "ou binaire" (||) entre celle de E ($1) et celle de T ($3) */ | T {$$=$1;} /* la valeur retournee ($$) est celle de T ($1) ; /* Regles 3 */ T : T '*' F {$$=$1 && $3;} /* la valeur retournee est le "et" binaire (&&) entre celle de T et celle de F */ | F {$$=$1;} /* la valeur retournee est celle de F */ ; /* Regles 4 */ F : '(' E ')' {$$=$2;} /* la valeur retournee est celle de E */ | True {$$=1;} /* la valeur retournee est 1 */ | False {$$=0;} /* la valeur retournee est 0 */ ; %% #include "lex.yy.c"