summaryrefslogtreecommitdiff
path: root/spec/syntax.peg
blob: 97b9632caea5b00cbba125611f54bcd40bd44182 (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
Unit         <- Blank* ( Datum Blank? )?


Blank        <- ' ' / '\t' / '\n' / 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]