Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.library / org.gvsig.expressionevaluator / org.gvsig.expressionevaluator.lib / org.gvsig.expressionevaluator.lib.impl / src / main / java / org / gvsig / expressionevaluator / impl / grammars / BasicGrammarFactory.java @ 46091

History | View | Annotate | Download (24.6 KB)

1
package org.gvsig.expressionevaluator.impl.grammars;
2

    
3
import org.apache.commons.lang3.StringUtils;
4
import org.gvsig.expressionevaluator.Code;
5
import static org.gvsig.expressionevaluator.ExpressionBuilder.FUNCTION_CAST;
6
import static org.gvsig.expressionevaluator.ExpressionBuilder.FUNCTION_DATE;
7
import static org.gvsig.expressionevaluator.ExpressionBuilder.FUNCTION_EXTRACT;
8
import static org.gvsig.expressionevaluator.ExpressionBuilder.FUNCTION_LIST;
9
import static org.gvsig.expressionevaluator.ExpressionBuilder.FUNCTION_TIME;
10
import static org.gvsig.expressionevaluator.ExpressionBuilder.FUNCTION_TIMESTAMP;
11
import static org.gvsig.expressionevaluator.ExpressionBuilder.OPERATOR_REGEXP;
12
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
13
import org.gvsig.expressionevaluator.ExpressionEvaluatorManager;
14
import org.gvsig.expressionevaluator.Grammar;
15
import org.gvsig.expressionevaluator.Statement;
16
import org.gvsig.expressionevaluator.Statement.StatementContext;
17
import org.gvsig.expressionevaluator.impl.DefaultCodeBuilder.BaseCodes;
18
import org.gvsig.expressionevaluator.impl.DefaultStatement.StatementBuilderBase;
19
import org.gvsig.expressionevaluator.impl.DefaultStatement.ArgsBuilderFromNames;
20
import org.gvsig.expressionevaluator.impl.function.programming.CaseFunction;
21
import org.gvsig.expressionevaluator.impl.function.programming.CodeBlockFunction;
22
import org.gvsig.expressionevaluator.impl.function.programming.CodeBlockWithExceptFunction;
23
import org.gvsig.expressionevaluator.impl.function.programming.CreateFnFunction;
24
import org.gvsig.expressionevaluator.impl.function.programming.ForEachFunction;
25
import org.gvsig.expressionevaluator.impl.function.programming.ReturnFunction;
26
import org.gvsig.expressionevaluator.impl.function.programming.WhileFunction;
27
import org.gvsig.expressionevaluator.spi.AbstractGrammarFactory;
28
import org.gvsig.expressionevaluator.Code.Callable;
29
import org.gvsig.expressionevaluator.Codes;
30
import org.gvsig.expressionevaluator.ExpressionBuilder;
31
import static org.gvsig.expressionevaluator.ExpressionBuilder.FUNCTION_DICT;
32

    
33
/**
34
 *
35
 * @author jjdelcerro
36
 */
