iXML Community Group Test Suite

21 Jun 2022 (28 Jun 2022)

Top-level catalog for tests in the iXML Community Group Test Suite.

Tests have been contributed from several sources, but the core of the test collection are the tests contributed by Steven Pemberton in December 2021.

Misc tests 2

13 Jun 2022

Grammars 21-40.

Test grammars compiled manually in 2018 and 2019, re-packaged in 2022.

Added test cases where needed and moved to ixml test collection, June 2022.

sample.grammar.39

Created 08 Feb 2022 by cmsmcq

Updated 13 Jun 2022 by cmsmcq

mark delimiters and space as hidden, correct space-handling blunders

Sample grammar from Niklaus Wirth, Grundlagen und Techniken des Compilerbaus (Bonn: Addison-Wesley, 1996, p. 8.

Grammar for EBNF as Wirth uses it. Rules for ws added for convenience; Wirth assumes the lexer eats whitespace.

Invisible XML Grammar


      syntax:  S?, production**S, S?.
      production: identifier, S?, "=", S?, expression, S?, ".".
      expression: term++(S?, -"|", S?).
      term: factor++S.
      factor: identifier; string;
      "(", S?, expression, S?, ")";
      "[", S?, expression, S?, "]";
      "{", S?, expression, S?, "}".

      identifier: letter, (letter; digit)*.
      string: '"', character*, '"'.
      -letter: ["A"-"Z"; "a"-"z"].
      -digit: ["0"-"9"].

      { Wirth does not define character. }
      -character: ~['"'].

      { Wirth does not define empty-set symbol. }
      nil: .

      -S: -[" "; #09; #0A; #0D]+.

    

Test case: Grammar test

Repository URI: …/tests/misc/misc-021-040-catalog.xml

Expected result

<ixml>
   <rule name="syntax">
      <alt>
         <option>
            <nonterminal name="S"/>
         </option>
         <repeat0>
            <nonterminal name="production"/>
            <sep>
               <nonterminal name="S"/>
            </sep>
         </repeat0>
         <option>
            <nonterminal name="S"/>
         </option>
      </alt>
   </rule>
   <rule name="production">
      <alt>
         <nonterminal name="identifier"/>
         <option>
            <nonterminal name="S"/>
         </option>
         <literal string="="/>
         <option>
            <nonterminal name="S"/>
         </option>
         <nonterminal name="expression"/>
         <option>
            <nonterminal name="S"/>
         </option>
         <literal string="."/>
      </alt>
   </rule>
   <rule name="expression">
      <alt>
         <repeat1>
            <nonterminal name="term"/>
            <sep>
               <alts>
                  <alt>
                     <option>
                        <nonterminal name="S"/>
                     </option>
                     <literal tmark="-" string="|"/>
                     <option>
                        <nonterminal name="S"/>
                     </option>
                  </alt>
               </alts>
            </sep>
         </repeat1>
      </alt>
   </rule>
   <rule name="term">
      <alt>
         <repeat1>
            <nonterminal name="factor"/>
            <sep>
               <nonterminal name="S"/>
            </sep>
         </repeat1>
      </alt>
   </rule>
   <rule name="factor">
      <alt>
         <nonterminal name="identifier"/>
      </alt>
      <alt>
         <nonterminal name="string"/>
      </alt>
      <alt>
         <literal string="("/>
         <option>
            <nonterminal name="S"/>
         </option>
         <nonterminal name="expression"/>
         <option>
            <nonterminal name="S"/>
         </option>
         <literal string=")"/>
      </alt>
      <alt>
         <literal string="["/>
         <option>
            <nonterminal name="S"/>
         </option>
         <nonterminal name="expression"/>
         <option>
            <nonterminal name="S"/>
         </option>
         <literal string="]"/>
      </alt>
      <alt>
         <literal string="{"/>
         <option>
            <nonterminal name="S"/>
         </option>
         <nonterminal name="expression"/>
         <option>
            <nonterminal name="S"/>
         </option>
         <literal string="}"/>
      </alt>
   </rule>
   <rule name="identifier">
      <alt>
         <nonterminal name="letter"/>
         <repeat0>
            <alts>
               <alt>
                  <nonterminal name="letter"/>
               </alt>
               <alt>
                  <nonterminal name="digit"/>
               </alt>
            </alts>
         </repeat0>
      </alt>
   </rule>
   <rule name="string">
      <alt>
         <literal string="&#34;"/>
         <repeat0>
            <nonterminal name="character"/>
         </repeat0>
         <literal string="&#34;"/>
      </alt>
   </rule>
   <rule mark="-" name="letter">
      <alt>
         <inclusion>
            <member from="A" to="Z"/>
            <member from="a" to="z"/>
         </inclusion>
      </alt>
   </rule>
   <rule mark="-" name="digit">
      <alt>
         <inclusion>
            <member from="0" to="9"/>
         </inclusion>
      </alt>
   </rule>
   <comment> Wirth does not define character. </comment>
   <rule mark="-" name="character">
      <alt>
         <exclusion>
            <member string="&#34;"/>
         </exclusion>
      </alt>
   </rule>
   <comment> Wirth does not define empty-set symbol. </comment>
   <rule name="nil">
      <alt/>
   </rule>
   <rule mark="-" name="S">
      <alt>
         <repeat1>
            <inclusion tmark="-">
               <member string=" "/>
               <member hex="09"/>
               <member hex="0A"/>
               <member hex="0D"/>
            </inclusion>
         </repeat1>
      </alt>
   </rule>
</ixml>