Unit : Blank* ( Datum [Blank] | EOF ) Blank : 9...13 | Comment Datum : OneDatum ( [JoinChar] OneDatum )* JoinChar : '.' | ':' Comment : ';' ( SkipUnit | SkipLine [LF] ) SkipUnit : '~' Unit SkipLine : ( ~LF )* OneDatum : BareString | CladDatum BareString : BareChar+ CladDatum : '|' ( PipeStrChar | '\' StringEsc )* '|' | '"' ( QuotStrChar | '\' StringEsc )* '"' | '#' HashExpr | '(' List ')' | '[' List ']' | '{' List '}' | "'" Datum | '`' Datum | ',' Datum BareChar : ALPHA | DIGIT | '!' | '$' | '%' | '*' | '+' | '-' | '.' | '/' | '<' | '=' | '>' | '?' | '@' | '^' | '_' | '~' PipeStrChar : ~( '|' | '\' ) QuotStrChar : ~( '"' | '\' ) HashExpr : Rune [ '\' BareString | CladDatum ] | '\' BareString | '%' Label ( '%' | '=' Datum ) | CladDatum List : Unit* [ '&' Unit ] Blank* StringEsc : '\' | '|' | '"' | ( HTAB | SP )* LF ( HTAB | SP )* | 'a' | 'b' | 't' | 'n' | 'v' | 'f' | 'r' | 'e' | 'x' ( HEXDIG{2} )+ ';' | 'u' HEXDIG{1,6} ';' Rune : ALPHA ( ALPHA | DIGIT ){0,5} Label : HEXDIG{1,12}