# Compatible with https://piumarta.com/software/peg Stream <- Unit ( Blank Unit )* !. Unit <- Blank* Datum Blank <- [\t-\r ] / Comment Datum <- OneDatum ( JoinChar? OneDatum )* JoinChar <- '.' / ':' Comment <- ';' ( SkipUnit / SkipLine ) SkipUnit <- '~' Unit SkipLine <- (!'\n' .)* '\n'? OneDatum <- BareString / CladDatum BareString <- ( '.' / '+' / '-' / DIGIT ) ( BareChar / '.' )* / BareChar+ CladDatum <- PipeStr / QuoteStr / HashExpr / QuoteExpr / List PipeStr <- '|' ( PipeStrChar / '\' StringEsc )* '|' QuoteStr <- '"' ( QuotStrChar / '\' StringEsc )* '"' HashExpr <- '#' ( RuneExpr / LabelExpr / HashDatum ) QuoteExpr <- "'" Datum / '`' Datum / ',' Datum List <- ParenList / SquareList / BraceList BareChar <- ALPHA / DIGIT / '!' / '$' / '%' / '*' / '+' / '-' / '/' / '<' / '=' / '>' / '?' / '@' / '^' / '_' / '~' PipeStrChar <- (![|\\] .) QuotStrChar <- (!["\\] .) StringEsc <- '\' / '|' / '"' / ( HTAB / SP )* LF ( HTAB / SP )* / 'a' / 'b' / 't' / 'n' / 'v' / 'f' / 'r' / 'e' / 'x' HexByte+ ';' / 'u' UnicodeSV ';' HexByte <- HEXDIG HEXDIG UnicodeSV <- HEXDIG+ RuneExpr <- Rune ( '\' BareString / CladDatum )? LabelExpr <- '%' Label ( '%' / '=' Datum ) HashDatum <- '\' BareString / CladDatum Rune <- ALPHA ( ALPHA / DIGIT )* Label <- HEXDIG+ ParenList <- '(' ListBody ')' SquareList <- '[' ListBody ']' BraceList <- '{' ListBody '}' ListBody <- Unit* ( Blank* '&' Unit )? Blank* DIGIT <- [0-9] ALPHA <- [a-zA-Z] HEXDIG <- [0-9a-fA-F] # This file should be kept in perfect sync with zbnf.txt for easy # comparison between the two. # Due to a quirk in the peg tool this file is used with, the grammar # must not allow an empty stream. Therefore, the Unit rule has its # Datum declared as mandatory rather than optional.