Académique Documents
Professionnel Documents
Culture Documents
Boutaina Hdioud
hdioud.boutaina@hotmail.fr
Plan
o Langages réguliers
o Expressions régulières
Langage
Langage
Un langage sur un alphabet X est une partie de X*. C’est donc un ensemble de mots.
L’ensemble des codes source C, des nombres binaires sont des langages.
Exemple :
Soit X = {a, b} un alphabet.
• ∅ désigne le langage vide
• On désigne également par {ε} le langage composé uniquement de la chaîne vide.
• {a, ba, bba} est un langage
• {w ∈ X*|w = an , n ∈ ℕ} est un langage
Langage
• Associative
• Commutative
• 𝑿= 𝒂, 𝒃, 𝒄 , 𝑳𝟏 = 𝒂, 𝒃 , 𝑳𝟐 = { 𝒂, 𝒄 }
• 𝑳𝟑 = 𝑳𝟏 ∪ 𝑳𝟐
Langage
• Associative
• Commutative
• Elément neutre : 𝑿∗
• Elément absorbant : ∅
Langage
• 𝑿= 𝒂, 𝒃, 𝒄 , 𝑳𝟏 = 𝒂, 𝒃 , 𝑳𝟐 = { 𝒂, 𝒄 }
• 𝑳𝟑 = 𝑳𝟏 ∩ 𝑳𝟐
Langage
• Non-associative,
• Non-commutative,
• Elément neutre ∅,
• Elément absorbant 𝑿∗
Langage
• 𝑿= 𝒂, 𝒃, 𝒄 , 𝑳𝟏 = 𝒂𝒃, 𝒂𝒄, 𝒄𝒅 , 𝑳𝟐 = { 𝒂𝒄 }
• 𝑳𝟑 = 𝐿 1 ∖ 𝐿 2
Langage
L1 ⊆ 𝑿∗ , Lഥ1= 𝑿∗ ∖ L1 = {w ∈ 𝑿∗ |w ∉ L1}
Langage
• Associative,
• non commutative,
• élément neutre ε,
• élément absorbant ∅
Langage
• 𝑿= 𝒂, 𝒃, 𝒄 , 𝑳𝟏 = 𝒂𝒃, 𝒂𝒄, 𝒄𝒅 , 𝑳𝟐 = { 𝒂𝒄 }
• 𝑳𝟑 = 𝐿 1 𝐿 2
Langage
Soit un alphabet X = {a, b}, un langage 𝐿1 = {𝜀, a, ab} et un langage 𝐿2 = {b, ba}.
• 𝐿2 ◦ 𝐿1 = 𝐿2 . 𝐿1 = 𝐿2 𝐿1 = {b, ba, bab, ba, baa, baab} = {b, bab, ba, baa, baab}
⇒ 𝐿1 𝐿2 ≠𝐿2 𝐿1
Langage
𝐿𝑖 = { α ∈ L* t. q. |α| = i }
Remarque :
• 𝐿0 = {ε} ,
• 𝐿𝑖 = 𝐿𝑖−1 .L
Langage
∀𝐿1 , 𝐿𝑖 ⊆ 𝑿∗ 𝐿1 .(⋃∞
𝑖=1 𝐿𝑖 ) =⋃𝑖=1 (𝐿1 𝐿𝑖 )
∞
. (⋃∞
𝑖=1 𝐿𝑖 ). 𝐿1 =⋃𝑖=1 (𝐿𝑖 𝐿1 )
∞
• 𝐿∗ =⋃∞
𝑖=0 𝐿
𝑖
• 𝐿∗ = {ε} ∪ L ∪ 𝐿2 … ∪ 𝐿𝑛 ∪ …
Ce langage contient un nombre infini de mots, qui sont les répétitions indéfinies de mots de L.
Langage
• (𝐿∗ )∗ = 𝐿∗
Langage
• Théorème
Les opérations de réunion, de concaténation et de fermeture sont dites opérations régulières, car
elles servent a écrire ce qu’on appelle des expressions régulières :
Exemple:
Soit le langage L des mots sur l’alphabet 𝐴 = {𝑎, 𝑏, 𝑐} qui commencent par 𝑎 ou 𝑏, suivis de 0 ou
plusieurs occurrences de 𝑐𝑐 et se termine par au moins un 𝑏.
Langages réguliers
Un langage L sur un alphabet Σ est dit régulier si et seulement s’il existe une expression régulière
qui le dénote, c’est- à -dire telle que L = L(r).
Expressions régulières
Langages réguliers
L’ensemble 𝐿 des langages réguliers sur un alphabet Σ est le plus petit ensemble (qui contient le
moins d ’éléments) des langages satisfaisant les conditions :
3. Si 𝐿1 , 𝐿2 ∈ L, alors 𝐿1 ∪ 𝐿2 ∈ L, 𝐿1 𝐿2 ∈ L et 𝐿1 ∗ ∈ L
Expressions régulières
Expressions régulières
Les expressions régulières sont une façon déclarative de décrire la formation des chaînes d’un langage.
Expressions régulières
Les expressions régulières sur un alphabet Σ sont les règles formées par les règles suivantes :
(α + β)
(α.β) ቑ sont des expressions régulières
(α)∗
Expressions régulières
∀a ∈ Σ, L(a) = {a}
L(α.β) = L(α).L(β)
L((𝛼)∗ ) = (𝐿(𝛼)) ∗
Expressions régulières
Théorème
Un langage est régulier si et seulement si il peut être dénoté par une expression régulière.
Exemple
• 𝑟 ∗ = 𝑟 ∗ + 𝜀 car 𝜀 ∈ 𝑟 ∗
Expressions régulières
• ∅+ε = ε +∅ =ε
• ∅∗ = ε
Expressions régulières
Règles de précédence
• Lorsqu’on combine plusieurs symboles de construction dans une expression régulière, comme par exemple dans 𝑎|𝑎𝑏 ∗ ,
il n’est pas clair comment les sous expressions régulières sont regroupées. On peut alors utiliser les parenthèses (...)
pour fixer un regroupement de symboles, par exemple (𝑎|(𝑎𝑏))∗ . Pour simplifier l’écriture des expressions régulières, on
adopte les règles de priorité suivantes :
Selon ces conventions, l’expression régulière 𝑎|𝑎𝑏 ∗ est équivalente à (𝑎|(𝑎(𝑏 ∗ )))
Expressions régulières
Exemples:
Considérons l’alphabet Σ = {0, 1}
• Expression1 : 0*
Cette expression régulière décrit toutes les chaînes composées uniquement du symbole 0 ainsi que la chaînes vide 𝜀.
• Expression2 : 110*1
Cette expression régulière décrit les chaînes contenant deux fois le symbole 1 suivis d’un nombre quelconque de
symboles 0, éventuellement nul, et du symbole 1.
• 0*110*1 est la concaténation des expressions 1 et 2. Elle décrit les chaînes commençant par un nombre quelconque de
0 suivis de deux 1, suivi d’un nombre quelconque de 0 et d’un 1.
• 0* | 110*1 est l’expression régulière décrivant les chaînes générées soit par l’expression 1, soit par l’expression 2.
Expressions régulières
Remarque
• On utilise parfois la notation 𝑒 + pour 𝑒𝑒 ∗
L 𝑒 + =∪𝑖=1 (𝐿(𝑒))𝑖
• Pour des raisons de lisibilité, il est possible de nommer certaines E.R. et d'utiliser ces noms dans d'autres E.R.
• Chiffre →(0|1|...|9)
• M+ pour MM*
• Une unité lexicale peut (la plupart du temps) être exprimée sous forme d'expression régulière.
• Dans la théorie des langages, on définit des automates qui sont des machines théoriques
permettant la reconnaissance de mots.
Théorème
Les automates sont des objets mathématiques, très utilisés en informatique, qui permettent de modéliser un grand
nombre de systèmes (informatiques). De façon très informelle, un automate est un ensemble “d’états du système”,
reliés entre eux par des “transitions” qui sont marquées par des symboles. Étant donné un “mot” fourni en entrée,
l’automate lit les symboles du mot un par un et va d’état en état selon les transitions. Le mot lu est soit accepté par
l’automate soit rejeté.
• Les automates finis peuvent être utilisés pour calculer des fonctions, ou pour reconnaître des langages.
Les automates finis
Les expressions régulières constituent un formalisme algébrique pour spécifier les langages
réguliers. Le formalisme graphique permet de résoudre la question de la reconnaissance de ces
langages.
Définition : Un reconnaisseur pour un langage 𝐿 sur un alphabet Σ est un programme qui prend
∗
en entrée une chaîne w ∈ Σ et répond ”oui” si w ∈ L et ”non” si w ∉ L.
Les automates finis constituent un outil formel très intéressant de la théorie des langages. Nous
allons voir comment transformer une expression régulière en un reconnaisseur en construisant un
automate fini.
Il y a deux grandes catégories d’automates finis : les AFD (automates finis déterministes) et les
AFND (automates finis non-déterministes ).
Automate fini déterministe
Une paire (q,w), où q ∈ Q est un état, et w ∈ Σ∗ est un mot de l’alphabet Σ est appelé une configuration.
Automate fini déterministe
Notations
• Etat initial
Diagrammes de transition
Ce sont des automates finis déterministes
On se déplace de position en position dans le diagramme au fur et à mesure de la lecture des caractères.
Les états sont reliés par des arcs qui ont des étiquettes indiquant les caractères lus.
Les automates sont déterministes (aucun symbole ne peut apparaître comme étiquette de deux arcs quittant un nœud )
– 𝚺 = {𝒂, 𝒃}
– 𝑸 = 𝟏, 𝟐, 𝟑
– 𝒒𝟎 = 𝟏
–𝑭 = 𝟑
– 𝜹(𝟏, 𝒂) = 𝟐 𝒆𝒕 𝜹(𝟐, 𝒃) = 𝟑.
Automate fini déterministe
Résumé
Un AFD dans le sens abstrait, est une ”machine” qui possède un nombre fini d’ états et un nombre fini de
transitions entre ces états. Une transition entre deux états est étiqueté par un symbole de l’alphabet d’entrée . En
théorie des langages, un AFD peut être utilisé pour décider si un mot w appartient a un langage donné 𝐿. Pour
faire ceci, nous partons de l’état initial q0 de l’automate. A chaque étape, on lit un symbole de w a partir de
l’entrée, puis on suit une transition étiquetée par ce symbole et on change l’état courant. Il y a deux cas qui
peuvent se présenter :
Tous les symboles de l’entrée ont été lus. Nous testons alors si le dernier état est un état final. Si oui, le mot
𝑤 ∈ 𝐿, sinon w ∉ L.
On se bloque sur un symbole particulier car il n’y a pas de transition avec ce symbole. Dans ce cas, w ∉ L.
Automate fini déterministe
Le langage reconnu (ou accepté) par un automate AFD est l’ensemble des mots qui correspondent à un
calcul de l’automate partant d’un état initial et s’arrêtant dans un état final.
La reconnaissance d’un mot w par un automate M (appelée aussi exécution d’un automate M sur
un mot w) est la suite des configurations :
La fonction de transition 𝛿 d’un AFD peut être représentée à l’aide d’un tableau bidimensionnel appelé matrice de transition
– 𝑞 ′ =𝛿(𝑞, 𝜎) (𝑞 ′ est le prochain état déterminé par la fonction de transition pour 𝑞 et 𝜎).
Un automate est complet si pour tout état 𝑞 ∈ 𝑄, il existe une transition pour chaque lettre de
l’alphabet Σ.
∀𝑞 ∈ 𝑄, ∀𝑥 ∈ Σ, 𝛿(𝑞, 𝑥) 𝑒𝑠𝑡 𝑑é𝑓𝑖𝑛𝑖
Automates complets
Exemple: Soit Σ = {a, b}
Pour un automate complet, on appelle état puits, un état 𝑞 ∈ 𝑄 pour lequel toutes les transitions sont
de la forme 𝛿(𝑞, 𝑥) = 𝑞.
Automates complets
Etat poubelle
Exemple:
Pour Σ = {𝑎, 𝑏}
Automates complets
Technique de complétion
• Ajouter pour chaque état q, et chaque lettre x, une transition (q, x, P) s’il n’existe pas déjà une transition
partant de q par la lettre x.
Remarque :
a,b
b
a,b
On complète l’automate:
Construction : Si 𝐴 = (𝑄, 𝛿, 𝑖, 𝐹) est un AFD complet qui reconnaît L, alors 𝐴 = (𝑄, 𝛿, 𝑖, 𝑄\F) reconnaît Σ ∗ \L .
Langage généré par un automate
Un automate peut être vu comme un mécanisme décrivant, ou générant, un langage
Le langage généré à partir d’un état 𝑞 par un automate M, noté L(q) est l’ensemble des mots acceptés à partir de
cet état.
L(M) = L(q0)
Langage généré par un automate
Système d’équations définissant un langage
Le langage généré à partir d’un état q par un automate M est défini par une équation de la forme :
Exemple : Pour M2
𝐿 𝑞0 = 𝑎𝐿 𝑞0 + 𝑏𝐿 𝑞1 + ∅ = 𝑎𝐿0 + 𝑏𝐿1
൞ 𝐿 𝑞1 = 𝑎𝐿 𝑞0 + 𝑏𝐿 𝑞2 + ∅ = 𝑎𝐿0 + 𝑏𝐿2
𝐿 𝑞2 = 𝑎𝐿 𝑞2 + 𝑏𝐿 𝑞2 + 𝜖 = 𝑎𝐿2 + 𝑏𝐿2 + 𝜖
Automates non déterministe
Non-déterministe
En informatique, non-déterministe est souvent associé à ”plusieurs choix possibles” par opposition déterministe où
• Absence de transition,
S’il n’y a plus de transition possible et que le mot est encore en cours de lecture alors le mot est refusé.
Plusieurs transitions
Le mot est accepté lorsqu’il existe au moins une lecture menant à un état acceptant.
Automates non déterministe
Plusieurs états initiaux
Le mot est accepté lorsqu’il existe une lecture à partir de l’un des états initiaux menant à un état acceptant.
Automates non déterministe
Définition AFN
Un AFD est un cas particulier d’AFN, avec 𝐶𝑎𝑟𝑑(𝛿(𝑞, 𝑎)) ≤ 1 pour tous 𝑞 ∈ 𝑄, 𝑎 ∈ Σ.
Donc tout langage reconnu par un AFD est reconnu par un AFN.
Théorème (Rabin-Scott)
Tout langage reconnu par un AFN peut être reconnu par un AFD.
La déterminisation
Le principe de la construction est de prendre comme états de l’AFD les ensembles d’états de
l’AFN. L’unique état initial de l’AFD est l’ensemble I des états initiaux de l’AFN.
Déterminisation d’un AFN
Adet = (P(Q), δdet, I, 𝐹 det) est un AFD qui reconnaît le même langage L, avec :
On part de l’état initial I, puis on calcule toutes les transitions qui partent de I, puis on recommence avec les
nouveaux états obtenus, etc.
Déterminisation d’un AFN
Exemple:
état {1, 2}
état {1, 3}
S’il y a équivalence des langages reconnus par AFD et AFN, quel est l’intérêt des AFN ?
Si 𝐴 = (Σ, 𝑄, 𝐼, 𝐹, 𝛿) et 𝐴′ =(Σ, 𝑄′ ,𝐼 ′ ,𝐹 ′ ,𝛿 ′ ) sont deux AFND , alors 𝐴′′ = (Σ, 𝑄 ∪ 𝑄′ , 𝐼 ∪ 𝐼 ′ , 𝐹 ∪ 𝐹 ′ , 𝛿∪𝛿 ′ ) est un
AFND reconnaissant l’union des langages reconnus par 𝐴 et 𝐴′ .
Si 𝐿 est un langage reconnu par AFN, alors son complémentaire Σ ∗ \L l’est aussi.
Par déterminisation, on peut construire un AFD reconnaissant le même langage L, puis appliquer la propriété de clôture
vue précédemment.
Automates non déterministe
Clôture par intersection
Propriété.
Remarque :
Pour cette propriété, il est très commode d’utiliser des ε–transitions : on rajoute des ε–transitions de tous les états initiaux
de l’AFN pour 𝐿1 , vers tous les états finals de l’AFN pour 𝐿2 .
Propriété.
De même, on rajoute des ε–transitions de tous les états finals de l’AFN pour L, vers tous ses états initiaux.
Automates non déterministe
Théorème de clôture pour les langages reconnus par AFN ou AFD
Théorème. Si L, L' sont des langages reconnus par AFN, alors il en est de même :
• du complémentaire Σ* \L,
• de l’intersection L ∩ L',
• de l’union L ∪ L',
• de la concaténation LL',
• de l’étoile L*.
Les langages reconnus par AFD étant les mêmes que les langages reconnus par AFN, ces propriétés de clôture sont
vraies aussi pour les langages reconnus par AFD.
Automates non déterministe
𝜺-transistions
Pendant la lecture d’un mot, il est possible de choisir d’effectuer la transition 𝜀 sans lire aucune lettre.
Automates non déterministe
Un automate fini non-déterministe avec 𝜺 −transitions
Exemple:
On appel ε-fermeture de l’ ensemble d’états 𝑸 = {𝒒𝟎 , 𝒒𝟏 , … … 𝒒𝒏 } l’ensemble des états accessibles depuis un
état 𝒒𝒏 de 𝑸 par une ou plusieurs transition spontanée. Formellement :
Définition.
Tout langage reconnu par un AFN avec ε–transitions peut être reconnu par un AFN (sans ε–transitions) ayant le même nombre d’états.
Preuve constructive : il existe un algorithme qui étant donné un AFN avec ε-transitions construit un AFN sans ε-transitions équivalent et avec le
même nombre d ’états.
Pour chaque état q, on définit Cloture(q) l’ensemble des états accessibles à partir de q par des ε-transitions. On ajoute à l’automate initial une ε-
transition de q vers p pour tout p dans Cloture(q).
• dans l’ensemble des états initiaux : les états p extrémités d’une ε-transition dont l’origine est un état initial;
• dans l’ensemble des états finaux : les états p origines d’une ε-transition dont l’extrémité est un état final;
𝑎 𝑎 ε
• dans l’ensemble des transitions : les transitions 𝑝 → 𝑟 pour chaque séquence p → q → r .
• L’AFN obtenu reconnaît bien le même langage : L = {acbc, acc, abc, ac}
Automates non déterministe
Algorithme de détermination d’un AFNε
(Conversion d’un AFNε en un AFD équivalent)
Principe : considérer des ensembles d’états successeurs de 𝐶𝜀({𝑞0}).
• Partir de l’état initial E0 = Cε({𝑞0})
• Pour toute transition a, construire Ei l’ensemble des états obtenus à partir de Ei-1 (à l’étape
précédente) par : 𝐸 i = Cε(δε(Ei-1, a))
• Recommencer 2. pour chaque nouvel ensemble obtenu.
• Tous les ensembles Ei contenant au moins un état final deviennent terminaux
• Renuméroter les ensembles Ei par de simples états
Automates non déterministe
Algorithme de détermination d’un AFNε
Exemple:
Transformation d’une expression régulière en un automate
L’algorithme de Thompson donne un moyen pour convertir automatiquement une expression régulière r dénotant un
langage L en un AFND ayant certaines propriétés et qui accepte le même langage L.
AFND normalisé
L’algorithme de Thompson construit un AFND normalisé. Ce dernier est un cas spécial d’un AFND :
5. Tout état, est soit l’origine d’exactement une transition étiquetée par un symbole de l’alphabet, soit l’origine
d’au plus deux transitions, étiquetées par le mot vide ε.
Transformation d’une expression régulière en un automate
L’algorithme de Thompson
L’algorithme de Thompson
• Induction : automate pour α .β
Etant donné une expression rationnelle e, on désire construire un automate reconnaissant le langage L(e) décrit par cette expression, en
mettant en œuvre l’algorithme de Glushkov.
• On associe à chaque occurence d’une lettre de l’expression rationnelle e un entier appelé sa position.
On obtient ainsi une expression rationnelle e’ sur l’alphabet ℕ\ {0} (linéarisation de l’expression e). On note αi la lettre en position i.
• On place une transition de i vers j étiquetée par αj si et seulement si la “lettre” j peut suivre la lettre i dans un mot du langage L(e′).
• On place une transition de 0 vers i si et seulement si la “lettre” i peut être la première lettre d’un mot du langage L(e′).
• L’état i (i > 0) est final si et seulement si i peut être la dernière “lettre” d’un mot du langage L(e′).
Systèmes d’équations
Lq =( 𝑎. 𝐿(𝛿 𝑞, 𝑎 )) + 𝜀 ∀𝑞 ∈ 𝐹
𝑎∈𝛴
De l’automate à l’expression rationnelle
Une équation de la forme 𝐿 = 𝐴. 𝐿 + 𝐵 où 𝐴 ne contient pas le mot vide admet comme unique
solution l’expression rationnelle L = 𝐴∗ .B
Analyse syntaxique
Grammaires
Analyse syntaxique
Le rôle principal de l’analyse syntaxique est de vérifier si l’écriture du programme source conforme avec la
syntaxe du langage à compilé. Cette dernière est spécifiée à l’aide d’une grammaire hors contexte. Il existe
plusieurs méthodes d’analyse appartenant à l’une des deux catégories qui sont l’analyse descendante et
l’analyse ascendante. Dans l’analyse descendante nous essayons de dériver à partir de l’axiome de la
grammaire le programme source. D’une façon opposée, l’analyse ascendante établit des réductions sur les
chaines à analyser pour aboutir à l’axiome de la grammaire
Grammaires
Une grammaire permet une représentation finie d'un langage (éventuellement infini). Noam Chomsky a inventé la notion
de grammaire formelle.
• N est le vocabulaire non terminal, c’est-à-dire l’ensemble des symboles qui n’apparaissent pas dans les mots générés, mais qui sont
utilisés au cours de la génération. Un symbole non terminal désigne une “catégorie syntaxique”.
• S ∈ N est le symbole de départ ou axiome. C’est à partir de ce symbole non terminal que l’on commencera la génération de mots
au moyen des règles de la grammaire.
Analyse syntaxique
Grammaire: Exemple1
– le vocabulaire est défini par l’ensemble : T = { le, la, fille, jouet, regarde }
– les catégories syntaxiques sont :
• la phrase, notée PH
• le groupe nominal, noté GN
• le verbe, noté V
• le déterminant, noté D
• le nom, noté N
– les règles permettant de combiner des éléments du vocabulaire et des catégories syntaxiques pour construire des catégories syntaxiques
sont les suivantes :
• PH → GN V GN N → fille
• GN → D N N → jouet
• D → le V → regarde
• D → la
où le symbole → est une abréviation de “peut être composé de”.
– la catégorie syntaxique de départ est la phrase PH.
La phrase “la fille regarde le jouet” est une phrase correcte pour la grammaire envisagée, comme le montre l’analyse suivante :
PH ⇒ GN V GN ⇒ D N V GN ⇒ la N V GN ⇒ la fille V GN ⇒ la fille regarde GN ⇒ la fille regarde D N ⇒ la fille regarde le N ⇒ la fille regarde
le jouet
où le symbole ⇒ est une abréviation de “se dérive en”.
Analyse syntaxique
Grammaire: Exemple2
• T = {int,(,), +, −, ×, /} ;
• N= {E} ;
• S=E;
𝐸 → 𝐸 + 𝐸
𝐸 → 𝐸 − 𝐸
𝐸 → 𝐸 × 𝐸
• R= 𝐸 → 𝐸/𝐸
𝐸 → (𝐸)
𝐸 → 𝑖𝑛𝑡
Grammaires
Dérivation : Extension des règles de production
Soient G = (T, N, S, P) une grammaire et αAβ une chaîne telle que :
• α ∈ (𝑁 ∪ 𝑇)∗
• β ∈ (𝑁 ∪ 𝑇)∗
• A∈N
• et A → γ une production de G
alors :
• αAβ se dérive selon G en αγβ
et on écrit :
Il est possible d’étendre la relation ⇒ en ∗ ⇒ pour représenter 0, 1 ou plusieurs pas de dérivation. Pour tout α ∈ (𝑁 ∪ 𝑇)∗ on écrit
∗
• α⇒α.
∗
• Si α ⇒ β et β ⇒ γ alors α ⇒ γ
Grammaires
Dérivation : Dérivation la plus à gauche, la plus à droite
Etant donné que plusieurs variables peuvent apparaître dans le corps d’une règle de production, il est possible d’imposer le choix de la
variable à remplacer. On peut ainsi imposer celle figurant le plus à gauche (respectivement le plus à droite).
Soit la grammaire suivante : Symboles terminaux : T = {a, b, 0, 1, +, ∗,(,)}. non terminaux : N = {E, I}. Symbole de départ E. Règles de
production P, telles que :
• E→I
• E→ E + E
• E→ E ∗ E
• E→ (E)
• I→ a
• I→ b
• I→ Ia
• I→ Ib
• I→ I0
• I→ I1
Dérivation la plus à gauche de : a ∗ (b + a0)
E ⇒ E ∗ E ⇒ I ∗ E ⇒ a ∗ E ⇒ a ∗ (E) ⇒ a ∗ (E + E) ⇒ a ∗ (I + E) ⇒ a ∗ (b + E) ⇒ a ∗ (b + I) ⇒ a ∗ (b + I0) ⇒ a ∗ (b + a0)
Dérivation la plus à droite de : a ∗ (b + a0)
E ⇒ E ∗ E ⇒ E ∗ (E) ⇒ E ∗ (E + E) ⇒ E ∗ (E + I) ⇒ E ∗ (E + I0) ⇒ E ∗ (E + a0) ⇒ E ∗ (I + a0) ⇒ E ∗ (b + a0) ⇒ I ∗ (b + a0)
⇒ a ∗ (b + a0)
Grammaires
Dérivation : Arbre de dérivation
Pour déterminer si une chaîne terminale appartient au langage engendré par une grammaire, on établit un arbre de
dérivation dont la racine est l’axiome, les feuilles sont des terminaux formant la chaîne donnée et les nœuds sont des
variables décrivant les règles utilisées.
Soit la grammaire suivante : Symboles terminaux : T = {a, b, 0, 1, +, ∗,(,)}. non terminaux : N = {E, I}. Symbole de départ E.
Règles de production P, telles que :
• E → I | E + E | E ∗ E | (E)
• I→ a | b | Ia | Ib |I0 | I1
La figure représente l’arbre de dérivation de l’expression : a∗(a+b00).
La dérivation la plus à gauche et la plus à droite fournissent le même arbre.
Analyse syntaxique
Langage défini par une grammaire
Étant donné des mots 𝑢 et v sur 𝑇 ∪ 𝑁 et une production A → w, on dit que 𝑢𝑤𝑣 peut être dérivé à partir de 𝑢𝐴𝑣, et on
note uAv →uwv . →+ désigne la fermeture transitive de →.
Une grammaire G défini un langage L(G) sur l’alphabet Σ dont les éléments sont les mots engendrés par dérivation à partir
du symbole de départ S :
L(G) := {w ∈ 𝑇 ∗ | S →+ w}
Le langage engendré par une grammaire G est l’ensemble des chaînes de terminaux que l’on peut dériver à partir de
l’axiome.
Remarques :
• - Par contre, un même langage peut être engendré par plusieurs grammaires différentes
Analyse syntaxique
Langage défini par une grammaire
Exemple1 : 𝑖𝑛𝑡 + 𝑖𝑛𝑡 ∗ 𝑖𝑛𝑡 ∈ 𝐿(𝐺) comme le montre les dérivations suivantes :
• E → E + E → E + E ∗ E → int + E ∗ E → int + int ∗ E → int + int ∗ int
• E → E + E → int + E → int + E ∗ E → int + int ∗ E → int + int ∗ int
• E → E ∗ E → E + E ∗ E → int + E ∗ E → int + int ∗ E → int + int ∗ int
• L’arbre correspondant aux deux premières dérivations est le suivant :
La grammaire suivante : Symboles terminaux : Σ = {id, +, ∗,(,)}. Symboles non terminaux : N= {E}. Symbole de départ E.
Règles de production P, telles que :
E→E+E
E→E∗E
E → (E) | id est ambiguë.
Types de grammaires
Type 2
Grammaires hors-contexte (CFG).
Les règles sont de la forme : A → α avec A ∈ N et α ∈ (𝑁 ∪ 𝑇)∗ .
Autrement dit, le membre de gauche de chaque règle est constitué d’un seul symbole non terminal.
Type 3
Grammaires régulières à droite (respectivement à gauche).
Les règles sont de la forme : A → aB, (respectivement A → Ba) avec A, B ∈ N et a ∈ T. ou de la forme : A → a avec A ∈ N et a
∈ T. Autrement dit, le membre de gauche de chaque règle est constitué d’un seul symbole non terminal, et le membre de
droite est constitué d’un symbole terminal éventuellement suivi (respectivement précédé) d’un seul non terminal.
Types de grammaires
A chaque type de grammaire est associé un type de langage :
– les grammaires de type 3 génèrent les langages réguliers,
– les grammaires de type 2 génèrent les langages hors-contexte,
– les grammaires de type 1 génèrent les langages contextuels,
– les grammaires de type 0 permettent de générer tous les langages “décidables”, autrement dit, tous les langages qui
peuvent être reconnus en un temps fini par une machine. Les langages qui ne peuvent pas être générés par une
grammaire de type 0 sont dits “indécidables”.
Ces langages sont ordonnés par inclusion : l’ensemble des langages générés par les grammaires de type n est strictement
inclus dans celui des grammaires de type n − 1 (pour n ∈ {1, 2, 3}). Enfin, à chaque type de grammaire est associé un type
d’automate qui permet de reconnaître les langages de sa classe (c’est-à-dire de déterminer si un mot donné appartient au
langage) : les langages réguliers sont reconnus par des automates finis, les langages hors-contexte sont reconnus par des
automates à pile, et les autres langages, décrits par des grammaires de type 1 ou 0, sont reconnus par des machines de
Turing. Ainsi, la machine de Turing peut être considérée comme le modèle de machine le plus puissant qu’il soit, dans la
mesure où tout langage (ou plus généralement, tout problème) qui ne peut pas être traité par une machine de Turing, ne
pourra pas être traité par une autre machine.
Elimination de la récursivité a gauche
Récursivité gauche
∗
Un symbole non terminal A d'une grammaire est dit récursif si A→αAβ avec α, β ∈(X∪V)∗. Si α=ε, A est dit récursif (à)
gauche. Une grammaire comportant au moins un symbole non terminal récursif gauche est dite récursive gauche
La récursivité gauche pose divers problèmes en analyse, et dans l’application de certains algorithmes de transformation de
grammaire. C’est la raison pour laquelle on cherche à́ éliminer cette récursivité.
Règle simple
Au niveau d’une règle, cela peut se faire simplement :
A→Aα|β, devient : A→βA′
A′→αA′|ε
Généralisation
Pour chaque non terminal récursif, on propose :
𝐴 → 𝛽1𝐴′|𝛽2𝐴′|. . . |𝛽𝑘𝐴′
A→Aα1|Aα2|. . .|Aαm|β1|. . .|βk devient ቊ
𝐴′ → 𝛼1𝐴′|𝛼2𝐴′|. . . |𝛼𝑚𝐴′|𝜀
Factorisation a gauche
Factorisation a gauche
On peut appliquer la factorisation a gauche par:
• 𝐴 →α𝛽1 |α𝛽2 | … … . |α𝛽𝑛
• A->αA’
• A’->𝛽1 𝛽2 … |𝛽𝑛
Types d’analyse
Il existe deux grandes classes de techniques différentes pour construire un arbre syntaxique et vérifier si une chaîne
appartient au langage. L’analyse de la chaîne se fait toujours de la gauche vers la droite (Left scanning).
• L’approche descendante. Un analyseur gauche construit l’arbre de dérivation à partir de sa racine et en effectuant
des dérivations en considérant la tête des règles de production et en faisant des dérivations les plus à gauche. C’est
• L’approche ascendante. Un analyseur droit construit l’arbre de dérivation à partir de ses feuilles et en effectuant
des dérivations en considérant la partie droite des règles de production et en faisant des dérivations les plus à
Exemple d’analyse
}
Types d’analyse
Exemple d’analyse
Analyse LL
Analyse LR
Pour achever son travail, l’analyse syntaxique nécessite un certain nombre de fonctions.
Des fonctions pour l’analyse syntaxique
Définition Le prédicat ”Nullable”
∗
On dit qu’une forme α est nullable, et l’ on écrit Nullable(α) = true, si et seulement si α ⇒ ε.
Remarques
Résolution du système
• Nullable(R) = true.
• Nullable(T) = true.
• Nullable(ε) = true.
• Nullable(aTc) = false.
• Nullable(bR) = false.
Des fonctions pour l’analyse syntaxique
Fonction FIRST (PREMIER)
Définition
Soit α une forme sur G.
On définit l’ensemble FIRST(α) comme étant l’ensemble des terminaux qui peuvent
apparaître au début d’une forme dérivable à partir de α.
∗
Formellement, FIRST(α) = {a ∈ T | α⇒ aβ}.
Si la partie droite d’une production contient plusieurs occurrences de symboles variables, on ajoute des contraintes
pour toutes ces occurrences, en fractionnant la partie droite de la production en les différents α,V et β.
Exemples
Soit la grammaire définie par les productions :
T → R | aTc
R → bR | ε
L’axiome étant le symbole T.
On ajoute T’ → T$ (grammaire augmentée).
On passe au calcul des contraintes.
Des fonctions pour l’analyse syntaxique
Exemples (suite)
Contraintes donnant les ensembles FOLLLOW
Pour la règle T’→ T$ : FIRST($) ⊆ FOLLOW (T).
Pour la règle T → R : FOLLOW (T) ⊆ FOLLOW (R).
Pour la règle T → aTc : FIRST(c) ⊆ FOLLOW (T).
Pour la règle R → bR : rien à ajouter.
Pour la règle R → ε : rien à ajouter.
Résolution des contraintes
FOLLOW (T) = {c, $}.
FOLLOW (R) = {c, $}.
Analyse descendante
Exemple
𝑆 → aSbT|cT|d
ቊ avec le mot 𝑤 = 𝑎𝑐𝑐𝑏𝑏𝑎𝑑𝑏𝑐
𝑇 → 𝑎𝑇|𝑏𝑆|𝑐
On part avec l arbre contenant le seul sommet S La lecture de la première lettre du mot (a) nous permet
d’avancer la construction.
Analyse descendante
Analyseur syntaxique
∗
Maintenant qu’ on a la table comment l’utiliser pour déterminer si un mot m donné est tel que S →m?
On utilise une pile.
Algorithme :
Données : mot m terminé par $, table d’analyse M
Initialisation de la pile et un pointeur ps sur la 1ère lettre de m
Analyse descendante
Sur l’exemple E, E’, T, T’, F, soit le mot 3+4*5
Analyse descendante
Si l’on essaye d’analyser maintenant le mot m=(7+3)5
Grammaire LL(1)
L’algorithme précédent ne peut pas être appliqué a toutes les grammaires. En effet si la table d’analyse comporte des entrées multiples
plusieurs productions pour une même case M[A,a] on ne pourra pas faire une telle analyse descendante car on ne pourra pas savoir quelle
production appliquer.
Définition
On appel le grammaire 𝐿𝐿(1) une grammaire pour laquelle la table d’analyse décrite précédemment n’a aucune case définie de façon
multiple.
Par exemple, nous avons déjà vu la grammaire
Nous avons First(S)={a}, First(A)={c}, Follow(S)={$}, Follow(A)={b}, ce qui donne la table d’analyse.
Il y a deux réductions pour la case M[A,c] donc ce n est pas une grammaire LL(1). On ne peut pas utiliser cette méthode d analyse. En effet
on l’a déjà remarqué, pour pouvoir choisir entre la production A cd et la production Ac il faut lire la lettre qui suit celle que l’on pointe.