summaryrefslogtreecommitdiff
path: root/docs/c1/grammar.peg.txt
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.