La notation BNF
- Sommaire :
- Définitions |
- Extensions |
- Exemples |
Définitions
Ou Backus Naur Form
A la lecture de certaines documentations, on peut tomber sur des expressions telles que :
document ::= ( prolog element Misc* ) - ( Char* RestrictedChar Char* )
Cf "Extensible Markup Language (XML) 1.1 (Second Edition) W3C Recommendation", lien dans les ressources XML
BNF signifie "(John) Backus (Peter) Naur Form". C’est un code introduit pour décrire le language de programmation ALGOL 60 après la présentation de J. Backus à l’UNESCO pour l’ALGOL 58. Cette notation a été depuis très utilisée pour présenter la syntaxe d’un nouveau langage. Les meta-symboles de BNF sont :
- ::=
- "est défini comme"
- |
- "ou"
- < >
- Ces signes encadrent un nom de catégorie ("symboles non-terminaux" par oppositions aux terminaux représentés tel-quel).
Exemple pour un programme écrit dans un langage très élémentaire :
<programme> ::= PROGRAMME <suite_de_declarations> debut <suite_d_instructions> fin ;
On a là le mot clef "PROGRAMME" suivi de déclarations, puis le mot-clef "debut" suivi par la suite d’instructions et le mot-clef "fin" et un point-virgule pour finir.
- [ ]
- Articles facultatifs ("options"), par exemple :
<clause_si> ::= si <oui_ou_non> alors <suite_d_instructions> [ sinon <suite_d_instructions> ] fin si ;
- { }
- Les accolades encadrent des articles répétitifs.
Exemple pour un nom qui doit commencer par une lettre de l’alphabet mais peut
être suivi par tout autre caractère :
<identifiant> ::= <lettre> { <lettre> | <digit> }
- <statement_sequence> ::= <statement> { ";" <statement> }
- On encadre par " " les symboles terminaux d’un seul caractère.
Extensions
Depuis, quelques extensions ont été ajoutées par certaines instances. On a vu apparaître EBNF (Extended BNF) qui a même sa spécification ISO (14977). Noter spécialement les indications suivantes, qui seront pas à être utilisées plus loin (dans les DTD en SGML).
- ? : le symbole ou groupe de symboles entre-parenthèses est facultatif, il ne peut apparaître qu’une fois au plus.
- * : peut être répété plusieurs fois, ou aussi bien omis.
- + : doit apparaître au moins une fois.
- - : constitue une exception à la rèle.
- [ … ] : des éléments facultatifs peuvent être regroupés entre crochets.
Exemples
Pour le plaisir, voici BNF explicité en BNF :
syntax ::= { rule } rule ::= identifier "::=" expression expression ::= term { "|" term } term ::= factor { factor } factor ::= identifier | quoted_symbol | "(" expression ")" | "[" expression "]" | "{" expression "}" identifier ::= letter { letter | digit } quoted_symbol ::= """ { any_character } """
Comme il a dû lire avidement le précédent chapitre sur les encodages, le lecteur se penchera avec profit sur ce qui suit, anticipant sur l’introduction à XML. Il s’agit de courts extraits des recommandations du W3C.
** XML version 1.0 ** [1] document ::= prolog element Misc* [2] Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | /* any Unicode character, excluding [#xE000-#xFFFD] | [#x10000-#x10FFFF] the surrogate blocks, FFFE, and FFFF. */ [78] extParsedEnt ::= TextDecl? content
Après la version 1.0 de 1998, voici maintenant un aperçu intéressant des évolutions de XML 1.1 parues en 2004, sur lesquelles on reviendra plus loin.
** XML version 1.1 ** [1] document ::= ( prolog element Misc* ) - ( Char* RestrictedChar Char* ) [2] Char ::= [#x1-#xD7FF] | [#xE000-#xFFFD] /* any Unicode character, excluding | [#x10000-#x10FFFF] the surrogate blocks, FFFE, and FFFF. */ [2a] RestrictedChar ::= [#x1-#x8] | [#xB-#xC] | [#xE-#x1F] | [#x7F-#x84] | [#x86-#x9F] [78] extParsedEnt ::= ( TextDecl? content ) - ( Char* RestrictedChar Char* )