Revision 45719

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/TestGrammarInterpreter.java
77 77
        assertEquals(23, symbolTable.value("V1"));
78 78
    }
79 79

  
80
    public void testVar() {
81
        SymbolTable symbolTable = createSymbolTable();
82
        Compiler compiler = createCompiler();
83
        Interpreter interpreter = createInterpreter(symbolTable);
84

  
85
        String source = "(VAR V1 DEFAULT 23)+2";
86

  
87
        Code code = compiler.compileExpression(source);
88
        Object v = interpreter.run(code);
89
        
90
        assertEquals(23, symbolTable.value("V1"));
91
        assertEquals((Integer)25, v);
92
    }
93

  
80 94
    public void testBlock() {
81 95
        SymbolTable symbolTable = createSymbolTable();
82 96
        Compiler compiler = createCompiler();
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/TestGrammarCompiler.java
2 2

  
3 3
import junit.framework.TestCase;
4 4
import org.gvsig.expressionevaluator.Code;
5
import org.gvsig.expressionevaluator.Compiler;
5 6
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
6 7
import org.gvsig.expressionevaluator.ExpressionEvaluatorManager;
7 8
import org.gvsig.expressionevaluator.Interpreter;
8 9
import org.gvsig.expressionevaluator.LexicalAnalyzer;
10
import org.gvsig.expressionevaluator.MutableSymbolTable;
9 11
import org.gvsig.expressionevaluator.SymbolTable;
10
import org.gvsig.expressionevaluator.Compiler;
11
import org.gvsig.expressionevaluator.MutableSymbolTable;
12 12
import org.gvsig.tools.library.impl.DefaultLibrariesInitializer;
13 13

  
14 14
/**
......
76 76
        assertEquals("LET('V1', 23)", code.toString());
77 77
    }
78 78

  
79
    public void testVar() {
80
        String source = "VAR V1 DEFAULT 23";
81

  
82
        Compiler compiler = createCompiler();
83

  
84
        Code code = compiler.compileExpression(source);
85
        assertEquals("VAR(\"V1\", 23)", code.toString());
86
    }
87

  
79 88
    public void testBlock() {
80 89
        String source = "BEGIN LET V1 = 23; END";
81 90

  
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/grammars/BasicGrammarFactory.java
105 105

  
106 106
    }
107 107

  
108
    public static class VarArgsBuilder implements Statement.ArgsBuilder {
109

  
110
        protected final String varName;
111
        protected final String valueName;
112

  
113
        public VarArgsBuilder(String varName, String valueName) {
114
            this.varName = varName;
115
            this.valueName = valueName;
116
        }
117

  
118
        @Override
119
        public String toString() {
120
          return "var_args("+varName+","+valueName+")";
121
        }
122
        
123
        @Override
124
        public Codes build(StatementContext context) {
125
            context.trace(this.toString()+".build");
126
            BaseCodes args = (BaseCodes) context.getCodeBuilder().args();
127
            args.add(context.getCodeBuilder().identifier((String) ((Code.Constant)context.getCode(varName)).value()));
128
            args.add(context.getCode(valueName));
129
            return args;
130
        }
131
    }
132

  
133
    
134
    
108 135
    public BasicGrammarFactory() {
109 136
        super("Basic", true);
110 137
    }
......
356 383
        );
357 384
        stmt.code(
358 385
                "VAR",
359
                stmt.args_names("NAME", "VALUE")
386
                new VarArgsBuilder("NAME", "VALUE")
360 387
        );
361 388
        return stmt;
362 389
    }
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/BookmarksSymbolTable.java
37 37
import org.gvsig.expressionevaluator.Function;
38 38
import org.gvsig.expressionevaluator.SymbolTable;
39 39
import org.gvsig.expressionevaluator.impl.function.programming.CreateFnFunction;
40
import org.gvsig.expressionevaluator.impl.function.programming.VarFunction;
40 41
import org.gvsig.expressionevaluator.spi.AbstractSymbolTable;
41 42
import org.gvsig.tools.bookmarksandhistory.Bookmark;
42 43
import org.gvsig.tools.bookmarksandhistory.Bookmarks;
......
94 95
                    List<String> argNames = new ArrayList<>();
95 96
                    try {
96 97
                        code.accept((Object o) -> {
97
                            if (((Code) o).code() == Code.IDENTIFIER) {
98
                                argNames.add(((Code.Identifier) o).name());
98
                            if (((Code) o).code() == Code.CALLABLE) {
99
                                Code.Callable c = (Code.Callable) o;
100
                                if(StringUtils.equalsIgnoreCase(c.name(), VarFunction.NAME)){
101
                                    argNames.add(((Code.Identifier) c.parameters().get(0)).name());
102
                                }
99 103
                            }
100 104
                        });
101 105
                    } catch (BaseException ex) {
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/VarFunction.java
1 1
package org.gvsig.expressionevaluator.impl.function.programming;
2 2

  
3 3
import org.apache.commons.lang3.Range;
4
import org.gvsig.expressionevaluator.Code;
5
import org.gvsig.expressionevaluator.Codes;
4 6
import org.gvsig.expressionevaluator.ExpressionBuilder;
5 7
import org.gvsig.expressionevaluator.Function;
6 8
import org.gvsig.expressionevaluator.Interpreter;
......
9 11
import org.gvsig.expressionevaluator.spi.AbstractFunction;
10 12

  
11 13
public class VarFunction extends AbstractFunction {
14
    
15
    public static final String NAME="VAR";
12 16

  
13 17
    public VarFunction() {
14 18
        super(Function.GROUP_PROGRAMMING, 
15
                "VAR", 
19
                NAME, 
16 20
            Range.between(1,2),
17 21
            "Declare a variable.",
18
            "VAR {{identifier}} = default_value",
22
            NAME+" {{identifier}} = default_value",
19 23
            new String[]{
20 24
                "identifier_name - Name of the variable",
21 25
                "default_value - Value to assign to the variable ifhave to create it."
......
32 36
    
33 37
    @Override
34 38
    public Object call(Interpreter interpreter, Object[] args) throws Exception {
35
        String name = getStr(args,0);
36
        if( name == null ) {
37
            throw new NullPointerException("A string with a variable name was expected and a null was received");
39
//        String name = getStr(args,0);
40
//        if( name == null ) {
41
//            throw new NullPointerException("A string with a variable name was expected and a null was received");
42
//        }
43
//        Object value = null;
44
//        if( args.length==2 ) {
45
//            value = getObject(args, 1);
46
//        }
47
//        SymbolTable symbolTable = interpreter.getSymbolTable();
48
//        if( symbolTable instanceof MutableSymbolTable ) {
49
//            if( !symbolTable.exists(name)) {
50
//                ((MutableSymbolTable)symbolTable).setVar(name, value);
51
//            }
52
//        } else {
53
//            throw new RuntimeException("A MutableSymbolTable is required for use VAR function.");
54
//        }
55
        return null;
56
    }
57

  
58
    @Override
59
    public Object call(Interpreter interpreter, Codes args) throws Exception {
60
        Code varNameCode = args.get(0);
61
        if(varNameCode.code() != Code.IDENTIFIER){
62
            throw new RuntimeException("First argument must be a identifier.");
38 63
        }
64
        String name = ((Code.Identifier)varNameCode).name();
39 65
        Object value = null;
40
        if( args.length==2 ) {
41
            value = getObject(args, 1);
66
        if(args.size() == 2){
67
            value = interpreter.run(args.get(1));
42 68
        }
43 69
        SymbolTable symbolTable = interpreter.getSymbolTable();
44 70
        if( symbolTable instanceof MutableSymbolTable ) {
45
            if( !symbolTable.exists(name)) {
71
            if( symbolTable.exists(name)) {
72
                value = symbolTable.value(name);
73
            } else {
46 74
                ((MutableSymbolTable)symbolTable).setVar(name, value);
47 75
            }
48 76
        } else {
49 77
            throw new RuntimeException("A MutableSymbolTable is required for use VAR function.");
50 78
        }
51
        return null;
79
        return value;
52 80
    }
81

  
82
    @Override
83
    public boolean useArgumentsInsteadObjects() {
84
        return true;
85
    }
53 86
    
87
    
88
    
89
    
90
    
54 91
}

Also available in: Unified diff