37
public class BasicGrammarFactory extends AbstractGrammarFactory {
38

    
39
    private Grammar grammar;
40

    
41
    public static class DictArgsBuilder implements Statement.ArgsBuilder {
42

    
43
        protected final String keyName;
44
        protected final String valueName;
45

    
46
        public DictArgsBuilder(String keyName, String valueName) {
47
            this.keyName = keyName;
48
            this.valueName = valueName;
49
        }
50

    
51
        @Override
52
        public String toString() {
53
            return "dict_args(" + this.keyName + "," + this.valueName + ")";
54
        }
55

    
56
        @Override
57
        public Codes build(StatementContext context) {
58
            context.trace(this.toString() + ".build");
59
            BaseCodes args = (BaseCodes) context.getCodeBuilder().args();
60
            if (keyName.contains("#")) {
61
                int n = 1;
62
                while (true) {
63
                    String keyNameX = StringUtils.replace(keyName, "#", String.valueOf(n).trim(), 1);
64
                    String valueNameX = StringUtils.replace(valueName, "#", String.valueOf(n).trim(), 1);
65
                    Code keyCodeX = context.getCode(keyNameX);
66
                    if (keyCodeX == null) {
67
                        break;
68
                    }
69
                    Code valueCodeX = context.getCode(valueNameX);
70
                    args.add(keyCodeX);
71
                    args.add(valueCodeX);
72
                    n++;
73
                }
74
            } else {
75
                args.add(context.getCodeBuilder().constant(keyName));
76
                args.add(context.getCode(valueName));
77
            }
78
            return args;
79
        }
80
    }
81

    
82
    private class BeginStatementBuilder extends StatementBuilderBase {
83

    
84
        private final String blockID;
85
        private final String exceptID;
86

    
87
        public BeginStatementBuilder(String blockID, String exceptID) {
88
            super(CodeBlockFunction.NAME, new ArgsBuilderFromNames(blockID));
89
            this.blockID = blockID;
90
            this.exceptID = exceptID;
91
        }
92

    
93
        @Override
94
        public Code build(StatementContext context) {
95
            Callable code = (Callable) super.build(context);
96
            Code exceptCode = context.getCode(this.exceptID);
97
            if (exceptCode == null) {
98
                return code;
99
            }
100
            BaseCodes args = (BaseCodes) code.parameters();
101
            args.add(exceptCode);
102
            code = context.getCodeBuilder().function(CodeBlockWithExceptFunction.NAME, args);
103
            return code;
104
        }
105

    
106
    }
107

    
108
    public static class VarArgsBuilder implements Statement.ArgsBuilder {
109

    
110
        protected final String varName;
111
        protected final String valueName;
112

    
113
        public VarArgsBuilder(String varName, String valueName) {
114
            this.varName = varName;
115
            this.valueName = valueName;
116
        }
117

    
118
        @Override
119
        public String toString() {
120
          return "var_args("+varName+","+valueName+")";
121
        }
122
        
123
        @Override
124
        public Codes build(StatementContext context) {
125
            context.trace(this.toString()+".build");
126
            BaseCodes args = (BaseCodes) context.getCodeBuilder().args();
127
            args.add(context.getCodeBuilder().identifier((String) ((Code.Constant)context.getCode(varName)).value()));
128
            args.add(context.getCode(valueName));
129
            return args;
130
        }
131
    }
132

    
133
    
134
    
135
    public BasicGrammarFactory() {
136
        super("Basic", true);
137
    }
138

    
139
    @Override
140
    public Grammar create(Object... parameters) {
141
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
142
        if (this.grammar == null) {
143
            Grammar theGrammar = manager.createGrammar(this.getName());
144

    
145
            theGrammar.addStatement(this.createArrayStatement(theGrammar));
146
            theGrammar.addStatement(this.createBlockStatement(theGrammar));
147
            theGrammar.addStatement(this.createCallStatement(theGrammar));
148
            theGrammar.addStatement(this.createCaseStatement(theGrammar));
149
            theGrammar.addStatement(this.createCastStatement(theGrammar));
150
            theGrammar.addStatement(this.createDateStatement(theGrammar));
151
            theGrammar.addStatement(this.createDictStatement(theGrammar));
152
            theGrammar.addStatement(this.createExtractStatement(theGrammar));
153
            theGrammar.addStatement(this.createForeachStatement(theGrammar));
154
            theGrammar.addStatement(this.createFunctionStatement(theGrammar));
155
            theGrammar.addStatement(this.createIfStatement(theGrammar));
156
            theGrammar.addStatement(this.createLambdaStatement(theGrammar));
157
            theGrammar.addStatement(this.createLet1Statement(theGrammar));
158
            theGrammar.addStatement(this.createLet2Statement(theGrammar));
159
            theGrammar.addStatement(this.createVarStatement(theGrammar));
160
            theGrammar.addStatement(this.createListStatement(theGrammar));
161
            theGrammar.addStatement(this.createMatchStatement(theGrammar));
162
            theGrammar.addStatement(this.createPassStatement(theGrammar));
163
            theGrammar.addStatement(this.createReturnStatement(theGrammar));
164
            theGrammar.addStatement(this.createTimeStatement(theGrammar));
165
            theGrammar.addStatement(this.createTimestampStatement(theGrammar));
166
            theGrammar.addStatement(this.createWhileStatement(theGrammar));
167
            theGrammar.addStatement(this.create$ConstantStatement(theGrammar));
168

    
169
            this.grammar = theGrammar;
170
        }
171
        return grammar;
172
    }
173

    
174
    private Statement createBlockStatement(Grammar theGrammar) {
175
        Statement stmt;
176

    
177
        theGrammar.addReservedWord("BEGIN");
178
        theGrammar.addReservedWord("EXCEPT");
179
        theGrammar.addReservedWord("END");
180

    
181
        stmt = theGrammar.createStatement("BLOCK");
182
        stmt.addRule(stmt.require_any_token("BEGIN"));
183
        stmt.addRule(stmt.require_expressions(";").capture_as("VALUES"));
184
        stmt.addRule(stmt.optional_any_token("EXCEPT")
185
                .addRuleOnTrue(stmt.require_expressions(";").capture_as("EXCEPT"))
186
        );
187
        stmt.addRule(stmt.require_any_token("END"));
188
        stmt.builder(new BeginStatementBuilder("VALUES", "EXCEPT"));
189
        return stmt;
190
    }
191
        
192
    private Statement create$ConstantStatement(Grammar theGrammar) {
193
        Statement stmt;
194

    
195
        stmt = theGrammar.createStatement("$Constant");
196
        stmt.addRule(stmt.require_any_token("<%"));
197
        stmt.addRule(stmt.require_any_token("="));
198
        stmt.addRule(stmt.require_expression().capture_as("VALUE"));
199
        stmt.addRule(stmt.require_any_token("%>"));
200
                stmt.code(
201
                                  ExpressionBuilder.FUNCTION_$CONSTANT,
202
                                  stmt.args_names("VALUE")
203
                          );
204
        return stmt;
205
    }
206

    
207
    private Statement createIfStatement(Grammar theGrammar) {
208
        Statement stmt;
209

    
210
        theGrammar.addReservedWord("IF");
211
        theGrammar.addReservedWord("THEN");
212
        theGrammar.addReservedWord("ELSE");
213
        theGrammar.addReservedWord("END");
214

    
215
        stmt = theGrammar.createStatement("IF");
216
        stmt.addRule(stmt.require_any_token("IF"));
217
        stmt.addRule(stmt.require_expression().capture_as("CONDITION"));
218
        stmt.addRule(stmt.require_any_token("THEN", ":"));
219
        stmt.addRule(stmt.require_expressions(";").capture_as("ONTRUE"));
220
        stmt.addRule(stmt.optional_any_token("ELSE")
221
                .addRuleOnTrue(stmt.optional_any_token(":"))
222
                .addRuleOnTrue(stmt.require_expressions(";").capture_as("ONFALSE"))
223
        );
224
        stmt.addRule(stmt.require_any_token("END"));
225
        stmt.addRule(stmt.optional_any_token("IF"));
226
        stmt.code(
227
                ExpressionBuilder.FUNCTION_IF,
228
                stmt.args_names("CONDITION", "ONTRUE", "ONFALSE")
229
        );
230
        return stmt;
231
    }
232

    
233
    private Statement createWhileStatement(Grammar theGrammar) {
234
        Statement stmt;
235

    
236
        theGrammar.addReservedWord("WHILE");
237
        theGrammar.addReservedWord("BEGIN");
238
        theGrammar.addReservedWord("END");
239
        theGrammar.addReservedWord("LOOP");
240

    
241
        stmt = theGrammar.createStatement("WHILE");
242
        stmt.addRule(stmt.require_any_token("WHILE"));
243
        stmt.addRule(stmt.require_expression().capture_as("CONDITION"));
244
        stmt.addRule(stmt.require_any_token("BEGIN", ":", "LOOP"));
245
        stmt.addRule(stmt.require_expressions(";").capture_as("BODY"));
246
        stmt.addRule(stmt.require_any_token("END"));
247
        stmt.addRule(stmt.optional_any_token("WHILE", "LOOP"));
248
        stmt.code(
249
                WhileFunction.NAME,
250
                stmt.args_names("CONDITION", "BODY")
251
        );
252
        return stmt;
253
    }
254

    
255
    private Statement createForeachStatement(Grammar theGrammar) {
256
        Statement stmt;
257

    
258
        theGrammar.addReservedWord("FOR");
259
        theGrammar.addReservedWord("IN");
260
        theGrammar.addReservedWord("BEGIN");
261
        theGrammar.addReservedWord("END");
262
        theGrammar.addReservedWord("LOOP");
263

    
264
        stmt = theGrammar.createStatement("FOREACH");
265
        stmt.addRule(stmt.require_any_token("FOR", "FOREACH"));
266
        stmt.addRule(stmt.require_identifier().capture_as("VAR"));
267
        stmt.addRule(stmt.require_any_token("IN"));
268
        stmt.addRule(stmt.require_expression().capture_as("ITERABLE"));
269
        stmt.addRule(stmt.require_any_token("BEGIN", ":", "LOOP"));
270
        stmt.addRule(stmt.require_expressions(";").capture_as("BODY"));
271
        stmt.addRule(stmt.require_any_token("END"));
272
        stmt.addRule(stmt.optional_any_token("FOR", "LOOP"));
273
        stmt.code(
274
                ForEachFunction.NAME,
275
                stmt.args_names("VAR", "ITERABLE", "BODY")
276
        );
277
        return stmt;
278
    }
279

    
280
    private Statement createCaseStatement(Grammar theGrammar) {
281
        Statement stmt;
282

    
283
        theGrammar.addReservedWord("CASE");
284
        theGrammar.addReservedWord("WHEN");
285
        theGrammar.addReservedWord("THEN");
286
        theGrammar.addReservedWord("ELSE");
287
        theGrammar.addReservedWord("END");
288

    
289
        stmt = theGrammar.createStatement("CASE");
290
        stmt.addRule(stmt.require_any_token("CASE"));
291
        stmt.addRule(
292
                stmt.repeat_until_any_tokens("END", "ELSE")
293
                        .addRule(stmt.require_any_token("WHEN"))
294
                        .addRule(stmt.require_expression().capture_as("CONDITION#"))
295
                        .addRule(stmt.require_any_token("THEN", ":"))
296
                        .addRule(stmt.require_expressions(";").capture_as("ONTRUE#"))
297
        );
298
        stmt.addRule(stmt.optional_any_token("ELSE")
299
                .addRuleOnTrue(stmt.optional_any_token(":"))
300
                .addRuleOnTrue(stmt.require_expressions(";").capture_as("ELSE"))
301
        );
302
        stmt.addRule(stmt.require_any_token("END"));
303
        stmt.addRule(stmt.optional_any_token("CASE"));
304
        stmt.code(
305
                CaseFunction.NAME,
306
                stmt.args_names("CONDITION#", "ONTRUE#", "ELSE")
307
        );
308
        return stmt;
309
    }
310

    
311
    private Statement createFunctionStatement(Grammar theGrammar) {
312
        Statement stmt;
313

    
314
        theGrammar.addReservedWord("CREATE");
315
        theGrammar.addReservedWord("FUNCTION");
316
        theGrammar.addReservedWord("PROCEDURE");
317
        theGrammar.addReservedWord("AS");
318
        theGrammar.addReservedWord("BEGIN");
319
        theGrammar.addReservedWord("END");
320
        theGrammar.addReservedWord("$$"); // ???? Asi van las funciones en PostgreSQL
321

    
322
        stmt = theGrammar.createStatement("USERFUNCTION");
323
        stmt.addRule(stmt.require_any_token("CREATE"));
324
        stmt.addRule(stmt.optional_any_token("OR")
325
                .addRuleOnTrue(stmt.optional_any_token("REPLACE"))
326
        );
327
        stmt.addRule(stmt.optional_any_token("FUNCTION", "PROCEDURE"));
328
        stmt.addRule(stmt.require_identifier().capture_as("FUNCTION_NAME"));
329
        stmt.addRule(stmt.optional_any_token("("));
330
        stmt.addRule(stmt.optional_identifiers(",").capture_as("PARAMETERS"));
331
        stmt.addRule(stmt.optional_any_token(")"));
332
        stmt.addRule(stmt.require_any_token("AS"));
333
        stmt.addRule(stmt.optional_any_token("$$", "BEGIN")
334
                .addRuleOnTrue(stmt.require_expressions(";").capture_as("BODY"))
335
                .addRuleOnTrue(stmt.require_any_token("$$", "END"))
336
                .addRuleOnTrue(stmt.optional_any_token("FUNCTION", "PROCEDURE"))
337
                .addRuleOnFalse(stmt.optional_literal_string().capture_as("SCRIPT_PATH")
338
                        .addRuleOnTrue(stmt.require_any_token(","))
339
                        .addRuleOnTrue(stmt.require_literal_string().capture_as("SCRIPT_FUNCTION"))
340
                        .addRuleOnTrue(stmt.optional_any_token("LANGUAGE")
341
                                .addRuleOnTrue(stmt.require_literal_string().capture_as("LANGUAGE"))
342
                        )
343
                )
344
        );
345
        stmt.code(
346
                CreateFnFunction.NAME,
347
                stmt.fixed_args_names("FUNCTION_NAME", "PARAMETERS", "BODY", "SCRIPT_PATH", "SCRIPT_FUNCTION", "LANGUAGE")
348
        );
349
        return stmt;
350
    }
351

    
352
    private Statement createLambdaStatement(Grammar theGrammar) {
353
        Statement stmt;
354

    
355
        theGrammar.addReservedWord("LAMBDA");
356

    
357
        stmt = theGrammar.createStatement("LAMBDA");
358
        stmt.addRule(stmt.require_any_token("LAMBDA"));
359
        stmt.addRule(stmt.optional_identifiers(",").capture_as("PARAMETERS"));
360
        stmt.addRule(stmt.require_any_token(":"));
361
        stmt.addRule(stmt.require_expression().capture_as("BODY"));
362
        stmt.code(
363
                CreateFnFunction.NAME,
364
                stmt.fixed_args_names("PARAMETERS", "BODY")
365
        );
366
        return stmt;
367
    }
368

    
369
    private Statement createReturnStatement(Grammar theGrammar) {
370
        Statement stmt;
371

    
372
        theGrammar.addReservedWord("RETURN");
373

    
374
        stmt = theGrammar.createStatement("RETURN");
375
        stmt.addRule(stmt.require_any_token("RETURN"));
376
        stmt.addRule(stmt.optional_any_token(";")
377
                .addRuleOnTrue(stmt.set_expression("VALUES", null))
378
                .addRuleOnFalse(stmt.require_expression().capture_as("VALUES"))
379
                .addRuleOnFalse(stmt.require_any_token(";"))
380
        );
381
        stmt.code(
382
                ReturnFunction.NAME,
383
                stmt.args_expand("VALUES")
384
        );
385
        return stmt;
386
    }
387

    
388
    private Statement createVarStatement(Grammar theGrammar) {
389
        Statement stmt;
390

    
391
        theGrammar.addReservedWord("VAR");
392

    
393
        stmt = theGrammar.createStatement("VAR");
394
        stmt.addRule(stmt.require_any_token("VAR"));
395
        stmt.addRule(stmt.require_identifier().capture_as("NAME"));
396
        stmt.addRule(stmt.optional_any_token("DEFAULT")
397
            .addRuleOnTrue(stmt.require_expression().capture_as("VALUE"))
398
            .addRuleOnFalse(stmt.set_expression("VALUE", null))
399
        );
400
        stmt.code(
401
                "VAR",
402
                new VarArgsBuilder("NAME", "VALUE")
403
        );
404
        return stmt;
405
    }
406

    
407
    private Statement createLet1Statement(Grammar theGrammar) {
408
        Statement stmt;
409

    
410
        theGrammar.addReservedWord("LET");
411
        theGrammar.addReservedWord("SET");
412
        theGrammar.addReservedWord("TO");
413

    
414
        stmt = theGrammar.createStatement("LET");
415
        stmt.addRule(stmt.require_any_token("LET", "SET"));
416
        stmt.addRule(stmt.require_identifier().capture_as("NAME"));
417
        stmt.addRule(stmt.optional_any_token("=", "TO"));
418
        stmt.addRule(stmt.require_expression().capture_as("VALUE"));
419
        stmt.code(
420
                ExpressionBuilder.FUNCTION_LET,
421
                stmt.args_names("NAME", "VALUE")
422
        );
423
        return stmt;
424
    }
425

    
426
    private Statement createLet2Statement(Grammar theGrammar) {
427
        Statement stmt;
428

    
429
        stmt = theGrammar.createStatement("LET2");
430
        stmt.addRule(stmt.require_identifier().capture_as("NAME"));
431
        stmt.addRule(stmt.require_any_token(":="));
432
        stmt.addRule(stmt.require_expression().capture_as("VALUE"));
433
        stmt.code(
434
                ExpressionBuilder.FUNCTION_LET,
435
                stmt.args_names("NAME", "VALUE")
436
        );
437
        return stmt;
438
    }
439

    
440
    private Statement createArrayStatement(Grammar theGrammar) {
441
        Statement stmt;
442

    
443
        theGrammar.addReservedWord("ARRAY");
444

    
445
        stmt = theGrammar.createStatement("ARRAY");
446
        stmt.addRule(stmt.require_any_token("ARRAY"));
447
        stmt.addRule(stmt.require_any_token("["));
448
        stmt.addRule(stmt.require_expressions(",").capture_as("VALUES"));
449
        stmt.addRule(stmt.require_any_token("]"));
450
        stmt.code(
451
                FUNCTION_LIST,
452
                stmt.args_expand("VALUES")
453
        );
454
        return stmt;
455
    }
456

    
457
    private Statement createCastStatement(Grammar theGrammar) {
458
        Statement stmt;
459

    
460
        theGrammar.addReservedWord("CAST");
461
        theGrammar.addReservedWord("AS");
462

    
463
        stmt = theGrammar.createStatement("CAST");
464
        stmt.addRule(stmt.require_any_token("CAST"));
465
        stmt.addRule(stmt.optional_any_token("(")
466
                .addRuleOnTrue(stmt.require_expression(false).capture_as("VALUE"))
467
                .addRuleOnTrue(stmt.require_any_token("AS"))
468
                .addRuleOnTrue(stmt.require_identifier().capture_as("TYPE"))
469
                .addRuleOnTrue(stmt.require_any_token(")"))
470
                .addRuleOnFalse(stmt.require_expression(false).capture_as("VALUE"))
471
                .addRuleOnFalse(stmt.require_any_token("AS"))
472
                .addRuleOnFalse(stmt.require_identifier().capture_as("TYPE"))
473
        );
474
        stmt.code(
475
                FUNCTION_CAST,
476
                stmt.args_names("VALUE", "TYPE")
477
        );
478
        return stmt;
479
    }
480

    
481
    private Statement createMatchStatement(Grammar theGrammar) {
482
        Statement stmt;
483

    
484
        theGrammar.addReservedWord("MATCH");
485

    
486
        stmt = theGrammar.createStatement("MATCH");
487
        stmt.addRule(stmt.require_any_token("MATCH"));
488
        stmt.addRule(stmt.optional_any_token("(")
489
                .addRuleOnTrue(stmt.require_expression().capture_as("VALUE"))
490
                .addRuleOnTrue(stmt.require_any_token(","))
491
                .addRuleOnTrue(stmt.require_expression().capture_as("PATTERN"))
492
                .addRuleOnTrue(stmt.require_any_token(")"))
493
                .addRuleOnFalse(stmt.require_expression().capture_as("VALUE"))
494
                .addRuleOnFalse(stmt.optional_any_token(","))
495
                .addRuleOnFalse(stmt.require_expression().capture_as("PATTERN"))
496
        );
497
        stmt.code(
498
                OPERATOR_REGEXP,
499
                stmt.args_names("VALUE", "PATTERN")
500
        );
501
        return stmt;
502
    }
503

    
504
    private Statement createDateStatement(Grammar theGrammar) {
505
        Statement stmt;
506

    
507
        stmt = theGrammar.createStatement("DATE");
508
        stmt.addRule(stmt.require_any_token("DATE"));
509
        stmt.addRule(stmt.require_expression().capture_as("EXP"));
510
        stmt.code(FUNCTION_DATE, stmt.args_names("EXP"));
511
        return stmt;
512
    }
513

    
514
    private Statement createTimeStatement(Grammar theGrammar) {
515
        Statement stmt;
516

    
517
        stmt = theGrammar.createStatement("TIME");
518
        stmt.addRule(stmt.require_any_token("TIME"));
519
        stmt.addRule(stmt.require_expression().capture_as("EXP"));
520
        stmt.code(FUNCTION_TIME, stmt.args_names("EXP"));
521
        return stmt;
522
    }
523

    
524
    private Statement createTimestampStatement(Grammar theGrammar) {
525
        Statement stmt;
526

    
527
        stmt = theGrammar.createStatement("TIMESTAMP");
528
        stmt.addRule(stmt.require_any_token("TIMESTAMP"));
529
        stmt.addRule(stmt.require_expression().capture_as("EXP"));
530
        stmt.code(FUNCTION_TIMESTAMP, stmt.args_names("EXP"));
531
        return stmt;
532
    }
533

    
534
    private Statement createExtractStatement(Grammar theGrammar) {
535
        Statement stmt;
536

    
537
        stmt = theGrammar.createStatement("EXTRACT");
538
        stmt.addRule(stmt.require_any_token("EXTRACT"));
539
        stmt.addRule(stmt.require_any_token("("));
540
        stmt.addRule(stmt.require_any_token("CENTURY", "DAY", "DECADE",
541
                "DOW", "DOY", "HOUR", "ISODOW", "ISOYEAR", "MICROSECONDS",
542
                "MILLENNIUM", "MILLUSECONDS", "MINUTE", "MONTH", "QUARTER",
543
                "SECOND", "WEEK", "YEAR").capture_as("FIELD"));
544
        stmt.addRule(stmt.require_any_token("FROM"));
545
        stmt.addRule(stmt.require_expression().capture_as("EXP"));
546
        stmt.addRule(stmt.require_any_token(")"));
547
        stmt.code(FUNCTION_EXTRACT, stmt.args_names("FIELD", "EXP"));
548
        return stmt;
549
    }
550

    
551
    private Statement createDictStatement(Grammar theGrammar) {
552
        Statement stmt;
553

    
554
        stmt = theGrammar.createStatement("DICT");
555
        stmt.addRule(stmt.require_any_token("{"));
556
        stmt.addRule(stmt.repeat()
557
                .addRule(stmt.optional_literal_string().capture_as("NAME#")
558
                        .addRuleOnFalse(stmt.require_identifier().capture_as("NAME#"))
559
                )
560
                .addRule(stmt.require_any_token(":", "=>"))
561
                .addRule(stmt.require_expression().capture_as("VALUE#"))
562
                .addRule(stmt.optional_any_token(",")
563
                        .addRuleOnFalse(stmt.break_loop())
564
                )
565
        );
566
        stmt.addRule(stmt.require_any_token("}"));
567
        stmt.code(FUNCTION_DICT, new DictArgsBuilder("NAME#", "VALUE#"));
568
        return stmt;
569
    }
570

    
571
    private Statement createListStatement(Grammar theGrammar) {
572
        Statement stmt;
573

    
574
        stmt = theGrammar.createStatement("LIST");
575
        stmt.addRule(stmt.require_any_token("["));
576
        stmt.addRule(stmt.repeat()
577
                .addRule(stmt.require_expression().capture_as("VALUE#"))
578
                .addRule(stmt.optional_any_token(",")
579
                        .addRuleOnFalse(stmt.break_loop())
580
                )
581
        );
582
        stmt.addRule(stmt.require_any_token("]"));
583
        stmt.code(FUNCTION_LIST, stmt.args_names("VALUE#"));
584
        return stmt;
585
    }
586

    
587
    private Statement createPassStatement(Grammar theGrammar) {
588
        Statement stmt;
589

    
590
        theGrammar.addReservedWord("PASS");
591

    
592
        stmt = theGrammar.createStatement("PASS");
593
        stmt.addRule(stmt.require_any_token("PASS"));
594
        stmt.addRule(stmt.optional_any_token("(")
595
                .addRuleOnTrue(stmt.require_expressions(",").capture_as("ARGS#"))
596
                .addRuleOnTrue(stmt.require_any_token(")"))
597
        );
598
        stmt.code(
599
                "PASS",
600
                stmt.args_names("ARGS#")
601
        );
602
        return stmt;
603
    }
604

    
605
    private Statement createCallStatement(Grammar theGrammar) {
606
        Statement stmt;
607

    
608
        theGrammar.addReservedWord("CALL");
609

    
610
        stmt = theGrammar.createStatement("CALL");
611
        stmt.addRule(stmt.require_any_token("CALL"));
612
        stmt.addRule(stmt.require_identifier().capture_as("CALLABLE"));
613
        stmt.addRule(stmt.optional_any_token("(")
614
                .addRuleOnTrue(stmt.require_expressions(",").capture_as("ARGS#"))
615
                .addRuleOnTrue(stmt.require_any_token(")"))
616
        );
617
        stmt.code(
618
                "CALL",
619
                stmt.args_names("CALLABLE", "ARGS#")
620
        );
621
        return stmt;
622
    }
623

    
624
}