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