<!ELEMENT grammar (system-terms?, ((rule|page)+|part+), description?)>
<!ATTLIST grammar
    initial CDATA #REQUIRED
    language CDATA #REQUIRED
    comment CDATA #IMPLIED
    src CDATA #IMPLIED
    date CDATA #IMPLIED
    version CDATA #IMPLIED
>

<!ELEMENT system-terms (system-term+)>

<!ELEMENT system-term EMPTY>
<!ATTLIST system-term term ID #REQUIRED>

<!ELEMENT rule (terminal | non-terminal | subrule)+>
<!ATTLIST rule
   name   ID #REQUIRED
   kind   (data | classification) "data"
   status CDATA "?"
>

<!ELEMENT page (rule)+>

<!ELEMENT part ((rule|page)+)>
<!ATTLIST part name NMTOKEN #REQUIRED>

<!ELEMENT subrule ((terminal | non-terminal | subrule)+, separator?)>
<!ATTLIST subrule
    kind  (sequence | alternative | zero-or-one | zero-or-more | one-or-more) "sequence"
>

<!ELEMENT terminal EMPTY>
<!ATTLIST terminal
    symbol CDATA #REQUIRED
>

<!ELEMENT non-terminal EMPTY>
<!ATTLIST non-terminal
    name CDATA #REQUIRED
>

<!ELEMENT separator (terminal)>

<!ELEMENT description ((desc-object*, desc-item)+)>

<!ELEMENT desc-item (#PCDATA | gref | tref | oref | href)*>
<!ATTLIST desc-item subject NMTOKEN #REQUIRED>

<!ELEMENT gref EMPTY>
<!ATTLIST gref target NMTOKEN #REQUIRED>

<!ELEMENT tref EMPTY>
<!ATTLIST tref symbol CDATA #REQUIRED>

<!ELEMENT oref EMPTY>
<!ATTLIST oref
    object NMTOKEN #REQUIRED
    order CDATA #IMPLIED
    kind (ref | table) 'ref'
>

<!ELEMENT href EMPTY>
<!ATTLIST href
  kind CDATA #REQUIRED
  link CDATA #REQUIRED
  target CDATA #IMPLIED
  text CDATA #REQUIRED
>

<!ELEMENT desc-object (list | lseg+)>
<!ATTLIST desc-object
   name ID #REQUIRED
   title CDATA #IMPLIED
>

<!ELEMENT list (lpattern, oref+)>
<!ATTLIST list kind CDATA #IMPLIED>

<!ELEMENT lpattern (lseg+)>

<!ELEMENT lseg (#PCDATA | oref | gref | tref | href)*>
