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

View differences:

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