Nous évoquerons souvent les notions de « terminal » et de « non terminal », qui se définissent de la manière suivante :
Au long des exemples suivants, nous tenterons de respecter les convensions suivantes[1] :
Une grammaire est récursive à gauche si un symbole non terminal A se dérive strictement en une proto-phrase[2] commençant par A ⇒+ Aα tel que α ne commence pas par A.
Une grammaire est composée de quatre éléments :

Les productions de la grammaire de type 0 sont de la forme : α → β avec α ∈ {VN ∪ VT}+ et β ∈ {VN ∪ VT}*
Ces grammaires engendrent des « langages récursivement énumérables » (en anglais, “recursively enumerable languages”), acceptés par une machine de Turing[8].
Les productions de la grammaire contextuelle sont de la forme : αΑβ → αγβ avec Α ∈ N, α, β ∈ (N ∪ Σ)* etγ ∈ (N ∪ Σ)+
Nous avons un élément non terminal (Α) qui dépend du contexte constitué par les mots qui l'encadrent (α et β).
Nous pouvons aussi accepter dans les grammaires de type 1 les productions de la forme : α → β avec α ∈ {VN ∪ VT}+ et β ∈ {VN ∪ VT}* et |α| ≤ |β|, car ces grammaires produisent des langages contextuels.
Les productions de la grammaire non contextuelle sont de la forme : A → α avec A ∈ VN et α ∈ {VN ∪ VT}*
Chomsky[5] a utilisé le terme “non contextuel” (en français, « context-free ») par opposition aux “contextuel” (en français, « context-sensitive ») pour lesquelles l'application d'une règle est soumise à des conditions.
Un langage « non contextuel »[10] peut être représenté par un automate à pile non déterministe. Pour prouver qu'un langage n'est pas « non contextuel »[10], nous devons donc prouver qu'il n'est pas possible de construire son automate à pile.
Les productions de la grammaire de type régulière sont de la forme :
A → α | A → αB | A → ε (grammaire linéaire à droite[13]) ou A → α | A → Bα | A → ε (grammaire linéaire à gauche[14])
avec A ∈ VN et α ∈ {VN ∪ VT}*
Un langage est régulier ssi un programme peut le lire (de gauche à droite) en ne mémorisant qu'une information finie.
Nous pouvons définir un langage régulier de la manière suivante :
Pour prouver qu'un langage est régulier, nous pouvons soit donner l'expression rationelle qui correspond, soit donner son AFN [automate fini non déterministe].
Pour prouver qu'un langage n'est pas régulier, nous pouvons soit montrer que nous ne pouvons construire son AFN, soit utiliser le lemme de pompage[17].
Tout langage fini est un langage régulier. Un langage non fini peut toutefois être un langage régulier si son automate est fini et contient un cycle.
Tout langage régulier est un langage « non contextuel »[10].
Certaines grammaires non régulières peuvent tout de même engendrer des langages réguliers.
Une grammaire récursive à gauche n'est jamais une grammaire LL(k).
Les grammaires LL(1) sont généralement suffisantes pour la construction de langages de programmation, pour peu qu'ils respectent les conditions qui suivent.
Une grammaire G est LL(1) ssi pour toute paire de productions distinctes Α → α | β de G :
Si nous pouvons générer plus d'un arbre syntaxique pour une même chaîne du langage, nous pouvons dire que la grammaire est ambiguë.
Nous pouvons être confrontés à des grammaires ambiguës quand par exemple α et β sont ε-productifs.
Nous pouvons généralement résoudre engendrés par une grammaire ambiguë en définissant des règles de précédence ou d'associativité.
Un analyseur LR(k) effecute une analyse ascendante sur les grammaires non contextuelles.
Nous retrouvons souvent simplement le terme LR, pour lequel LR(1) est sous-entendu.
Un analyseur LR(k) n'effectue aucune anticipation pour décider quelle réduction il doit entreprendre. Si nous constatons que la table des actions contient plus d'une action dans une même cellule, nous avons la certitude que lq grammaire n'est pas LR(0), et nous devons alors augmenter le nombre de symboles de prévision.
Les analyseurs SLR(0) est utilise un autre algorithme d'analyse descendante, version renforcée de LR(0).
Afin de résoudre les conflits LR(0), nous devons alors consulter SUIVANT(A), où A est le côté gauche de la règle à réduire.
Un automate à pile permet d'analyser une grammaire LALR [“Look-Ahead Left Recursive”[21]]. Un exemple célèbre d'analyseur syntaxique LALR est YACC.
Les grammaires attribuées sont des grammaires non contextuelles étendues avec des attributs (typage, table des symboles, etc.) associés à des valeurs, et définis par des règles d'attribution associées aux productions (les règles de la grammaire).
Si le nombre d'états de l'automate est plus petit que la chaîne, la chaîne contient une boucle qui peut être répetée. Nous pouvons alors dire que la partie de la boucle est « pompée ».
Nous utiliserons par la suite la décomposition que nous permet le lemme de pompage pour prouver par l'absurde qu'un langage n'est pas régulier.
Si le langage est régulier, nous pouvons le décomposer selon la formule qui suit.

