Le web de Dominique Guebey – Bazar informatique

Page : http://www.dg77.net/tekno/xhtml/bnf.htm


  D o m i n i q u e   G u e b e y    J u n g l e    Bazar informatique

Pages Web en XHTML (suite)

La notation BNF

Sommaire :

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).

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*  )