summaryrefslogtreecommitdiff
path: root/docs/c1/grammar.zbnf.txt
blob: a8792f01139848d59e5342a7ad8651b96b5a7e4f (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
# Custom notation with PEG semantics; see grammar.html

Stream        : Unit ( Blank Unit )*

Unit          : Blank* [Datum]


Blank         : '\t'...'\r' | SP | Comment

Datum         : OneDatum ( [JoinChar] OneDatum )*

JoinChar      : '.' | ':'


Comment       : ';' ( SkipUnit | SkipLine )

SkipUnit      : '~' Unit

SkipLine      : ( ~LF )* [LF]


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*