Revision 44533 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/DefaultStatement.java

View differences:

DefaultStatement.java
100 100
        }
101 101
    }
102 102

  
103
    public class RuleRequireLiteralString implements Rule {
104

  
105
        private final String id;
106

  
107
        public RuleRequireLiteralString(String id) {
108
            this.id = id;
109
        }
110

  
111
        @Override
112
        public void parse(StatementContext context) {
113
            Token token = context.look_token();
114
            if (token.getType() != Token.STRING_LITERAL) {
115
                throw new ExpressionSyntaxException(
116
                        I18N.A_string_literal_was_expected(),
117
                        context.getLexicalAnalyzer()
118
                );
119
            }
120
            String identifier = (String) token.getLiteral();
121
            Code code = context.getCodeBuilder().constant(identifier);
122
            context.setCode(id, code);
123
            context.next_token();
124
        }
125

  
126
        @Override
127
        public String toString() {
128
            return "require_literal_string('" + this.id + "')";
129
        }
130
    }
131

  
103 132
    public class RuleRequireExpression implements Rule {
104 133

  
105 134
        private final String id;
......
180 209
        }
181 210
    }
182 211

  
212
    public abstract class AbstractConditionalRule implements ConditionalRule {
213

  
214
        protected final List<Rule> onTrueRules;
215
        protected final List<Rule> onFalseRules;
216

  
217
        public AbstractConditionalRule() {
218
            this.onTrueRules = new ArrayList<>();
219
            this.onFalseRules = new ArrayList<>();
220
        }
221

  
222
        protected void parseOnTrueRules(StatementContext context) {
223
            for (Rule rule : this.onTrueRules) {
224
                rule.parse(context);
225
            }
226
        }
227

  
228
        protected void parseOnFalseRules(StatementContext context) {
229
            for (Rule rule : this.onFalseRules) {
230
                rule.parse(context);
231
            }
232
        }
233

  
234
        @Override
235
        public ConditionalRule addRuleOnTrue(Rule rule) {
236
            this.onTrueRules.add(rule);
237
            return this;
238
        }
239

  
240
        @Override
241
        public ConditionalRule addRuleOnFalse(Rule rule) {
242
            this.onFalseRules.add(rule);
243
            return this;
244
        }
245

  
246
    }
247

  
183 248
    public class RuleOptionalAnyToken implements ConditionalRule {
184 249

  
185 250
        private final String[] optional_token;
......
275 340
        }
276 341
    }
277 342

  
278
    public class RuleOptionalIdentifiers implements Rule {
343
    public class RuleOptionalIdentifiers extends AbstractConditionalRule implements ConditionalRule {
279 344

  
280 345
        private final String id;
281 346
        private final String separator;
282 347

  
283 348
        public RuleOptionalIdentifiers(String id, String separator) {
349
            super();
284 350
            this.id = id;
285 351
            this.separator = separator;
286 352
        }
......
304 370
                context.next_token();
305 371
                token = context.look_token();
306 372
            }
307
            Code code = null;
308 373
            if (args.size() != 0) {
309
                code = context.getCodeBuilder().function(FUNCTION_LIST, args);
374
                Code code = context.getCodeBuilder().function(FUNCTION_LIST, args);
375
                context.setCode(id, code);
376
                this.parseOnTrueRules(context);
377
            } else {
378
                this.parseOnFalseRules(context);
310 379
            }
311
            context.setCode(id, code);
312 380
        }
313 381

  
314 382
        @Override
......
317 385
        }
318 386
    }
319 387

  
388
    public class RuleOptionalLiteralString extends AbstractConditionalRule implements ConditionalRule {
389

  
390
        private final String id;
391

  
392
        public RuleOptionalLiteralString(String id) {
393
            super();
394
            this.id = id;
395
        }
396

  
397
        @Override
398
        public void parse(StatementContext context) {
399
            Token token = context.look_token();
400
            if (token.getType() == Token.STRING_LITERAL) {
401
                String s = (String) token.getLiteral();
402
                Code code = context.getCodeBuilder().constant(s);
403
                context.setCode(id, code);
404
                context.next_token();
405
                this.parseOnTrueRules(context);
406
            } else {
407
                this.parseOnFalseRules(context);
408
            }
409
        }
410

  
411
        @Override
412
        public String toString() {
413
            return "optional_literal_string('" + id + "')";
414
        }
415
    }
416

  
320 417
    public static class ArgsBuilderFromNames implements ArgsBuilder {
321 418

  
322 419
        private final String[] argNames;
......
342 439
                    }
343 440
                } else {
344 441
                    Code code = context.getCode(argName);
345
                    if( code != null) {
346
                        args.add(code);
442
                    if( code == null) {
443
                        code = context.getCodeBuilder().constant(null);
347 444
                    }
445
                    args.add(code);
348 446
                }
349 447
            }
350 448
            return args;
......
447 545
    }
448 546

  
449 547
    @Override
548
    public Rule require_literal_string(String id) {
549
        return new RuleRequireLiteralString(id);
550
    }
551

  
552
    @Override
450 553
    public Rule set_expression(String id, Object value) {
451 554
        return new RuleSetExpression(id, value);
452 555
    }
......
467 570
    }
468 571

  
469 572
    @Override
470
    public Rule optional_identifiers(String id, String separator) {
573
    public ConditionalRule optional_identifiers(String id, String separator) {
471 574
        return new RuleOptionalIdentifiers(id, separator);
472 575
    }
473 576

  
474 577
    @Override
578
    public ConditionalRule optional_literal_string(String id) {
579
        return new RuleOptionalLiteralString(id);
580
    }
581

  
582
    @Override
475 583
    public CompoundRule repeat_until_any_tokens(String... tokens) {
476 584
        return new RuleRepeatUntilAnyTokens(tokens);
477 585
    }

Also available in: Unified diff