-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathformal-syntax.ebnf
More file actions
56 lines (52 loc) · 1.88 KB
/
formal-syntax.ebnf
File metadata and controls
56 lines (52 loc) · 1.88 KB
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
program = statseq ;
expression = control ;
(* Expressions *)
control = 'if' expression 'then' statement ['else' statement]
| 'while' expression 'do' statement
| 'for' patlist 'in' expression 'do' statement
| function ;
function = fn | operator ;
operator = ('+' | '-' | ...) | disjunction ;
disjunction = conjunction {'or' conjunction} ;
conjunction = application {'and' application} ;
application = lowpredop {'|>' lowpredop} ;
lowpredop = comparison {'++' comparison} ;
comparison = bitwise {('==' | '!=' | '<' | '>' | '<=' | '>=') bitwise} ;
bitwise = addsub {('>>' | '<<') addsub} ;
addsub = muldiv {('+' | '-') muldiv} ;
muldiv = range {('*' | '/' | '//' | '%') range} ;
range = unary {'..' unary} ;
unary = ('-' | '!' | '#' | '...') unary | call ;
call = primary {primary} ;
primary = Identifier | Symbol | Number | String | group | list | block ;
group = '(' expseq ')' ;
list = '[' expseq ']' ;
block = '{' statseq '}' ;
(* Statements *)
statement = 'return' [explist]
| 'yield' [explist]
| 'break' {'break'} [explist]
| 'continue'
| ';'
| definition ;
definition = {modifier} Identifier {',' Identifier} ['=' explist]
| {modifier} Identifier fn
| assignment ;
assignment = patlist ':=' explist
| expression ;
(* Patterns *)
pattern = Identifier | Number | String | grouppat | listpat | blockpat ;
grouppat = '(' patexpseq [restpat] patexpseq ')' ;
listpat = '[' patexpseq [restpat] patexpseq ']' ;
blockpat = '{' patstatseq [restpat] patstatseq '}' ;
(* varpat = '\(' Identifier ')' ; *)
restpat = '...' Identifier ;
patexpseq = {pattern | ','} ;
patstatseq = {Identifier '=' expression | Identifier | ';'} ;
(* Smaller components *)
fn = pattern '=>' expression ;
expseq = {primary '=' expression | expression | ','} ;
statseq = {statement} ;
explist = expression {',' expression} ;
patlist = pattern {',' pattern} ;
modifier = 'var' | 'const' | 'rec' ;