/
neo-grammar
73 lines (57 loc) · 1.71 KB
/
neo-grammar
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
<program> = atom*
<atom> = regex / string / nil / number / boolean / set / map / vector /
qualified-keyword / keyword / qualified-identifier / identifier /
binding-definition /
fn-expression / do-expression /
if /
application
<left-paren> = <'('>
<right-paren> = <')'>
<left-bracket> = <'['>
<right-bracket> = <']'>
<left-curly> = <'{'>
<right-curly> = <'}'>
special-identifier = def-keyword | fn-keyword | do-keyword | if-keyword
nil = <'nil'>
integer = #'[+-]?\d+'
real = #'[+-]?\d+\.\d*'
<number> = (integer | real)
<double-quote> = '\"'
string = <double-quote> #'(?:[^"\\]|\\.)*' <double-quote>
regex = <'#'> <double-quote> #'(?:[^"\\]|\\.)*' <double-quote>
<symbol-text> = #'[^\s"()\[\]{}\d:/#][^\s"()\[\]{}/#]*'
symbol = symbol-text
<identifier-text> = #'[^\s"()\[\]{}\d:/\.#][^\s"()\[\]{}/\.#]*'
identifier = identifier-text
<namespace> = symbol-text
qualified-identifier = namespace <'/'> identifier-text
<keyword-text> = #'[^\s"()\[\]{}/:]+'
qualified-keyword = #'::?' keyword-text '/' keyword-text
keyword = #'::?' keyword-text
boolean = 'true' | 'false'
map = left-curly atom* right-curly
set = <'#'> left-curly atom* right-curly
vector = left-bracket atom* right-bracket
<def-keyword> = <'def'>
binding-definition = left-paren def-keyword identifier atom right-paren
<fn-keyword> = <'fn'>
argument-list = left-bracket identifier* right-bracket
fn-expression =
left-paren fn-keyword identifier? argument-list
atom*
right-paren
<do-keyword> = <'do'>
do-expression =
left-paren do-keyword
atom*
right-paren
<if-keyword> = <'if'>
if =
left-paren if-keyword atom
atom
atom?
right-paren
application =
left-paren !special-identifier
atom+
right-paren