Un esempio di SGML


Il modo migliore per capire la filosofia di sgml è quello di studiare un semplice esempio. Supponiamo di dover affrontare il seguente progetto:

  1. E' stato realizzato un programma che scandisce tutti i files sorgenti ed estrae tutti i prototipi delle funzioni utilizzate.
  2. Ogni prototipo è composto da tre diversi elementi:
    1. Il nome della funzione.
    2. Il valore di ritorno.
    3. I parametri della funzione.
    4. Una descrizione della funzione.
  3. Bisogna salvare queste informazioni su di un'archivio, per poterle processare successivamente.

Per quanto sia semplice la natura del problema ci rendiamo immediatamente conto che il record tradizionale non è in grado1 di gestire questa semplice struttura. I motivi sono diversi:

  1. La lunghezza dei diversi elementi varia notevolmente da un minimo abbastanza basso ad un massimo non definito. Un record tradizionale dovrebbe riservare spazio per la stringa massima. Ad esempio 255 caratteri. Supposto che tale massimo non possa mai essere superato, comporta comunque un notevole spreco di spazio.
  2. Il valore di ritorno può esserci o non esserci.
  3. Il numero di parametri varia da 0 a n dove U è il massimo di parametri gestibile.
  4. La lunghezza della descrizione non ha limiti.

Il problema viene risolto in SGML stabilendo le seguenti entità:

  1. Esiste un contenitore FUN che descrive una funzione. Questo contiene:
    1. Un elemento NOME sempre presente.
    2. Zero o uno elementi RITORNO. Ogni ritorno è composto da:
      1. Un elemento TIPO.
    3. Zero o N elementi PARAMETRO. Ogni parametro è composto da:
      1. Un elemento TIPO.
      2. Un elemento NOME.

Con una sintassi molto simile a quella di html2 un documento di questo tipo verrebbe rappresentato in questo modo:

<FUN>
    <NOME>cifre_it</NOME>
    <RITORNO>
        <TIPO>int</TIPO>
    </RITORNO>
    <PARAMETRO>
        <TIPO>double</TIPO>
        <NOME>val</NOME>
    </PARAMETRO>
    <PARAMETRO>
        <TIPO>char*</TIPO>
        <NOME>buf</NOME>
    </PARAMETRO>
    <PARAMETRO>
        <TIPO>int</TIPO>
        <NOME>buf_len</NOME>
    </PARAMETRO>
</FUN>


1 Come sempre quando si dice non è in grado, si intende con ragionevole comodità. E' ovvio che è sempre possibile, in un qualche modo gestire questa situazione.

2 HTML è una particolare implementazione di SGML.

req.04ojbs8 • LastModified: 14-9-2007 • John Peter Arnold