Loading AI tools
formalisme permettant de définir une syntaxe De Wikipédia, l'encyclopédie libre
Une grammaire formelle est un formalisme permettant de définir une syntaxe et donc un langage formel, c'est-à-dire un ensemble de mots admissibles sur un alphabet donné.
La notion de grammaire formelle est particulièrement utilisée en programmation logique, compilation (analyse syntaxique), en théorie de la calculabilité et dans le traitement des langues naturelles (tout particulièrement en ce qui concerne leur morphologie et leur syntaxe)[1].
Un langage est un ensemble de mots, qui sont simplement des séquences de symboles choisis dans un ensemble (en général fini) appelé alphabet. Formellement, si est un ensemble, on note le monoïde libre sur , c'est-à-dire l'ensemble des suites finies d'éléments de , muni de l'opération de concaténation de deux mots. Un langage sur l'alphabet est par définition un sous-ensemble de .
Souvent, les « symboles » que l'on considère lorsqu'on définit un langage par une grammaire formelle sont constitués de plusieurs caractères, de sorte qu'ils correspondent plutôt à ce que l'on appelle des mots dans la langue courante. De même, les « mots » du langage correspondent plutôt à des phrases ou à des textes. Lorsqu'il y a ambiguïté, on parle de lettres ou de caractères pour les symboles de l'alphabet utilisé pour coder les informations ; et on réserve le mot symbole pour ceux de l'alphabet abstrait, qui sont les éléments de base du langage.
Par exemple :
Une grammaire formelle (ou, simplement, grammaire) est constituée des quatre objets suivants :
Appliquer une règle de production consiste à remplacer dans un mot une occurrence du membre de gauche de cette règle par son membre de droite ; l'application successive de règles de production s'appelle une dérivation. Le langage défini par une grammaire est l'ensemble des mots formés uniquement de symboles terminaux qui peuvent être atteints par dérivation à partir de l'axiome.
Ainsi, la grammaire définie par les terminaux , le non-terminal , l'axiome et les deux règles de production suivantes :
représente le langage des mots de la forme (un certain nombre de — éventuellement 0, en vertu de la deuxième règle —, suivis du même nombre de ) : .
Lorsque le linguiste Noam Chomsky a dégagé la notion de grammaire formelle, il en a proposé une classification appelée de nos jours hiérarchie de Chomsky. Elle est formée des quatre niveaux suivants, du plus restrictif au plus large.
Outre les quatre types de la hiérarchie de Chomsky, il existe des classes intermédiaires remarquables, par exemple :
Les six types ci-dessus sont strictement inclus les uns dans les autres. Si dans le type 1, on transforme « non déterministe » en « déterministe », on obtient un type plus petit, mais on ne sait pas montrer s'il est strictement inclus dans le type 1 ou s'il est égal à celui-ci.
Un analyseur pour un langage formel est un programme informatique qui décide si un mot donné en entrée appartient ou non au langage, et éventuellement en construire une dérivation.
On dispose de méthodes systématiques pour écrire des programmes d'analyse des langages de type 2 ou 3 dans la hiérarchie de Chomsky. Les interpréteurs ou compilateurs comprennent presque toujours une phase d'analyse lexicale, qui consiste à reconnaître des langages de type 3, suivie d'une phase d'analyse syntaxique qui est une analyse de langage de type 2. L'analyse lexicale porte sur une suite de caractères et produit une suite de lexèmes, qui servent à leur tour d'éléments de l'alphabet lors de l'analyse syntaxique.
Des outils comme lex et yacc facilitent l'écriture, respectivement, d'analyseurs lexicaux et d'analyseurs syntaxiques, en produisant automatiquement des portions de programmes à partir d'une spécification de ce langage. Les constructeurs d'analyseurs syntaxiques utilisent le plus souvent une variante de la forme de Backus-Naur, qui est une notation pour les grammaires hors-contexte ; tandis que les constructeurs d'analyseurs lexicaux emploient le formalisme moins lourd des expressions rationnelles.
On peut définir la grammaire des expressions arithmétiques de la façon suivante en utilisant comme notation la forme de Backus-Naur :
<exp> ::= <exp> "+" <exp>
| <exp> "×" <exp>
| "(" <exp> ")"
| <num>
<num> ::= <chiffre> <num>
| <chiffre>
<chiffre> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
Les non-terminaux sont ici implicitement exp, num et chiffre, les terminaux sont +, ×, (, ) et les chiffres. L'axiome est exp.
La dérivation suivante est un exemple d'utilisation de cette grammaire.
exp → exp × exp → num × exp → chiffre × exp → 3 × exp → 3 × num → 3 × chiffre num →3 × 1 num → 3 × 1 chiffre → 3 × 18
La définition donnée
Définir un langage de programmation simple n'est pas très compliqué. Cette grammaire reconnaît un langage de programmation ressemblant à Pascal. Voici un exemple de programme calculant fact(10)
begin
int a;
int b;
a:=10;
b:=1;
while(a>1) do
b:=a*b;
a:=a-1;
od;
print b;
end
La grammaire correspondante est:
<program> ::= "begin" <listinstr> "end"
<listinstr> ::= <instr> <listinstr>
| <instr>
<instr> ::= "int" <id> ";"
| <id> ":=" <expr> ";"
| "print" <expr> ";"
| "while" "(" <cond> ")" "do" <listinstr> "od" ";"
<expr> ::= <expr> "-" <expr1>
| <expr1>
<expr1> ::= <expr1> "*" <expr2>
| <expr2>
<expr2> ::= <id>
| <num>
| "(" <expr> ")"
<cond> ::= <expr> <condsymb> <expr>
<condsymb> ::= ">" | "<" | ">=" | "<=" | "!=" | "="
les terminaux étant id, num, begin, end, int, print, while, (, ), do, od, ;, et les symboles de comparaison. Remarquons qu'avec une telle grammaire (de type 2 dans la hiérarchie de Chomsky[2]) on ne peut pas vérifier que toutes les variables ont été déclarées (pour cela il faut une grammaire de type 1). Il faudrait aussi ajouter des règles pour num (comme plus haut) et pour id.
La syntaxe de la logique propositionnelle classique ou calcul des propositions peut se définir de la façon suivante :
P, Q, ... sont les variables propositionnelles (terminaux).
Un L-Système (ou Système de Lindenmayer) est une grammaire formelle générative ayant vocation à décrire les développements du vivant : levures, champignons, algues, plantes, coquillages... D'abord développées en rapport avec la botanique en liaison avec des modèles 2D, elles ont été étendues notamment à des modèles 3D.
Deux grammaires sont dites fortement équivalentes si et seulement si
Deux grammaires sont dites faiblement équivalentes si et seulement si elles reconnaissent exactement le même langage.
<liste> ::= <variable>
| <liste> "," <variable>
<liste> ::= <variable>
| <liste> "," <liste>
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.