| Liste Articles: [0-A] [A-C] [C-F] [F-J] [J-M] [M-P] [P-S] [S-Z] | Liste Catégories | Une page au hasard | Pages liées | ||||||
BNF, pour Backus Naur Form, est une notation permettant de décrire les règles syntaxiques des
langages informatiques. C'est donc un métalangage. Elle est
utilisée dans certains livres pour décrire le langage étudié mais également par de nombreux logiciels d'analyse syntaxique. BNF est une grammaire de type hors-contexte (car on définit les termes hors de leur contexte, pour replacer ensuite la définition
desdits termes dans ce contexte).
Cette syntaxe a été conçue par John Backus et Peter Naur (sur une suggestion de Donald Knuth) lors de la création de la grammaire du langage Algol 60.
BNF est à la fois une simple notation qu'utilisent nombre de livres pour expliquer la syntaxe d'un langage et un réel langage qu'emploient certains outils informatiques pour travailler sur des fichiers sources de plusieurs langages différents.
| Sommaire |
Bien que la prise de connaissance d'un langage demande une connaissance des rudiments de sa syntaxe, il ne faut surtout 'jamais' utiliser la BNF pour essayer d' apprendre un langage : plus de temps et d'énergie passeraient en effet à la décoder qu'à vraiment apprendre le langage. L'enseignement initial d'un langage n'a jamais besoin du degré la précision de la BNF, qui peut même constituer un handicap à cet apprentissage. Des expériences tentées vers 1967-1972 dans les Écoles des Mines, par exemple, se sont toutes soldées par des échecs.
La raison en est que la BNF a pour rôle de fixer des règles à des compilateurs et non à des utilisateurs humains. Pour prendre l'exemple de l'antique langage FORTRAN, le compilateur accepte :
DO 10 I=1,5
est c'est alors une instruction de boucle. Mais il accepte aussi (les espaces des colonnes 7 à 72 ne comptent pas en FORTRAN):
DO 10 I=1.5
et c'est alors une affectation de la valeur 1.5 à la valeur DO10I ! Loufoque ? Oui. Reste que dans un tel cas le compilateur a besoin de savoir quoi faire, et seule la BNF permet de le lui préciser de façon claire et maintenable.
Autres exemples :
GO TO 5 = 1.
est une affectation parfaitement licite de la valeur 1. à la variable GOTO5.
IF (MAVALEUR) 10, 20, 30
représente un IF artihmétique; mais :
IF (MAVALEUR) = 10
affecte 10 à la valeur d'indice MAVALEUR du tableau nommé IF !
Il semble évident à la lecture de ces exemples que l'utilisateur débutant n'a rien à gagner à commencer par ces subtilités byzantines qu'il n'écrira certainement pas de toute façon. Il ne faut donc pas utiliser la BNF comme outil d'enseignement, pas plus qu'on n'utiliserait un marteau-pilon pour écraser une mouche. En revanche, cette forme de description convient très bien comme aide à l'écriture de compilateurs.
En BNF, on distingue les méta-symboles, les terminaux et les non terminaux. Les méta-symboles sont tout simplement les symboles de BNF. Les symboles non terminaux sont les noms des catégories que l'on définit, tandis que les terminaux sont des symboles du langage décrit.
Prenons un exemple définissant la structure if du langage C :
<structure_if> ::= if "(" <condition> ")" "{" <code> "}"
<structure_if>, <condition> et <code> sont des non terminaux.
::= est un méta-symbole signifiant « est défini par ».
if, "(", ")", "{" et "}" sont des terminaux. Lorsque les terminaux ne font qu'un
caractère, qu'ils contiennent des caractères non alphanumériques ou qu'ils peuvent être confondus avec des méta-symboles, on les met entre
guillemets.
Il arrive souvent qu'un non terminal puisse se définir de plusieurs façons. Dans ce cas, on utilise le méta-symbole |.
<categorie> ::= <un> | <deux> | ...
On utilise parfois également des parenthèses :
<categorie> ::= ( <un> | <deux> ) <trois>
Qui équivaut à :
<categorie> ::= <un> <trois> | <deux> <trois>
Différentes extensions ont été proposées afin de faciliter la rédaction et la lecture d'un document BNF :
[ et ] entourent les éléments optionels :
<structure_if> ::= if "(" <condition> ")" "{"
<code>
"}" [ else "{"
<code>
"}" ]
{ et } entourent quant à eux les éléments à répéter un nombre indéfini de fois.
Avec cela, nous allons tenter une meilleure définition de if ... else :
<ifelse> ::= <if>
[ { else <if> } ]
[ else
( <instruction> ";" |
"{" { <instruction> ";" } "}" ) ]
<if> ::= if "(" <condition> ")"
( <instruction> ";" |
"{" { <instruction> ";" } "}" )
Évidemment, il manque à cette définition les définitions des non terminaux <instruction> et <condition>.
BNF est parfois utilisé par des logiciels de vérification syntaxique. Cependant, afin de faciliter la rédaction et la lecture de ce type de documents, de nombreux auteurs créent des BNF, non destinés à être utilisés dans un tel cadre, en réalisant quelques petites entorses, qui bien souvent sont très faciles à comprendre :
Il arrive que les auteurs ne définissent pas certaines règles ou les définissent avec une phrase :
<caractere> ::= .. n'importe quel caractère ASCII ..
Il est également courant, dans une liste, de n'indiquer que le premier et le dernier élément :
<alpha> ::= 'a' .. 'z' | 'A' .. 'Z'
ou
<alpha> ::= 'a'-'z' | 'A'-'Z'
Enfin, dans certains livres, pour des raisons de lisibilité, on supprime les < et > pour les non terminaux et on met en gras les terminaux :
ifelse ::= if
[ { else if } ]
[ else
( instruction ; |
{ { instruction ; } } ) ]
if ::= if ( condition )
( instruction ; |
{ { instruction ; } } )


