# Standard PEG notation 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 <- SpecBareChar ( BareChar / JoinChar )* / BareChar+ SpecBareChar <- '+' / '-' / JoinChar / DIGIT BareChar <- ALPHA / DIGIT / '!' / '$' / '%' / '&' / '*' / '+' / '-' / '/' / '<' / '=' / '>' / '?' / '^' / '_' / '~' CladDatum <- PipeStr / QuoteStr / HashExpr / QuoteExpr / List PipeStr <- '|' ( PipeStrChar / '\' StringEsc )* '|' QuoteStr <- '"' ( QuotStrChar / '\' StringEsc )* '"' HashExpr <- '#' HashExprs QuoteExpr <- "'" Datum / '`' Datum / ',' Datum List <- ParenList / SquareList / BraceList PipeStrChar <- (![|\\] .) QuotStrChar <- (!["\\] .) StringEsc <- '\' / '|' / '"' / ( HTAB / SP )* LF ( HTAB / SP )* / '0' / 'a' / 'b' / 't' / 'n' / 'v' / 'f' / 'r' / 'e' / 'x' HexByte* ';' / 'u' UnicodeSV ';' HexByte <- HEXDIG HEXDIG UnicodeSV <- HEXDIG+ HashExprs <- '!' [\t ]* HBangLine '\n'? / '%' Label ( '%' / '=' Datum ) / '\' BareString / CladDatum / Rune ( '\' BareString / CladDatum )? HBangLine <- HBChars+ [\t ]* ( HBChars+ )? HBChars <- (![\t\n ] .) Label <- HEXDIG+ Rune <- ALPHA ( ALPHA / DIGIT )* ParenList <- '(' Unit* ')' SquareList <- '[' Unit* ']' BraceList <- '{' Unit* '}' DIGIT <- [0-9] ALPHA <- [a-zA-Z] HEXDIG <- [0-9a-fA-F] # Keep this in sync line-for-line with the ZBNF grammar for easy # comparison between the two. # This file is meant to be compatible with: # https://piumarta.com/software/peg # 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. # Local Variables: # eval: (flyspell-mode -1) # End: