{version 2022-05-19} ixml: s, prolog?, rule++RS, s. prolog: version, s. version: -"ixml", RS, -"version", RS, -string, 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: ~["{}"]. rule: (mark, s)?, name, s, -["=:"], s, -alts, -".". @mark: ["@^-"]. alts: alt++(-[";|"], s). alt: term**(-",", s). -term: factor; option; repeat0; repeat1. -factor: terminal; nonterminal; -"(", 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: ~['"'; #a; #d]; '"', -'"'. {all characters except line breaks; quotes must be doubled} -schar: ~["'"; #a; #d]; "'", -"'". {all characters except line breaks; 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"].