Définition (Grammaire)
Une grammaire est un ensemble de règles de syntaxe qui décrivent quelles sont les constructions correctes, possibles dans le langage utilisé, à l'aide de l'alphabet utilisé (alphabet ou vocabulaire).
Il existe de nombreux types de grammaires, et encore bien plus de formalismes exprimés pour représenter cette grammaire.
Nous utiliseront ici un seul symbolisme, parmi les plus célèbres, pour représenter les grammaires : la formalisation BNF (Backus-Naur Form).
Dans la syntaxe BNF, une grammaire est constituée d'un ensemble de règles.
Chaque règle est constituée :
On utilise (et on distingue) des symboles terminaux et des symboles non-terminaux (ST et SNT).
Définition (Symbole terminal)
Un symbole terminal est un symbole qui peut intervenir réellement, effectivement, dans le texte analysé.
Exemple : Dans
if (temps == beau)
if est un symbole terminal (on trouve le mot dans le programme).
Notation: Les symboles terminaux sont entourés par des guillemets : « ».
Définition (Symbole non terminal)
Un symbole non terminal (SNT) est un symbole introduit par commodité, ou par nécessité, par le rédacteur de la grammaire. Il n'est pas présent en tant que tel dans le texte analysé.
Ce rédacteur (vous, par exemple) introduit des SNT pour décrire les parties du fichier d'entrée qui représentent entre eux un tout logique.
On peut ainsi simplifier l'écriture de la grammaire.
Notation : Les symboles non-terminaux sont entourés par des chevrons: $<$ $>$.
Les règles d'une grammaire sont ainsi constituées :
Ainsi, chaque règle de la grammaire consiste en la définition d'un symbole non-terminal. Cette dernière est terminée quand tous les SNT ont reçu une définition.
Une règle s'écrit finalement sous la forme :
$<$SNT$>$::= suite (éventuellement vide) de ST et SNT
Exemple :
Voici un bout de grammaire (pour la définition d'une fonction en C) :
<fct> ::= <type> <nom> «(» <parametres> «)» <bloc> <type> ::= «int» ::= «char»
Définition (Axiome de la grammaire)
Parmi tous les SNT, l'un d'entre eux doit désigner l'ensemble du texte à analyser, on l'appelle axiome de la grammaire.
Exemple :
<programme en C> ::= <entete> <suite de fonctions>
La grammaire est terminée quand tous les SNT ont reçu au moins une définition.
Exercice : Les mots du langage $\mathcal L$ sont constitués d'un nombre éventuellement nul de $a$, suivi d'un $b$, suivi d'au moins un $c$.
Donner une grammaire BNF de ce langage.
Correction :
<mot> ::= <suite_a> 'b' <suite_c> <suite_a> ::= 'a' <suite_a> ::= <suite_c> ::= 'c' <fin_c> <fin_c> ::= 'c' <fin_c> ::=
Exercice : Ecrire la grammaire, en syntaxe BNF, des formes propositionnelles. On rappelle que les opérateurs sont, par ordre de priorité croissante :
Les noms de variable commencent par un caractère alphabétique, suivi éventuellement d'un nombre quelconque de caractères alphanumériques ou de soulignements. Il n'y a pas de constantes dans les expressions.
Les opérateurs sont réalisés au clavier :
L'expression peut évidemment comporter des parenthèses, et ne peut être vide.
Consulter le site http://pltplp.net/lex-yacc/yacc.html.fr et implanter les fichiers lex et yacc permettant l'analyse lexicale et syntaxique d'une ligne contenant une formule propositionnelle.