Revision 45719
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