Revision 46081

View differences:

trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.impl/src/test/java/org/gvsig/expresionevaluator/impl/TestCompiler.java
574 574
        code.link(this.createSymbolTable());
575 575
        assertEquals( "list(1, 2, 3).set(1, 20)", code.toString());
576 576
    }    
577

  
578
    public void testColon1() {
579
        String source =  ":a+b";
580

  
581
        Compiler compiler = createCompiler();
582
        
583
        Code code = compiler.compileExpression(source);
584
        code.link(this.createSymbolTable());
585
        assertEquals( "($EVAL(\"a\") + \"b\")", code.toString());
586
    }    
577 587
    
588
    public void testColon2() {
589
        String source =  ":(a+b)+c";
590

  
591
        Compiler compiler = createCompiler();
592
        
593
        Code code = compiler.compileExpression(source);
594
        code.link(this.createSymbolTable());
595
        assertEquals( "($EVAL((\"a\" + \"b\")) + \"c\")", code.toString());
596
    }    
597
    
598
    
599
    public void testColon3() {
600
        String source =  ":a.c";
601

  
602
        Compiler compiler = createCompiler();
603
        
604
        Code code = compiler.compileExpression(source);
605
        code.link(this.createSymbolTable());
606
        assertEquals( "GETATTR($EVAL(\"a\"), 'c')", code.toString());
607
    }    
608
    
609
    public void testColon4() {
610
        String source =  ":IN a.c";
611

  
612
        Compiler compiler = createCompiler();
613
        
614
        Code code = compiler.compileExpression(source);
615
        code.link(this.createSymbolTable());
616
        assertEquals( "GETATTR($EVAL(\"a\"), 'c')", code.toString());
617
    }    
618
    
619
    
620
    
578 621
}
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/function/programming/$EvalFunction.java
1
package org.gvsig.expressionevaluator.impl.function.programming;
2

  
3
import org.apache.commons.lang3.Range;
4
import static org.gvsig.expressionevaluator.ExpressionBuilder.FUNCTION_$EVAL;
5
import org.gvsig.expressionevaluator.Function;
6
import org.gvsig.expressionevaluator.Interpreter;
7
import org.gvsig.expressionevaluator.spi.AbstractFunction;
8

  
9
public class $EvalFunction extends AbstractFunction {
10

  
11
    public $EvalFunction() {
12
        super(Function.GROUP_PROGRAMMING, 
13
                FUNCTION_$EVAL, 
14
            Range.is(1),
15
            "Returns the value passed as a parameter.\n",
16
            FUNCTION_$EVAL+"({{expression}})",
17
            null,
18
            "Object",
19
            false
20
        );
21
    }
22
    
23
    @Override
24
    public boolean allowConstantFolding() {
25
        return false;
26
    }    
27
    
28
    @Override
29
    public Object call(Interpreter interpreter, final Object[] args) throws Exception {
30
        return args[0];        
31
    }
32
    
33

  
34
}
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/SQLLexicalAnalyzer.java
98 98
                return token;
99 99
            }
100 100
            ungetch();
101
            token.set(Token.CHAR, ":");
101
            token.set(Token.COLON, ":");
102 102
            return token;
103 103

  
104 104
        case '<':
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/I18N.java
172 172
        return "non-keyword arg after keyword arg";
173 173
    }
174 174

  
175
    static String invalid_mode_specifier_in_host_expression() {
176
        return "Invalid mode specifier in host expression";
177
    }
178

  
175 179
}
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
517 517
    }
518 518

  
519 519
    public Code parse_getattr() {
520
        Code op1 = parse_termino();
520
        Code op1 = parse_colon();
521 521
        if( !isObjectAccessSupported() ) {
522 522
            return op1;
523 523
        }
......
557 557
        }
558 558
    }    
