-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathGrammar.txt
214 lines (132 loc) · 5.43 KB
/
Grammar.txt
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
<bracket> := [
</bracket> := ]
<scope> := {
</scope> := }
<angled> := <
</angled> := >
<parentheses> := (
</parentheses> := )
<number> := <number literal>
<string> := <string literal>
<literal> := <number> | <string> | true | false | null
<primitive> := void | bool | byte | ubyte | int | int16 | int64 | uint | uint16 | uint64 | float | string
<expression> := <binaryExpression> | <unaryExpression>
<binaryExpression> := <expression> <binaryOperator> <expression>
<unaryExpression> := <unaryOperator> <expression> | <primaryExpression>
<primaryExpression> := <operand> |
<dereference> |
<primaryExpression> <selector> |
<primaryExpression> <as> |
<primaryExpression> <index> |
<primaryExpression> <functionParams> |
<operand> := <literal> | <identifier> | <groupedExpression> | <compileTime> | <anonymousType>
<groupedExpression> := "(" <expression> ")"
<operator> := <binaryOperator> | <unaryOperator> | <variationOperator> | <bitwiseOperator> |
<relativeOperator> | <assignmentOperator> | <definitionOperator> | <accessOperator>
<binaryOperator> := + | - | * | / | % | && | || | << | >> | | | ^ | & | &^ |
<relativeOperator>
<unaryOperator> := ! | - | ^
<bitwiseOperator> := | | ^ | << | >> | & | &^
<relativeOperator> := == | != | <= | >= | < | >
<assignmentOperator> := += | -= | *= | /= | %= | &= | |= | ^= | <<= | >>= | &^=
<definitionOperator> := = | :=
<accessOperator> := ... | in | .. | [] | =>
<import> := import <identifier>
<package> := package <identifier>
<statement> := <definition> | <if> | <for> | <while> | <switch> | <assignment> | <ternary> |
<delete> | <defer> | <return> | <compileTime> | <block> | <expression>
<statements> := <statement...> | <statement>
<generics> := <angled> (<type...>,) ?(:<where>) </angled>
<type> := <namedType> |
<primitive> |
<explicitType> |
<pointerType> |
<rawPointerType> |
<arrayType> |
<genericType> |
<functionType> |
<namedType> := <identifier> |
// PackageName.Type
(<identifier> . <identifier>)
<pointerType> := * <type>
<uniquePointerType> := ~* <type>
<valueType> := ~ <type>
<arrayType> := <bracket></bracket> <type>
<genericType> := <namedType> <generics>
<functionType> := :: <type> <parenthesis> ?(<type...>,) </parenthesis>
<declaration> := <identifier> : <type>
<explicitType> := <scope> <declaration...>, </scope>
<implicitType> := <scope> <identifier...>, </scope>
<anonymousType> := <scope> <definition...>, </scope> |
<scope> <expression...>, </scope>
<assignmentValue> := <expression> | <new> | <anonymousType> | <functionValue> | <fixedArray>
<definition> := <declaration> = <assignmentValue> |
(<identifier> | <implicitType>) := <assignmentValue>
<assignment> := <expression> <assignmentOperator> <assignmentValue>
<block> := <scope> <statements> </scope>
<functionSignature> := <parentheses>
?((<declaration> | <expression>...) ?(<definition>...)),
</parentheses>
<functionDeclaration> := <functionSignature> <block> | <functionSignature> => <expression>
<function> := <type> <identifier> ?(<generics>) <functionDeclaration>
<functionParams> := <parentheses> ?(<expression...>,) </parentheses>
<functionCall> := <identifier> <functionParams>
<state> := state <identifier>
?(<generics>)
<scope>
<declaration...> & <definition...> & <inset...>
</scope>
<inset> := <bracket> (size | null | serialized | noalign) </bracket>
<where> := where <functionDeclaration>
<constructor> := <identifier> :: <functionDeclaration>
<destructor> := <identifier> :: delete <scope> <statements> </scope>
<operatorOverload> := <type> <identifier> :: Operator :: <operator> <functionDeclaration>
<method> := (<type> <identifier> :: <identifier> <functionDeclaration>) |
<constructor> |
<destructor> |
<operatorOverload>
<compileTime> := #compile <type> (<block> | (=> <statement>)
<compileTimeDebug> := #compileDebug (<block> | (<statement>)
<functionValue> := <type> <functionDeclaration>
<condition> := <expression> ?((== | < | > | != | <= | >=) <expression>)
<conditions> := <condition> ?((|| | &&) <condition>...)
<conditional> := <parentheses> <conditions...> </parentheses> <block>
<for> := for
<parentheses>
(<identifier> | <declaration>) (in | ..) (<identifier> | <expression>)
</parentheses>
<block>
<while> := while <conditional>
<if> := if <conditional> ?(<elif...>) ?(<else>)
<elif> := else <if>
<else> := else <block>
<case> := case <parentheses> <expression> </parentheses> <block>
<switch> := switch <parentheses> <expression> </parentheses>
<scope>
<case...>
?(default : <block>)
</scope>
<defer> := defer (<statement> | <block>) | defer if <conditional> (<statement> | <block>)
<ternary> := <expression> ? <expression> : <expression>
<new> := new <type> <functionParams> ?(<at>)
| new <anonymousType> ?(<at>)
<delete> := delete <primaryExpression> |
delete[] <primaryExpression>
<return> := return <expression>
<fixedArray> := fixed <type> <index>
<selector> := . <identifier>
<selection> := <identifier> <selector>
<as> := as <type>
<at> := at <primaryExpression>
<index> := <bracket> <expression> </bracket>
<dereference> := <primaryExpression> ~
<reference> := <primaryExpression> @
<extern> := extern <scope> (<type> <identifier> <parentheses> ?(<declaration>...), </parentheses>...) </scope>
<program> := <package> &
<import...> &
<state...> &
<function...> &
<method...> &
<definition...> &
<compileTime...> &
<extern...>