Revision 44211 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 org.apache.commons.lang3.StringUtils;
6
import org.apache.commons.lang3.math.NumberUtils;
6 7
import org.gvsig.expressionevaluator.Compiler;
7 8
import org.gvsig.expressionevaluator.LexicalAnalyzer;
8 9
import org.gvsig.expressionevaluator.LexicalAnalyzer.Token;
9 10
import org.gvsig.expressionevaluator.Code;
11
import org.gvsig.expressionevaluator.Code.Constant;
10 12
import org.gvsig.expressionevaluator.CodeBuilder;
11 13
import org.gvsig.expressionevaluator.Codes;
14
import org.gvsig.expressionevaluator.ExpressionBuilder;
12 15
import org.gvsig.expressionevaluator.ExpressionSyntaxException;
13 16
import org.gvsig.expressionevaluator.GrammarSet;
14 17
import org.gvsig.expressionevaluator.Statement;
15 18
import org.gvsig.expressionevaluator.Statement.StatementContext;
16 19
import org.gvsig.expressionevaluator.impl.DefaultCodeBuilder.BaseCodes;
20
import org.gvsig.expressionevaluator.impl.DefaultCodeBuilder.BaseConstant;
21
import org.gvsig.expressionevaluator.impl.function.operator.NegOperator;
17 22

  
18 23
public class DefaultCompiler implements Compiler {
19 24

  
......
513 518
        case Token.OP_SUBST:
514 519
            lexer.next();
515 520
            Code code = parse_termino();
521
            if( code.code()==Code.CONSTANT ) {
522
                BaseConstant c = (BaseConstant)code;
523
                if( c.value() instanceof Number ) {
524
                    c.value(NegOperator.negate((Number) c.value()));
525
                    return code;
526
                }
527
                // Aqui no tengo claro si deberia lanzarse una excepcion 
528
                // Ya que se esta intentando aplicar el operador unario de 
529
                // negacion a algo que no es un numero. Lo normal es que falle
530
                // en tiempo de ejecucion.
531
            }
516 532
            return codeBuilder.negate(code);
517 533
        case Token.EOF:
518 534
            throw new ExpressionSyntaxException(I18N.unexpected_end_of_source(),lexer);

Also available in: Unified diff