Aller au contenu

« Forme de Backus-Naur » : différence entre les versions

Un article de Wikipédia, l'encyclopédie libre.
Contenu supprimé Contenu ajouté
BNF et apprentissage : Références de l'expérience d'enseignement en écoles d'ingénieurs
Cilisso (discuter | contributions)
Fonctionnalité de suggestions de liens : 2 liens ajoutés.
 
(42 versions intermédiaires par 30 utilisateurs non affichées)
Ligne 1 : Ligne 1 :
{{voir homonymes|BNF}}
{{homonyme|BNF}}

La '''forme de Backus-Naur''' (souvent abrégée en BNF, de l'anglais ''Backus-Naur Form'') est une notation permettant de décrire les règles syntaxiques des [[langage de programmation|langages de programmation]]. C’est donc un [[métalangage]]. Elle est utilisée dans certains livres pour décrire le langage étudié, mais également par de nombreux [[logiciel]]s d’[[analyse syntaxique]] pour travailler sur des fichiers sources de plusieurs langages différents. Elle est une notation pour des [[grammaire formelle|grammaires formelles]] de type [[grammaire hors-contexte|hors-contexte]] (car on définit les termes hors de leur contexte, pour replacer ensuite la définition desdits termes dans ce contexte).
La '''forme de Backus-Naur''' (souvent abrégée en '''BNF''', de l'anglais ''{{Langue|en|Backus-Naur Form}}'') est une notation qui permet d'écrire les règles {{Lien|Syntaxe (informatique)|trad=Syntax (programming languages)|texte=syntaxiques}} des [[Langage informatique|langages informatiques]] (notamment des [[langage de programmation|langages de programmation]]).
C’est donc un [[métalangage]] employé pour définir [[induction structurelle|inductivement]] un langage. Elle est utilisée dans certains livres pour décrire le langage étudié, mais également par de nombreux [[logiciel]]s d’[[analyse syntaxique]] pour travailler sur des fichiers sources de plusieurs langages différents. Elle est une notation pour des [[grammaire formelle|grammaires formelles]] de type [[Grammaire non contextuelle|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]] lors de la création de la grammaire du langage [[Algol (langage)|Algol 60]]. Initialement appelée ''Backus normal form'' (« forme normale de Backus »), elle est devenue la « forme de Backus-Naur » à la suggestion de [[Donald Knuth]].
Cette syntaxe a été conçue par [[John Backus]] et [[Peter Naur]] lors de la création de la grammaire du langage [[Algol (langage)|Algol 60]]. Initialement appelée ''Backus normal form'' (« forme normale de Backus »), elle est devenue la « forme de Backus-Naur » à la suggestion de [[Donald Knuth]].

Le grammairien [[Panini (grammairien)|Panini]] est un précurseur de Backus et Naur.


== BNF et apprentissage ==
== BNF et apprentissage ==
Ligne 8 : Ligne 12 :
Bien que la prise de connaissance d’un langage demande une connaissance des rudiments de sa syntaxe, la BNF n'est pas nécessairement adaptée à l'apprentissage d'un langage.
Bien que la prise de connaissance d’un langage demande une connaissance des rudiments de sa syntaxe, la BNF n'est pas nécessairement adaptée à l'apprentissage d'un langage.


En effet, si la BNF a pour rôle de fixer des règles à des [[compilateur]]s et permet aussi à des informaticiens ayant les bases d'un langage d'en approfondir la logique fine, l'apprentissage initial de ce langage ne nécessite pas un tel degré de précision au départ, où on cherche à maîtriser la sémantique bien plus que syntaxe (dont le compilateur signalera de toute façon les erreurs). Celui-ci peut même constituer un handicap par sa profusion de détails et de degrés d'abstraction imbriqués inutiles au simple ''utilisateur'' d'un langage.
En effet, si la BNF a pour rôle de fixer des règles à des [[compilateur]]s et permet aussi à des informaticiens ayant les bases d'un langage d'en approfondir la logique fine, l'apprentissage initial de ce langage ne nécessite pas un tel degré de précision au départ, où on cherche à maîtriser la sémantique bien plus que la syntaxe (dont le compilateur signalera de toute façon les erreurs). Celui-ci peut même constituer un handicap par sa profusion de détails et de degrés d'abstraction imbriqués inutiles au simple ''utilisateur'' d'un langage.


Des expériences tentées vers 1967-1972<ref>Cours de Manuel Bloch, Ecole des Mines de Paris, 1967; cours de François Vigué, école des Mines de Nancy, 1968, puis de Douai, 1971</ref> dans trois [[École des Mines|Écoles des Mines]], par exemple, ont montré que cette forme axiomatique générale se mémorisait moins bien qu'une série d'exemples particuliers que l'élève généralisait ensuite de lui-même<ref>L'élève maîtrisant la BNF saura par exemple qu'on a le droit d'écrire en FORTRAN "DO 10 I=1.5" (les espaces ne comptent pas en FORTRAN) ou encore "GO TO 5 = 3", ce qui ne sera pas forcément pour lui d'un intérêt immédiat.</ref>.
Des expériences tentées vers 1967-1972<ref>Cours de Manuel Bloch, [[École nationale supérieure des mines de Paris|École des mines de Paris]], 1967 ; cours de François Vigué, [[École nationale supérieure des mines de Nancy|École des mines de Nancy]], 1968, puis de [[École nationale supérieure des mines de Douai|Douai]], 1971.</ref> dans trois [[École des mines|écoles des mines]], par exemple, ont montré que cette forme axiomatique générale se mémorisait moins bien qu'une série d'exemples particuliers que l'élève généralisait ensuite de lui-même<ref>L'élève maîtrisant la BNF saura par exemple qu'on a le droit d'écrire en FORTRAN « DO 10 I=1.5 » (les espaces ne comptent pas en FORTRAN) ou encore « GO TO 5 = 3 », ce qui ne sera pas forcément pour lui d'un intérêt immédiat.</ref>.


Cela n'enlève rien à l'intérêt du métalangage dans le domaine pour lequel il a été conçu, qui n'est pas l'enseignement. Cette forme de description est par exemple parfaitement appropriée à l’écriture de [[compilateur]]s.
Cela n'enlève rien à l'intérêt du métalangage dans le domaine pour lequel il a été conçu, qui n'est pas l'enseignement. Cette forme de description est par exemple parfaitement appropriée à l’écriture de [[compilateur]]s.
Ligne 18 : Ligne 22 :
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.
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 <tt>if</tt> du [[langage C]] :
Prenons un exemple définissant la structure <tt>if</tt> du [[C (langage)|langage C]] :
<syntaxhighlight lang="bnf">
<structure_if> ::= if "(" <condition> ")" "{" &lt;code&gt; "}"
<structure_if> ::= if "(" <condition> ")" "{" <instructions> "}"
<tt><structure_if></tt>, <tt><condition></tt> et <tt>&lt;code&gt;</tt> sont des non-terminaux. <tt>::=</tt> est un méta-symbole signifiant « est défini par ». <tt>if</tt>, <tt>"("</tt>, <tt>")"</tt>, <tt>"{"</tt> et <tt>"}"</tt> sont des terminaux. Lorsque les terminaux ne font qu’un caractère, qu’ils contiennent des caractères non [[alphanumérique]]s ou qu’ils peuvent être confondus avec des méta-symboles, on les met entre guillemets.
</syntaxhighlight>
<tt><structure_if></tt>, <tt><condition></tt> et <tt>&lt;instructions&gt;</tt> sont des non-terminaux. <tt>::=</tt> est un méta-symbole signifiant « est défini par ». <tt>if</tt>, <tt>"("</tt>, <tt>")"</tt>, <tt>"{"</tt> et <tt>"}"</tt> sont des terminaux. Lorsque les terminaux ne font qu’un caractère, qu’ils contiennent des caractères non [[Caractère alphanumérique|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 <tt>|</tt>.
Il arrive souvent qu’un non-terminal puisse se définir de plusieurs façons. Dans ce cas, on utilise le méta-symbole <tt>|</tt>.
<syntaxhighlight lang="bnf">
<categorie> ::= <un> | <deux> | ...
<categorie> ::= <un> | <deux> | ...
</syntaxhighlight>
On utilise parfois également des parenthèses :
On utilise parfois également des parenthèses :
<syntaxhighlight lang="bnf">
<categorie> ::= ( <un> | <deux> ) <trois>
<categorie> ::= ( <un> | <deux> ) <trois>
</syntaxhighlight>
qui équivaut à :
qui équivaut à :
<syntaxhighlight lang="bnf">
<categorie> ::= <un> <trois> | <deux> <trois>
<categorie> ::= <un> <trois> | <deux> <trois>
</syntaxhighlight>


==Extensions==
== Extensions ==


Différentes extensions (voir en particulier l'[[EBNF|Extended Backus-Naur Form]]) ont été proposées afin de faciliter la rédaction et la lecture d’un document BNF.
Différentes extensions (voir en particulier l'[[Extended Backus-Naur Form]]) ont été proposées afin de faciliter la rédaction et la lecture d’un document BNF.


Les crochets (<tt>[</tt> et <tt>]</tt>) entourent les éléments optionnels :
Les crochets (<tt>[</tt> et <tt>]</tt>) entourent les éléments optionnels :
<syntaxhighlight lang="bnf">
<structure_if> ::= if "(" <condition> ")" "{"
<structure_if> ::= if "(" <condition> ")" "{"<instructions>"}"
&lt;code&gt;
"}" [ else "{"
[ else "{" <instructions>"}" ]
</syntaxhighlight>
&lt;code&gt;
"}" ]
Les accolades (<tt>{</tt> et <tt>}</tt>) entourent les éléments à répéter un nombre indéfini de fois, ou ils sont suivis d'une astérisque (<tt>*</tt>).
Les accolades (<tt>{</tt> et <tt>}</tt>) entourent les éléments à répéter un nombre indéfini de fois, ou ils sont suivis d'une astérisque (<tt>*</tt>).


Un élément qui apparaît une ou plusieurs fois est suivi d'un signe plus (<tt>+</tt>)
Un élément qui apparaît une ou plusieurs fois est suivi d'un signe plus (<tt>+</tt>)


Avec cela, nous allons tenter une meilleure définition de <tt>if … else</tt> :
Avec cela, nous allons tenter une meilleure définition de <tt>if… else</tt> :
<syntaxhighlight lang="bnf">
<ifelse> ::= <if>
[ { else <if> } ]
<ifelse> ::= <if>
[ { else <if> } ]
[ else
( <instruction> ";" |
[ else
( <instruction> ";" |
"{" { <instruction> ";" } "}" ) ]
"{" { <instruction> ";" } "}" ) ]

<if> ::= if "(" <condition> ")"
<if> ::= if "(" <condition> ")"
( <instruction> ";" |
( <instruction> ";" |
"{" { <instruction> ";" } "}" )
"{" { <instruction> ";" } "}" )
</syntaxhighlight>
Évidemment, il manque à cette définition les définitions des non terminaux <instruction> et <condition>.
Évidemment, il manque à cette définition les définitions des non terminaux <instruction> et <condition>.


==Entorses==
== Entorses ==


BNF est parfois utilisé par des [[logiciel]]s 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 :
BNF est parfois utilisé par des [[logiciel]]s 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 :
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 ..</tt>
<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 :
Il est également courant, dans une liste, de n’indiquer que le premier et le dernier élément :
<alpha> ::= 'a' .. 'z' | 'A' .. 'Z'
<alpha> ::= 'a' .. 'z' | 'A' .. 'Z'
Ligne 70 : Ligne 83 :
[ { '''else''' if } ]
[ { '''else''' if } ]
[ '''else'''
[ '''else'''
( instruction ''';''' |
(instruction ''';''' |
'''{''' { instruction ''';''' } '''}''' ) ]
'''{''' { instruction ''';''' } '''}''') ]


if ::= '''if''' '''(''' condition ''')'''
if ::= '''if (''' condition ''')'''
( instruction ''';''' |
(instruction ''';''' |
'''{''' { instruction ''';''' } '''}''' )
'''{''' { instruction ''';''' } '''}''')


== Notes et références ==
==Liens externes==
<references />
* {{en}} [http://cui.unige.ch/db-research/Enseignement/analyseinfo/BNFweb.html BNF Web Club] propose les BNF de plusieurs langages sous forme de diagrammes syntaxiques


== Voir aussi ==
{{Portail|programmation informatique}}
* [[Extended Backus-Naur Form]]
* [[Augmented Backus-Naur Form]]


=== Liens externes ===
[[Catégorie:Langage formel]]
* {{en}} [http://cui.unige.ch/isi/bnf/ BNF Web Club] propose les BNF de plusieurs langages (SQL, ADA, JAVA, MODULA2, SQL, [[SPARQL]], [[PL/SQL]], IDL, LISP, LAZY, M5…) sous forme de diagrammes syntaxiques.


{{Portail|programmation informatique}}
{{Lien BA|de}}


[[Catégorie:Langage formel]]
[[ar:صيغة باكوس نور]]
[[ca:Forma de Backus i Naur]]
[[cs:Backusova-Naurova forma]]
[[da:Backus-Naur form]]
[[de:Backus-Naur-Form]]
[[el:Μορφή Μπάκους-Νάουρ]]
[[en:Backus–Naur Form]]
[[es:Notación de Backus-Naur]]
[[fi:Backus–Naur-muoto]]
[[gl:Backus-Naur Form]]
[[hi:बाक्कस-नार प्रारूप]]
[[hr:Backus-Naurov oblik]]
[[hu:Backus–Naur forma]]
[[is:BNF]]
[[it:Backus-Naur Form]]
[[ja:バッカス・ナウア記法]]
[[ka:ბეკუს-ნაურის ფორმალიზმი]]
[[ko:바쿠스-나우르 표기법]]
[[ms:Bentuk Backus–Naur]]
[[nl:Backus-Naur-vorm]]
[[no:Backus-Naur form]]
[[pl:Notacja BNF]]
[[pt:Formalismo de Backus-Naur]]
[[ru:Форма Бэкуса — Наура]]
[[sr:Бекус-Наурова форма]]
[[sv:Backus-Naur-form]]
[[ta:பேக்கசு-நார் முறை]]
[[tr:Backus-Naur form]]
[[uk:Нотація Бекуса-Наура]]
[[zh:巴科斯范式]]

Dernière version du 8 juin 2023 à 16:47

La forme de Backus-Naur (souvent abrégée en BNF, de l'anglais Backus-Naur Form) est une notation qui permet d'écrire les règles syntaxiques (en) des langages informatiques (notamment des langages de programmation). C’est donc un métalangage employé pour définir inductivement un langage. Elle est utilisée dans certains livres pour décrire le langage étudié, mais également par de nombreux logiciels d’analyse syntaxique pour travailler sur des fichiers sources de plusieurs langages différents. Elle est une notation pour des grammaires formelles 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 lors de la création de la grammaire du langage Algol 60. Initialement appelée Backus normal form (« forme normale de Backus »), elle est devenue la « forme de Backus-Naur » à la suggestion de Donald Knuth.

Le grammairien Panini est un précurseur de Backus et Naur.

BNF et apprentissage

[modifier | modifier le code]

Bien que la prise de connaissance d’un langage demande une connaissance des rudiments de sa syntaxe, la BNF n'est pas nécessairement adaptée à l'apprentissage d'un langage.

En effet, si la BNF a pour rôle de fixer des règles à des compilateurs et permet aussi à des informaticiens ayant les bases d'un langage d'en approfondir la logique fine, l'apprentissage initial de ce langage ne nécessite pas un tel degré de précision au départ, où on cherche à maîtriser la sémantique bien plus que la syntaxe (dont le compilateur signalera de toute façon les erreurs). Celui-ci peut même constituer un handicap par sa profusion de détails et de degrés d'abstraction imbriqués inutiles au simple utilisateur d'un langage.

Des expériences tentées vers 1967-1972[1] dans trois écoles des mines, par exemple, ont montré que cette forme axiomatique générale se mémorisait moins bien qu'une série d'exemples particuliers que l'élève généralisait ensuite de lui-même[2].

Cela n'enlève rien à l'intérêt du métalangage dans le domaine pour lequel il a été conçu, qui n'est pas l'enseignement. Cette forme de description est par exemple parfaitement appropriée à 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> ")" "{" <instructions> "}"

<structure_if>, <condition> et <instructions> 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 (voir en particulier l'Extended Backus-Naur Form) ont été proposées afin de faciliter la rédaction et la lecture d’un document BNF.

Les crochets ([ et ]) entourent les éléments optionnels :

<structure_if> ::= if "(" <condition> ")" "{"<instructions>"}" 
                   [ else "{" <instructions>"}" ]

Les accolades ({ et }) entourent les éléments à répéter un nombre indéfini de fois, ou ils sont suivis d'une astérisque (*).

Un élément qui apparaît une ou plusieurs fois est suivi d'un signe plus (+)

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 ; } })

Notes et références

[modifier | modifier le code]
  1. Cours de Manuel Bloch, École des mines de Paris, 1967 ; cours de François Vigué, École des mines de Nancy, 1968, puis de Douai, 1971.
  2. L'élève maîtrisant la BNF saura par exemple qu'on a le droit d'écrire en FORTRAN « DO 10 I=1.5 » (les espaces ne comptent pas en FORTRAN) ou encore « GO TO 5 = 3 », ce qui ne sera pas forcément pour lui d'un intérêt immédiat.

Liens externes

[modifier | modifier le code]
  • (en) BNF Web Club propose les BNF de plusieurs langages (SQL, ADA, JAVA, MODULA2, SQL, SPARQL, PL/SQL, IDL, LISP, LAZY, M5…) sous forme de diagrammes syntaxiques.