Le lemme de pompage indique que nous pouvons répéter une partie centrale du mot, et que le mot ainsi produit appartient toujours au langage décrit : ∀ n ≥ 0, xynz ∈ L
Notre automate est dans son état initial (Sinit). Nous pouvons accepter une séquence de caractères (partie x) qui nous fait passer d'état en état jusqu'au moment où l'acceptation du caractère lu nous placera dans le premier état de la boucle (partie y). Ensuite nous pouvons passer par un certain nombre d'états (partie z).
Exemple : le langage qui comprend les nombres pairs en binaire (0, 10, 100, 110, etc.).
Nous représentons donc les nombres pairs en binaire par un 0, ou un 1 suivi d'un certain nombre de 0 ou de 1, et enfin un 0 pour terminer.
L'expression rationnelle qui correspond à ce langage est 0|1(0|1)*0, ce qui correspond parfaitement au lemme de pompage (x y* z) avec :
Nous pouvons parler de symbole non terminal ε-productif si ce non terminal A ∈ VN et que A ⇒ *ε
| Type | Direction | Dérivation | Info |
| LL(k) | analyse descendante | gauche | choix de la bonne expansion sur les k prochains symboles à lire |
| LL(1) | analyse descendante | gauche | pour chaque non terminal, chaque production commence par un symbole terminal différent |
| LR(k) | analyse asscendante | droite | la production est déterminée après lecture du texte correspondant. |
| SLR(k) | analyse asscendante | droite | Utilisation d'un symbole de prévision. |
| LALR | analyse asscendante | droite | Union des états de même cœur parmi les éléments LR(1). |
| Type | Langage | Automate | Info |
| type 00 | récursivement énumérable | machine de Turing | |
| type 01 | récursif | machine de Turing totale | Ne fait pas partie de la hiérarchie de Comsky. |
| type 10 | contextuel | machine de Turing | |
| type 11 | indexé | automate à piles imbriquées | Ne fait pas partie de la hiérarchie de Comsky. La pile de l'automate peut contenir pour chaque entrée une donnée ou une pile (Nested stack). |
| type 12 | semi contextuel | EPDA | Ne fait pas partie de la hiérarchie de Comsky. La pile de l'automate est une pile de piles (Embedded pushdown automaton). |
| type 20 | non contextuel | automate à pile non déterministe | |
| type 21 | non contextuel déterministe | automate à pile déterministe | Ne fait pas partie de la hiérarchie de Comsky. |
| type 22 | à mots imbriqués | automate pour mots imbriqués | Ne fait pas partie de la hiérarchie de Comsky. |
| type 30 | rationnel | automate fini |
|
| type 31 | Star free | automate pour mots imbriqués | Ne fait pas partie de la hiérarchie de Comsky. Langage rationnel dont l'expression rationnelle n'emploie pas l'étoile de Kleene. |
Vous pouvez modifier vos préférences dans votre profil pour ne plus afficher les interactions avec les réseaux sociaux sur ces pages.
71 mots clés dont 64 définis manuellement (plus d'information...).
Vous pouvez modifier vos préférences dans votre profil pour ne plus afficher le nuage de mots clés.
Cours et exercices corrigés
Principes; techniques et outils
Syntaxe et sémantique(Janvier 2010)
IRE Transactions on Information Theory(Septembre 1956)
formal languages and formal grammars(version 06/05/10)
Ces références et liens indiquent des documents consultés lors de la rédaction de cette page, ou qui peuvent apporter un complément d'information, mais les auteurs de ces sources ne peuvent être tenus responsables du contenu de cette page.
L'auteur de ce site est seul responsable de la manière dont sont présentés ici les différents concepts, et des libertés qui sont prises avec les ouvrages de référence. N'oubliez pas que vous devez croiser les informations de sources multiples afin de diminuer les risques d'erreurs.
Recherche (afficher)
Utilisateur (masquer)
Navigation (masquer)
Apparence (afficher)
Stats (afficher)
Citation (masquer)