Produktionsregeln (EBNF)

(Auszug aus "DocBook-XML: Medienneutrales und plattformunabhängiges Publizieren" von Thomas Schraitle)

DocBook 5 erlaubt, Produktionsregeln in der Erweiterte Backus-Naur-Form (EBNF) zu definieren. Diese Produktionsregeln sind eine alternative Darstellung eines Algorithmus und werden beispielsweise für den Compilerbau benötigt. Auch die XML-Spezifikation verwendet EBNF, um damit ein Dokument, Prolog, Tag usw. zu definieren. Am Beispiel eines CDATA-Abschnittes wird dieser Sachverhalt gezeigt. Die folgende Produktion ist aus Extensible Markup Language (XML): CDATA Sections entnommen:

EBNF-Produktion eines CDATA-Abschnitts

[1]    CDSect   : : =    CDStart CData CDEnd   
[2]   CDStart   : : =    '<![CDATA['   
[3] CDATA   : : =    (Char - (Char* ']]>' Char*))         /* Alle Zeichen außer ']]>' * /
[4] CDEnd   : : =    ']]>'

Bei der vorigen Produktionsregel steht auf der linken Seite immer der Name der Produktion und auf der rechten Seite dessen Definition. Somit besteht ein CDATA-Abschnitt aus drei weiteren Produktionen: einem Anfang (CDStart), einer Mitte (CData) und einem Ende (CDEnd). Ein CDATA-Abschnitt beginnt mit der Zeichenfolge <![CDATA[. Der Mittelteil darf beliebige Zeichen (Char) enthalten mit Ausnahme der Folge ]]>. Ein CDATA-Abschnitt endet mit ]]>.

Die vorige EBNF-Produktion ist in DocBook 5-Markup wie folgt angegeben:

Beispiel: Markup einer EBNF-Produktion für einen CDATA-Abschnitt

<productionset> 
    <title>EBNF-Produktion eines CDATA-Abschnitts</title>   
    <production xml:id="prset">     
        <lhs>CDSect</lhs>     
        <rhs>           
            <nonterminal def="#pr.cdstart"/>           
            <nonterminal def="#pr.cdata"/>              
            <nonterminal def="#pr.cdend"/>              
        </rhs>        
    </production>    
    <production xml:id="pr.cdstart">        
        <lhs>CDStart</lhs>        
        <rhs>'&lt;![CDATA['</rhs>        
    </production>    
    <production xml:id="pr.cdata">     
        <lhs>CData</lhs>       
        <rhs><lineannotation>Alle Zeichen außer ']]>'</lineannotation>   
            (Char - (Char* ']]&gt;' Char*))           
        </rhs>      
    </production>    
    <production xml:id="pr.cdend">     
        <lhs>CDEnd</lhs>        
        <rhs>']]>'</rhs>       
    </production>    
</productionset>

Zeile 1: Ein oder mehrere Produktionen werden in einem productionset gesammelt. Da unsere Definitionen eines CDATA-Abschnittes aus drei Produktionen besteht, müssen auch drei production-Elemente vorhanden sein.
Zeilen 3, 11, 15 und 21: Eine vollständige Produktion aus linker und rechter Seite durch production. Jede Produktion muss einen Anker besitzen, um darauf im Bedarfsfall zu verweisen.
Zeile 4: Die linke Seite einer Produktion enthält den Namen.
Zeile 5: Die rechte Seite einer Produktion enthält die Definition. Verweise auf andere Produktionen werden mit nonterminal vorgenommen.
Zeilen 6 bis 8: Ein Verweis auf eine andere Produktion. Hierbei enthält das Attribut def eine URL auf die Produktion. Befindet sich die Produktion im selben Dokument, wird ein #-Zeichen vor dem eigentlichen Ankerwert hinzugefügt. Der Name der Produktion wird in diesem Fall automatisch eingefügt.
Zeile 17: Kommentiert eine Produktion

Hinweis: Expliziter Zeilenumbruch
Wenn Sie viele Produktionen in einem rhs-Element besitzen, ist der Umbruch in manchen Fällen verwirrend. Um den Umbruch selbst zu bestimmen, hilft das leere Element <sbr/> an der gewünschten Stelle:

<rhs> A B C <sbr/> D E F ... </rhs>

Häufig enthalten Produktionen Nebenbedingungen oder Einschränkungen. In diesem Fall hilft constraintdef und contstraint:

Beispiel: Einschränkungen für eine Produktion

<productionset>   
    <title>Division</title>
    <production xml:id="pr.divisionexpr">       
        <lhs>DivExpr</lhs>        
        <rhs><nonterminal def="#pr.expression"/>'/'<nonterminal def="#pr.expression"/></rhs>        
        <constraint linkend="cd.div0"/>       
    </production>    
    <production xml:id="pr.expression">        
        <lhs>Expression</lhs>        
        <rhs>...</rhs>        
    </production>   
</productionset>
<constraintdef xml:id="cd.div0">
    <title>Division durch Null</title>    
    <para>Division durch Null ist ein Fehler.</para>    
</constraintdef>

Zeile 6: Verweis auf ein Element constraintdef. Das Attribut linkend zeigt auf den Anker von constraintdef.
Zeile 13: Definiert die Einschränkung, die sich außerhalb von productionset befinden muss.

Das Ergebnis sieht wie folgt aus:

Division

[5]       DivExpr : : = Expression '/' Expression                                                          [Division durch Null]

[6]   Expression : : = ...

 

Division durch Null

Division durch Null ist ein Fehler.

Abbildung: Einschränkungen für eine Produktion (Darstellung des obigen Beispiels) 

Weitere Details zu EBNF finden Sie im Wikipedia-Artikel.

 

<< zurück vor >>
Tipp der data2type-Redaktion:
Zum Thema DocBook bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an:

Copyright © 2009 Millin Verlag
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "DocBook-XML: Medienneutrales und plattformunabhängiges Publizieren" denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

Millin Verlag, Siebengebirgsring 36, 53797 Lohmar, info(at)millin.de