summaryrefslogtreecommitdiff
path: root/_tests/antlr.bnf
blob: 7b0cf8382d6345e35eff711eefd46471bf5bb672 (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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
grammar ExprLexer;

LF      : '\n' ;
SP      : ' ' ;
WS_CC   : [\t\r\f] ;
SEMI    : ';' ;
DOT     : '.' ;
COLON   : ':' ;
PIPE    : '|' ;
TILDE   : '~' ;
BSLASH  : '\\' ;
DQUOTE  : '"' ;
HASH    : '#' ;
LPAREN  : '(' ;
RPAREN  : ')' ;
LSQBR   : '[' ;
RSQBR   : ']' ;
LCURLY  : '{' ;
RCURLY  : '}' ;
EQUAL   : '=' ;
APOS    : '\'' ;
GRAVE   : '`' ;
COMMA   : ',' ;

    : [\u0000-\u0009\u000b-\u00ff] ;

BARE_CHAR     : [a-zA-Z0-9!$%&*+/<=>?@^_~-] | '\\' BARE_ESC ;

BARE_ESC      : [\u0021-\u007e] ;

QUOTED_CHAR   : [^"\\] | '\\' QUOTED_ESC ;

QUOTED_ESC    : [\\"abefnrtv]
              | 'x' HEX_DIGIT HEX_DIGIT
              | 'u' '{' HEX_DIGIT+ '}'
              ;


HEX_DIGIT  : [0-9a-fA-F] ;
ALPHA      : [a-zA-Z] ;
ALNUM      : [a-zA-Z0-9] ;



parse_unit    : blank* datum blank? ;


blank         : LF | SP | WS_CC | comment ;

datum         : datum_one ( join_char? datum )? ;


comment       : ';' ( skip_datum | skip_line ) ;


datum_one     : bare_string | fancy_datum ;

join_char     : '.' | ':' | '|' ;


skip_datum    : '~' parse_unit ;

skip_line     : ANY_BUT_LF* LF? ;


bare_string   : BARE_CHAR+ ;

fancy_datum   : '\\' bare_esc_str
              | '"' quoted_str '"'
              | '#' hash_expr
              | '(' list_body ')'
              | '[' list_body ']'
              | '{' list_body '}'
              | quote_expr
              ;


bare_esc_str  : '\\' BARE_ESC BARE_CHAR* ;

quoted_str    : QUOTED_CHAR* ;

hash_expr     : rune fancy_datum?
              | label ( '=' fancy_datum )?
              | fancy_datum
              ;

list_body     : blank* ( list_head list_tail? )? ;

quote_expr    : ( '\'' | '`' | ',' ) datum ;


rune          : ALPHA ALNUM* ;

label         : '%' HEX_DIGIT+ ;


list_head     : datum blank* list_head? ;
            
list_tail     : blank+ '.' blank+ datum blank* ;