This is the complete Invisible XML grammar in iXML. It is also available in XML.
{version 2023-05-09}
ixml: s, prolog?, rule++RS, s.
-s: (whitespace; comment)*. {Optional spacing}
-RS: (whitespace; comment)+. {Required spacing}
-whitespace: -[Zs]; tab; lf; cr.
-tab: -#9.
-lf: -#a.
-cr: -#d.
comment: -"{", (cchar; comment)*, -"}".
-cchar: ~["{}"].
prolog: version, s.
version: -"ixml", RS, -"version", RS, string, s, -'.' .
rule: (mark, s)?, name, s, -["=:"], s, -alts, -".".
@mark: ["@^-"].
alts: alt++(-[";|"], s).
alt: term**(-",", s).
-term: factor;
option;
repeat0;
repeat1.
-factor: terminal;
nonterminal;
insertion;
-"(", s, alts, -")", s.
repeat0: factor, (-"*", s; -"**", s, sep).
repeat1: factor, (-"+", s; -"++", s, sep).
option: factor, -"?", s.
sep: factor.
nonterminal: (mark, s)?, name, s.
@name: namestart, namefollower*.
-namestart: ["_"; L].
-namefollower: namestart; ["-.·‿⁀"; Nd; Mn].
-terminal: literal;
charset.
literal: quoted;
encoded.
-quoted: (tmark, s)?, string, s.
@tmark: ["^-"].
@string: -'"', dchar+, -'"';
-"'", schar+, -"'".
dchar: ~['"'; #0-#1f; #7f-#9f];
'"', -'"'. {all characters except controls; quotes must be doubled}
schar: ~["'"; #0-#1f; #7f-#9f];
"'", -"'". {all characters except controls; quotes must be doubled}
-encoded: (tmark, s)?, -"#", hex, s.
@hex: ["0"-"9"; "a"-"f"; "A"-"F"]+.
-charset: inclusion;
exclusion.
inclusion: (tmark, s)?, set.
exclusion: (tmark, s)?, -"~", s, set.
-set: -"[", s, (member, s)**(-[";|"], s), -"]", s.
member: string;
-"#", hex;
range;
class.
-range: from, s, -"-", s, to.
@from: character.
@to: character.
-character: -'"', dchar, -'"';
-"'", schar, -"'";
"#", hex.
-class: code.
@code: capital, letter?.
-capital: ["A"-"Z"].
-letter: ["A"-"Z"; "a"-"z"].
insertion: -"+", s, (string; -"#", hex), s.