Grammaires
Un automate fini est une description analytique d'un langage régulier : c'est un algorithme pour reconnaître les mots du langage. Les grammaires donnent une description générative d'un langage : elles explicitent des règles de construction des mots du langage. Nous connaissans déjà la notion de grammaires en lagage naturel. Par exemple, en français, une phrase déclarative à la forme : "sujet" + "verbe" + "complément". La grammaire a pour rôle de fixer la structure des phrases. En informatique, les grammaires sont couramment utilisées pour définir la syntaxe des langages de programmation et pour construire les compilateurs.
Grammaire, dérivation, langage
Une ̀grammaire` est un quadruplet où :
- et sont deux alphabets disjoints. Les symboles de sont dits non-terminaux, ceux de sont dits terminaux.
- est un ensemble fini de règles telles que contient au moins un symbôle non-terminal
- est le symbole non terminal initial
Les symboles non terminaux (ie symboles de ) sont usuellement notés par des lettres majuscules alors que les symboles terminaux (ie les symboles de ) sont représentés par des lettres minuscules . L'ensemble définit les règles de substitution. Une règle sera souvent représentée sous la forme . Elle signifie que peut être substitué à . Le symbole non terminal initial est généralement noté . Lorsqu'une grammaire comporte plusieurs règles avec le même membre gauche, par exemple : et , on écrit souvent : pour simplifier.
Une grammaire dérive
à partie de , noté , s'il est possible de décomposer et est une règle de .
La langage généré
par une grammaire est l'ensemble des mots dérivés depuis le symbôle initial qui ne contiennent que des symboles terminaux.
Grammaire régulières et langage réguliers
Dans cette section, on étudie les grammaires qui génèrent les langages réguliers.
Une grammaire est linéaire droite
si toutes les règles de ont la forme ou pour et .
On appelle ̀grammaire régulière` une grammaire qui est soit linéaire gauche soit linéaire droite.
Théorème
Un langage est régulier si et seulement si il est généré par une grammaire régulière
Pour toute grammaire régulière , il existe un automate fini qui accepte le langage .
Pour tout automate fini déterministe , il existe une grammaire régulière qui génère le langage
Au-delà des grammaires régulières
Toutes les grammaires ne sont pas régulières. Comme nous l'avons vu précédemment, il existe des grammaires (possiblement linéaires) qui génèrent des langages non-réguliers.
Le linguiste et informaticien Noam Chomsky a défini la classification suivante des grammaires.
Type 3
Les grammaires régulières dont les règles sont toutes linéaires droites , ou alors toutes linéaires gauches , . Où et . Le membre gauche d'une règle est seulemement constitué d'un symbôle non terminal. Le membre droit contient au plus un symbole non terminal, à droite (resp à gauche) des symboles terminaux. Le langage généré par une grammaire régulière est régulier, et donc accepté par un automate fini.
Type 2
Les grammaires hors-contextes dont les productions sont de la forme où et . Seul le membre gauche est contraint : il ne peut s'agir que d'un seul symbole non terminal. Le Langage d'une grammaire hors-contexte est accepté par un automate à pile.
Type 1
Les grammaires contextuelles ont des productions de la forme , où , contient au moins un symbole non terminal, et contient au moins autant de symboles que . La règle est autorisée si n'apparaît en membre droit d'aucune règle. Les langages contextuels sont acceptés par des automates linéairement bornés.
Type 0
Aucune restriction. Les langages définis par de telles grammaires sont reconnus par des machines de Turing, sans garantie de terminaison (récursivement énumérable).
On peut montrer que les familles de langages associées à ces types sont incluses les unes dans les autres, mais non égales. Ainsi, tous les langages générés avec une grammaire de type peuvent être générés par une grammaire de type . De plus, pour chaque , il existe des langages générés par une grammaire de type mais par aucune grammaire de type . Il existe également des langages qui ne sont générés par aucune grammaire.
Arbre de dérivation, ambiguïté
Les grammaires sont fréquemment utilisées pour décrire des langages naturels, des langages de programmation, ou encore des langages de description. Elles permettent de décrire de manière formelle ces langages et donc de construire des compilateurs pour ces langages. Le compilateur vérifie qu'un mot appartient au langage, et il reconstitue en général la structure de ce mot afin de pouvoir lui appliquer des transformations.
Un arbre de dérivation
d'un mot par une grammaire hors-contexte est un arbre fini
- de racine
- dont les feuilles sont étiquetées par des symboles terminaux
- dont les noeuds intermédiaires sont étiquetés par des symboles non-terminaux
- tel que si un noeud étiqueté par un élément non-terminal possède les fils dans cet ordre alors est une règle de
- et la concaténation des feuilles de l'arbre de gauche à droite donne le mot
Un arbre de dérivation explicite donc comment un mot est généré par la grammaire en partant du symbôle initial et en remplaçant successivement les symboles non terminaux à l'aide d'une des règles de la grammaire. Il s'agit d'une description structurée de la dérivation d'un mot par une grammaire tel que défini précédemment.
Une grammaire est ambigue
s'il existe un mot généré par pour lequel il existe (au moins) deux arbres de dérivations distincts. Une grammaire qui admet au plus un arbre de dérivation pour tout mot est dit non ambiguë.
Il n'est pas possible de déterminer si une grammaire est ambiguë ou non.