559 559

  
560
    public Code parse_colon() { 
561
        Token token = lexer.look();
562
        if( token.getType() == Token.COLON ) {
563
            // Con esto pretendemos simular el uso de los ":" de SQLJ.
564
            // 
565
            // https://docs.oracle.com/cd/A87860_01/doc/java.817/a83723/blangfe3.htm
566
            // Basic Host Expression Syntax
567
            //
568
            // Solo estamos dando soporte al especificador de modo "IN".
569
            lexer.next();
570
            token = lexer.look();
571
            if( token.getType() == Token.IDENTIFIER )  {
572
                switch(token.getLiteral().trim().toUpperCase()) {
573
                    case "IN":
574
                        lexer.next();
575
                        break;
576
                    case "OUT":
577
                    case "INOUT":
578
                        // Invalid mode specifier in host expression
579
                        throw new ExpressionSyntaxException(
580
                            I18N.invalid_mode_specifier_in_host_expression(),
581
                            lexer
582
                        );
583
                }
584
            }
585
            Code op = parse_termino();
586
            return codeBuilder.$eval(op);
587
        }
588
        return parse_termino();
589
    }
590
    
560 591
    @SuppressWarnings("UnusedAssignment")
561 592
    public Code parse_termino() {
562 593

  
......
630 661
                    return codeBuilder.identifier(id);
631 662
                }
632 663
            }
633
        case Token.STRING_LITERAL:
664
        case Token.STRING_LITERAL: 
634 665
            lexer.next();
635 666
            return codeBuilder.constant(token.getValue());
636 667
        case Token.INTEGER_LITERAL:
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/DefaultCodeBuilder.java
988 988
        return function(FUNCTION_DICT, args);
989 989
    }
990 990
    
991
    @Override
992
    public Code $eval(Code obj) {
993
        BaseCodes args = args();
994
        args.add(obj);
995
        return function(ExpressionBuilder.FUNCTION_$EVAL, args);
996
    }    
997

  
991 998
}
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/symboltable/ProgrammingSymbolTable.java
2 2

  
3 3
import org.gvsig.expressionevaluator.Function;
4 4
import org.gvsig.expressionevaluator.impl.function.programming.$ConstantFunction;
5
import org.gvsig.expressionevaluator.impl.function.programming.$EvalFunction;
5 6
import org.gvsig.expressionevaluator.impl.function.programming.$IdentifierFunction;
6 7
import org.gvsig.expressionevaluator.impl.function.programming.CallFunction;
7 8
import org.gvsig.expressionevaluator.impl.function.programming.CallMethodFunction;
......
91 92
        this.addFunction(new ShowWindowFunction());
92 93
        this.addFunction(new CreateHtmlPanelFunction());
93 94
        this.addFunction(new SwingBlockFunction());
95
        this.addFunction(new $EvalFunction());
94 96
    }
95 97

  
96 98
    private void addOperator(Function operator) {
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.api/src/main/java/org/gvsig/expressionevaluator/CodeBuilder.java
79 79
    Code method(Code obj, String methodname, Codes args);
80 80
    
81 81
    Code let(String identifier, Code value);
82
    
83
    Code $eval(Code value);
82 84
}
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.api/src/main/java/org/gvsig/expressionevaluator/ExpressionBuilder.java
125 125
    public static final String FUNCTION_DICT = "DICT";
126 126
    public static final String FUNCTION_$CONSTANT = "$CONSTANT";
127 127
    public static final String FUNCTION_$IDENTIFIER = "$IDENTIFIER";
128
    public static final String FUNCTION_$EVAL = "$EVAL";
128 129
    
129 130
    public static final String FUNCTION_GETATTR = "GETATTR";
130 131
    public static final String FUNCTION_GETITEM = "GETITEM";
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.api/src/main/java/org/gvsig/expressionevaluator/LexicalAnalyzer.java
47 47
        public static final int CLOSED_BRACKET = 37;
48 48
        public static final int ASSIGNMENT = 38;
49 49
        public static final int ARGUMENT_ASSIGNMENT = 39;
50
        public static final int COLON = 40;
50 51

  
51 52
        @Override
52 53
        public Token clone() throws CloneNotSupportedException;

Also available in: Unified diff