Revision 47598 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/DefaultCompiler.java
DefaultCompiler.java | ||
---|---|---|
3 | 3 |
import java.util.HashMap; |
4 | 4 |
import java.util.Map; |
5 | 5 |
import java.util.Stack; |
6 |
import java.util.function.Supplier; |
|
6 | 7 |
import org.apache.commons.lang3.StringUtils; |
7 | 8 |
import org.gvsig.expressionevaluator.Compiler; |
8 | 9 |
import org.gvsig.expressionevaluator.LexicalAnalyzer; |
... | ... | |
18 | 19 |
import org.gvsig.expressionevaluator.MutableCodes; |
19 | 20 |
import org.gvsig.expressionevaluator.Statement; |
20 | 21 |
import org.gvsig.expressionevaluator.Statement.StatementContext; |
22 |
import org.gvsig.expressionevaluator.UserOperator; |
|
23 |
import static org.gvsig.expressionevaluator.UserOperator.OERATOR_PRECEDENCE_CONDITIONAL; |
|
24 |
import static org.gvsig.expressionevaluator.UserOperator.OERATOR_PRECEDENCE_FACTOR; |
|
25 |
import static org.gvsig.expressionevaluator.UserOperator.OERATOR_PRECEDENCE_RELATIONAL; |
|
26 |
import static org.gvsig.expressionevaluator.UserOperator.OERATOR_PRECEDENCE_SUM; |
|
21 | 27 |
import org.gvsig.expressionevaluator.impl.DefaultCodeBuilder.BaseConstant; |
22 | 28 |
import org.gvsig.expressionevaluator.impl.function.operator.NegOperator; |
23 | 29 |
import org.gvsig.expressionevaluator.impl.function.programming.$HostExpressionFunction; |
... | ... | |
276 | 282 |
return code; |
277 | 283 |
} |
278 | 284 |
|
285 |
protected Code parse_user_operator(String precedence, Code op1, Supplier<Code>op2) { |
|
286 |
for (UserOperator operator : this.manager.getUserDefinedOperators(precedence)) { |
|
287 |
Code userop = operator.parse(lexer, codeBuilder, op1, op2); |
|
288 |
if( userop != null ) { |
|
289 |
return userop; |
|
290 |
} |
|
291 |
} |
|
292 |
return op1; |
|
293 |
} |
|
294 |
|
|
279 | 295 |
public Code parse_relational() { |
280 | 296 |
Code op1 = parse_not(); |
281 | 297 |
Code op2; |
282 | 298 |
while( true ) { |
283 | 299 |
Token token = lexer.look(); |
284 | 300 |
switch( token.getType() ) { |
285 |
case Token.OP_OR: |
|
286 |
lexer.next(); |
|
287 |
op2 = parse_not(); |
|
288 |
if( op2==null ) { |
|
289 |
throw new ExpressionSyntaxException(I18N.Cant_recognize_the_second_operand_of_OR_operator(),lexer); |
|
290 |
} |
|
291 |
op1 = codeBuilder.or(op1, op2); |
|
292 |
break; |
|
293 | 301 |
case Token.PRED_IN: |
294 | 302 |
lexer.next(); |
295 | 303 |
Token next = lexer.look(); |
... | ... | |
317 | 325 |
} |
318 | 326 |
op1 = codeBuilder.in(op1, op2); |
319 | 327 |
break; |
328 |
case Token.OP_OR: |
|
329 |
lexer.next(); |
|
330 |
op2 = parse_not(); |
|
331 |
if( op2==null ) { |
|
332 |
throw new ExpressionSyntaxException(I18N.Cant_recognize_the_second_operand_of_OR_operator(),lexer); |
|
333 |
} |
|
334 |
op1 = codeBuilder.or(op1, op2); |
|
335 |
break; |
|
320 | 336 |
case Token.OP_AND: |
321 | 337 |
lexer.next(); |
322 | 338 |
op2 = parse_not(); |
... | ... | |
326 | 342 |
op1 = codeBuilder.and(op1, op2); |
327 | 343 |
break; |
328 | 344 |
default: |
345 |
op1 = parse_user_operator(OERATOR_PRECEDENCE_RELATIONAL, op1, () -> parse_not()); |
|
329 | 346 |
return op1; |
330 | 347 |
} |
331 | 348 |
} |
... | ... | |
496 | 513 |
break; |
497 | 514 |
|
498 | 515 |
default: |
516 |
op1 = parse_user_operator(OERATOR_PRECEDENCE_CONDITIONAL, op1, () -> parse_sum()); |
|
499 | 517 |
return op1; |
500 | 518 |
} |
501 | 519 |
} |
... | ... | |
523 | 541 |
op1 = codeBuilder.subst(op1, op2); |
524 | 542 |
break; |
525 | 543 |
default: |
544 |
op1 = parse_user_operator(OERATOR_PRECEDENCE_SUM, op1, () -> parse_factor()); |
|
526 | 545 |
return op1; |
527 | 546 |
} |
528 | 547 |
} |
... | ... | |
572 | 591 |
Code code = codeBuilder.getitem(op1, codeIndex); |
573 | 592 |
return code; |
574 | 593 |
default: |
594 |
op1 = parse_user_operator(OERATOR_PRECEDENCE_FACTOR, op1, () -> parse_getattr()); |
|
575 | 595 |
return op1; |
576 | 596 |
} |
577 | 597 |
} |
Also available in: Unified diff