blob: d194652f9f2c78932fcd24bb6ce6d6e1cc49fdbd (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
# 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.
|