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

History | View | Annotate | Download (26.8 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
import org.gvsig.expressionevaluator.impl.function.programming.BreakFunction;
33

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

    
40
    private Grammar grammar;
41

    
42
    public static class DictArgsBuilder implements Statement.ArgsBuilder {
43

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

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

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

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

    
83
    private class BeginStatementBuilder extends StatementBuilderBase {
84

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

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

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

    
107
    }
108

    
109
    public static class VarArgsBuilder implements Statement.ArgsBuilder {
110

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

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

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

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

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

    
146
            theGrammar.addStatement(this.createArrayStatement(theGrammar));
147
            theGrammar.addStatement(this.createBlockStatement(theGrammar));
148
            theGrammar.addStatement(this.createCallStatement(theGrammar));
149
            theGrammar.addStatement(this.createCaseStatement(theGrammar));
150
            theGrammar.addStatement(this.createCastStatement(theGrammar));
151
            theGrammar.addStatement(this.createDateStatement(theGrammar));
152
            theGrammar.addStatement(this.createDictStatement(theGrammar));
153
            theGrammar.addStatement(this.createExtractStatement(theGrammar));
154
            theGrammar.addStatement(this.createForeachStatement(theGrammar));
155
            theGrammar.addStatement(this.createFunctionStatement(theGrammar));
156
            theGrammar.addStatement(this.createIfStatement(theGrammar));
157
            theGrammar.addStatement(this.createLambdaStatement(theGrammar));
158
            theGrammar.addStatement(this.createLet1Statement(theGrammar));
159
            theGrammar.addStatement(this.createLet2Statement(theGrammar));
160
            theGrammar.addStatement(this.createSetattr1Statement(theGrammar));
161
            theGrammar.addStatement(this.createSetattr2Statement(theGrammar));
162
            theGrammar.addStatement(this.createVarStatement(theGrammar));
163
            theGrammar.addStatement(this.createListStatement(theGrammar));
164
            theGrammar.addStatement(this.createMatchStatement(theGrammar));
165
            theGrammar.addStatement(this.createPassStatement(theGrammar));
166
            theGrammar.addStatement(this.createReturnStatement(theGrammar));
167
            theGrammar.addStatement(this.createTimeStatement(theGrammar));
168
            theGrammar.addStatement(this.createTimestampStatement(theGrammar));
169
            theGrammar.addStatement(this.createWhileStatement(theGrammar));
170
            theGrammar.addStatement(this.create$ConstantStatement(theGrammar));
171
            theGrammar.addStatement(this.createBreakStatement(theGrammar));
172
            this.grammar = theGrammar;
173
        }
174
        return grammar;
175
    }
176

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
358
    private Statement createLambdaStatement(Grammar theGrammar) {
359
        Statement stmt;
360

    
361
        theGrammar.addReservedWord("LAMBDA");
362

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

    
375
    private Statement createReturnStatement(Grammar theGrammar) {
376
        Statement stmt;
377

    
378
        theGrammar.addReservedWord("RETURN");
379

    
380
        stmt = theGrammar.createStatement("RETURN");
381
        stmt.addRule(stmt.require_any_token("RETURN"));
382
        stmt.addRule(stmt.optional_expression().capture_as("VALUES"));
383
        stmt.code(
384
                ReturnFunction.NAME,
385
                stmt.args_expand("VALUES")
386
        );
387
        return stmt;
388
    }
389

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

    
393
        theGrammar.addReservedWord("BREAK");
394

    
395
        stmt = theGrammar.createStatement("BREAK");
396
        stmt.addRule(stmt.require_any_token("BREAK"));
397
        stmt.code(
398
                BreakFunction.NAME,
399
                stmt.args_expand()
400
        );
401
        return stmt;
402
    }
403

    
404
    private Statement createVarStatement(Grammar theGrammar) {
405
        Statement stmt;
406

    
407
        theGrammar.addReservedWord("VAR");
408

    
409
        stmt = theGrammar.createStatement("VAR");
410
        stmt.addRule(stmt.require_any_token("VAR"));
411
        stmt.addRule(stmt.require_identifier().capture_as("NAME"));
412
        stmt.addRule(stmt.optional_any_token("DEFAULT")
413
            .addRuleOnTrue(stmt.require_expression().capture_as("VALUE"))
414
            .addRuleOnFalse(stmt.set_expression("VALUE", null))
415
        );
416
        stmt.code(
417
                "VAR",
418
                new VarArgsBuilder("NAME", "VALUE")
419
        );
420
        return stmt;
421
    }
422

    
423
    private Statement createLet1Statement(Grammar theGrammar) {
424
        Statement stmt;
425

    
426
        theGrammar.addReservedWord("LET");
427
        theGrammar.addReservedWord("SET");
428
        theGrammar.addReservedWord("TO");
429

    
430
        stmt = theGrammar.createStatement("LET");
431
        stmt.addRule(stmt.require_any_token("LET", "SET"));
432
        stmt.addRule(stmt.require_identifier().capture_as("NAME"));
433
        stmt.addRule(stmt.optional_any_token("=", "TO"));
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 createLet2Statement(Grammar theGrammar) {
443
        Statement stmt;
444

    
445
        stmt = theGrammar.createStatement("LET2");
446
        stmt.addRule(stmt.require_identifier().capture_as("NAME"));
447
        stmt.addRule(stmt.require_any_token(":="));
448
        stmt.addRule(stmt.require_expression().capture_as("VALUE"));
449
        stmt.code(
450
                ExpressionBuilder.FUNCTION_LET,
451
                stmt.args_names("NAME", "VALUE")
452
        );
453
        return stmt;
454
    }
455

    
456
    private Statement createSetattr1Statement(Grammar theGrammar) {
457
        Statement stmt;
458

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

    
473
    private Statement createSetattr2Statement(Grammar theGrammar) {
474
        Statement stmt;
475

    
476
        stmt = theGrammar.createStatement("SETATTR");
477
        stmt.addRule(stmt.require_identifier().capture_as("NAME"));
478
        stmt.addRule(stmt.require_any_token("."));
479
        stmt.addRule(stmt.require_identifier().capture_as("ATTRNAME"));
480
        stmt.addRule(stmt.require_any_token(":="));
481
        stmt.addRule(stmt.require_expression().capture_as("VALUE"));
482
        stmt.code(
483
                ExpressionBuilder.FUNCTION_SETATTR,
484
                stmt.args_names("NAME", "ATTRNAME", "VALUE")
485
        );
486
        return stmt;
487
    }
488

    
489
    private Statement createArrayStatement(Grammar theGrammar) {
490
        Statement stmt;
491

    
492
        theGrammar.addReservedWord("ARRAY");
493

    
494
        stmt = theGrammar.createStatement("ARRAY");
495
        stmt.addRule(stmt.require_any_token("ARRAY"));
496
        stmt.addRule(stmt.require_any_token("["));
497
        stmt.addRule(stmt.require_expressions(",").capture_as("VALUES"));
498
        stmt.addRule(stmt.require_any_token("]"));
499
        stmt.code(
500
                FUNCTION_LIST,
501
                stmt.args_expand("VALUES")
502
        );
503
        return stmt;
504
    }
505

    
506
    private Statement createCastStatement(Grammar theGrammar) {
507
        Statement stmt;
508

    
509
        theGrammar.addReservedWord("CAST");
510
        theGrammar.addReservedWord("AS");
511

    
512
        stmt = theGrammar.createStatement("CAST");
513
        stmt.addRule(stmt.require_any_token("CAST"));
514
        stmt.addRule(stmt.optional_any_token("(")
515
                .addRuleOnTrue(stmt.require_expression(false).capture_as("VALUE"))
516
                .addRuleOnTrue(stmt.require_any_token("AS"))
517
                .addRuleOnTrue(stmt.require_identifier().capture_as("TYPE"))
518
                .addRuleOnTrue(stmt.require_any_token(")"))
519
                .addRuleOnFalse(stmt.require_expression(false).capture_as("VALUE"))
520
                .addRuleOnFalse(stmt.require_any_token("AS"))
521
                .addRuleOnFalse(stmt.require_identifier().capture_as("TYPE"))
522
        );
523
        stmt.code(
524
                FUNCTION_CAST,
525
                stmt.args_names("VALUE", "TYPE")
526
        );
527
        return stmt;
528
    }
529

    
530
    private Statement createMatchStatement(Grammar theGrammar) {
531
        Statement stmt;
532

    
533
        theGrammar.addReservedWord("MATCH");
534

    
535
        stmt = theGrammar.createStatement("MATCH");
536
        stmt.addRule(stmt.require_any_token("MATCH"));
537
        stmt.addRule(stmt.optional_any_token("(")
538
                .addRuleOnTrue(stmt.require_expression().capture_as("VALUE"))
539
                .addRuleOnTrue(stmt.require_any_token(","))
540
                .addRuleOnTrue(stmt.require_expression().capture_as("PATTERN"))
541
                .addRuleOnTrue(stmt.require_any_token(")"))
542
                .addRuleOnFalse(stmt.require_expression().capture_as("VALUE"))
543
                .addRuleOnFalse(stmt.optional_any_token(","))
544
                .addRuleOnFalse(stmt.require_expression().capture_as("PATTERN"))
545
        );
546
        stmt.code(
547
                OPERATOR_REGEXP,
548
                stmt.args_names("VALUE", "PATTERN")
549
        );
550
        return stmt;
551
    }
552

    
553
    private Statement createDateStatement(Grammar theGrammar) {
554
        Statement stmt;
555

    
556
        stmt = theGrammar.createStatement("DATE");
557
        stmt.addRule(stmt.require_any_token("DATE"));
558
        stmt.addRule(stmt.require_expression().capture_as("EXP"));
559
        stmt.code(FUNCTION_DATE, stmt.args_names("EXP"));
560
        return stmt;
561
    }
562

    
563
    private Statement createTimeStatement(Grammar theGrammar) {
564
        Statement stmt;
565

    
566
        stmt = theGrammar.createStatement("TIME");
567
        stmt.addRule(stmt.require_any_token("TIME"));
568
        stmt.addRule(stmt.require_expression().capture_as("EXP"));
569
        stmt.code(FUNCTION_TIME, stmt.args_names("EXP"));
570
        return stmt;
571
    }
572

    
573
    private Statement createTimestampStatement(Grammar theGrammar) {
574
        Statement stmt;
575

    
576
        stmt = theGrammar.createStatement("TIMESTAMP");
577
        stmt.addRule(stmt.require_any_token("TIMESTAMP"));
578
        stmt.addRule(stmt.require_expression().capture_as("EXP"));
579
        stmt.code(FUNCTION_TIMESTAMP, stmt.args_names("EXP"));
580
        return stmt;
581
    }
582

    
583
    private Statement createExtractStatement(Grammar theGrammar) {
584
        Statement stmt;
585

    
586
        stmt = theGrammar.createStatement("EXTRACT");
587
        stmt.addRule(stmt.require_any_token("EXTRACT"));
588
        stmt.addRule(stmt.require_any_token("("));
589
        stmt.addRule(stmt.require_any_token("CENTURY", "DAY", "DECADE",
590
                "DOW", "DOY", "HOUR", "ISODOW", "ISOYEAR", "MICROSECONDS",
591
                "MILLENNIUM", "MILLUSECONDS", "MINUTE", "MONTH", "QUARTER",
592
                "SECOND", "WEEK", "YEAR").capture_as("FIELD"));
593
        stmt.addRule(stmt.require_any_token("FROM"));
594
        stmt.addRule(stmt.require_expression().capture_as("EXP"));
595
        stmt.addRule(stmt.require_any_token(")"));
596
        stmt.code(FUNCTION_EXTRACT, stmt.args_names("FIELD", "EXP"));
597
        return stmt;
598
    }
599

    
600
    private Statement createDictStatement(Grammar theGrammar) {
601
        Statement stmt;
602

    
603
        stmt = theGrammar.createStatement("DICT");
604
        stmt.addRule(stmt.require_any_token("{"));
605
        stmt.addRule(stmt.optional_any_token("}") // Diccionario vacio.
606
            .addRuleOnFalse(stmt.repeat()
607
                    .addRule(stmt.optional_literal_string().capture_as("NAME#")
608
                            .addRuleOnFalse(stmt.require_identifier().capture_as("NAME#"))
609
                    )
610
                    .addRule(stmt.require_any_token(":", "=>"))
611
                    .addRule(stmt.require_expression().capture_as("VALUE#"))
612
                    .addRule(stmt.optional_any_token(",")
613
                            .addRuleOnFalse(stmt.break_loop())
614
                    )
615
                )
616
            .addRuleOnFalse(stmt.require_any_token("}"))
617
        );
618
        stmt.code(FUNCTION_DICT, new DictArgsBuilder("NAME#", "VALUE#"));
619
        return stmt;
620
    }
621

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

    
625
        stmt = theGrammar.createStatement("LIST");
626
        stmt.addRule(stmt.require_any_token("["));
627
        stmt.addRule(stmt.optional_any_token("]")  // lista vacia.
628
            .addRuleOnFalse(stmt.repeat()
629
                    .addRule(stmt.require_expression().capture_as("VALUE#"))
630
                    .addRule(stmt.optional_any_token(",")
631
                            .addRuleOnFalse(stmt.break_loop())
632
                    )
633
                )
634
            .addRuleOnFalse(stmt.require_any_token("]"))
635
        );
636
        stmt.code(FUNCTION_LIST, stmt.args_names("VALUE#"));
637
        return stmt;
638
    }
639

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

    
643
        theGrammar.addReservedWord("PASS");
644

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

    
658
    private Statement createCallStatement(Grammar theGrammar) {
659
        Statement stmt;
660

    
661
        theGrammar.addReservedWord("CALL");
662

    
663
        stmt = theGrammar.createStatement("CALL");
664
        stmt.addRule(stmt.require_any_token("CALL"));
665
        stmt.addRule(stmt.require_identifier().capture_as("CALLABLE"));
666
        stmt.addRule(stmt.optional_any_token("(")
667
                .addRuleOnTrue(stmt.require_expressions(",").capture_as("ARGS#"))
668
                .addRuleOnTrue(stmt.require_any_token(")"))
669
        );
670
        stmt.code(
671
                "CALL",
672
                stmt.args_names("CALLABLE", "ARGS#")
673
        );
674
        return stmt;
675
    }
676

    
677
}