Compilation AL LL LR As-1
Compilation AL LL LR As-1
Compilation AL LL LR As-1
q Introduc)on et rappel
q Analyseur lexical
q Analyseur syntaxique
Compila(on q Analyseur séman)que
q Représenta)on intermédiaire
Pr. Youness Tabii
q Généra)on de code
q Op)misa)on
22/10/2024 1 22/10/2024 2
Introduc)on Introduc)on
n Les micro-processeurs deviennent indispensables et sont embarqués n Programma'on en langages de bas niveau (proches de la machine)
dans tous les appareils que nous utilisons dans la vie quotidienne ¨ très difficile (complexité)
¨ Transport n Courbe d’appren'ssage très lente
n Véhicules, Systèmes de navigation par satellites (GPS), Avions, … n Débuggage fas'dieux
¨ très coûteuse en temps (perte de temps)
¨ Télécom
n Tâches récurrentes
n Téléphones portables, Smart Phones, …
n Tâches automa'sables
¨ Électroménager ¨ très coûteuse en ressource humaine (budget énorme)
n Machine à laver, Micro-ondes, Lave vaisselles, … n Tâches manuelles
Maintenance
¨ Loisir n
22/10/2024 5 22/10/2024 6
22/10/2024 7 22/10/2024 8
Quelques éléments de
Ques%ons réponses
n Quels sont les constituants d’un langage n Quelques cons*tuants d’un langage naturel ?
¨ Vocabulaire (lexique), Syntaxe (grammaire), Séman*que
naturel ? (sens selon le contexte)
22/10/2024 9 22/10/2024 10
22/10/2024 11 22/10/2024 12
Architecture d’un compilateur Rappel
Code Source
Comment Transcrire une expression régulière en langage C ?
Analyseur Lexical
Expression : L(L+C)* Avec L=[a-zA-Z] et C=[0-9]
Analyseur Syntaxique
Op4misa4on de code
Génération de code
22/10/2024 13 22/10/2024 14
Rappel Rappel
ER à DFA minimal à Programme en C ER à DFA minimal à Programme en C
typedef enum {S0, S1, S2} State;
L,C
int main(int argc,char *argv[]){
L
// 1- traitement intial
s0 s1
State state = S0;
C
s2 printf(”S0\n");
return 0;
}
22/10/2024 15 22/10/2024 16
void automate(State current_state){
State state = current_state;
char c = getchar();
if (c != '$') { Rappel
// 2- traitement récursif
switch (state){ ER à DFA minimal à Programme en C
case S0 :
if (((c >= 'a') && (c <='z')) || ((c >= 'A') && (c <='Z'))){ ./idAutomate ./idAutomate
state = S1; printf(”S0 --> S1\n"); state0 a123456$ state0 12345$
}else {state = S2; printf(”S0 --> S2\n");}
break;
state0 --> state1 state0 --> state2
case S1 : state1 --> state1 state2 --> state2
if (((c >= 'a') && (c <='z')) || ((c >= 'A') && (c <='Z')) || ((c state1 --> state1
>= '0') && (c <= '9'))) state2 --> state2
state = S1; printf(”S1 --> S1\n"); state1 --> state1
state2 --> state2
break;
state1 --> state1
case S2 : state2 --> state2
state = S2; printf(”S2 --> S2\n"); state1 --> state1
} state1 --> state1 mot refusé par l'automate des
automate(state); iden:ficateurs
mot accepté par l'automate des
}else{
iden:ficateurs
// 3- traitement final
if (state == S1) printf("mot accepté par l'automate des identificateurs\n");
else printf("mot refusé par l'automate des identificateurs\n");}}
22/10/2024 17 22/10/2024 18
Définitions
q Le lexique d’un langage de programma1on est son
vocabulaire.
q Un lexème (token) est une collec1on de symboles
Analyse Lexical
élémentaires (un mot) ayant un sens pour le langage.
q Plusieurs lexèmes peuvent appartenir à une même
classe. Une telle classe s’appelle une unité lexicale.
q L’ensemble des lexèmes d’une unité lexicale est décrit
par une règle appelée modèle associé à l’unité lexicale.
22/10/2024 19 22/10/2024 20
Analyseur Lexical Définition
qLe module qui effectue l’analyse lexicale s’appel q Unités lexicales (Tokens):
un analyseur lexical (lexer ou scanner).
qUn analyseur lexical prend en entrée une q Symboles : iden-ficateurs, chaînes, constantes
séquence de caractères individuels et les regroupe numériques
en lexèmes.
qAutres tâches d’un analyseur lexical q Mots clefs : while, if, case, …
q Ignorer tous les éléments n’ayant pas un sens pour le code
machine (Les espaces, les tabulations, les retours à la ligne,
et les commentaires). q Opérateurs : <=, =, ==, +, -, …
22/10/2024 21 22/10/2024 22
Analyseur Lexical
Exemple Analyseur Lexical
ü Les meilleurs modèles qui existent pour iden2fier les types lexicaux de
Input : a = b+c*2; tokens sont les expressions régulières
Tokens Unité Lexical
Ouput : a Identificateur Ø Alphabé(que : (‘a’ | ‘b’ | ... | ‘z’ | ‘A’ | ‘B’ | ... | ‘Z’)
= Opérateur Affectation
Ø Numérique : (0 | ...| 9)
IDENTIFICATEUR b Identificateur
OPPAFFECT Ø Opérateurs : (+ | - | / | * | = | <= | >= | < | >)
IDENTIFICATEUR + Opérateur Plus
PLUS Ø Naturel : Numérique+
c Identificateur
IDENTIFICATEUR * Opérateur Multiplication ØEn(er : ( + | - | e ) Naturel
OPPMULT
CONSTANTE 2 Constante Ø Iden(ficateur : (Alphabé(que ( Alphabé(que | Numérique)*)
PTVIRG
Ø ChaîneAlphaNumérique : " (Alphabé(que | Numérique)+ "
22/10/2024 23 22/10/2024 24
Analyseur Lexical
Il existe des algorithmes et ou0ls
perme2ant de générer le code
implantant l’automate d’états finis
Générateur de
(scanner) correspondant à une
expression régulière (Lex)
scanner - FLEX
22/10/2024 25 22/10/2024 26
22/10/2024 27 22/10/2024 28
FLEX
Etapes FLEX
qLorsque l’exécutable est mis en
Expressions régulières Lex Lex.yy.c œuvre, il analyse le fichier source pour
chercher les occurrences d’expressions
Lex.yy.c régulières.
gcc Executable
Autres modules qLorsqu’une régulière est trouvée, il
exécute le code C correspondant.
Source à analyser Executable Résultats de l’analyse
22/10/2024 29 22/10/2024 30
22/10/2024 31 22/10/2024 32
Expression régulière FLEX FLEX
Commandes
qLes étapes à suivre pour obtenir un analyseur
avec Flex :
1. Ecrire votre analyseur dans un fichier portant une
extension ”.l” ou ”.lex”. Par exemple, ”prog.lex”.
2. Compiler votre analyseur par la commende flex : flex
prog.lex
3. Compiler le fichier par la commande gcc le fichier lex.yy.c
produit par l’étape précédente :
gcc lex.yy.c −lfl –o prog
4. Lancer l’analyseur en uHlisant le nom de celui-ci : prog
22/10/2024 33 22/10/2024 34
Exemple
/*reconnaître les chiffres, lettres, réels et identificateurs*/
%{
/* Déclaration VIDE */ 12 à en&er 12
%}
%option noyywrap 3.4à reel 3.4 Exercice 1
/* Définition */
chiffre [0-9]
L à iden&ficateur L qCompte le nombre de Voyelles, Consonnes et les
lettre [a-zA-Z] caractères de ponctua4on d’un texte entré en
6.5e+4 à reel 6.5e+4
entier {chiffre}+ clavier.
reel {chiffre}+(\.{chiffre}+(e(\+|\-)?{chiffre}+)?)?
ident {lettre}({lettre}|{chiffre})*
%% qEtapes :
/* Régles exrp à action*/
{entier} printf("\n entier %s \n ", yytext); qDéclara4on des compteurs
{reel} printf("\n reel %s \n ", yytext); qDéfini4on des expressions régulières (les consonnes,
{ident} printf("\n identificateur %s \n ", yytext); voyelles et ponctua4on)
%%
qL’ac4on à exécuté pour chaque expression régulière
int main(void){ qLa fonc4on main (pour affichage des résultat)
yylex();
return 0;}
22/10/2024 35 22/10/2024 36
%{
int nbConsonnes,nbVoyelles,nbPonctuation;
%}
Solu%on
%option noyywrap
consonne [b-df-hj-np-xz]
ponctuation [,;:?!\.]
%%
Analyse
[aeiouy] nbVoyelles++;
{consonne} nbConsonnes++;
{ponctuation} nbPonctuation++;
.|\n // ne rien faire
Syntaxique
%% $ bonjour,
22/10/2024 37 22/10/2024 38
22/10/2024 39 22/10/2024 40
Analyseur Syntaxique
Analyseur Syntaxique Arbre syntaxique - Exemple
q Arbre syntaxique suivant représente la
Unité lexicale Arbre
Syntaxique
structure de : (1+2)*3*4 Instruc?on
Analyseur Analyseur Analyseur
Lexical Syntaxique Sémantique Instruction
Prochain Token
Instruc?on
instruction
Table des Erreur de
Symboles Syntaxe Instruction Instruc?on
( 1 + 2 ) * 3 * 4
22/10/2024 41 22/10/2024 42
22/10/2024 43 22/10/2024 44
Grammaire Grammaire
Exemple Exemple
q Exemple d’une structure du if en langage C : G1 = ( {« a », « b », « c », « d », /* terminaux */
« + », « - », « * », « / »,
« ( » , « ) », « ^ »},
{<expression>, <facteur> },/* non-terminaux */
q<structure_if> ::= if «(» <condition> «)» «{» <instruction> «}»
{<expression> ::= <facteur>, /* productions */
<expression> ::= <expression> « + » <expression>,
<expression> ::= <expression> « - » <expression>,
q <structure_if>, <condition>, <instruction> : non-terminaux. <expression> ::= <expression> « * » <expression>,
q ::= : est un méta-symbole (symbole de la grammaire) signifiant <expression> ::= <expression> « / » <expression>,
«est défini par». <facteur> ::= « a »,
<facteur> ::= « b »,
q if, «(» , «)» , «{» et «}» : des terminaux. <facteur> ::= « c »,
Lorsque les terminaux ne font qu’un caractère, ou qu’ils <facteur> ::= « d »,
contiennent des caractères non alphanumériques, ou qu’ils <facteur> ::= « ( » expression « ) »,
peuvent être confondus avec des méta-symboles, ils sont écrits <facteur> ::= <facteur> « ^ » <facteur> },
entre guillemets. <expression> /* axiome */)
22/10/2024 45 22/10/2024 46
Grammaire
Résumé Grammaire hors-Contexte (GHC)
qUne grammaire dérive des chaînes en qUne Grammaire hors-contexte (GHC) G est un 4-
commençant par l’axiome et en remplaçant uplet G = <T, NT, S, P> où :
q T est l’ensemble des symboles terminaux (concrets) ou
de façon répétée les non-terminaux décrits lettres de l’alphabet
par les productions de la grammaire. q NT est l’ensemble des symboles non-terminaux
(abstraits)
qLes chaînes de terminaux dérivables à q SÎ NT, appelé symbole initial (Start ou axiome)
partir de l’axiome forment le langage défini qToute dérivation d’un mot de L(G) débute par S
par la grammaire. qÀ partir de S, on dérive l’ensemble des mots de L(G)
q P est l’ensemble des règles de réécriture ou de
production. Formellement, une règle de P est sous la
forme : NT → (T È NT)∗
22/10/2024 47 22/10/2024 48
Grammaire hors-Contexte (GHC)
Langage dérivé Exemple
qSoit G = <T, NT, S, P> une grammaire. q Soit G=<T,NT,S,P> avec:
On appelle langage engendré par G üT = {a,b}
l’ensemble L(G) = {w Î T* / S ÞrÎP+ w} üNT={S,A,B}
üS : l’axiome.
q où ÞrÎP , est appelée dérivation et dénote üP ={S→AB|aS|A, A→Ab|ε, B→AS}
l’application d’une règle de production r
de P
q et ÞrÎP + dénote la répétition de règles q Pour cette grammaire, les mots AB, aaS et ε sont
ÞrÎP des formes sur G.
22/10/2024 49 22/10/2024 50
22/10/2024 51 22/10/2024 52
BNF-Backus-Naur Form Grammaire hors-Contexte (GHC)
Exemple Exercice 1
Grammaire BNF pour la construc3on d’un langage naturel simple q Quel est le langage L(G) décrit par la
<Phrase> ::= <sujet> <verbe> <complément> grammaire hors-contexte suivante ?
<sujet> ::= <article> <adjectif> <nom> |
<article> <nom> <adjectif> |
<article> <nom>
qG = < T ={a}, NT ={S}, S, P = {r1, r2} >
<article> ::= «le» | «la» | «l’» | q r1: S à aS
«les» | «un» | «une» | «des» q r2: | a
<adjectif> ::= «grand» | «petit» | <couleur>
<couleur> ::= «bleu» | «vert» | «rouge»
<verbe> ::= (etc)
22/10/2024 53 22/10/2024 54
22/10/2024 55 22/10/2024 56
Grammaire hors-Contexte (GHC) Grammaire hors-Contexte (GHC)
Solution 2 Exercice 3
En effet, partant de l’axiome S, toute dérivation On considère la grammaire G = <T,NT,S,P> où
commencera nécessairement par appliquer 0, 1 ou
plusieurs fois la première règle puis se terminera en T = { a,b,0}
appliquant la deuxième règle.
NT = { S,U}
On représentera cela en écrivant le schéma de dérivation
P = { S→ aSa | bSb | U
suivant :
U → 0U | ε }
! ⟹∗#$ & ' ! ⟹#( & ' )) * ∈ ℕ
22/10/2024 57 22/10/2024 58
22/10/2024 61 22/10/2024 62
22/10/2024 63 22/10/2024 64
Algorithme DFA à GHC
Algorithme DFA à GHC Autrement dit
Principe de la construc0on : Input : A = <S, S, d, s0, F >
Output : G = <T, NT, S, P>
q Soit le DFA M = ⟨Q,T,δ,q0,F⟩
Øsi #$ ∉F : on définit G = ⟨T,Q, q0,P ⟩ équivalent qOn fait correspondre
avec
üp→aq ∈ P ⇐⇒ δ(p,a)=q qA chaque s de S, un élément de NT ( NT(s) )
üp→a ∈ P ⇐⇒ δ(p,a)∈F qA chaque élément l de S, un élément de T ( T(l) )
Øsi q0 ∈ F : on fait comme le cas précédant + on qA chaque élément (s,l,s’) de d, un élément de P ( P(s,l,s’) )
qA s0 le non terminal S
rajoute la variable S et
qA chaque élément s de F, une règle NT(s)--> e
üS → q0 | ε
22/10/2024 65 22/10/2024 66
22/10/2024 67 22/10/2024 68
Dérivation : Gauche & Droite Dériva'on : Gauche & Droite
Exemple Exemple
q Soit la grammaire HC G3 = < Exemples de dériva'ons gauches de mots dans L(G3)
üT={Number,+,-, ×, ÷ },
üNT ={Expr, Op}, 1: !"#$ ⟹&' !"#$ () *+,-./ ⟹&0 *+,-./ 1# *+,-./ ⟹&2 *+,-./ + *+,-./
üS=Expr,
üP = {r1,..,r6} > 2: !"#$ ⟹&' !"#$ () *+,-./ ⟹&' !"#$ () *+,-./ () *+,-./
ü r1 : Expr àExpr Op Number
⟹&0 *+,-./ 1# *+,-./ () *+,-./ ⟹&2 *+,-./ + *+,-./ 1# *+,-./
ü r2: | Number
ü r3 : Op à + ⟹&4 *+,-./ + *+,-./ ∗ *+,-./
ü r4 : |-
ü r5 : |×
ü r6 : |÷
22/10/2024 69 22/10/2024 70
Mêmes règles mais pas dans le même ordre qLes nœuds de l’arbre syntaxique sont : le résultat de
l’applica5on des règles de produc5on ∈ (T È NT)∗
Dérivation à Gauche
!"#$ ⟹ &' !"#$ 7* -./01+ ⟹ &' !"#$ 7* -./01+ 7* -./01+ ⟹ &6 -./01+ ,# -./01+ 7* -./01+ qLes feuilles de l’arbre syntaxique sont : les éléments de
⟹ &4 -./01+ + -./01+ ,# -./01+ ⟹ &2 -./01+ + -./01+ ∗ -./01+
l’expression donnée en entrée ∈ T*
Expr Expr
Number + *
22/10/2024 73 22/10/2024 74
!"#$ ⟹&' ()*+ ,# -./01+ ⟹&2 !"#$ ∗ -./01+ ⟹&' ()*+ ,# -./01+ ∗ -./01+ Grammaire
⟹&4 !"#$ + -./01+ ∗ -./01+ ⟹&6 -./01+ + -./01+ ∗ -./01+
Expr hors-contexte
Expr Op Number Ambigüe
Expr Op Number Mêmes
Arbre Syntaxique
Number + *
22/10/2024 75 22/10/2024 76
Grammaire ambigüe
Grammaire ambigüe Exemple
q Pour une CFG G tout string w de L(G) a au moins qSoit les règles de la grammaire suivante :
un arbre de dériva6on pour G.
q Grammaire Simpliste :
q w ∈ L(G) peut avoir plusieurs arbres de dériva6on q r1: GroupeNominal → Nom
pour G : dans ce cas on dira que la grammaire est
q r2 : | Adjectif Nom
ambigüe.
q r3 : | GroupeNominal de GroupeNominal
q Idéalement, pour perme@re le parsing, une
grammaire ne doit pas être ambigüe. En effet,
l’arbre de dériva6on détermine le code généré par q Trouver un arbre de dérivation du mot
le compilateur. q w = « Ecole de Commerce de jeunes filles »
22/10/2024 77 22/10/2024 78
GroupeNominal de GroupeNominal
Nom
GroupeNominal GroupeNominal
Nom Adjectif Nom
Ecole de commerce de jeunes filles Ecole
GroupeNominal de GroupeNominal GroupeNominal de GroupeNominal
jeunes filles
Commerce
GroupeNominal de GroupeNominal GroupeNominal de GroupeNominal Adjec8f Nom
Nom Nom’ Ecole
Nom Nom jeunes filles
Nom Adjec8f Nom GN’ Nom AD’ de
Ecole
filles Commerce
Commerce jeunes Ecole de de de Commerce
GN Nom
GN Nom Nom de
GN de de
2 arbres syntaxiques différents d’une expression (i.e. ambigüité de la grammaire) Þ de de
2 interprétations différentes Þ 2 sémantiques différentes Þ 2 codes possibles à générer GN GN de Jeunes’
pour cette expression Þ Problème de non-déterminisme pour le compilateur !!
Nom GN’ Nom Filles’
22/10/2024 79 22/10/2024 80
Grammaire ambigüe GroupeNominal
Grammaire ambigüe
Exemple Exemple
GroupeNominal de GroupeNominal
22/10/2024 81 22/10/2024 82
22/10/2024 83 22/10/2024 84
Grammaire ambigüe Grammaire ambigüe
Exercice Solu/on 1
q Stmt Þr1 Stmt
qG: q if ( Expr ) then
q Stmt
q r1: Stmt → if ( Expr ) then Stmt else q else Stmt if ( ) then else
Stmt q Þr2
Expr Stmt Stmt
q if ( Expr ) then
q r2: | if ( Expr ) then Stmt q if ( Expr ) then
q Stmt
q … q else Stmt
Expr1 Stmt2
q rn |... q … if ( ) then
q Þ Expr Stmt
q if (Expr1) then
q if (Expr2) then
q Trouver un arbre de dérivation du mot w = if
q Stmt1
(Expr1) then if (Expr2) then Stmt1 else Stmt2 Expr2 Stmt1
q else
q Stmt2
22/10/2024 85 22/10/2024 86
Grammaire ambigüe
Solu/on 2 Grammaire ambigüe
qStmt Þr2 Stmt qL’ambiguïté implique que l’analyseur syntaxique
qif ( Expr ) then ne pourra pas découvrir d’une manière unique et
q Stmt définitive l’arbre syntaxique de cette expression.
qÞr1 if ( ) then
qif ( Expr ) then
q if ( Expr ) then Expr Stmt q Si l’analyseur syntaxique ne peut pas décider la
q Stmt
else Stmt
structure syntaxique d’une expression, décider du
q…
q
Expr1 sens (i.e. la sémantique) et donc du code
qÞ
exécutable équivalent à cette expression ne sera
qif (Expr1) then
if ( ) then else Stmt pas possible !!
q if (Expr2) then Expr Stmt
Stmt1
q
q
else Stmt2 qL’Ambiguïté est donc une propriété indésirable
q Stmt2
Expr2 Stmt1
dans une grammaire.
G est une grammaire ambiguë du fait qu’on a trouvé deux dériva>ons
du mot w = « if (Expr1) then if (Expr2) then Stmt1 else Stmt2 »
22/10/2024 87 22/10/2024 88
Grammaire ambigüe
Grammaire ambigüe Exemple
qLorsque le langage définit des strings composés qLe mot “1 + 2 ´ 3” possède deux dérivations droites
q E Þr1 E ´ E Þr2 E + E ´ E Þ*r3 1 + 2 ´ 3
d’instruc5ons et d’opéra5on, l’arbre syntaxique (qui q E Þr2 E + E Þr1 E + E ´ EÞ*r3 1 + 2 ´ 3
va déterminer le code produit par le compilateur) qDonc 2 arbres syntaxiques
doit refléter : ´ +
Arbre 1 + Arbre 2 ´
3 1
q Les priorités 1 2 2 3
22/10/2024 89 22/10/2024 90
22/10/2024 91 22/10/2024 92
Grammaire ambigüe Grammaire ambigüe
Elimina.on de l’ambiguïté Elimina.on de l’ambiguïté
qAccepter l’associativité à gauche de + qChoisir priorité( ´ ) > priorité( + )
+ + + ´ + + +
+ + ´ ´ ´
+ 2 2
3 + 4 + ´ 1 2 3 4
1 2 5 3 4 3 4
+ ´
3 + 4 + 4 4
1 2 + 2 3
+
3 3
1 2 1 2
Þ Introduire des règles récursives gauches
q R21 : Add ® Add + Nombre
q R22 : Add ® Nombre Þ Introduire des règles récursives gauches
¨ R31 : Add ® Add + Mult (plus générale que R21, car R12 : Mult ® Nombre)
¨ R32 : Add ® Mult (plus générale que R22, car R12 : Mult ® Nombre)
22/10/2024 93 22/10/2024 94
q On a pris S=Add car Add est plus général de Mult (c.f. R32, de qSuite de l’exercice :
Add on peut aller vers Mult mais l’inverse est faux)
q Penser à une solution à ces nouveaux
q G’arith n’est pas ambiguë par construction !! problèmes
22/10/2024 95 22/10/2024 96
Grammaire ambigüe Grammaire ambigüe
Elimina.on de l’ambiguïté Elimina.on de l’ambiguïté
qSolution possible : introduire les parenthèses q 4 cas avec deux opérations dans une expression parenthèsées
q + à gauche du × : x + y + z
q NT devient {Mult, Add, Aux} q Cas particuliers : Nombre + Add, Add + Nombre
q × à gauche du × : x × y × z
q Au lieu de q Cas particuliers : Mult ´ Nombre, Nombre ´ Mult
q R11 : Mult ® Mult ´ Nombre
qSeuls l’associativité gauche sera bien sûr prise en compte
q R12 : Mult ® Nombre
22/10/2024 97 22/10/2024 98
q Algorithme : q Algorithme :
q Commence par la racine et procède en descendant l’arbre q Commence par les feuilles et procède en remontant l’arbre
syntaxique jusqu’aux feuilles. syntaxique jusqu’à la racine.
q A chaque étape, l’analyseur choisit un nœud parmi les q A chaque étape, l’analyseur ajoute des nœuds qui
symboles non-terminaux et développe l’arbre à partir de ce développent l’arbre partiellement construit.
nœud.
q Exemples : Analyseur LR(1), Analyseur LALR(1),
q Exemples : Analyseur récursif descendant, Analyseur Analyseur SLR(1)
LL(1) q LR(1) É LALR(1) É SLR(1)
Analyseur Syntaxique q
q
R3 : Mult ® Aux
R4 : Aux ® Nombre
q Solution :
q Éliminer la récursivité gauche de la grammaire pour une analyse top-
down
Factorisa)on à gauche
Solu)on
q S ® *aA | *aB | *C
q S ® *S’’
q S’’ ® aS’ | C
q F ® (S) | id T’ { * , e} {+,),$} S’ S’ ® + T S’ S’ ® e S’ ® e
T T ® FT’ T ® FT’
F { ( , id } {*,+,),$}
T’ T’ ® e T’ ®*FT’ T’ ® e T’ ® e
F F ® id F ® (S)
Autres Exercices
ROUTE’ {go , pan , tg , td , ε } {$}
ü TOURNE→ tg| td
INST {go , pan , tg , td } {go , pan , tg , td , $ } ü PANNEAU→ ε | pan
TOURNE {tg , td} { go , pan , tg , td , $ La table d’analyse LL(1) pour les deux grammaires :
PANNEAU { ε, pan } {tg , td}
G1 ={
q Table d’analyse S à (A) | a | b Vérification de : (a->(b->a))
Aà S | A -> S
tg td go pan $ }
ROUTE ROUTE → ROUTE → ROUTE → ROUTE →
INST ROUTE’ INST ROUTE’ INST ROUTE’ INST ROUTE’ G2={
ROUTE’ ROUTE’ → ROUTE ROUTE’ → ROUTE ROUTE’ → ROUTE ROUTE’ → ROUTE ROUTE’ → ε Sà iEa
INST INST→ INST→ INST→ go INST→ Eà TE½ e Vérification de : id[e]a
PANNEAU TOURNE PANNEAU TOURNE PANNEAU TOURNE Tà d[eF] ½ di
TOURNE TOURNE→ tg TOURNE→ td Fà d½ e
PANNEAU PANNEAU→ ε PANNEAU→ ε PANNEAU→ pan }
Solution Solution
üE → TE’ üE → TE’
üE’ → ou TE’ | ε üE’ → ou TE’ | ε
üT → FT’ üT → FT’
üT’ → et FT’ | ε üT’ → et FT’ | ε
üF → non F | (E) | vrai | faux üF → non F | (E) | vrai | faux
(décale) la fron&ère en ajoutant un token à droite Ø On le remplace par la parFe gauche de la producFon
de la fron&ère.
S
$
Fin Ø Détection d’une Erreur ou $
qNous ajoutons à l’état d’analyse le point • q L’axiome S permet d’avoir qu’un seul état accepteur (méthode
pour marquer son début : ascendante, Grammaire Augmentée).
q Non-terminal è • corps
fact
6
1 + term
exp 9
Analyse syntaxique Ascendante
term 2 SLR
* Construction de la table d’analyse: Action et Aller_à
7
* 10 qSi l’état état_i contient une position d’analyse de la forme: notion Þ préfixe ● terminal suffixe
qToutesles entrées de la table action qui n’ont pas été garnies par les quatre considérations ci-dessus sont
) marquées par:
11 q ACTION( état_i, terminal_i ) = ERROR
Entier
qon garde le contenu de la table ALLER_A pour toutes les entrées dont le second argument est une notion non
5
terminale
Entier
Automate final
+entier$ +entier$
S5 0 term 2 * 7 Entier 5 R 6 0 term 2 * 7 fact 10
R3 0
+entier$
term 2 R2 0
+entier$
exp 1 S6 0
entier$
exp 1 + 6
Analyse sémantique
$ $
S5 0 exp 1 + 6 Entier 5 R 6 0 exp 1 + 6 fact 3
$ $
R4 0 exp 1 + 6 term 9 R1 0 exp 1 Acc
3 1
.l Lex.yy.c %%
FLEX
Analyseur /∗ Code utilisateur ∗/
Syntaxique
qL’analyse lexicale produit une séquence de terminaux, et q Lorsque aucune action n’est pas indiquée, YACC génère par défaut l’action :
l’analyse syntaxique accepte ou rejeEe ceEe séquence. {$$ = $1; }
expr : term { printf( ’’expression’’);} expr : term {$$ =$1; //par defaut}
| term + expr { printf( ’’+’’);} | term + expr {$$ =$1 + $3;}
| term - expr { printf( ’’ -’’);} | term - expr {$$ =$1 - $3;}
; ;
22/10/2024 201