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.