Datei: NDODLL/NDOql/NDOql.ATG
Last Commit (f96ae8c)
1 | using System.Collections.Generic; |
2 | using System.Text; |
3 | using System.Globalization; |
4 | using NDOql.Expressions; |
5 | |
6 | COMPILER NDOQL |
7 | |
8 | |
9 | OqlExpression rootExpression; |
10 | public OqlExpression RootExpression |
11 | { |
12 | ····get { return rootExpression; } |
13 | } |
14 | |
15 | |
16 | |
17 | /*------------------------------------------------------------------------* |
18 | *----- SCANNER DESCRIPTION ----------------------------------------------* |
19 | *------------------------------------------------------------------------*/ |
20 | |
21 | IGNORECASE |
22 | |
23 | CHARACTERS |
24 | |
25 | ····tab················= '\u0009'. /*··9 = tabulator */ |
26 | ····eol················= '\u000a'. /* 10 = line feed */ |
27 | ····cr················ = '\u000d'. /* 13 = carriage return */ |
28 | ····newLine············= cr + eol. /* Line separator character (U+2028) + Paragraph separator character (U+2029) */ |
29 | |
30 | ····startletter········= 'A' .. 'Z' + 'a' .. 'z' + '_' + '\u00aa' + '\u00b5' + '\u00ba' + '\u00c0' .. '\u00d6' + '\u00d8' .. '\u00f6' + '\u00f8' .. '\u00ff'. |
31 | ····partletter········ = '.' + '0' .. '9' + 'A' .. 'Z' + 'a' .. 'z' + '_' + '\u0080' + '\u00a0' .. '\u00b3' + '\u00b5' + '\u00ba' + '\u00c0' .. '\u00d6' + '\u00d8' .. '\u00f6' + '\u00f8' .. '\u00ff'. |
32 | |
33 | ····digit··············= "0123456789". |
34 | ····hexDigit·········· = digit + "ABCDEFabcdef". |
35 | ····notDigit·········· = ANY - digit. |
36 | |
37 | ····regularStringChar··= ANY - "'" - newLine. |
38 | ····notNewLine········ = ANY - newLine . |
39 | ····ws················ = " " + tab + '\u000b' + '\u000c'. /* Any character with Unicode class Zs */ |
40 | |
41 | |
42 | TOKENS |
43 | |
44 | ··/* This definition is not exact, as it allows '_.x' or 'x..y' as valid identifiers. But we couldn't get a mapping to that kind of wrong identifiers anyway. */ |
45 | ····ident = startletter { partletter }.···· |
46 | |
47 | ··/*--------------------------------------------------------------------------------*/ |
48 | ····realCon = |
49 | ····['-'] [digit {digit}] "." digit {digit} |
50 | ············[("e" | "E" ) ["+" | "-"] digit {digit} ] ···················· |
51 | ········. |
52 | |
53 | ··/*--------------------------------------------------------------------------------*/ |
54 | ····intCon = |
55 | ········['-'] (digit {digit} | digit {digit} ) |
56 | ········. |
57 | |
58 | ··/*--------------------------------------------------------------------------------*/ |
59 | stringCon = "'" { regularStringChar } "'". |
60 | |
61 | |
62 | ····/*----- keyword names needed in LL(1) resolvers -----*/ |
63 | ····AND······= "AND". |
64 | ····OR······ = "OR". |
65 | ····NOT······= "NOT". |
66 | ····LIKE···· = "LIKE". |
67 | ····ESCAPE·· = "ESCAPE". |
68 | ····BETWEEN··= "BETWEEN". |
69 | ····IS······ = "IS". |
70 | ····NULL···· = "NULL". |
71 | ····TRUE······= "TRUE". |
72 | ····MOD···· = "MOD". |
73 | ····IN···· = "IN". |
74 | |
75 | |
76 | ····parameter =··"{" digit "}". |
77 | |
78 | |
79 | |
80 | COMMENTS FROM "--" TO eol |
81 | |
82 | IGNORE eol + cr + tab |
83 | |
84 | PRODUCTIONS |
85 | |
86 | /*------------------------------------------------------------------------* |
87 | *--------------------------- Declarations -------------------------------* |
88 | *------------------------------------------------------------------------*/ |
89 | |
90 | NDOQL = RootExpr<out this.rootExpression> . |
91 | |
92 | /*------------------------------------------------------------------------*/ |
93 | |
94 | RootExpr<out OqlExpression expression> |
95 | ····(.··OqlExpression child; |
96 | ········OqlExpression result = new OqlExpression(la.line, la.col); |
97 | ········bool negated = false; |
98 | ····.) |
99 | = ····[NOT (.negated = true; .)] OrExpr<out child> |
100 | (. |
101 | ····if (negated) result.UnaryOp = "NOT"; |
102 | ····result.Add(child); |
103 | ····expression = result.Simplify(); |
104 | .) |
105 | . |
106 | |
107 | /*------------------------------------------------------------------------*/ |
108 | OrExpr <out OqlExpression expression>·· |
109 | ····(. |
110 | ········OqlExpression child; |
111 | ········OqlExpression result = new OqlExpression(la.line, la.col); |
112 | ····.) |
113 | |
114 | = AndExpr ············<out child> (. result.Add(child); .) |
115 | ··{ "OR" (. bool negated = false; .) [NOT (. negated = true; .)] |
116 | ··AndExpr<out child> (. if (negated) child.UnaryOp = "NOT"; result.Add(child, "OR"); .) |
117 | ··} |
118 | |
119 | (. expression = result.Simplify(); .) |
120 | . |
121 | |
122 | |
123 | /*------------------------------------------------------------------------*/ |
124 | AndExpr<out OqlExpression expression>·· |
125 | ····(. |
126 | ········OqlExpression child; |
127 | ········OqlExpression result = new OqlExpression(la.line, la.col); |
128 | ····.) |
129 | = EqlExpr<out child> (. result.Add(child); .) { |
130 | ················································"AND" (. bool negated = false; .) [NOT (. negated = true; .)] |
131 | ················································EqlExpr<out child> (. if (negated) child.UnaryOp = "NOT"; result.Add(child, "AND"); .) |
132 | ··············································} |
133 | (. expression = result.Simplify(); .) |
134 | . |
135 | |
136 | |
137 | /*------------------------------------------------------------------------*/ |
138 | EqlExpr<out OqlExpression expression> |
139 | ····(. |
140 | ········OqlExpression child; |
141 | ········OqlExpression result = new OqlExpression(la.line, la.col); |
142 | ········string newOp = null; |
143 | ········bool negated = false; |
144 | ····.) |
145 | ···· |
146 | = ( |
147 | ····IF(!(scanner.Peek().kind==_IN)) |
148 | ····RelExpr<out child> (. result.Add(child); .) |
149 | ····{ |
150 | ········( |
151 | ············"!=" (. newOp = "<>"; .) |
152 | ············| "<>" (. newOp = "<>"; .) |
153 | ············| "=" (. newOp = "="; .) [NOT (. negated = true; .)] |
154 | ············| "LIKE" (. newOp = "LIKE"; .) /*[ESCAPE stringCon]*/ |
155 | ········) |
156 | ········RelExpr<out child> (. if (negated) child.UnaryOp = "NOT"; result.Add(child, newOp); .) |
157 | ····} |
158 | ····| |
159 | ····Identifier <out child> (. result.Add(child); .) |
160 | ········IN "(" |
161 | ········( |
162 | ············NumList <out child> (. child.HasBrackets = true; result.Add(child, "IN"); .) |
163 | ············| StringList <out child> (. child.HasBrackets = true; result.Add(child, "IN"); .) |
164 | ········) |
165 | ········")" |
166 | ·· ) |
167 | (. expression = result.Simplify(); .) |
168 | . |
169 | |
170 | /*------------------------------------------------------------------------*/ |
171 | RelExpr <out OqlExpression expression> |
172 | ····(. |
173 | ········OqlExpression child; |
174 | ········OqlExpression result = new OqlExpression(la.line, la.col); |
175 | ········string newOp = null; |
176 | ········bool negated = false; |
177 | ····.) |
178 | = BitOrExpr<out child> (. result.Add(child); .) |
179 | ··[ |
180 | ····( |
181 | ········"<" (. newOp = "<"; .) |
182 | ········| ">" (. newOp = ">"; .) |
183 | ········| "<=" (. newOp = "<="; .) |
184 | ········| ">=" (. newOp = ">="; .) |
185 | ········| "!<" (. newOp = ">="; .) |
186 | ········| "!>" (. newOp = "<="; .) |
187 | ····) BitOrExpr <out child> (. result.Add(child, newOp); .) |
188 | ····| IS [NOT (. negated = true; .)] NULL (. result.Add(new NamedConstantExpression("NULL", negated, t.line, t.col), "IS"); .) |
189 | ····| [NOT (. negated = true; .)] BETWEEN BitOrExpr <out child> (. result.Add(child, "BETWEEN"); .) |
190 | ································AND BitOrExpr <out child> (. result.Add(child, "BETWEEN"); .) |
191 | ··] |
192 | (. expression = result.Simplify(); .) |
193 | . |
194 | |
195 | /*------------------------------------------------------------------------*/ |
196 | BitOrExpr<out OqlExpression expression> |
197 | ····(. |
198 | ········OqlExpression child; |
199 | ········OqlExpression result = new OqlExpression(la.line, la.col); |
200 | ····.) |
201 | = BitXorExpr <out child> (. result.Add(child); .) |
202 | ··{"|" BitXorExpr <out child> (. result.Add(child, "|"); .) } |
203 | (. expression = result.Simplify(); .) |
204 | . |
205 | |
206 | |
207 | /*------------------------------------------------------------------------*/ |
208 | BitXorExpr<out OqlExpression expression> |
209 | ····(. |
210 | ········OqlExpression child; |
211 | ········OqlExpression result = new OqlExpression(la.line, la.col); |
212 | ····.) |
213 | = BitAndExpr <out child> (. result.Add(child); .) |
214 | ··{"^" BitAndExpr <out child> (. result.Add(child, "^"); .) } |
215 | (. expression = result.Simplify(); .) |
216 | . |
217 | |
218 | |
219 | /*------------------------------------------------------------------------*/ |
220 | BitAndExpr<out OqlExpression expression> |
221 | ····(. |
222 | ········OqlExpression child; |
223 | ········OqlExpression result = new OqlExpression(la.line, la.col); |
224 | ····.) |
225 | = AddExpr <out child> (. result.Add(child); .) |
226 | ··{"&" AddExpr <out child> (. result.Add(child, "&"); .) } |
227 | (. expression = result.Simplify(); .) |
228 | . |
229 | |
230 | |
231 | /*------------------------------------------------------------------------*/ |
232 | AddExpr<out OqlExpression expression> |
233 | ····(. |
234 | ········OqlExpression child; |
235 | ········OqlExpression result = new OqlExpression(la.line, la.col); |
236 | ········string newOp = null; |
237 | ····.) |
238 | = MulExpr<out child> (. result.Add(child); .) |
239 | ····{ |
240 | ········( |
241 | ············"+" (. newOp = "+"; .) |
242 | ············| "-" (. newOp = "-"; .) |
243 | ········) |
244 | ········MulExpr<out child> (. result.Add(child, newOp); .) |
245 | ····} |
246 | (. expression = result.Simplify(); .) |
247 | . |
248 | |
249 | /*------------------------------------------------------------------------*/ |
250 | MulExpr<out OqlExpression expression> |
251 | ····(. |
252 | ········OqlExpression child; |
253 | ········OqlExpression result = new OqlExpression(la.line, la.col); |
254 | ········string newOp = null; |
255 | ····.) |
256 | = Unary<out child> (. result.Add(child); .) |
257 | ····{ |
258 | ········( |
259 | ············"*" (. newOp = "*"; .) |
260 | ············| "/" (. newOp = "/"; .) |
261 | ············| "%" (. newOp = "%"; .) |
262 | ············| "MOD" (. newOp = "MOD"; .) |
263 | ········) |
264 | ········Unary<out child> (. result.Add(child, newOp); .) |
265 | ····} |
266 | (. expression = result.Simplify(); .) |
267 | . |
268 | |
269 | /*------------------------------------------------------------------------*/ |
270 | Unary <out OqlExpression expression> |
271 | ····(. |
272 | ········OqlExpression child; |
273 | ········OqlExpression result = new OqlExpression(la.line, la.col); |
274 | ········string newOp = null; |
275 | ····.) |
276 | |
277 | = [······"+" (. newOp = "+"; .) |
278 | ····| "-" (. newOp = "-"; .) |
279 | ····| "~" (. newOp = "~"; .) |
280 | ··]·· Primary<out child> (. result.Add(child); child.UnaryOp = newOp; .) |
281 | (. expression = result.Simplify(); .)·· |
282 | . |
283 | /*------------------------------------------------------------------------*/ |
284 | Primary <out OqlExpression expression> |
285 | ····(. |
286 | ········OqlExpression result = null; |
287 | ········OqlExpression child; |
288 | ····.) |
289 | =·· |
290 | ··( |
291 | ······ident (. result = new IdentifierExpression(t.val, t.line, t.col); .) |
292 | ············[ |
293 | ················IF(IsOidIdentifier(result)) |
294 | ················"(" intCon |
295 | ····················(. |
296 | ····················result.UnaryOp=""; |
297 | ····················result.Add(new IndexExpression(int.Parse(t.val), t.line, t.col)); |
298 | ····················.) |
299 | ················")" |
300 | ················| |
301 | ················"(" |
302 | ····················ParameterList <out child> |
303 | ····················(. |
304 | ························result = new FunctionExpression(result.Value, t.line, t.col); |
305 | ························result.UnaryOp="";························ |
306 | ························result.Add(child); |
307 | ····················.) |
308 | ················")" |
309 | ············] |
310 | ······| Literal <out result> |
311 | ······| parameter (. result = new ParameterExpression(t.val, t.line, t.col); .) |
312 | ······| "(" RootExpr <out result> (. result.HasBrackets = true; .) ")" |
313 | ··) |
314 | (. expression = result.Simplify(); .)·· |
315 | . |
316 | |
317 | Identifier <out OqlExpression expression> |
318 | ····(. |
319 | ········OqlExpression result = null; |
320 | ····.) |
321 | =·· |
322 | ····ident (. result = new IdentifierExpression(t.val, t.line, t.col); .) |
323 | (. expression = result.Simplify(); .)·· |
324 | . |
325 | |
326 | NumList <out OqlExpression expression> |
327 | ····(. ········ |
328 | ········OqlExpression result = new OqlExpression(la.line, la.col); |
329 | ····.) |
330 | = |
331 | ····( |
332 | ········realCon (. result.Add(new NumberExpression(double.Parse(t.val, CultureInfo.InvariantCulture ), t.line, t.col)); .) |
333 | ········| intCon (. result.Add(new NumberExpression(int.Parse(t.val), t.line, t.col)); .) |
334 | ····) |
335 | { |
336 | ····"," |
337 | ····( |
338 | ········realCon (. result.Add(new NumberExpression(double.Parse(t.val, CultureInfo.InvariantCulture ), t.line, t.col), ","); .) |
339 | ········| intCon (. result.Add(new NumberExpression(int.Parse(t.val), t.line, t.col), ","); .) |
340 | ····) |
341 | } |
342 | (. expression = result.Simplify(); .) |
343 | . |
344 | |
345 | StringList <out OqlExpression expression> |
346 | ····(. |
347 | ········OqlExpression result = new OqlExpression(la.line, la.col); |
348 | ····.) |
349 | = |
350 | ····stringCon (. result.Add(new StringLiteralExpression(t.val, t.line, t.col)); .) |
351 | ····{ |
352 | ········"," |
353 | ········stringCon (. result.Add(new StringLiteralExpression(t.val, t.line, t.col), ","); .) |
354 | ····} |
355 | (. expression = result; /* Do not simplify here, because otherwise the brackets are missing */ .) |
356 | . |
357 | |
358 | ParameterList <out OqlExpression expression> |
359 | ····(. |
360 | ········OqlExpression result = new ParameterListExpression(la.line, la.col); |
361 | ········OqlExpression child; |
362 | ····.) |
363 | = |
364 | ····[ |
365 | ········Primary <out child> (. result.Add(child); .) |
366 | ········{ |
367 | ············"," |
368 | ············Primary <out child> (. result.Add(child, ","); .) |
369 | ········} |
370 | ····] |
371 | (. expression = result; /* Do not simplify here, because otherwise the brackets are missing */ .) |
372 | . |
373 | |
374 | |
375 | |
376 | /*------------------------------------------------------------------------*/ |
377 | Literal <out OqlExpression expression> |
378 | ····(. |
379 | ········OqlExpression result = null; |
380 | ····.) |
381 | = |
382 | ( |
383 | ···· realCon (. result = new NumberExpression(double.Parse(t.val, CultureInfo.InvariantCulture ), t.line, t.col); .) |
384 | ····| intCon (. result = new NumberExpression(int.Parse(t.val), t.line, t.col); .) |
385 | ····| stringCon (. result = new StringLiteralExpression(t.val, t.line, t.col); .) |
386 | ····| "TRUE" (. result = new NamedConstantExpression("TRUE", t.line, t.col); .) |
387 | ····| "FALSE" (. result = new NamedConstantExpression("FALSE", t.line, t.col); .) |
388 | ····| "NULL" (. result = new NamedConstantExpression("NULL", t.line, t.col); .) |
389 | ) |
390 | (. expression = result.Simplify(); .)·· |
391 | . |
392 | |
393 | END NDOQL. |
394 |
New Commit (fe801ed)
1 | using System.Collections.Generic; |
2 | using System.Text; |
3 | using System.Globalization; |
4 | using NDOql.Expressions; |
5 | |
6 | COMPILER NDOQL |
7 | |
8 | |
9 | OqlExpression rootExpression; |
10 | public OqlExpression RootExpression |
11 | { |
12 | ····get { return rootExpression; } |
13 | } |
14 | |
15 | |
16 | |
17 | /*------------------------------------------------------------------------* |
18 | *----- SCANNER DESCRIPTION ----------------------------------------------* |
19 | *------------------------------------------------------------------------*/ |
20 | |
21 | IGNORECASE |
22 | |
23 | CHARACTERS |
24 | |
25 | ····tab················= '\u0009'. /*··9 = tabulator */ |
26 | ····eol················= '\u000a'. /* 10 = line feed */ |
27 | ····cr················ = '\u000d'. /* 13 = carriage return */ |
28 | ····newLine············= cr + eol. /* Line separator character (U+2028) + Paragraph separator character (U+2029) */ |
29 | |
30 | ····startletter········= 'A' .. 'Z' + 'a' .. 'z' + '_' + '\u00aa' + '\u00b5' + '\u00ba' + '\u00c0' .. '\u00d6' + '\u00d8' .. '\u00f6' + '\u00f8' .. '\u00ff'. |
31 | ····partletter········ = '.' + '0' .. '9' + 'A' .. 'Z' + 'a' .. 'z' + '_' + '\u0080' + '\u00a0' .. '\u00b3' + '\u00b5' + '\u00ba' + '\u00c0' .. '\u00d6' + '\u00d8' .. '\u00f6' + '\u00f8' .. '\u00ff'. |
32 | |
33 | ····digit··············= "0123456789". |
34 | ····hexDigit·········· = digit + "ABCDEFabcdef". |
35 | ····notDigit·········· = ANY - digit. |
36 | |
37 | ····regularStringChar··= ANY - "'" - newLine. |
38 | ····notNewLine········ = ANY - newLine . |
39 | ····ws················ = " " + tab + '\u000b' + '\u000c'. /* Any character with Unicode class Zs */ |
40 | |
41 | |
42 | TOKENS |
43 | |
44 | ··/* This definition is not exact, as it allows '_.x' or 'x..y' as valid identifiers. But we couldn't get a mapping to that kind of wrong identifiers anyway. */ |
45 | ····ident = startletter { partletter }.···· |
46 | |
47 | ··/*--------------------------------------------------------------------------------*/ |
48 | ····realCon = |
49 | ····['-'] [digit {digit}] "." digit {digit} |
50 | ············[("e" | "E" ) ["+" | "-"] digit {digit} ] ···················· |
51 | ········. |
52 | |
53 | ··/*--------------------------------------------------------------------------------*/ |
54 | ····intCon = |
55 | ········['-'] (digit {digit} | digit {digit} ) |
56 | ········. |
57 | |
58 | ··/*--------------------------------------------------------------------------------*/ |
59 | stringCon = "'" { regularStringChar | "\'\'" } "'". |
60 | |
61 | |
62 | ····/*----- keyword names needed in LL(1) resolvers -----*/ |
63 | ····AND······= "AND". |
64 | ····OR······ = "OR". |
65 | ····NOT······= "NOT". |
66 | ····LIKE···· = "LIKE". |
67 | ····ESCAPE·· = "ESCAPE". |
68 | ····BETWEEN··= "BETWEEN". |
69 | ····IS······ = "IS". |
70 | ····NULL···· = "NULL". |
71 | ····TRUE······= "TRUE". |
72 | ····MOD···· = "MOD". |
73 | ····IN···· = "IN". |
74 | |
75 | |
76 | ····parameter =··"{" digit "}". |
77 | |
78 | |
79 | |
80 | COMMENTS FROM "--" TO eol |
81 | |
82 | IGNORE eol + cr + tab |
83 | |
84 | PRODUCTIONS |
85 | |
86 | /*------------------------------------------------------------------------* |
87 | *--------------------------- Declarations -------------------------------* |
88 | *------------------------------------------------------------------------*/ |
89 | |
90 | NDOQL = RootExpr<out this.rootExpression> . |
91 | |
92 | /*------------------------------------------------------------------------*/ |
93 | |
94 | RootExpr<out OqlExpression expression> |
95 | ····(.··OqlExpression child; |
96 | ········OqlExpression result = new OqlExpression(la.line, la.col); |
97 | ········bool negated = false; |
98 | ····.) |
99 | = ····[NOT (.negated = true; .)] OrExpr<out child> |
100 | (. |
101 | ····if (negated) result.UnaryOp = "NOT"; |
102 | ····result.Add(child); |
103 | ····expression = result.Simplify(); |
104 | .) |
105 | . |
106 | |
107 | /*------------------------------------------------------------------------*/ |
108 | OrExpr <out OqlExpression expression>·· |
109 | ····(. |
110 | ········OqlExpression child; |
111 | ········OqlExpression result = new OqlExpression(la.line, la.col); |
112 | ····.) |
113 | |
114 | = AndExpr ············<out child> (. result.Add(child); .) |
115 | ··{ "OR" (. bool negated = false; .) [NOT (. negated = true; .)] |
116 | ··AndExpr<out child> (. if (negated) child.UnaryOp = "NOT"; result.Add(child, "OR"); .) |
117 | ··} |
118 | |
119 | (. expression = result.Simplify(); .) |
120 | . |
121 | |
122 | |
123 | /*------------------------------------------------------------------------*/ |
124 | AndExpr<out OqlExpression expression>·· |
125 | ····(. |
126 | ········OqlExpression child; |
127 | ········OqlExpression result = new OqlExpression(la.line, la.col); |
128 | ····.) |
129 | = EqlExpr<out child> (. result.Add(child); .) { |
130 | ················································"AND" (. bool negated = false; .) [NOT (. negated = true; .)] |
131 | ················································EqlExpr<out child> (. if (negated) child.UnaryOp = "NOT"; result.Add(child, "AND"); .) |
132 | ··············································} |
133 | (. expression = result.Simplify(); .) |
134 | . |
135 | |
136 | |
137 | /*------------------------------------------------------------------------*/ |
138 | EqlExpr<out OqlExpression expression> |
139 | ····(. |
140 | ········OqlExpression child; |
141 | ········OqlExpression result = new OqlExpression(la.line, la.col); |
142 | ········string newOp = null; |
143 | ········bool negated = false; |
144 | ····.) |
145 | ···· |
146 | = ( |
147 | ····IF(!(scanner.Peek().kind==_IN)) |
148 | ····RelExpr<out child> (. result.Add(child); .) |
149 | ····{ |
150 | ········( |
151 | ············"!=" (. newOp = "<>"; .) |
152 | ············| "<>" (. newOp = "<>"; .) |
153 | ············| "=" (. newOp = "="; .) [NOT (. negated = true; .)] |
154 | ············| "LIKE" (. newOp = "LIKE"; .) /*[ESCAPE stringCon]*/ |
155 | ········) |
156 | ········RelExpr<out child> (. if (negated) child.UnaryOp = "NOT"; result.Add(child, newOp); .) |
157 | ····} |
158 | ····| |
159 | ····Identifier <out child> (. result.Add(child); .) |
160 | ········IN "(" |
161 | ········( |
162 | ············NumList <out child> (. child.HasBrackets = true; result.Add(child, "IN"); .) |
163 | ············| StringList <out child> (. child.HasBrackets = true; result.Add(child, "IN"); .) |
164 | ········) |
165 | ········")" |
166 | ·· ) |
167 | (. expression = result.Simplify(); .) |
168 | . |
169 | |
170 | /*------------------------------------------------------------------------*/ |
171 | RelExpr <out OqlExpression expression> |
172 | ····(. |
173 | ········OqlExpression child; |
174 | ········OqlExpression result = new OqlExpression(la.line, la.col); |
175 | ········string newOp = null; |
176 | ········bool negated = false; |
177 | ····.) |
178 | = BitOrExpr<out child> (. result.Add(child); .) |
179 | ··[ |
180 | ····( |
181 | ········"<" (. newOp = "<"; .) |
182 | ········| ">" (. newOp = ">"; .) |
183 | ········| "<=" (. newOp = "<="; .) |
184 | ········| ">=" (. newOp = ">="; .) |
185 | ········| "!<" (. newOp = ">="; .) |
186 | ········| "!>" (. newOp = "<="; .) |
187 | ····) BitOrExpr <out child> (. result.Add(child, newOp); .) |
188 | ····| IS [NOT (. negated = true; .)] NULL (. result.Add(new NamedConstantExpression("NULL", negated, t.line, t.col), "IS"); .) |
189 | ····| [NOT (. negated = true; .)] BETWEEN BitOrExpr <out child> (. result.Add(child, "BETWEEN"); .) |
190 | ································AND BitOrExpr <out child> (. result.Add(child, "BETWEEN"); .) |
191 | ··] |
192 | (. expression = result.Simplify(); .) |
193 | . |
194 | |
195 | /*------------------------------------------------------------------------*/ |
196 | BitOrExpr<out OqlExpression expression> |
197 | ····(. |
198 | ········OqlExpression child; |
199 | ········OqlExpression result = new OqlExpression(la.line, la.col); |
200 | ····.) |
201 | = BitXorExpr <out child> (. result.Add(child); .) |
202 | ··{"|" BitXorExpr <out child> (. result.Add(child, "|"); .) } |
203 | (. expression = result.Simplify(); .) |
204 | . |
205 | |
206 | |
207 | /*------------------------------------------------------------------------*/ |
208 | BitXorExpr<out OqlExpression expression> |
209 | ····(. |
210 | ········OqlExpression child; |
211 | ········OqlExpression result = new OqlExpression(la.line, la.col); |
212 | ····.) |
213 | = BitAndExpr <out child> (. result.Add(child); .) |
214 | ··{"^" BitAndExpr <out child> (. result.Add(child, "^"); .) } |
215 | (. expression = result.Simplify(); .) |
216 | . |
217 | |
218 | |
219 | /*------------------------------------------------------------------------*/ |
220 | BitAndExpr<out OqlExpression expression> |
221 | ····(. |
222 | ········OqlExpression child; |
223 | ········OqlExpression result = new OqlExpression(la.line, la.col); |
224 | ····.) |
225 | = AddExpr <out child> (. result.Add(child); .) |
226 | ··{"&" AddExpr <out child> (. result.Add(child, "&"); .) } |
227 | (. expression = result.Simplify(); .) |
228 | . |
229 | |
230 | |
231 | /*------------------------------------------------------------------------*/ |
232 | AddExpr<out OqlExpression expression> |
233 | ····(. |
234 | ········OqlExpression child; |
235 | ········OqlExpression result = new OqlExpression(la.line, la.col); |
236 | ········string newOp = null; |
237 | ····.) |
238 | = MulExpr<out child> (. result.Add(child); .) |
239 | ····{ |
240 | ········( |
241 | ············"+" (. newOp = "+"; .) |
242 | ············| "-" (. newOp = "-"; .) |
243 | ········) |
244 | ········MulExpr<out child> (. result.Add(child, newOp); .) |
245 | ····} |
246 | (. expression = result.Simplify(); .) |
247 | . |
248 | |
249 | /*------------------------------------------------------------------------*/ |
250 | MulExpr<out OqlExpression expression> |
251 | ····(. |
252 | ········OqlExpression child; |
253 | ········OqlExpression result = new OqlExpression(la.line, la.col); |
254 | ········string newOp = null; |
255 | ····.) |
256 | = Unary<out child> (. result.Add(child); .) |
257 | ····{ |
258 | ········( |
259 | ············"*" (. newOp = "*"; .) |
260 | ············| "/" (. newOp = "/"; .) |
261 | ············| "%" (. newOp = "%"; .) |
262 | ············| "MOD" (. newOp = "MOD"; .) |
263 | ········) |
264 | ········Unary<out child> (. result.Add(child, newOp); .) |
265 | ····} |
266 | (. expression = result.Simplify(); .) |
267 | . |
268 | |
269 | /*------------------------------------------------------------------------*/ |
270 | Unary <out OqlExpression expression> |
271 | ····(. |
272 | ········OqlExpression child; |
273 | ········OqlExpression result = new OqlExpression(la.line, la.col); |
274 | ········string newOp = null; |
275 | ····.) |
276 | |
277 | = [······"+" (. newOp = "+"; .) |
278 | ····| "-" (. newOp = "-"; .) |
279 | ····| "~" (. newOp = "~"; .) |
280 | ··]·· Primary<out child> (. result.Add(child); child.UnaryOp = newOp; .) |
281 | (. expression = result.Simplify(); .)·· |
282 | . |
283 | /*------------------------------------------------------------------------*/ |
284 | Primary <out OqlExpression expression> |
285 | ····(. |
286 | ········OqlExpression result = null; |
287 | ········OqlExpression child; |
288 | ····.) |
289 | =·· |
290 | ··( |
291 | ······ident (. result = new IdentifierExpression(t.val, t.line, t.col); .) |
292 | ············[ |
293 | ················IF(IsOidIdentifier(result)) |
294 | ················"(" intCon |
295 | ····················(. |
296 | ····················result.UnaryOp=""; |
297 | ····················result.Add(new IndexExpression(int.Parse(t.val), t.line, t.col)); |
298 | ····················.) |
299 | ················")" |
300 | ················| |
301 | ················"(" |
302 | ····················ParameterList <out child> |
303 | ····················(. |
304 | ························result = new FunctionExpression(result.Value, t.line, t.col); |
305 | ························result.UnaryOp="";························ |
306 | ························result.Add(child); |
307 | ····················.) |
308 | ················")" |
309 | ············] |
310 | ······| Literal <out result> |
311 | ······| parameter (. result = new ParameterExpression(t.val, t.line, t.col); .) |
312 | ······| "(" RootExpr <out result> (. result.HasBrackets = true; .) ")" |
313 | ··) |
314 | (. expression = result.Simplify(); .)·· |
315 | . |
316 | |
317 | Identifier <out OqlExpression expression> |
318 | ····(. |
319 | ········OqlExpression result = null; |
320 | ····.) |
321 | =·· |
322 | ····ident (. result = new IdentifierExpression(t.val, t.line, t.col); .) |
323 | (. expression = result.Simplify(); .)·· |
324 | . |
325 | |
326 | NumList <out OqlExpression expression> |
327 | ····(. ········ |
328 | ········OqlExpression result = new OqlExpression(la.line, la.col); |
329 | ····.) |
330 | = |
331 | ····( |
332 | ········realCon (. result.Add(new NumberExpression(double.Parse(t.val, CultureInfo.InvariantCulture ), t.line, t.col)); .) |
333 | ········| intCon (. result.Add(new NumberExpression(int.Parse(t.val), t.line, t.col)); .) |
334 | ····) |
335 | { |
336 | ····"," |
337 | ····( |
338 | ········realCon (. result.Add(new NumberExpression(double.Parse(t.val, CultureInfo.InvariantCulture ), t.line, t.col), ","); .) |
339 | ········| intCon (. result.Add(new NumberExpression(int.Parse(t.val), t.line, t.col), ","); .) |
340 | ····) |
341 | } |
342 | (. expression = result.Simplify(); .) |
343 | . |
344 | |
345 | StringList <out OqlExpression expression> |
346 | ····(. |
347 | ········OqlExpression result = new OqlExpression(la.line, la.col); |
348 | ····.) |
349 | = |
350 | ····stringCon (. result.Add(new StringLiteralExpression(t.val, t.line, t.col)); .) |
351 | ····{ |
352 | ········"," |
353 | ········stringCon (. result.Add(new StringLiteralExpression(t.val, t.line, t.col), ","); .) |
354 | ····} |
355 | (. expression = result; /* Do not simplify here, because otherwise the brackets are missing */ .) |
356 | . |
357 | |
358 | ParameterList <out OqlExpression expression> |
359 | ····(. |
360 | ········OqlExpression result = new ParameterListExpression(la.line, la.col); |
361 | ········OqlExpression child; |
362 | ····.) |
363 | = |
364 | ····[ |
365 | ········Primary <out child> (. result.Add(child); .) |
366 | ········{ |
367 | ············"," |
368 | ············Primary <out child> (. result.Add(child, ","); .) |
369 | ········} |
370 | ····] |
371 | (. expression = result; /* Do not simplify here, because otherwise the brackets are missing */ .) |
372 | . |
373 | |
374 | |
375 | |
376 | /*------------------------------------------------------------------------*/ |
377 | Literal <out OqlExpression expression> |
378 | ····(. |
379 | ········OqlExpression result = null; |
380 | ····.) |
381 | = |
382 | ( |
383 | ···· realCon (. result = new NumberExpression(double.Parse(t.val, CultureInfo.InvariantCulture ), t.line, t.col); .) |
384 | ····| intCon (. result = new NumberExpression(int.Parse(t.val), t.line, t.col); .) |
385 | ····| stringCon (. result = new StringLiteralExpression(t.val, t.line, t.col); .) |
386 | ····| "TRUE" (. result = new NamedConstantExpression("TRUE", t.line, t.col); .) |
387 | ····| "FALSE" (. result = new NamedConstantExpression("FALSE", t.line, t.col); .) |
388 | ····| "NULL" (. result = new NamedConstantExpression("NULL", t.line, t.col); .) |
389 | ) |
390 | (. expression = result.Simplify(); .)·· |
391 | . |
392 | |
393 | END NDOQL. |
394 |