Systèmes de communication
SGML, quelques détails (2)
Structure d'un document SGML et d'une DTD
Un document SGML est constitué de trois parties:
Une DTD présente les caractéristiques suivantes:
Déclaration d'éléments
Le contenu d'un élément peut être décrit à l'aide d'un modèle de contenu ou d'un contenu déclaré.
Le modèle de contenu définit le contenu autorisé pour un élément. C'est généralement un groupe constitué d'éléments suivi par des indicateurs d'occurence et liés ensemble par des connecteurs.
Les éléments des contenus sont suivis par des indicateurs d'occurence:
Ils sont liés ensemble dans un groupe par des connecteurs:
#PCDATA (Parsed Character DATA) est utilisé dans les déclarations de balisage pour indiquer que des données textuelles parsables peuvent être contenues dans un modèle de contenu ne contenant aucun sous-élément.
Parfois on veut éviter que le parser n'interprète les caractères en tant que délimiteur de balisages. Cela peut être fait en utilisant un contenu déclaré d'élément:
Déclaration d'attributs
Un attribut se présente sous la forme:
<!ATTLIST élément nom type defaut> avec:
Les attributs booléens sont ceux qui ont une seule valeur possible.
Exemple: <!ATTLIST INPUT CHECKED (checked) #IMPLIED>
Dans ce cas la valeur peut être ommise: <INPUT TYPE="radio"
NAME="r1" CHECKED>
Déclaration d'entités
Les documents peuvent contenir des caractères spéciaux ou des formules ou des images provenant d'autres documents. Dans tous ces cas SGML utilise la notion de "référence à entité". Une entité est représentée par une chaîne de caractères introduite dans le texte là où la partie externe devra être placée.
Les entités générales et les entités paramètres sont les suivantes:
Référence à une DTD
Chaque document doit faire référence à une DTD et doit donc contenir une déclaration de type de document (DOCTYPE). La référence peut faire appel à un identificateur public ISO (par exemple: +//ISO 9070 Identificateur de dépositaire//Classe de texte Description de texte//Langue) ou à une adresse de DTD (URL). La DTD peut également être contenue dans cette déclaration sous la forme: <!DOCTYPE Nom du type de la classe [ La DTD se trouve ici]>.
Déclaration SGML
La déclaration SGML (<!SGML ...>) indique les caractères utilisés, ceux servant de délimiteur ou esquivés et les options adoptées en ce qui concerne la syntaxe (minimisation, raccourci, capcités requises, etc.).
Sections marquées
Les sections marquées sont utilisées pour désigner les parties d'un document qui ne doivent pas être traitées ou n'être traitées que sous certaines conditions.
Un section est marquée de la façon suivante: <![mot-clé [données]]>. Les mots-clés sont. IGNORE, INCLUDE, TEMP, CDATA.
Exemple:
<!ENTITY % confiden "INCLUDE">
<!ENTITY % public "IGNORE">
...
<![ %confiden; [Les choses vont au plus mal]]>
<![%public; [tout va bien]]>
SGML est un langage de type Extended Context Free Grammar (ECFG) avec exceptions (+ et -). Il n'est pas déterministe mais 1-déterministe (le groupe a(b|empty)b permet de "parser" ab et abb mais il faut lire un caractère à l'avance pour connaître de quel b il s'agit).
La minimilisation pose problème: si on a la déclaration de balisage:
<!ELEMENT S O - (A,A?,S?)>
L'interprétation de <S>AAA</S></S> peut être diverse. De façon plus concrète en HTML, avec ommision des balise HEAD et BODY, un objet SCRIPT n'est pas toujours situé de façon univoque.
De même les balises "raccourcies" posent problème.
XML reprend les qualités de SGML en abandonnant les défauts. (XML est du SGML sans larme!).
Pour en savoir plus en cas d'intérêt en théorie des langages: Wood, D. (1995) SGML, mathematical and philosophical issues.
![]()