Beyond SGML

2. A Grammar for Grammars

Previous chapter is Chapter 1, "What Could We Have Done Without SGML?".

   grammar ::= declaration*, production+;
   declaration ::= "#MARK-LENGTH", "::=", mark length |
                   "#UC-MARKS", "::=", uc marks |
                   "#WS", "::=", white-space set;
   mark length, uc marks ::= #TEXT;
   %white-space set ::= white-space indicator,
                        ("|", white-space indicator)*;
   white-space indicator ::= literal | keyword;
   production ::= non-syntactic indicator?, syntactic name set, "::=",
                  %regular expression, ";";
   non-syntactic name indicator ::= "%";
   %syntactic name set ::= syntactic name, (",", syntactic name)*;
   %regular expression ::= alternate set;
   alternate set ::= sequence, ("|", sequence)*;
   sequence ::= qualified syntactic item, (",", qualified syntactic item);
   qualified syntactic item ::= basic syntactic item, occurence indicator?;
   %occurence indicator ::= optional | repeatable |
                            optional and repeatable |
                            specific occurence indicator;
   optional ::= "?";
   repeatable ::= "+";
   optional and repeatable ::= "*";
   %specific occurence indicator ::= "{", occurence count, "}",
                                     or more indicator?;
   or more indicator ::= "+";
   %basic syntactic item ::= qualified mark | "(", regular expression, ")";
   qualified mark ::= mark, ("=", mark replacement)?;
   mark replacement ::= asis indicator?, source indicator?, simple literal;
   asis indicator ::= "#ASIS";
   source indicator ::= "#SOURCE";
   mark ::= literal | keyword | "[", mark reqular expression, "]";
   %mark regular experssion ::= mark alternate set;
   mark alternate set ::= mark sequence, ("|", mark sequence)*;
   mark sequence ::= mark item, (",", mark item);
   mark item ::= basic mark item, occurence indicator?;
   %basic mark item ::= literal | keyword |
                        "(", mark regular expression, ")";
   %literal ::= case specific literal | case independent literal
   case specific literal ::= ["#CASE", #WS?, '"'], literal text, '"' |
                             ["#CASE", #WS?, "'"], literal text, "'";
   case independent literal ::= simple literal;
   %simple literal ::= '"', literal text, '"' |
                       "'", literal text, "'";
   literal text ::= #TEXT;
   %keyword ::= "#", keyword name;
   syntactic name ::= name;
   keyword name ::= name;
   %name ::= {letter, (letter | digit)*};
   %letter ::= #CASE "A" | #CASE "B" | #CASE "C" | #CASE "D" |
               #CASE "E" | #CASE "F" | #CASE "G" | #CASE "H" |
           #CASE "I" | #CASE "J" | #CASE "K" | #CASE "L" | #CASE "M" | #CASE "N" |
           #CASE "O" | #CASE "P" | #CASE "Q" | #CASE "R" | #CASE "S" | #CASE "T" |
           #CASE "U" | #CASE "V" | #CASE "W" | #CASE "X" | #CASE "Y" | #CASE "Z";
   %digit ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9";

© 1993 OmniMark Technologies Corporation All rights reserved.
ETR09, release 2, 1993/04/26.