Académique Documents
Professionnel Documents
Culture Documents
Une défintion reguliere permet d’asocier un nom à une expression réguliere et de se referer
par la Suite dans la section des règles à ce nom plutot qu’à l’expression réguliere.
Les règles de traduction sont des suites d’instructions de la forme
Exp1 action1
Exp2 action2
Les exp sont des expression regulieres, les actions sont des bloc d’instruction en C si elle
comporte plusieurs instructions alors ils doivent etre entre {}.
La derniere section est facultative.
/* partie pour les déclarations de include et autres concernant tout ce que nous voudrions écrire
en C dans les actions sémantiques*/
%{
#include "global.h"
#include "compiler.h"
#include <stdlib.h>
%}
/* ici, vous spécifiez vos définitions régulières pour reconnaître des unités lexicales ou tokens*/
blancs [ \t]+
espace \040+
chiffre [0-9]
entier {chiffre}+
exposant [eE][+-]?{entier}
lettre [A-Za-z]
id {lettre}(_|({lettre}|{chiffre})*)
reel {entier}("."{entier})?{exposant}?
%% /*ici actions mises entre accolades à faire quand l’automate atteindra un état final*/
"while" {printf("UL reconnue : %s\n","WHILE");return(WHILE);};
{blancs} { /* On ignore */ }
{reel} {printf("UL reconnue : %s\n","NOMBRE");return(NOMBRE);};
{id} {printf("UL reconnue : %s\n","ID");return(ID);};
"{" {printf("UL reconnue : %s\n","ACCGAUCHE");return(ACCGAUCHE);};
"}" {printf("UL reconnue : %s\n","ACCDROITE");return(ACCDROITE);};
"+" {printf("UL reconnue : %s\n","PLUS");return(PLUS);};
"-" {printf("UL reconnue : %s\n","MOINS");return(MOINS);};
"*" {printf("UL reconnue : %s\n","FOIS");return(FOIS);};
"/" {printf("UL reconnue : %s\n","DIVISE");return(DIVISE);};
";" {printf("UL reconnue : %s\n","PV");return (PV);};
"^" {printf("UL reconnue : %s\n","PUISSANCE");return(PUISSANCE);};
"(" {printf("UL reconnue : %s\n","PARENTHESE_GAUCHE");return(PARENTHESE_GAUCHE);};
")" {printf("UL reconnue : %s\n","PARENTHESE_DROITE");return(PARENTHESE_DROITE);};
"=" {printf("UL reconnue : %s\n","AFFECTATION");return(AFFECTATION);};
"<" {printf("UL reconnue : %s\n","OPEREL");return(OPEREL);};
">" {printf("UL reconnue : %s\n","OPEREL");return(OPEREL);};
"<=" {printf("UL reconnue : %s\n","OPEREL");return(OPEREL);};
">=" {printf("UL reconnue : %s\n","OPEREL");return(OPEREL);};
"==" {printf("UL reconnue : %s\n","OPEREL");return(OPEREL);};
"<>" {printf("UL reconnue : %s\n","OPEREL");return(OPEREL);};
"\n" {printf("UL reconnue : %s\n","FIN");return(FIN);};
II. Générateurs d’analyseurs syntaxiques
1. Rappel
2. Définition
Un générateur d’analyseur syntaxique accepte en entrée la description d’un langage sous forme de
règles de productions et produit un programme écrit dans un langage de haut niveau qui, une fois
compilé, reconnait des phrases de ce langage.
Parmi ces générateurs nous pouvons citer : YACC (unix), BISON (windows)
b. Actions sémantiques
Les actions sémantiques sont des instructions en C insérées dans les règles de production. Elles sont
exécutées chaque fois qu’il y a réduction par la production associée.
c. Variables, fonctions et actions prédéfinies
FLEX BISON
Librairies
MinGW
CC
Programme
d. Exemple complet
La grammaire :
#include "global.h"
#include <stdio.h>
#include <stdlib.h>
%}
/* Ici, rappel des unités lexicales ou tokens générés par l’analyseur lexicale*/
%token NOMBRE
%token AFFECTATION
%token PLUS MOINS FOIS DIVISE PUISSANCE
%token PARENTHESE_GAUCHE PARENTHESE_DROITE
%token FIN
%token OPEREL
%token WHILE
%token ID
%token PV
%token ACCGAUCHE ACCDROITE
%left PLUS MOINS
%left FOIS DIVISE
%left NEG
%right PUISSANCE
%start Input
%%
Input:
Input Programme
| Programme
;
/* Ici, spécification de la grammaire*/
Programme:
ListInst FIN {printf("Analyses lexicales et syntaxiques réussies!\n");
printf("Tapez Enter pour terminer ou entrez une nouvelle chaine à analyser!\n");
} ;
ListInst:
Instruction PV ListInst
| Instruction
;
Instruction:
ID AFFECTATION Expression {}
;
Expression: