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

History | View | Annotate | Download (22.5 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 BasicGrammarFactory() {
109
        super("Basic", true);
110
    }
111

    
112
    @Override
113
    public Grammar create(Object... parameters) {
114
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
115
        if (this.grammar == null) {
116
            Grammar theGrammar = manager.createGrammar(this.getName());
117

    
118
            theGrammar.addStatement(this.createArrayStatement(theGrammar));
119
            theGrammar.addStatement(this.createBlockStatement(theGrammar));
120
            theGrammar.addStatement(this.createCallStatement(theGrammar));
121
            theGrammar.addStatement(this.createCaseStatement(theGrammar));
122
            theGrammar.addStatement(this.createCastStatement(theGrammar));
123
            theGrammar.addStatement(this.createDateStatement(theGrammar));
124
            theGrammar.addStatement(this.createDictStatement(theGrammar));
125
            theGrammar.addStatement(this.createExtractStatement(theGrammar));
126
            theGrammar.addStatement(this.createForeachStatement(theGrammar));
127
            theGrammar.addStatement(this.createFunctionStatement(theGrammar));
128
            theGrammar.addStatement(this.createIfStatement(theGrammar));
129
            theGrammar.addStatement(this.createLambdaStatement(theGrammar));
130
            theGrammar.addStatement(this.createLet1Statement(theGrammar));
131
            theGrammar.addStatement(this.createLet2Statement(theGrammar));
132
            theGrammar.addStatement(this.createListStatement(theGrammar));
133
            theGrammar.addStatement(this.createMatchStatement(theGrammar));
134
            theGrammar.addStatement(this.createPassStatement(theGrammar));
135
            theGrammar.addStatement(this.createReturnStatement(theGrammar));
136
            theGrammar.addStatement(this.createTimeStatement(theGrammar));
137
            theGrammar.addStatement(this.createTimestampStatement(theGrammar));
138
            theGrammar.addStatement(this.createWhileStatement(theGrammar));
139

    
140
            this.grammar = theGrammar;
141
        }
142
        return grammar;
143
    }
144

    
145
    private Statement createBlockStatement(Grammar theGrammar) {
146
        Statement stmt;
147

    
148
        theGrammar.addReservedWord("BEGIN");
149
        theGrammar.addReservedWord("EXCEPT");
150
        theGrammar.addReservedWord("END");
151

    
152
        stmt = theGrammar.createStatement("BLOCK");
153
        stmt.addRule(stmt.require_any_token("BEGIN"));
154
        stmt.addRule(stmt.require_expressions(";").capture_as("VALUES"));
155
        stmt.addRule(stmt.optional_any_token("EXCEPT")
156
                .addRuleOnTrue(stmt.require_expressions(";").capture_as("EXCEPT"))
157
        );
158
        stmt.addRule(stmt.require_any_token("END"));
159
        stmt.builder(new BeginStatementBuilder("VALUES", "EXCEPT"));
160
        return stmt;
161
    }
162

    
163
    private Statement createIfStatement(Grammar theGrammar) {
164
        Statement stmt;
165

    
166
        theGrammar.addReservedWord("IF");
167
        theGrammar.addReservedWord("THEN");
168
        theGrammar.addReservedWord("ELSE");
169
        theGrammar.addReservedWord("END");
170

    
171
        stmt = theGrammar.createStatement("IF");
172
        stmt.addRule(stmt.require_any_token("IF"));
173
        stmt.addRule(stmt.require_expression().capture_as("CONDITION"));
174
        stmt.addRule(stmt.require_any_token("THEN", ":"));
175
        stmt.addRule(stmt.require_expressions(";").capture_as("ONTRUE"));
176
        stmt.addRule(stmt.optional_any_token("ELSE")
177
                .addRuleOnTrue(stmt.optional_any_token(":"))
178
                .addRuleOnTrue(stmt.require_expressions(";").capture_as("ONFALSE"))
179
        );
180
        stmt.addRule(stmt.require_any_token("END"));
181
        stmt.addRule(stmt.optional_any_token("IF"));
182
        stmt.code(
183
                ExpressionBuilder.FUNCTION_IF,
184
                stmt.args_names("CONDITION", "ONTRUE", "ONFALSE")
185
        );
186
        return stmt;
187
    }
188

    
189
    private Statement createWhileStatement(Grammar theGrammar) {
190
        Statement stmt;
191

    
192
        theGrammar.addReservedWord("WHILE");
193
        theGrammar.addReservedWord("BEGIN");
194
        theGrammar.addReservedWord("END");
195
        theGrammar.addReservedWord("LOOP");
196

    
197
        stmt = theGrammar.createStatement("WHILE");
198
        stmt.addRule(stmt.require_any_token("WHILE"));
199
        stmt.addRule(stmt.require_expression().capture_as("CONDITION"));
200
        stmt.addRule(stmt.require_any_token("BEGIN", ":", "LOOP"));
201
        stmt.addRule(stmt.require_expressions(";").capture_as("BODY"));
202
        stmt.addRule(stmt.require_any_token("END"));
203
        stmt.addRule(stmt.optional_any_token("WHILE", "LOOP"));
204
        stmt.code(
205
                WhileFunction.NAME,
206
                stmt.args_names("CONDITION", "BODY")
207
        );
208
        return stmt;
209
    }
210

    
211
    private Statement createForeachStatement(Grammar theGrammar) {
212
        Statement stmt;
213

    
214
        theGrammar.addReservedWord("FOR");
215
        theGrammar.addReservedWord("IN");
216
        theGrammar.addReservedWord("BEGIN");
217
        theGrammar.addReservedWord("END");
218
        theGrammar.addReservedWord("LOOP");
219

    
220
        stmt = theGrammar.createStatement("FOREACH");
221
        stmt.addRule(stmt.require_any_token("FOR", "FOREACH"));
222
        stmt.addRule(stmt.require_identifier().capture_as("VAR"));
223
        stmt.addRule(stmt.require_any_token("IN"));
224
        stmt.addRule(stmt.require_expression().capture_as("ITERABLE"));
225
        stmt.addRule(stmt.require_any_token("BEGIN", ":", "LOOP"));
226
        stmt.addRule(stmt.require_expressions(";").capture_as("BODY"));
227
        stmt.addRule(stmt.require_any_token("END"));
228
        stmt.addRule(stmt.optional_any_token("FOR", "LOOP"));
229
        stmt.code(
230
                ForEachFunction.NAME,
231
                stmt.args_names("VAR", "ITERABLE", "BODY")
232
        );
233
        return stmt;
234
    }
235

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

    
239
        theGrammar.addReservedWord("CASE");
240
        theGrammar.addReservedWord("WHEN");
241
        theGrammar.addReservedWord("THEN");
242
        theGrammar.addReservedWord("ELSE");
243
        theGrammar.addReservedWord("END");
244

    
245
        stmt = theGrammar.createStatement("CASE");
246
        stmt.addRule(stmt.require_any_token("CASE"));
247
        stmt.addRule(
248
                stmt.repeat_until_any_tokens("END", "ELSE")
249
                        .addRule(stmt.require_any_token("WHEN"))
250
                        .addRule(stmt.require_expression().capture_as("CONDITION#"))
251
                        .addRule(stmt.require_any_token("THEN", ":"))
252
                        .addRule(stmt.require_expressions(";").capture_as("ONTRUE#"))
253
        );
254
        stmt.addRule(stmt.optional_any_token("ELSE")
255
                .addRuleOnTrue(stmt.optional_any_token(":"))
256
                .addRuleOnTrue(stmt.require_expressions(";").capture_as("ELSE"))
257
        );
258
        stmt.addRule(stmt.require_any_token("END"));
259
        stmt.addRule(stmt.optional_any_token("CASE"));
260
        stmt.code(
261
                CaseFunction.NAME,
262
                stmt.args_names("CONDITION#", "ONTRUE#", "ELSE")
263
        );
264
        return stmt;
265
    }
266

    
267
    private Statement createFunctionStatement(Grammar theGrammar) {
268
        Statement stmt;
269

    
270
        theGrammar.addReservedWord("CREATE");
271
        theGrammar.addReservedWord("FUNCTION");
272
        theGrammar.addReservedWord("PROCEDURE");
273
        theGrammar.addReservedWord("AS");
274
        theGrammar.addReservedWord("BEGIN");
275
        theGrammar.addReservedWord("END");
276
        theGrammar.addReservedWord("$$"); // ???? Asi van las funciones en PostgreSQL
277

    
278
        stmt = theGrammar.createStatement("USERFUNCTION");
279
        stmt.addRule(stmt.require_any_token("CREATE"));
280
        stmt.addRule(stmt.optional_any_token("OR")
281
                .addRuleOnTrue(stmt.optional_any_token("REPLACE"))
282
        );
283
        stmt.addRule(stmt.optional_any_token("FUNCTION", "PROCEDURE"));
284
        stmt.addRule(stmt.require_identifier().capture_as("FUNCTION_NAME"));
285
        stmt.addRule(stmt.optional_any_token("("));
286
        stmt.addRule(stmt.optional_identifiers(",").capture_as("PARAMETERS"));
287
        stmt.addRule(stmt.optional_any_token(")"));
288
        stmt.addRule(stmt.require_any_token("AS"));
289
        stmt.addRule(stmt.optional_any_token("$$", "BEGIN")
290
                .addRuleOnTrue(stmt.require_expressions(";").capture_as("BODY"))
291
                .addRuleOnTrue(stmt.require_any_token("$$", "END"))
292
                .addRuleOnTrue(stmt.optional_any_token("FUNCTION", "PROCEDURE"))
293
                .addRuleOnFalse(stmt.optional_literal_string().capture_as("SCRIPT_PATH")
294
                        .addRuleOnTrue(stmt.require_any_token(","))
295
                        .addRuleOnTrue(stmt.require_literal_string().capture_as("SCRIPT_FUNCTION"))
296
                        .addRuleOnTrue(stmt.optional_any_token("LANGUAGE")
297
                                .addRuleOnTrue(stmt.require_literal_string().capture_as("LANGUAGE"))
298
                        )
299
                )
300
        );
301
        stmt.code(
302
                CreateFnFunction.NAME,
303
                stmt.fixed_args_names("FUNCTION_NAME", "PARAMETERS", "BODY", "SCRIPT_PATH", "SCRIPT_FUNCTION", "LANGUAGE")
304
        );
305
        return stmt;
306
    }
307

    
308
    private Statement createLambdaStatement(Grammar theGrammar) {
309
        Statement stmt;
310

    
311
        theGrammar.addReservedWord("LAMBDA");
312

    
313
        stmt = theGrammar.createStatement("LAMBDA");
314
        stmt.addRule(stmt.require_any_token("LAMBDA"));
315
        stmt.addRule(stmt.optional_identifiers(",").capture_as("PARAMETERS"));
316
        stmt.addRule(stmt.require_any_token(":"));
317
        stmt.addRule(stmt.require_expression().capture_as("BODY"));
318
        stmt.code(
319
                CreateFnFunction.NAME,
320
                stmt.fixed_args_names("PARAMETERS", "BODY")
321
        );
322
        return stmt;
323
    }
324

    
325
    private Statement createReturnStatement(Grammar theGrammar) {
326
        Statement stmt;
327

    
328
        theGrammar.addReservedWord("RETURN");
329

    
330
        stmt = theGrammar.createStatement("RETURN");
331
        stmt.addRule(stmt.require_any_token("RETURN"));
332
        stmt.addRule(stmt.optional_any_token(";")
333
                .addRuleOnTrue(stmt.set_expression("VALUES", null))
334
                .addRuleOnFalse(stmt.require_expression().capture_as("VALUES"))
335
                .addRuleOnFalse(stmt.require_any_token(";"))
336
        );
337
        stmt.code(
338
                ReturnFunction.NAME,
339
                stmt.args_expand("VALUES")
340
        );
341
        return stmt;
342
    }
343

    
344
    private Statement createLet1Statement(Grammar theGrammar) {
345
        Statement stmt;
346

    
347
        theGrammar.addReservedWord("LET");
348
        theGrammar.addReservedWord("SET");
349
        theGrammar.addReservedWord("TO");
350

    
351
        stmt = theGrammar.createStatement("LET");
352
        stmt.addRule(stmt.require_any_token("LET", "SET"));
353
        stmt.addRule(stmt.require_identifier().capture_as("NAME"));
354
        stmt.addRule(stmt.optional_any_token("=", "TO"));
355
        stmt.addRule(stmt.require_expression().capture_as("VALUE"));
356
        stmt.code(
357
                ExpressionBuilder.FUNCTION_LET,
358
                stmt.args_names("NAME", "VALUE")
359
        );
360
        return stmt;
361
    }
362

    
363
    private Statement createLet2Statement(Grammar theGrammar) {
364
        Statement stmt;
365

    
366
        stmt = theGrammar.createStatement("LET2");
367
        stmt.addRule(stmt.require_identifier().capture_as("NAME"));
368
        stmt.addRule(stmt.require_any_token(":="));
369
        stmt.addRule(stmt.require_expression().capture_as("VALUE"));
370
        stmt.code(
371
                ExpressionBuilder.FUNCTION_LET,
372
                stmt.args_names("NAME", "VALUE")
373
        );
374
        return stmt;
375
    }
376

    
377
    private Statement createArrayStatement(Grammar theGrammar) {
378
        Statement stmt;
379

    
380
        theGrammar.addReservedWord("ARRAY");
381

    
382
        stmt = theGrammar.createStatement("ARRAY");
383
        stmt.addRule(stmt.require_any_token("ARRAY"));
384
        stmt.addRule(stmt.require_any_token("["));
385
        stmt.addRule(stmt.require_expressions(",").capture_as("VALUES"));
386
        stmt.addRule(stmt.require_any_token("]"));
387
        stmt.code(
388
                FUNCTION_LIST,
389
                stmt.args_expand("VALUES")
390
        );
391
        return stmt;
392
    }
393

    
394
    private Statement createCastStatement(Grammar theGrammar) {
395
        Statement stmt;
396

    
397
        theGrammar.addReservedWord("CAST");
398
        theGrammar.addReservedWord("AS");
399

    
400
        stmt = theGrammar.createStatement("CAST");
401
        stmt.addRule(stmt.require_any_token("CAST"));
402
        stmt.addRule(stmt.optional_any_token("(")
403
                .addRuleOnTrue(stmt.require_expression(false).capture_as("VALUE"))
404
                .addRuleOnTrue(stmt.require_any_token("AS"))
405
                .addRuleOnTrue(stmt.require_identifier().capture_as("TYPE"))
406
                .addRuleOnTrue(stmt.require_any_token(")"))
407
                .addRuleOnFalse(stmt.require_expression(false).capture_as("VALUE"))
408
                .addRuleOnFalse(stmt.require_any_token("AS"))
409
                .addRuleOnFalse(stmt.require_identifier().capture_as("TYPE"))
410
        );
411
        stmt.code(
412
                FUNCTION_CAST,
413
                stmt.args_names("VALUE", "TYPE")
414
        );
415
        return stmt;
416
    }
417

    
418
    private Statement createMatchStatement(Grammar theGrammar) {
419
        Statement stmt;
420

    
421
        theGrammar.addReservedWord("MATCH");
422

    
423
        stmt = theGrammar.createStatement("MATCH");
424
        stmt.addRule(stmt.require_any_token("MATCH"));
425
        stmt.addRule(stmt.optional_any_token("(")
426
                .addRuleOnTrue(stmt.require_expression().capture_as("VALUE"))
427
                .addRuleOnTrue(stmt.require_any_token(","))
428
                .addRuleOnTrue(stmt.require_expression().capture_as("PATTERN"))
429
                .addRuleOnTrue(stmt.require_any_token(")"))
430
                .addRuleOnFalse(stmt.require_expression().capture_as("VALUE"))
431
                .addRuleOnFalse(stmt.optional_any_token(","))
432
                .addRuleOnFalse(stmt.require_expression().capture_as("PATTERN"))
433
        );
434
        stmt.code(
435
                OPERATOR_REGEXP,
436
                stmt.args_names("VALUE", "PATTERN")
437
        );
438
        return stmt;
439
    }
440

    
441
    private Statement createDateStatement(Grammar theGrammar) {
442
        Statement stmt;
443

    
444
        stmt = theGrammar.createStatement("DATE");
445
        stmt.addRule(stmt.require_any_token("DATE"));
446
        stmt.addRule(stmt.require_expression().capture_as("EXP"));
447
        stmt.code(FUNCTION_DATE, stmt.args_names("EXP"));
448
        return stmt;
449
    }
450

    
451
    private Statement createTimeStatement(Grammar theGrammar) {
452
        Statement stmt;
453

    
454
        stmt = theGrammar.createStatement("TIME");
455
        stmt.addRule(stmt.require_any_token("TIME"));
456
        stmt.addRule(stmt.require_expression().capture_as("EXP"));
457
        stmt.code(FUNCTION_TIME, stmt.args_names("EXP"));
458
        return stmt;
459
    }
