forked from sail-pl/SAIL
-
Notifications
You must be signed in to change notification settings - Fork 1
/
grammar.bnf
78 lines (61 loc) · 2.31 KB
/
grammar.bnf
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
<<module>> ::=
{{ <<declaration>> }}*
<<declaration>> ::=
| <<struct-declaration>>
| <<enum-declaration>>
| <<method-declaration>>
<<struct-declaration>> ::=
| struct lid {{ < {{ _list(uid) }}? > }}? { {{ _list(<<lid-type>>) }}? }
<<enum-declaration>> ::=
| enum lid {{ < {{ _list(uid) }}? > }} ? { {{ _list(<<cons-def>>) }}? }
<<method-declaration> ::=
| method lid ( {{ _list(<<lid-type>>) }}? ) { {{ <<statement>> }}? }
<<lid-type>> ::= lid : <<type>>
<<type>> ::=
bool | int | float | char | string | id<type> | uid
<<cons-def>> ::=
id {{ ( {{ list(<<type>>) }}? ) }}?
<<statement>> ::=
| var {{ mut }}? lid : <<type>> {{ = <<expression>> }}?
| signal lid
| <<expression>> = <<expression>>
| <<statement>> ; << statement>>
| <<block-statement>> << statement>>
| <<statement>> || <<statement>>
| if ( <<expression>> ) <<statement>>
| if ( <<expression>> ) <<statement>> else <<statement>>
| while ( <<expression>> ) <<statement>>
| case ( <<expression>> ) {_list(<<(case)>)>}
| lid ( {{ _list(<<listexpression>>) }}? )
| return {{ <<expression>> }} ?
| emit id
| when id <<statement>>
| watch id <<statement>>
| { {{ <<statement>> }} ? }
<<block-statement>> ::=
| { {{ <<statement>> }} ? }
| if ( <<expression>> ) { {{ <<statement>> }} ? }
| if ( <<expression>> ) <<statement>> else { {{ <<statement>> }} ? }
| while ( <<expression>> ) { {{ <<statement>> }} ? }
| when (id) { {{ <<statement>> }} ? }
| watch (id) { {{ <<statement>> }} ? }
<<pattern>> ::=
lid | uid {{ ( {{ _list(<<pattern>>) }} ? ) }}?
<<case>> ::= <<pattern>> : <<statement>>
<<expression>> ::=
| lid
| <<bool>> | <<int>> | <<float>> | <<char>> | <<string>>
| <<expression>>[<<expression>>]
| <<expression>>.lid | ( <<expression>> )
| <<unop>> <<expression>>
| <<expression>> <<binop>> <<expression>>
| & {{ mut }}? <<expression>>
| * <<expression>>
| [ {{ _list(<<expression>>) }} ?]
| { {{ _list(<<field-expression>>) }}? }
| Id {{ ( {{ _list(<<expression>>) }} ? ) }}?
| id ( _list(<<expression-list>>)? )
<<field-expression>> ::= id : <<expression>>
<<unop>> ::= - | !
<<binop> ::= + | - | * | / | % | < | > | <= | >= | == | != | and | or
_list(x) = x | x, <<list>>(x)