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 @ 46957

History | View | Annotate | Download (26 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.createSetattr1Statement(theGrammar));
160
            theGrammar.addStatement(this.createSetattr2Statement(theGrammar));
161
            theGrammar.addStatement(this.createVarStatement(theGrammar));
162
            theGrammar.addStatement(this.createListStatement(theGrammar));
163
            theGrammar.addStatement(this.createMatchStatement(theGrammar));
164
            theGrammar.addStatement(this.createPassStatement(theGrammar));
165
            theGrammar.addStatement(this.createReturnStatement(theGrammar));
166
            theGrammar.addStatement(this.createTimeStatement(theGrammar));
167
            theGrammar.addStatement(this.createTimestampStatement(theGrammar));
168
            theGrammar.addStatement(this.createWhileStatement(theGrammar));
169
            theGrammar.addStatement(this.create$ConstantStatement(theGrammar));
170

    
171
            this.grammar = theGrammar;
172
        }
173
        return grammar;
174
    }
175

    
176
    private Statement createBlockStatement(Grammar theGrammar) {
177
        Statement stmt;
178

    
179
        theGrammar.addReservedWord("BEGIN");
180
        theGrammar.addReservedWord("EXCEPT");
181
        theGrammar.addReservedWord("END");
182

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

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

    
209
    private Statement createIfStatement(Grammar theGrammar) {
210
        Statement stmt;
211

    
212
        theGrammar.addReservedWord("IF");
213
        theGrammar.addReservedWord("THEN");
214
        theGrammar.addReservedWord("ELSE");
215
        theGrammar.addReservedWord("END");
216

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

    
235
    private Statement createWhileStatement(Grammar theGrammar) {
236
        Statement stmt;
237

    
238
        theGrammar.addReservedWord("WHILE");
239
        theGrammar.addReservedWord("BEGIN");
240
        theGrammar.addReservedWord("END");
241
        theGrammar.addReservedWord("LOOP");
242

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

    
257
    private Statement createForeachStatement(Grammar theGrammar) {
258
        Statement stmt;
259

    
260
        theGrammar.addReservedWord("FOR");
261
        theGrammar.addReservedWord("IN");
262
//        theGrammar.addReservedWord("BEGIN");
263
        theGrammar.addReservedWord("END");
264
        theGrammar.addReservedWord("LOOP");
265

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

    
282
    private Statement createCaseStatement(Grammar theGrammar) {
283
        Statement stmt;
284

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

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

    
313
    private Statement createFunctionStatement(Grammar theGrammar) {
314
        Statement stmt;
315

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

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

    
354
    private Statement createLambdaStatement(Grammar theGrammar) {
355
        Statement stmt;
356

    
357
        theGrammar.addReservedWord("LAMBDA");
358

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

    
371
    private Statement createReturnStatement(Grammar theGrammar) {
372
        Statement stmt;
373

    
374
        theGrammar.addReservedWord("RETURN");
375

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

    
390
    private Statement createVarStatement(Grammar theGrammar) {
391
        Statement stmt;
392

    
393
        theGrammar.addReservedWord("VAR");
394

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

    
409
    private Statement createLet1Statement(Grammar theGrammar) {
410
        Statement stmt;
411

    
412
        theGrammar.addReservedWord("LET");
413
        theGrammar.addReservedWord("SET");
414
        theGrammar.addReservedWord("TO");
415

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

    
428
    private Statement createLet2Statement(Grammar theGrammar) {
429
        Statement stmt;
430

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

    
442
    private Statement createSetattr1Statement(Grammar theGrammar) {
443
        Statement stmt;
444

    
445
        stmt = theGrammar.createStatement("SETATTR");
446
        stmt.addRule(stmt.require_identifier().capture_as("NAME"));
447
        stmt.addRule(stmt.require_any_token("["));
448
        stmt.addRule(stmt.require_expression().capture_as("ATTRNAME"));
449
        stmt.addRule(stmt.require_any_token("]"));
450
        stmt.addRule(stmt.require_any_token(":="));
451
        stmt.addRule(stmt.require_expression().capture_as("VALUE"));
452
        stmt.code(
453
                ExpressionBuilder.FUNCTION_SETATTR,
454
                stmt.args_names("NAME", "ATTRNAME", "VALUE")
455
        );
456
        return stmt;
457
    }
458

    
459
    private Statement createSetattr2Statement(Grammar theGrammar) {
460
        Statement stmt;
461

    
462
        stmt = theGrammar.createStatement("SETATTR");
463
        stmt.addRule(stmt.require_identifier().capture_as("NAME"));
464
        stmt.addRule(stmt.require_any_token("."));
465
        stmt.addRule(stmt.require_identifier().capture_as("ATTRNAME"));
466
        stmt.addRule(stmt.require_any_token(":="));
467
        stmt.addRule(stmt.require_expression().capture_as("VALUE"));
468
        stmt.code(
469
                ExpressionBuilder.FUNCTION_SETATTR,
470
                stmt.args_names("NAME", "ATTRNAME", "VALUE")
471
        );
472
        return stmt;
473
    }
474

    
475
    private Statement createArrayStatement(Grammar theGrammar) {
476
        Statement stmt;
477

    
478
        theGrammar.addReservedWord("ARRAY");
479

    
480
        stmt = theGrammar.createStatement("ARRAY");
481
        stmt.addRule(stmt.require_any_token("ARRAY"));
482
        stmt.addRule(stmt.require_any_token("["));
483
        stmt.addRule(stmt.require_expressions(",").capture_as("VALUES"));
484
        stmt.addRule(stmt.require_any_token("]"));
485
        stmt.code(
486
                FUNCTION_LIST,
487
                stmt.args_expand("VALUES")
488
        );
489
        return stmt;
490
    }
491

    
492
    private Statement createCastStatement(Grammar theGrammar) {
493
        Statement stmt;
494

    
495
        theGrammar.addReservedWord("CAST");
496
        theGrammar.addReservedWord("AS");
497

    
498
        stmt = theGrammar.createStatement("CAST");
499
        stmt.addRule(stmt.require_any_token("CAST"));
500
        stmt.addRule(stmt.optional_any_token("(")
501
                .addRuleOnTrue(stmt.require_expression(false).capture_as("VALUE"))
502
                .addRuleOnTrue(stmt.require_any_token("AS"))
503
                .addRuleOnTrue(stmt.require_identifier().capture_as("TYPE"))
504
                .addRuleOnTrue(stmt.require_any_token(")"))
505
                .addRuleOnFalse(stmt.require_expression(false).capture_as("VALUE"))
506
                .addRuleOnFalse(stmt.require_any_token("AS"))
507
                .addRuleOnFalse(stmt.require_identifier().capture_as("TYPE"))
508
        );
509
        stmt.code(
510
                FUNCTION_CAST,
511
                stmt.args_names("VALUE", "TYPE")
512
        );
513
        return stmt;
514
    }
515

    
516
    private Statement createMatchStatement(Grammar theGrammar) {
517
        Statement stmt;
518

    
519
        theGrammar.addReservedWord("MATCH");
520

    
521
        stmt = theGrammar.createStatement("MATCH");
522
        stmt.addRule(stmt.require_any_token("MATCH"));
523
        stmt.addRule(stmt.optional_any_token("(")
524
                .addRuleOnTrue(stmt.require_expression().capture_as("VALUE"))
525
                .addRuleOnTrue(stmt.require_any_token(","))
526
                .addRuleOnTrue(stmt.require_expression().capture_as("PATTERN"))
527
                .addRuleOnTrue(stmt.require_any_token(")"))
528
                .addRuleOnFalse(stmt.require_expression().capture_as("VALUE"))
529
                .addRuleOnFalse(stmt.optional_any_token(","))
530
                .addRuleOnFalse(stmt.require_expression().capture_as("PATTERN"))
531
        );
532
        stmt.code(
533
                OPERATOR_REGEXP,
534
                stmt.args_names("VALUE", "PATTERN")
535
        );
536
        return stmt;
537
    }
538

    
539
    private Statement createDateStatement(Grammar theGrammar) {
540
        Statement stmt;
541

    
542
        stmt = theGrammar.createStatement("DATE");
543
        stmt.addRule(stmt.require_any_token("DATE"));
544
        stmt.addRule(stmt.require_expression().capture_as("EXP"));
545
        stmt.code(FUNCTION_DATE, stmt.args_names("EXP"));
546
        return stmt;
547
    }
548

    
549
    private Statement createTimeStatement(Grammar theGrammar) {
550
        Statement stmt;
551

    
552
        stmt = theGrammar.createStatement("TIME");
553
        stmt.addRule(stmt.require_any_token("TIME"));
554
        stmt.addRule(stmt.require_expression().capture_as("EXP"));
555
        stmt.code(FUNCTION_TIME, stmt.args_names("EXP"));
556
        return stmt;
557
    }
558

    
559
    private Statement createTimestampStatement(Grammar theGrammar) {
560
        Statement stmt;
561

    
562
        stmt = theGrammar.createStatement("TIMESTAMP");
563
        stmt.addRule(stmt.require_any_token("TIMESTAMP"));
564
        stmt.addRule(stmt.require_expression().capture_as("EXP"));
565
        stmt.code(FUNCTION_TIMESTAMP, stmt.args_names("EXP"));
566
        return stmt;
567
    }
568

    
569
    private Statement createExtractStatement(Grammar theGrammar) {
570
        Statement stmt;
571

    
572
        stmt = theGrammar.createStatement("EXTRACT");
573
        stmt.addRule(stmt.require_any_token("EXTRACT"));
574
        stmt.addRule(stmt.require_any_token("("));
575
        stmt.addRule(stmt.require_any_token("CENTURY", "DAY", "DECADE",
576
                "DOW", "DOY", "HOUR", "ISODOW", "ISOYEAR", "MICROSECONDS",
577
                "MILLENNIUM", "MILLUSECONDS", "MINUTE", "MONTH", "QUARTER",
578
                "SECOND", "WEEK", "YEAR").capture_as("FIELD"));
579
        stmt.addRule(stmt.require_any_token("FROM"));
580
        stmt.addRule(stmt.require_expression().capture_as("EXP"));
581
        stmt.addRule(stmt.require_any_token(")"));
582
        stmt.code(FUNCTION_EXTRACT, stmt.args_names("FIELD", "EXP"));
583
        return stmt;
584
    }
585

    
586
    private Statement createDictStatement(Grammar theGrammar) {
587
        Statement stmt;
588

    
589
        stmt = theGrammar.createStatement("DICT");
590
        stmt.addRule(stmt.require_any_token("{"));
591
        stmt.addRule(stmt.repeat()
592
                .addRule(stmt.optional_literal_string().capture_as("NAME#")
593
                        .addRuleOnFalse(stmt.require_identifier().capture_as("NAME#"))
594
                )
595
                .addRule(stmt.require_any_token(":", "=>"))
596
                .addRule(stmt.require_expression().capture_as("VALUE#"))
597
                .addRule(stmt.optional_any_token(",")
598
                        .addRuleOnFalse(stmt.break_loop())
599
                )
600
        );
601
        stmt.addRule(stmt.require_any_token("}"));
602
        stmt.code(FUNCTION_DICT, new DictArgsBuilder("NAME#", "VALUE#"));
603
        return stmt;
604
    }
605

    
606
    private Statement createListStatement(Grammar theGrammar) {
607
        Statement stmt;
608

    
609
        stmt = theGrammar.createStatement("LIST");
610
        stmt.addRule(stmt.require_any_token("["));
611
        stmt.addRule(stmt.repeat()
612
                .addRule(stmt.require_expression().capture_as("VALUE#"))
613
                .addRule(stmt.optional_any_token(",")
614
                        .addRuleOnFalse(stmt.break_loop())
615
                )
616
        );
617
        stmt.addRule(stmt.require_any_token("]"));
618
        stmt.code(FUNCTION_LIST, stmt.args_names("VALUE#"));
619
        return stmt;
620
    }
621

    
622
    private Statement createPassStatement(Grammar theGrammar) {
623
        Statement stmt;
624

    
625
        theGrammar.addReservedWord("PASS");
626

    
627
        stmt = theGrammar.createStatement("PASS");
628
        stmt.addRule(stmt.require_any_token("PASS"));
629
        stmt.addRule(stmt.optional_any_token("(")
630
                .addRuleOnTrue(stmt.require_expressions(",").capture_as("ARGS#"))
631
                .addRuleOnTrue(stmt.require_any_token(")"))
632
        );
633
        stmt.code(
634
                "PASS",
635
                stmt.args_names("ARGS#")
636
        );
637
        return stmt;
638
    }
639

    
640
    private Statement createCallStatement(Grammar theGrammar) {
641
        Statement stmt;
642

    
643
        theGrammar.addReservedWord("CALL");
644

    
645
        stmt = theGrammar.createStatement("CALL");
646
        stmt.addRule(stmt.require_any_token("CALL"));
647
        stmt.addRule(stmt.require_identifier().capture_as("CALLABLE"));
648
        stmt.addRule(stmt.optional_any_token("(")
649
                .addRuleOnTrue(stmt.require_expressions(",").capture_as("ARGS#"))
650
                .addRuleOnTrue(stmt.require_any_token(")"))
651
        );
652
        stmt.code(
653
                "CALL",
654
                stmt.args_names("CALLABLE", "ARGS#")
655
        );
656
        return stmt;
657
    }
658

    
659
}