460

    
461
    private Statement createTimestampStatement(Grammar theGrammar) {
462
        Statement stmt;
463

    
464
        stmt = theGrammar.createStatement("TIMESTAMP");
465
        stmt.addRule(stmt.require_any_token("TIMESTAMP"));
466
        stmt.addRule(stmt.require_expression().capture_as("EXP"));
467
        stmt.code(FUNCTION_TIMESTAMP, stmt.args_names("EXP"));
468
        return stmt;
469
    }
470

    
471
    private Statement createExtractStatement(Grammar theGrammar) {
472
        Statement stmt;
473

    
474
        stmt = theGrammar.createStatement("EXTRACT");
475
        stmt.addRule(stmt.require_any_token("EXTRACT"));
476
        stmt.addRule(stmt.require_any_token("("));
477
        stmt.addRule(stmt.require_any_token("CENTURY", "DAY", "DECADE",
478
                "DOW", "DOY", "HOUR", "ISODOW", "ISOYEAR", "MICROSECONDS",
479
                "MILLENNIUM", "MILLUSECONDS", "MINUTE", "MONTH", "QUARTER",
480
                "SECOND", "WEEK", "YEAR").capture_as("FIELD"));
481
        stmt.addRule(stmt.require_any_token("FROM"));
482
        stmt.addRule(stmt.require_expression().capture_as("EXP"));
483
        stmt.addRule(stmt.require_any_token(")"));
484
        stmt.code(FUNCTION_EXTRACT, stmt.args_names("FIELD", "EXP"));
485
        return stmt;
486
    }
487

    
488
    private Statement createDictStatement(Grammar theGrammar) {
489
        Statement stmt;
490

    
491
        stmt = theGrammar.createStatement("DICT");
492
        stmt.addRule(stmt.require_any_token("{"));
493
        stmt.addRule(stmt.repeat()
494
                .addRule(stmt.optional_literal_string().capture_as("NAME#")
495
                        .addRuleOnFalse(stmt.require_identifier().capture_as("NAME#"))
496
                )
497
                .addRule(stmt.require_any_token(":", "=>"))
498
                .addRule(stmt.require_expression().capture_as("VALUE#"))
499
                .addRule(stmt.optional_any_token(",")
500
                        .addRuleOnFalse(stmt.break_loop())
501
                )
502
        );
503
        stmt.addRule(stmt.require_any_token("}"));
504
        stmt.code(FUNCTION_DICT, new DictArgsBuilder("NAME#", "VALUE#"));
505
        return stmt;
506
    }
507

    
508
    private Statement createListStatement(Grammar theGrammar) {
509
        Statement stmt;
510

    
511
        stmt = theGrammar.createStatement("LIST");
512
        stmt.addRule(stmt.require_any_token("["));
513
        stmt.addRule(stmt.repeat()
514
                .addRule(stmt.require_expression().capture_as("VALUE#"))
515
                .addRule(stmt.optional_any_token(",")
516
                        .addRuleOnFalse(stmt.break_loop())
517
                )
518
        );
519
        stmt.addRule(stmt.require_any_token("]"));
520
        stmt.code(FUNCTION_LIST, stmt.args_names("VALUE#"));
521
        return stmt;
522
    }
523

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

    
527
        theGrammar.addReservedWord("PASS");
528

    
529
        stmt = theGrammar.createStatement("PASS");
530
        stmt.addRule(stmt.require_any_token("PASS"));
531
        stmt.addRule(stmt.optional_any_token("(")
532
                .addRuleOnTrue(stmt.require_expressions(",").capture_as("ARGS#"))
533
                .addRuleOnTrue(stmt.require_any_token(")"))
534
        );
535
        stmt.code(
536
                "PASS",
537
                stmt.args_names("ARGS#")
538
        );
539
        return stmt;
540
    }
541

    
542
    private Statement createCallStatement(Grammar theGrammar) {
543
        Statement stmt;
544

    
545
        theGrammar.addReservedWord("CALL");
546

    
547
        stmt = theGrammar.createStatement("CALL");
548
        stmt.addRule(stmt.require_any_token("CALL"));
549
        stmt.addRule(stmt.require_identifier().capture_as("CALLABLE"));
550
        stmt.addRule(stmt.optional_any_token("(")
551
                .addRuleOnTrue(stmt.require_expressions(",").capture_as("ARGS#"))
552
                .addRuleOnTrue(stmt.require_any_token(")"))
553
        );
554
        stmt.code(
555
                "CALL",
556
                stmt.args_names("CALLABLE", "ARGS#")
557
        );
558
        return stmt;
559
    }
560

    
561
}