Unit = *Blank Datum [ ';' SkipLine ] Blank = HTAB / LF / %x0b / %x0c / CR / Comment Datum = OneDatum *( [JoinChar] OneDatum ) JoinChar = '.' / ':' Comment = ';' ( SkipUnit / SkipLine LF ) SkipUnit = '~' Unit SkipLine = *( %x00-09 / %x0b-ff ) ; any but LF OneDatum = BareString / CladDatum BareString = ( '.' / '+' / '-' / DIGIT ) *( BareChar / '.' ) / 1*BareChar CladDatum = '|' *( PipeStrChar / '\' StringEsc ) '|' / '"' *( QuotStrChar / '\' StringEsc ) '"' / '#' HashExpr / '(' List ')' / '[' List ']' / '{' List '}' / "'" Datum / '`' Datum / ',' Datum BareChar = ALPHA / DIGIT / '!' / '$' / '%' / '&' / '*' / '+' / '-' / '/' / '<' / '=' / '>' / '?' / '@' / '^' / '_' / '~' PipeStrChar = %x00-5b / %x5d-7b / %x7d-ff ; any but | or \ QuotStrChar = %x00-21 / %x23-5b / %x5d-ff ; any but " or \ 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' 1*( 2*HEXDIG ) ';' / 'u' 1*6( HEXDIG ) ';' Rune = ALPHA *5( ALPHA / DIGIT ) Label = 1*12( HEXDIG )