Revision 44738
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.time/org.gvsig.expressionevaluator.time.lib/org.gvsig.expressionevaluator.time.lib.impl/src/main/resources/META-INF/services/org.gvsig.tools.library.Library | ||
---|---|---|
1 |
org.gvsig.expressionevaluator.impl.GeometryExpressionEvaluatorImplLibrary |
|
1 |
org.gvsig.expressionevaluator.impl.TimeExpressionEvaluatorImplLibrary |
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/Codes.java | ||
---|---|---|
1 | 1 |
package org.gvsig.expressionevaluator; |
2 | 2 |
|
3 |
import org.gvsig.tools.util.GetItemByKey; |
|
3 | 4 |
import org.gvsig.tools.util.UnmodifiableBasicList; |
4 | 5 |
import org.gvsig.tools.visitor.Visitable; |
5 | 6 |
|
... | ... | |
7 | 8 |
* |
8 | 9 |
* @author jjdelcerro |
9 | 10 |
*/ |
10 |
public interface Codes extends Code, Visitable, UnmodifiableBasicList<Code> { |
|
11 |
public interface Codes extends Code, Visitable, UnmodifiableBasicList<Code>, GetItemByKey<String,Code> {
|
|
11 | 12 |
|
13 |
public boolean useArgNames(); |
|
14 |
|
|
15 |
public boolean useArgNames(boolean useNames); |
|
16 |
|
|
17 |
public boolean contains(String name, int index); |
|
18 |
|
|
19 |
public String getName(int index); |
|
20 |
|
|
12 | 21 |
} |
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/Statement.java | ||
---|---|---|
32 | 32 |
|
33 | 33 |
public boolean isReservedWord(String s); |
34 | 34 |
|
35 |
public void trace(String msg); |
|
35 | 36 |
} |
36 | 37 |
|
37 | 38 |
public interface Rule { |
... | ... | |
50 | 51 |
|
51 | 52 |
public ConditionalRule addRuleOnFalse(Rule rule); |
52 | 53 |
} |
54 |
|
|
55 |
public interface SwichTokenRule extends Rule { |
|
56 |
public SwichTokenRule addCase(String token, Rule... rules); |
|
57 |
public SwichTokenRule addDefault(Rule... rules); |
|
58 |
} |
|
53 | 59 |
|
54 | 60 |
public interface ArgsBuilder { |
55 | 61 |
|
... | ... | |
74 | 80 |
|
75 | 81 |
public CompoundRule repeat_until_any_tokens(String... token); |
76 | 82 |
|
83 |
public CompoundRule repeat(); |
|
84 |
|
|
77 | 85 |
public Rule require_identifier(String id); |
78 | 86 |
|
79 | 87 |
public Rule require_literal_string(String id); |
... | ... | |
84 | 92 |
|
85 | 93 |
public Rule require_expressions(String id, String separator); |
86 | 94 |
|
95 |
public Rule break_loop(); |
|
96 |
|
|
97 |
public SwichTokenRule switch_token(); |
|
98 |
|
|
87 | 99 |
public ConditionalRule optional_any_token(String... id); |
88 | 100 |
|
89 | 101 |
public ConditionalRule optional_identifiers(String id, String separator); |
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/spi/AbstractFunction.java | ||
---|---|---|
131 | 131 |
} |
132 | 132 |
|
133 | 133 |
@Override |
134 |
public boolean isHidden() { |
|
135 |
return false; |
|
136 |
} |
|
137 |
|
|
138 |
@Override |
|
134 | 139 |
public boolean useArgumentsInsteadObjects() { |
135 | 140 |
return false; |
136 | 141 |
} |
... | ... | |
144 | 149 |
public boolean allowConstantFolding() { |
145 | 150 |
return false; |
146 | 151 |
} |
152 |
|
|
153 |
@Override |
|
154 |
public boolean allowArgNames() { |
|
155 |
return false; |
|
156 |
} |
|
147 | 157 |
|
148 | 158 |
@Override |
149 | 159 |
public Object call(Interpreter interpreter, Codes args) throws Exception { |
... | ... | |
259 | 269 |
return value; |
260 | 270 |
} |
261 | 271 |
|
272 |
protected Object getObject(Interpreter interpreter, Codes args, String name) { |
|
273 |
Code arg = args.get(name); |
|
274 |
if( arg==null ) { |
|
275 |
return null; |
|
276 |
} |
|
277 |
Object value = interpreter.run(arg); |
|
278 |
return value; |
|
279 |
} |
|
280 |
|
|
281 |
protected Object getObject(Interpreter interpreter, Codes args, String name, int index) { |
|
282 |
Code arg = args.get(name+index); |
|
283 |
if( arg==null ) { |
|
284 |
return null; |
|
285 |
} |
|
286 |
Object value = interpreter.run(arg); |
|
287 |
return value; |
|
288 |
} |
|
289 |
|
|
262 | 290 |
protected Date getDate(Object[] args, int n) { |
263 | 291 |
if( args.length < n ) { |
264 | 292 |
throw new IllegalArgumentException(I18N.Required_argument_XargnX_and_only_found_XargcX_in_call_to_XIdentifierX(name(), args.length, n)); |
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/spi/AbstractLexicalAnalyzer.java | ||
---|---|---|
204 | 204 |
|
205 | 205 |
abstract protected Token getToken(); |
206 | 206 |
|
207 |
protected void push_state() {
|
|
207 |
public void push_state() {
|
|
208 | 208 |
this.states.push(position); |
209 | 209 |
} |
210 | 210 |
|
211 |
protected void pop_state() {
|
|
211 |
public void pop_state() {
|
|
212 | 212 |
position = this.states.pop(); |
213 | 213 |
} |
214 | 214 |
|
... | ... | |
511 | 511 |
public boolean getUseBracketsForIdentifiers() { |
512 | 512 |
return this.useBracketsForIdentifiers; |
513 | 513 |
} |
514 |
|
|
515 |
public String getSourceContext() { |
|
516 |
String s = StringUtils.left(source, position) + "[*]" + StringUtils.mid(source, position, 200); |
|
517 |
if( s.length()>200 ) { |
|
518 |
s = "..."+StringUtils.mid(s, position-100, 200)+"..."; |
|
519 |
} |
|
520 |
return s; |
|
521 |
} |
|
522 |
|
|
514 | 523 |
} |
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/Function.java | ||
---|---|---|
39 | 39 |
|
40 | 40 |
public boolean isOperator(); |
41 | 41 |
|
42 |
public boolean isHidden(); |
|
43 |
|
|
42 | 44 |
public boolean useArgumentsInsteadObjects(); |
43 | 45 |
|
44 | 46 |
public boolean isSQLCompatible(); |
... | ... | |
53 | 55 |
* @return true if this function allow constant folding optimization. |
54 | 56 |
*/ |
55 | 57 |
public boolean allowConstantFolding(); |
58 |
|
|
59 |
public boolean allowArgNames(); |
|
56 | 60 |
} |
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 | ||
---|---|---|
86 | 86 |
public void setUseBracketsForIdentifiers(boolean useBracketsForIdentifiers); |
87 | 87 |
|
88 | 88 |
public boolean getUseBracketsForIdentifiers(); |
89 |
|
|
90 |
public String getSourceContext(); |
|
89 | 91 |
} |
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/DefaultGrammar.java | ||
---|---|---|
50 | 50 |
|
51 | 51 |
@Override |
52 | 52 |
public Statement getApplicableStatement(StatementContext context) { |
53 |
context.trace(this.getName()+".getApplicableStatement"); |
|
53 | 54 |
for (Statement statement : statements) { |
54 | 55 |
if( statement.isApplicable(context) ) { |
56 |
context.trace(this.getName()+".getApplicableStatement return "+statement); |
|
55 | 57 |
return statement; |
56 | 58 |
} |
57 | 59 |
} |
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/ForEachFunction.java | ||
---|---|---|
25 | 25 |
} |
26 | 26 |
|
27 | 27 |
@Override |
28 |
public boolean isHidden() { |
|
29 |
return true; |
|
30 |
} |
|
31 |
|
|
32 |
@Override |
|
28 | 33 |
public boolean useArgumentsInsteadObjects() { |
29 | 34 |
return true; |
30 | 35 |
} |
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/WhileFunction.java | ||
---|---|---|
24 | 24 |
} |
25 | 25 |
|
26 | 26 |
@Override |
27 |
public boolean isHidden() { |
|
28 |
return true; |
|
29 |
} |
|
30 |
|
|
31 |
@Override |
|
27 | 32 |
public boolean useArgumentsInsteadObjects() { |
28 | 33 |
return true; |
29 | 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/function/programming/ListFunction.java | ||
---|---|---|
20 | 20 |
"List", |
21 | 21 |
false |
22 | 22 |
); |
23 |
this.addAlias("array"); |
|
24 | 23 |
} |
25 | 24 |
|
26 | 25 |
@Override |
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/CaseFunction.java | ||
---|---|---|
26 | 26 |
} |
27 | 27 |
|
28 | 28 |
@Override |
29 |
public boolean isHidden() { |
|
30 |
return true; |
|
31 |
} |
|
32 |
|
|
33 |
@Override |
|
29 | 34 |
public boolean useArgumentsInsteadObjects() { |
30 | 35 |
return true; |
31 | 36 |
} |
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/TryFunction.java | ||
---|---|---|
23 | 23 |
} |
24 | 24 |
|
25 | 25 |
@Override |
26 |
public boolean isHidden() { |
|
27 |
return true; |
|
28 |
} |
|
29 |
|
|
30 |
@Override |
|
26 | 31 |
public boolean useArgumentsInsteadObjects() { |
27 | 32 |
return true; |
28 | 33 |
} |
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/ReturnFunction.java | ||
---|---|---|
22 | 22 |
} |
23 | 23 |
|
24 | 24 |
@Override |
25 |
public boolean isHidden() { |
|
26 |
return true; |
|
27 |
} |
|
28 |
|
|
29 |
@Override |
|
25 | 30 |
public boolean allowConstantFolding() { |
26 | 31 |
return false; |
27 | 32 |
} |
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/CodeBlockFunction.java | ||
---|---|---|
25 | 25 |
} |
26 | 26 |
|
27 | 27 |
@Override |
28 |
public boolean isHidden() { |
|
29 |
return true; |
|
30 |
} |
|
31 |
|
|
32 |
@Override |
|
28 | 33 |
public boolean useArgumentsInsteadObjects() { |
29 | 34 |
return true; |
30 | 35 |
} |
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/ForFunction.java | ||
---|---|---|
23 | 23 |
} |
24 | 24 |
|
25 | 25 |
@Override |
26 |
public boolean isHidden() { |
|
27 |
return true; |
|
28 |
} |
|
29 |
|
|
30 |
@Override |
|
26 | 31 |
public boolean useArgumentsInsteadObjects() { |
27 | 32 |
return true; |
28 | 33 |
} |
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/CreateFnFunction.java | ||
---|---|---|
4 | 4 |
import java.util.ArrayList; |
5 | 5 |
import java.util.Arrays; |
6 | 6 |
import java.util.List; |
7 |
import java.util.Objects; |
|
8 | 7 |
import org.apache.commons.lang3.Range; |
9 | 8 |
import org.apache.commons.lang3.StringUtils; |
10 | 9 |
import org.gvsig.expressionevaluator.Code; |
... | ... | |
39 | 38 |
} |
40 | 39 |
|
41 | 40 |
@Override |
41 |
public boolean isHidden() { |
|
42 |
return true; |
|
43 |
} |
|
44 |
|
|
45 |
@Override |
|
42 | 46 |
public boolean useArgumentsInsteadObjects() { |
43 | 47 |
return true; |
44 | 48 |
} |
... | ... | |
47 | 51 |
public boolean allowConstantFolding() { |
48 | 52 |
return false; |
49 | 53 |
} |
54 |
|
|
55 |
@Override |
|
56 |
public boolean allowArgNames() { |
|
57 |
return true; |
|
58 |
} |
|
50 | 59 |
|
51 | 60 |
@Override |
52 | 61 |
public Object call(Interpreter interpreter, Object[] args) throws Exception { |
... | ... | |
55 | 64 |
|
56 | 65 |
@Override |
57 | 66 |
public Object call(Interpreter interpreter, Codes args) throws Exception { |
58 |
// FNAME, PARAM-NAMES, BODY |
|
59 | 67 |
if( !(interpreter.getSymbolTable() instanceof MutableSymbolTable) ) { |
60 | 68 |
throw new ExpressionRuntimeException("The use of user functions require a mutable symbol table."); |
61 | 69 |
} |
62 | 70 |
MutableSymbolTable symbolTable = (MutableSymbolTable) interpreter.getSymbolTable(); |
63 | 71 |
|
64 |
String name; |
|
65 |
List<String> argNames; |
|
66 |
Code body = null; |
|
67 |
String script_path = null; |
|
68 |
String script_function = null; |
|
69 |
String language = null; |
|
70 |
// name, body |
|
71 |
// name, args, body |
|
72 |
// name, script_name, script_func, lang |
|
73 |
// name, args, script_name, script_func, lang |
|
74 |
switch(args.size()) { |
|
75 |
case 2: |
|
76 |
name = (String) getObject(interpreter, args, 0); |
|
77 |
argNames = null; |
|
78 |
body = args.get(1); |
|
79 |
break; |
|
80 |
case 3: |
|
81 |
name = (String) getObject(interpreter, args, 0); |
|
82 |
if( args.get(1)==null ) { |
|
83 |
argNames = null; |
|
84 |
} else { |
|
85 |
argNames = (List<String>) getObject(interpreter, args, 1); |
|
86 |
} |
|
87 |
body = args.get(2); |
|
88 |
break; |
|
89 |
case 6: |
|
90 |
name = (String) getObject(interpreter, args, 0); |
|
91 |
if( args.get(1)==null ) { |
|
92 |
argNames = null; |
|
93 |
} else { |
|
94 |
argNames = (List<String>) getObject(interpreter, args, 1); |
|
95 |
} |
|
96 |
body = args.get(2); |
|
97 |
script_path = (args.get(3)==null)? null:((String)((Code.Constant)args.get(3)).value()); |
|
98 |
script_function = (args.get(4)==null)? null:((String)((Code.Constant)args.get(4)).value()); |
|
99 |
language = (args.get(5)==null)? null:((String)((Code.Constant)args.get(5)).value()).toLowerCase(); |
|
100 |
break; |
|
101 |
default: |
|
102 |
throw new ExpressionRuntimeException("Incorrect number of arguments"); |
|
103 |
} |
|
72 |
String name = (String) getObject(interpreter, args, "FUNCTION_NAME"); |
|
73 |
List<String> argNames = (List<String>) getObject(interpreter, args, "PARAMETERS"); |
|
74 |
Code body = args.get("BODY"); |
|
75 |
String script_path = (String) getObject(interpreter, args, "SCRIPT_PATH"); |
|
76 |
String script_function = (String) getObject(interpreter, args, "SCRIPT_FUNCTION"); |
|
77 |
String language = (String) getObject(interpreter, args, "LANGUAGE"); |
|
104 | 78 |
Function fn; |
105 | 79 |
if( body!=null ) { |
106 | 80 |
fn = new UserFunction(name, argNames, body); |
... | ... | |
136 | 110 |
this.argNames = argNames; |
137 | 111 |
this.body = body; |
138 | 112 |
} |
139 |
|
|
113 |
|
|
140 | 114 |
@Override |
115 |
public boolean allowArgNames() { |
|
116 |
return true; |
|
117 |
} |
|
118 |
|
|
119 |
@Override |
|
141 | 120 |
public Object call(Interpreter interpreter, Object[] args) throws Exception { |
142 | 121 |
Object value; |
143 | 122 |
ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager(); |
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/TupleFunction.java | ||
---|---|---|
1 | 1 |
package org.gvsig.expressionevaluator.impl.function.programming; |
2 | 2 |
|
3 |
import java.util.ArrayList; |
|
4 |
import java.util.Arrays; |
|
5 | 3 |
import org.apache.commons.lang3.Range; |
6 | 4 |
import static org.gvsig.expressionevaluator.ExpressionBuilder.FUNCTION_TUPLE; |
7 | 5 |
import org.gvsig.expressionevaluator.Function; |
8 | 6 |
import org.gvsig.expressionevaluator.Interpreter; |
9 | 7 |
import org.gvsig.expressionevaluator.spi.AbstractFunction; |
10 |
import org.gvsig.tools.util.UnmodifiableBasicListAdapter; |
|
11 | 8 |
|
12 | 9 |
public class TupleFunction extends AbstractFunction { |
13 | 10 |
|
... | ... | |
21 | 18 |
"TUPLE", |
22 | 19 |
false |
23 | 20 |
); |
21 |
this.addAlias("ARRAY"); |
|
24 | 22 |
} |
25 | 23 |
|
26 | 24 |
@Override |
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/CodeBlockWithExceptFunction.java | ||
---|---|---|
25 | 25 |
} |
26 | 26 |
|
27 | 27 |
@Override |
28 |
public boolean isHidden() { |
|
29 |
return true; |
|
30 |
} |
|
31 |
|
|
32 |
@Override |
|
28 | 33 |
public boolean useArgumentsInsteadObjects() { |
29 | 34 |
return true; |
30 | 35 |
} |
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/DefaultStatement.java | ||
---|---|---|
5 | 5 |
import java.util.Objects; |
6 | 6 |
import org.apache.commons.lang3.ArrayUtils; |
7 | 7 |
import org.apache.commons.lang3.StringUtils; |
8 |
import org.apache.commons.lang3.tuple.ImmutablePair; |
|
9 |
import org.apache.commons.lang3.tuple.Pair; |
|
8 | 10 |
import org.gvsig.expressionevaluator.Code; |
9 | 11 |
import org.gvsig.expressionevaluator.Code.Caller; |
10 | 12 |
import org.gvsig.expressionevaluator.Codes; |
... | ... | |
18 | 20 |
import org.gvsig.expressionevaluator.Statement.StatementContext; |
19 | 21 |
import org.gvsig.expressionevaluator.impl.function.programming.CodeBlockFunction; |
20 | 22 |
import org.gvsig.expressionevaluator.impl.DefaultCodeBuilder.BaseCodes; |
23 |
import org.gvsig.expressionevaluator.spi.AbstractLexicalAnalyzer; |
|
21 | 24 |
|
22 | 25 |
/** |
23 | 26 |
* |
... | ... | |
31 | 34 |
// private String codeId; |
32 | 35 |
// private ArgsBuilder argsBuilder; |
33 | 36 |
|
37 |
public interface IsApplicableRule extends Rule { |
|
38 |
public boolean isApplicable(StatementContext context); |
|
39 |
} |
|
40 |
|
|
34 | 41 |
public interface RepeatRule extends CompoundRule { |
35 | 42 |
|
36 | 43 |
public String getClassifier(); |
37 | 44 |
} |
38 | 45 |
|
39 |
public class RuleRequireAnyToken implements Rule { |
|
46 |
public class RuleRequireAnyToken implements IsApplicableRule {
|
|
40 | 47 |
|
41 | 48 |
private final String[] required_token; |
42 | 49 |
|
... | ... | |
46 | 53 |
|
47 | 54 |
@Override |
48 | 55 |
public void parse(StatementContext context) { |
56 |
context.trace(this.toString()+".parse"); |
|
49 | 57 |
Token token = context.look_token(); |
50 | 58 |
if (!token.is(this.required_token)) { |
51 | 59 |
throw new ExpressionSyntaxException( |
... | ... | |
59 | 67 |
context.next_token(); |
60 | 68 |
} |
61 | 69 |
|
62 |
private boolean isApplicable(StatementContext context) { |
|
63 |
Token token = context.look_token(); |
|
64 |
return token.is(this.required_token); |
|
70 |
@Override |
|
71 |
public boolean isApplicable(StatementContext context) { |
|
72 |
Token token = context.next_token(); |
|
73 |
boolean r = token.is(this.required_token); |
|
74 |
context.trace(this.toString()+".isApplicable return "+r); |
|
75 |
return r; |
|
65 | 76 |
} |
66 | 77 |
|
67 | 78 |
@Override |
... | ... | |
71 | 82 |
|
72 | 83 |
} |
73 | 84 |
|
74 |
public class RuleRequireIdentifier implements Rule { |
|
85 |
public class RuleRequireIdentifier implements IsApplicableRule {
|
|
75 | 86 |
|
76 | 87 |
private final String id; |
77 | 88 |
|
... | ... | |
81 | 92 |
|
82 | 93 |
@Override |
83 | 94 |
public void parse(StatementContext context) { |
95 |
context.trace(this.toString()+".parse"); |
|
84 | 96 |
Token token = context.look_token(); |
85 | 97 |
if (token.getType() != Token.IDENTIFIER) { |
86 | 98 |
throw new ExpressionSyntaxException( |
... | ... | |
95 | 107 |
} |
96 | 108 |
|
97 | 109 |
@Override |
110 |
public boolean isApplicable(StatementContext context) { |
|
111 |
Token token = context.next_token(); |
|
112 |
boolean r = token.getType() == Token.IDENTIFIER; |
|
113 |
context.trace(this.toString()+".isApplicable return "+r); |
|
114 |
return r; |
|
115 |
} |
|
116 |
|
|
117 |
@Override |
|
98 | 118 |
public String toString() { |
99 | 119 |
return "require_identifier('" + this.id + "')"; |
100 | 120 |
} |
... | ... | |
110 | 130 |
|
111 | 131 |
@Override |
112 | 132 |
public void parse(StatementContext context) { |
133 |
context.trace(this.toString()+".parse"); |
|
113 | 134 |
Token token = context.look_token(); |
114 | 135 |
if (token.getType() != Token.STRING_LITERAL) { |
115 | 136 |
throw new ExpressionSyntaxException( |
... | ... | |
139 | 160 |
|
140 | 161 |
@Override |
141 | 162 |
public void parse(StatementContext context) { |
163 |
context.trace(this.toString()+".parse"); |
|
142 | 164 |
Code code = context.parse_expression(); |
143 | 165 |
if (code == null) { |
144 | 166 |
throw new ExpressionSyntaxException(context.getLexicalAnalyzer()); |
... | ... | |
165 | 187 |
|
166 | 188 |
@Override |
167 | 189 |
public void parse(StatementContext context) { |
190 |
context.trace(this.toString()+".parse"); |
|
168 | 191 |
if( this.value instanceof Code ) { |
169 | 192 |
context.setCode(id, (Code) this.value); |
170 | 193 |
} else { |
... | ... | |
190 | 213 |
|
191 | 214 |
@Override |
192 | 215 |
public void parse(StatementContext context) { |
216 |
context.trace(this.toString()+".parse"); |
|
193 | 217 |
Codes codes = context.parse_expressions(this.separator); |
194 | 218 |
if (codes == null) { |
195 | 219 |
throw new ExpressionSyntaxException(context.getLexicalAnalyzer()); |
... | ... | |
259 | 283 |
|
260 | 284 |
@Override |
261 | 285 |
public void parse(StatementContext context) { |
286 |
context.trace(this.toString()+".parse"); |
|
262 | 287 |
Token token = context.look_token(); |
263 | 288 |
if (token.is(this.optional_token)) { |
264 | 289 |
context.next_token(); |
... | ... | |
286 | 311 |
|
287 | 312 |
@Override |
288 | 313 |
public String toString() { |
289 |
return "optional_token(" + StringUtils.join(this.optional_token) + ") rules:" + StringUtils.join(onTrueRules, ",");
|
|
314 |
return "optional_token(" + StringUtils.join(this.optional_token) + ") onTrue:" + StringUtils.join(onTrueRules, ",")+", onFalse:" + StringUtils.join(onFalseRules, ",");
|
|
290 | 315 |
} |
291 | 316 |
} |
292 | 317 |
|
318 |
public class RuleSwitchToken implements SwichTokenRule { |
|
319 |
|
|
320 |
private final List<Pair<String,Rule[]>> caseRules; |
|
321 |
private Rule[] defaultRule; |
|
322 |
|
|
323 |
public RuleSwitchToken() { |
|
324 |
this.caseRules = new ArrayList<>(); |
|
325 |
} |
|
326 |
|
|
327 |
@Override |
|
328 |
public void parse(StatementContext context) { |
|
329 |
context.trace(this.toString()+".parse"); |
|
330 |
Token token = context.look_token(); |
|
331 |
for (Pair<String, Rule[]> caseRule : caseRules) { |
|
332 |
if( token.is(caseRule.getKey()) ) { |
|
333 |
context.next_token(); |
|
334 |
for (Rule rule : caseRule.getValue()) { |
|
335 |
rule.parse(context); |
|
336 |
} |
|
337 |
return; |
|
338 |
} |
|
339 |
} |
|
340 |
if( defaultRule!=null ) { |
|
341 |
for (Rule rule : defaultRule) { |
|
342 |
rule.parse(context); |
|
343 |
} |
|
344 |
} |
|
345 |
} |
|
346 |
|
|
347 |
@Override |
|
348 |
public SwichTokenRule addCase(String token, Rule... rules) { |
|
349 |
this.caseRules.add(new ImmutablePair(token,rules)); |
|
350 |
return this; |
|
351 |
} |
|
352 |
|
|
353 |
@Override |
|
354 |
public SwichTokenRule addDefault(Rule... rules) { |
|
355 |
this.defaultRule = rules; |
|
356 |
return this; |
|
357 |
} |
|
358 |
|
|
359 |
@Override |
|
360 |
public String toString() { |
|
361 |
return "switch_token() rules:" + StringUtils.join(this.caseRules,",") + " default: " + defaultRule; |
|
362 |
} |
|
363 |
} |
|
364 |
|
|
293 | 365 |
public class RuleRepeatUntilAnyTokens implements RepeatRule { |
294 | 366 |
|
295 | 367 |
private final String[] exit_tokens; |
... | ... | |
303 | 375 |
|
304 | 376 |
@Override |
305 | 377 |
public void parse(StatementContext context) { |
378 |
context.trace(this.toString()+".parse"); |
|
306 | 379 |
String save = context.getCodeClassifier(); |
307 | 380 |
try { |
308 | 381 |
this.counter = 1; |
... | ... | |
340 | 413 |
} |
341 | 414 |
} |
342 | 415 |
|
416 |
public class RuleRepeat implements RepeatRule { |
|
417 |
|
|
418 |
private final List<Rule> rules; |
|
419 |
private int counter; |
|
420 |
|
|
421 |
public RuleRepeat() { |
|
422 |
this.rules = new ArrayList<>(); |
|
423 |
} |
|
424 |
|
|
425 |
@Override |
|
426 |
public void parse(StatementContext context) { |
|
427 |
context.trace(this.toString()+".parse"); |
|
428 |
String save = context.getCodeClassifier(); |
|
429 |
try { |
|
430 |
this.counter = 1; |
|
431 |
boolean breakloop = false; |
|
432 |
while (!breakloop) { |
|
433 |
context.setCodeClassifier(String.valueOf(counter).trim()); |
|
434 |
for (Rule rule : rules) { |
|
435 |
try { |
|
436 |
rule.parse(context); |
|
437 |
} catch(BreakLoopException ex) { |
|
438 |
breakloop = true; |
|
439 |
break; |
|
440 |
} |
|
441 |
} |
|
442 |
this.counter = this.counter + 1; |
|
443 |
} |
|
444 |
} finally { |
|
445 |
context.setCodeClassifier(save); |
|
446 |
} |
|
447 |
} |
|
448 |
|
|
449 |
@Override |
|
450 |
public RuleRepeat addRule(Rule rule) { |
|
451 |
this.rules.add(rule); |
|
452 |
return this; |
|
453 |
} |
|
454 |
|
|
455 |
@Override |
|
456 |
public String getClassifier() { |
|
457 |
String s = String.valueOf(counter).trim(); |
|
458 |
return s; |
|
459 |
} |
|
460 |
|
|
461 |
@Override |
|
462 |
public String toString() { |
|
463 |
return "repeat() rules:" + StringUtils.join(rules, ","); |
|
464 |
} |
|
465 |
} |
|
466 |
|
|
467 |
public static class BreakLoopException extends RuntimeException { |
|
468 |
|
|
469 |
} |
|
470 |
|
|
471 |
public static class RuleBreakLoop implements Rule { |
|
472 |
|
|
473 |
public RuleBreakLoop() { |
|
474 |
} |
|
475 |
|
|
476 |
@Override |
|
477 |
public void parse(StatementContext context) { |
|
478 |
context.trace(this.toString()+".parse"); |
|
479 |
throw new BreakLoopException(); |
|
480 |
} |
|
481 |
|
|
482 |
@Override |
|
483 |
public String toString() { |
|
484 |
return "break_loop()"; |
|
485 |
} |
|
486 |
} |
|
487 |
|
|
343 | 488 |
public class RuleOptionalIdentifiers extends AbstractConditionalRule implements ConditionalRule { |
344 | 489 |
|
345 | 490 |
private final String id; |
... | ... | |
353 | 498 |
|
354 | 499 |
@Override |
355 | 500 |
public void parse(StatementContext context) { |
501 |
context.trace(this.toString()+".parse"); |
|
356 | 502 |
BaseCodes args = (BaseCodes) context.getCodeBuilder().args(); |
357 | 503 |
Token token = context.look_token(); |
358 | 504 |
while (token.getType() == Token.IDENTIFIER) { |
... | ... | |
396 | 542 |
|
397 | 543 |
@Override |
398 | 544 |
public void parse(StatementContext context) { |
545 |
context.trace(this.toString()+".parse"); |
|
399 | 546 |
Token token = context.look_token(); |
400 | 547 |
if (token.getType() == Token.STRING_LITERAL) { |
401 | 548 |
String s = (String) token.getValue(); |
... | ... | |
416 | 563 |
|
417 | 564 |
public static class ArgsBuilderFromNames implements ArgsBuilder { |
418 | 565 |
|
419 |
private final String[] argNames;
|
|
566 |
protected final String[] argNames;
|
|
420 | 567 |
|
421 | 568 |
public ArgsBuilderFromNames(String... argNames) { |
422 | 569 |
this.argNames = argNames; |
423 | 570 |
} |
424 | 571 |
|
425 | 572 |
@Override |
573 |
public String toString() { |
|
574 |
return "args_names("+StringUtils.join(argNames,",")+")"; |
|
575 |
} |
|
576 |
|
|
577 |
@Override |
|
426 | 578 |
public Codes build(StatementContext context) { |
579 |
context.trace(this.toString()+".build"); |
|
427 | 580 |
BaseCodes args = (BaseCodes) context.getCodeBuilder().args(); |
428 | 581 |
for (String argName : argNames) { |
429 | 582 |
if (argName.contains("#")) { |
... | ... | |
434 | 587 |
if (code == null) { |
435 | 588 |
break; |
436 | 589 |
} |
437 |
args.add(code); |
|
590 |
args.add(argNameX, code);
|
|
438 | 591 |
n++; |
439 | 592 |
} |
440 | 593 |
} else { |
... | ... | |
442 | 595 |
// if( code == null) { |
443 | 596 |
// code = context.getCodeBuilder().constant(null); |
444 | 597 |
// } |
445 |
args.add(code); |
|
598 |
args.add(argName,code);
|
|
446 | 599 |
} |
447 | 600 |
} |
448 | 601 |
return args; |
... | ... | |
456 | 609 |
} |
457 | 610 |
|
458 | 611 |
@Override |
612 |
public String toString() { |
|
613 |
return "args_expand("+StringUtils.join(argNames,",")+")"; |
|
614 |
} |
|
615 |
|
|
616 |
@Override |
|
459 | 617 |
public Codes build(StatementContext context) { |
460 | 618 |
BaseCodes args = (BaseCodes) context.getCodeBuilder().args(); |
461 | 619 |
|
... | ... | |
595 | 753 |
if (this.rules.isEmpty()) { |
596 | 754 |
return false; |
597 | 755 |
} |
598 |
Rule rule = this.rules.get(0); |
|
599 |
if (!(rule instanceof RuleRequireAnyToken)) { |
|
600 |
return false; |
|
756 |
context.trace(this.getName()+".isApplicable"); |
|
757 |
AbstractLexicalAnalyzer lexer = (AbstractLexicalAnalyzer) context.getLexicalAnalyzer(); |
|
758 |
lexer.push_state(); |
|
759 |
try { |
|
760 |
boolean applicable = false; |
|
761 |
for (Rule rule : rules) { |
|
762 |
if (!(rule instanceof IsApplicableRule)) { |
|
763 |
break; |
|
764 |
} |
|
765 |
if( !((IsApplicableRule) rule).isApplicable(context) ) { |
|
766 |
return false; |
|
767 |
} |
|
768 |
applicable = true; |
|
769 |
} |
|
770 |
context.trace(this.getName()+".isApplicable return "+applicable); |
|
771 |
return applicable; |
|
772 |
} finally { |
|
773 |
lexer.pop_state(); |
|
601 | 774 |
} |
602 |
return ((RuleRequireAnyToken) rule).isApplicable(context); |
|
603 | 775 |
} |
604 | 776 |
|
605 | 777 |
@Override |
... | ... | |
619 | 791 |
this.builder(new StatementBuilderBase(id, argsBuilder)); |
620 | 792 |
} |
621 | 793 |
|
794 |
@Override |
|
622 | 795 |
public void builder(StatementBuilder builder) { |
623 | 796 |
this.stmtBuilder = builder; |
624 | 797 |
} |
625 | 798 |
|
626 | 799 |
@Override |
627 | 800 |
public Code parse(StatementContext context) { |
628 |
// System.err.println("start parse "+this.getName());
|
|
801 |
context.trace(this.getName()+".parse");
|
|
629 | 802 |
for (Rule rule : rules) { |
630 | 803 |
rule.parse(context); |
631 | 804 |
} |
632 | 805 |
Code code = this.stmtBuilder.build(context); |
806 |
context.trace(this.getName()+".return "+code); |
|
633 | 807 |
return code; |
634 | 808 |
} |
635 | 809 |
|
... | ... | |
638 | 812 |
return this.getName() + " " + StringUtils.join(this.rules, ";"); |
639 | 813 |
|
640 | 814 |
} |
815 |
|
|
816 |
@Override |
|
817 |
public CompoundRule repeat() { |
|
818 |
return new RuleRepeat(); |
|
819 |
} |
|
820 |
|
|
821 |
@Override |
|
822 |
public Rule break_loop() { |
|
823 |
return new RuleBreakLoop(); |
|
824 |
} |
|
825 |
|
|
826 |
@Override |
|
827 |
public SwichTokenRule switch_token() { |
|
828 |
return new RuleSwitchToken(); |
|
829 |
} |
|
830 |
|
|
641 | 831 |
} |
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 | ||
---|---|---|
18 | 18 |
import org.gvsig.expressionevaluator.impl.DefaultCodeBuilder.BaseConstant; |
19 | 19 |
import org.gvsig.expressionevaluator.impl.function.operator.NegOperator; |
20 | 20 |
import org.gvsig.expressionevaluator.impl.function.programming.CodeBlockFunction; |
21 |
import org.gvsig.expressionevaluator.spi.AbstractLexicalAnalyzer; |
|
22 |
import org.slf4j.Logger; |
|
23 |
import org.slf4j.LoggerFactory; |
|
21 | 24 |
|
22 | 25 |
public class DefaultCompiler implements Compiler { |
23 | 26 |
|
27 |
protected static final Logger LOGGER = LoggerFactory.getLogger(DefaultCompiler.class); |
|
28 |
|
|
24 | 29 |
class DefaultStatementContext implements StatementContext { |
25 | 30 |
|
26 | 31 |
private String codeClassifier; |
... | ... | |
89 | 94 |
return DefaultCompiler.this.parse_expressions(separator); |
90 | 95 |
} |
91 | 96 |
|
97 |
@Override |
|
92 | 98 |
public boolean isReservedWord(String s) { |
93 | 99 |
return grammars.isReservedWord(s); |
94 | 100 |
} |
101 |
|
|
102 |
@Override |
|
103 |
public void trace(String msg) { |
|
104 |
// System.out.println(msg+". "+this.getLexicalAnalyzer().getSourceContext()); |
|
105 |
} |
|
95 | 106 |
} |
96 | 107 |
|
97 | 108 |
private boolean objectAccessSupported; |
... | ... | |
504 | 515 |
Token next = lexer.look(); |
505 | 516 |
if( next.getType() == Token.PARENTHESIS_OPEN ) { |
506 | 517 |
lexer.next(); |
507 |
Codes args = parse_expressions(",");
|
|
518 |
Codes args = parse_arguments();
|
|
508 | 519 |
next = lexer.next(); |
509 | 520 |
switch(next.getType()) { |
510 | 521 |
case Token.PARENTHESIS_CLOSE: |
... | ... | |
592 | 603 |
} |
593 | 604 |
} |
594 | 605 |
|
606 |
public Codes parse_arguments() { |
|
607 |
String sep = ","; |
|
608 |
BaseCodes codes = null; |
|
609 |
while( true ) { |
|
610 |
((AbstractLexicalAnalyzer)lexer).push_state(); |
|
611 |
String argName = null; |
|
612 |
Token tok0 = lexer.next(); |
|
613 |
Token tok1 = lexer.next(); |
|
614 |
if( tok0.getType()==Token.IDENTIFIER && tok1.is(":") ) { |
|
615 |
argName = (String) tok0.getValue(); |
|
616 |
} else { |
|
617 |
((AbstractLexicalAnalyzer)lexer).pop_state(); |
|
618 |
} |
|
619 |
Code code = parse_expression(); |
|
620 |
if( code!=null ) { |
|
621 |
if( codes == null ) { |
|
622 |
codes = (BaseCodes) codeBuilder.args(); |
|
623 |
} |
|
624 |
codes.add(argName, code); |
|
625 |
} |
|
626 |
Token next = lexer.look(); |
|
627 |
String literal = next.getLiteral(); |
|
628 |
if( literal == null ) { |
|
629 |
return codes; |
|
630 |
} |
|
631 |
literal = literal.trim(); |
|
632 |
if( sep.equals(literal) ) { |
|
633 |
lexer.next(); // Consume el ",". |
|
634 |
} else { |
|
635 |
return codes; |
|
636 |
} |
|
637 |
} |
|
638 |
} |
|
639 |
|
|
595 | 640 |
private Code parse_grammars() { |
596 | 641 |
StatementContext context = new DefaultStatementContext(); |
597 | 642 |
Code code; |
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 | ||
---|---|---|
5 | 5 |
import java.util.Iterator; |
6 | 6 |
import java.util.List; |
7 | 7 |
import org.apache.commons.lang3.StringUtils; |
8 |
import org.apache.commons.lang3.tuple.ImmutablePair; |
|
9 |
import org.apache.commons.lang3.tuple.Pair; |
|
8 | 10 |
import org.gvsig.expressionevaluator.Code; |
9 | 11 |
import static org.gvsig.expressionevaluator.Code.CALLER; |
10 | 12 |
import static org.gvsig.expressionevaluator.Code.CONSTANT; |
... | ... | |
90 | 92 |
} |
91 | 93 |
if( caller.parameters() != null ) { |
92 | 94 |
for( Code arg : caller.parameters() ) { |
93 |
arg.link(symbolTable); |
|
95 |
if( arg!=null ) { |
|
96 |
arg.link(symbolTable); |
|
97 |
} |
|
94 | 98 |
} |
95 | 99 |
} |
96 | 100 |
} |
... | ... | |
236 | 240 |
|
237 | 241 |
public class BaseCodes implements Codes { |
238 | 242 |
|
239 |
private final List<Code> codes; |
|
243 |
private final List<Pair<String,Code>> codes; |
|
244 |
private boolean useNames; |
|
240 | 245 |
|
241 | 246 |
public BaseCodes() { |
242 | 247 |
this.codes = new ArrayList<>(); |
248 |
this.useNames = false; |
|
243 | 249 |
} |
244 | 250 |
|
245 | 251 |
@Override |
252 |
public boolean useArgNames() { |
|
253 |
return this.useNames; |
|
254 |
} |
|
255 |
|
|
256 |
@Override |
|
257 |
public boolean useArgNames(boolean useNames) { |
|
258 |
this.useNames = useNames; |
|
259 |
return this.useNames; |
|
260 |
} |
|
261 |
|
|
262 |
@Override |
|
246 | 263 |
public int code() { |
247 | 264 |
return CODES; |
248 | 265 |
} |
... | ... | |
255 | 272 |
return this.codes.size(); |
256 | 273 |
} |
257 | 274 |
|
275 |
public void add(String name, Code arg) { |
|
276 |
this.codes.add(new ImmutablePair<>(name, arg)); |
|
277 |
} |
|
278 |
|
|
258 | 279 |
public void add(Code arg) { |
259 |
this.codes.add(arg);
|
|
280 |
this.codes.add(new ImmutablePair<>(null, arg));
|
|
260 | 281 |
} |
261 | 282 |
|
262 | 283 |
public void insert(int pos, Code arg) { |
263 |
this.codes.add(pos, arg);
|
|
284 |
this.codes.add(pos, new ImmutablePair<>(null, arg));
|
|
264 | 285 |
} |
265 | 286 |
|
266 | 287 |
@Override |
288 |
public boolean contains(String name, int index) { |
|
289 |
String argNameX = name + String.valueOf(index).trim(); |
|
290 |
for (Pair<String, Code> arg : this.codes) { |
|
291 |
if( StringUtils.equalsIgnoreCase(arg.getKey(), argNameX) ) { |
|
292 |
return true; |
|
293 |
} |
|
294 |
} |
|
295 |
return false; |
|
296 |
} |
|
297 |
|
|
298 |
@Override |
|
267 | 299 |
public Iterator<Code> iterator() { |
268 |
return this.codes.iterator(); |
|
300 |
final Iterator<Pair<String, Code>> it = this.codes.iterator(); |
|
301 |
return new Iterator<Code>() { |
|
302 |
@Override |
|
303 |
public boolean hasNext() { |
|
304 |
return it.hasNext(); |
|
305 |
} |
|
306 |
|
|
307 |
@Override |
|
308 |
public Code next() { |
|
309 |
Pair<String, Code> arg = it.next(); |
|
310 |
return arg.getValue(); |
|
311 |
} |
|
312 |
}; |
|
269 | 313 |
} |
270 | 314 |
|
271 | 315 |
@Override |
272 | 316 |
public Code get(int n) { |
273 |
return this.codes.get(n); |
|
317 |
return this.codes.get(n).getValue();
|
|
274 | 318 |
} |
275 | 319 |
|
276 | 320 |
@Override |
321 |
public Code get(String name) { |
|
322 |
for (Pair<String, Code> arg : this.codes) { |
|
323 |
if( StringUtils.equalsIgnoreCase(name, arg.getKey()) ) { |
|
324 |
return arg.getValue(); |
|
325 |
} |
|
326 |
} |
|
327 |
return null; |
|
328 |
} |
|
329 |
|
|
330 |
public String getName(int n) { |
|
331 |
return this.codes.get(n).getKey(); |
|
332 |
} |
|
333 |
|
|
334 |
@Override |
|
277 | 335 |
public boolean isEmpty() { |
278 | 336 |
return this.codes.isEmpty(); |
279 | 337 |
} |
280 | 338 |
|
281 | 339 |
@Override |
282 | 340 |
public List<Code> toList() { |
283 |
return Collections.unmodifiableList(this.codes); |
|
341 |
List<Code> l = new ArrayList<>(); |
|
342 |
for (Pair<String, Code> arg : this.codes) { |
|
343 |
l.add(arg.getValue()); |
|
344 |
} |
|
345 |
return Collections.unmodifiableList(l); |
|
284 | 346 |
} |
285 | 347 |
|
286 | 348 |
@Override |
287 | 349 |
public void accept(Visitor visitor) throws BaseException { |
288 |
for( Code arg : this.codes ) {
|
|
289 |
arg.accept(visitor); |
|
350 |
for( Pair<String,Code> arg : this.codes ) {
|
|
351 |
arg.getValue().accept(visitor);
|
|
290 | 352 |
} |
291 | 353 |
} |
292 | 354 |
|
... | ... | |
313 | 375 |
if( codes != null ) { |
314 | 376 |
StringBuilder builder = new StringBuilder(); |
315 | 377 |
boolean skipcoma = true; |
316 |
for( Code code : codes ) { |
|
378 |
for( Pair<String, Code> arg : codes ) { |
|
379 |
if( arg == null ) { |
|
380 |
continue; |
|
381 |
} |
|
382 |
String name = arg.getKey(); |
|
383 |
Code code = arg.getValue(); |
|
317 | 384 |
if( code == null ) { |
318 | 385 |
continue; |
319 | 386 |
} |
... | ... | |
322 | 389 |
} else { |
323 | 390 |
builder.append(", "); |
324 | 391 |
} |
325 |
builder.append(code.toString(formatter)); |
|
392 |
if( name==null || !useNames ) { |
|
393 |
builder.append(code.toString(formatter)); |
|
394 |
} else { |
|
395 |
builder.append(name); |
|
396 |
builder.append(":"); |
|
397 |
builder.append(code.toString(formatter)); |
|
398 |
} |
|
326 | 399 |
} |
327 | 400 |
return builder.toString(); |
328 | 401 |
} |
... | ... | |
331 | 404 |
|
332 | 405 |
@Override |
333 | 406 |
public void link(SymbolTable symbolTable) { |
334 |
for (Code code : this.codes) {
|
|
335 |
code.link(symbolTable);
|
|
407 |
for (Pair<String,Code> arg : this.codes) {
|
|
408 |
arg.getValue().link(symbolTable);
|
|
336 | 409 |
} |
337 | 410 |
} |
338 | 411 |
|
... | ... | |
377 | 450 |
@Override |
378 | 451 |
public Function function(Function function) { |
379 | 452 |
this.function = function; |
453 |
if( this.args!=null && this.function!=null ) { |
|
454 |
this.args.useArgNames(this.function.allowArgNames()); |
|
455 |
} |
|
380 | 456 |
return this.function; |
381 | 457 |
} |
382 | 458 |
|
... | ... | |
472 | 548 |
break; |
473 | 549 |
case FUNCTION: |
474 | 550 |
default: |
475 |
builder.append(this.name()); |
|
476 |
builder.append("("); |
|
477 |
if( this.parameters()!=null ) { |
|
478 |
builder.append(this.parameters().toString(formatter)); |
|
551 |
if( StringUtils.equalsIgnoreCase(this.name(),GetattrFunction.NAME) ) { |
|
552 |
Code arg0 = this.parameters().get(0); |
|
553 |
Code arg1 = this.parameters().get(1); |
|
554 |
if( arg0 instanceof Code.Identifier && arg1 instanceof Code.Constant ) { |
|
555 |
builder.append(arg0.toString(formatter)); |
|
556 |
builder.append(".\""); |
|
557 |
builder.append(((Code.Constant)arg1).value()); |
|
558 |
builder.append("\""); |
|
559 |
} else { |
|
560 |
builder.append(this.name()); |
|
561 |
builder.append("("); |
|
562 |
builder.append(arg0.toString(formatter)); |
|
563 |
builder.append(", "); |
|
564 |
builder.append(arg1.toString(formatter)); |
|
565 |
builder.append(")"); |
|
566 |
} |
|
567 |
} else { |
|
568 |
builder.append(this.name()); |
|
569 |
builder.append("("); |
|
570 |
if( this.parameters()!=null ) { |
|
571 |
builder.append(this.parameters().toString(formatter)); |
|
572 |
} |
|
573 |
builder.append(")"); |
|
479 | 574 |
} |
480 |
builder.append(")"); |
|
481 | 575 |
} |
482 | 576 |
return builder.toString(); |
483 | 577 |
} |
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/DefaultOptimizer.java | ||
---|---|---|
7 | 7 |
import org.gvsig.expressionevaluator.Code; |
8 | 8 |
import org.gvsig.expressionevaluator.Code.Caller; |
9 | 9 |
import org.gvsig.expressionevaluator.CodeBuilder; |
10 |
import org.gvsig.expressionevaluator.Codes; |
|
10 | 11 |
import org.gvsig.expressionevaluator.ExpressionEvaluatorManager; |
11 | 12 |
import org.gvsig.expressionevaluator.Function; |
12 | 13 |
import org.gvsig.expressionevaluator.Interpreter; |
... | ... | |
212 | 213 |
boolean canOptimize = true; |
213 | 214 |
if (caller.parameters() != null) { |
214 | 215 |
newArgs = (BaseCodes) this.getCodeBuilder().args(); |
215 |
for (Code arg : caller.parameters()) { |
|
216 |
Codes parameters = caller.parameters(); |
|
217 |
for (int i = 0; i < parameters.size(); i++) { |
|
218 |
Code arg = parameters.get(i); |
|
216 | 219 |
Code newArg = this.doOptimize(arg); |
217 |
newArgs.add(newArg); |
|
220 |
newArgs.add(parameters.getName(i), newArg);
|
|
218 | 221 |
if (newArg.code() != Code.CONSTANT) { |
219 | 222 |
canOptimize = false; |
220 | 223 |
} |
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 | ||
---|---|---|
20 | 20 |
import org.gvsig.expressionevaluator.impl.function.programming.CodeBlockWithExceptFunction; |
21 | 21 |
import org.gvsig.expressionevaluator.impl.function.programming.CreateFnFunction; |
22 | 22 |
import org.gvsig.expressionevaluator.impl.function.programming.ForEachFunction; |
23 |
import org.gvsig.expressionevaluator.impl.function.programming.ForFunction; |
|
23 | 24 |
import org.gvsig.expressionevaluator.impl.function.programming.ReturnFunction; |
24 | 25 |
import org.gvsig.expressionevaluator.impl.function.programming.WhileFunction; |
25 | 26 |
import org.gvsig.expressionevaluator.spi.AbstractGrammarFactory; |
... | ... | |
129 | 130 |
theGrammar.addStatement(stmt); |
130 | 131 |
|
131 | 132 |
// stmt = theGrammar.createStatement("FOR"); |
132 |
// stmt.addRule(stmt.require_token("FOR")); |
|
133 |
// stmt.addRule(stmt.require_any_token("FOR"));
|
|
133 | 134 |
// stmt.addRule(stmt.require_expression("INIT")); |
134 |
// stmt.addRule(stmt.require_token(";")); |
|
135 |
// stmt.addRule(stmt.require_any_token(";"));
|
|
135 | 136 |
// stmt.addRule(stmt.require_expression("CONDITION")); |
136 |
// stmt.addRule(stmt.require_token(";")); |
|
137 |
// stmt.addRule(stmt.require_any_token(";"));
|
|
137 | 138 |
// stmt.addRule(stmt.require_expression("STEP")); |
138 |
// stmt.addRule(stmt.optional_token(":"));
|
|
139 |
// stmt.addRule(stmt.require_any_token("BEGIN", ":"));
|
|
139 | 140 |
// stmt.addRule(stmt.require_expression("BODY")); |
140 |
// stmt.addRule(stmt.optional_token("END")); |
|
141 |
// stmt.code(ForFunction.NAME,"INIT","CONDITION","STEP","BODY"); |
|
141 |
// stmt.addRule(stmt.require_any_token("END")); |
|
142 |
// stmt.addRule(stmt.optional_any_token("FOR")); |
|
143 |
// stmt.code( |
|
144 |
// ForFunction.NAME, |
|
145 |
// stmt.args_names("INIT","CONDITION","STEP","BODY") |
|
146 |
// ); |
|
142 | 147 |
// theGrammar.addStatement(stmt); |
143 | 148 |
|
144 | 149 |
stmt = theGrammar.createStatement("FOREACH"); |
... | ... | |
182 | 187 |
stmt.addRule(stmt.optional_any_token("FUNCTION", "PROCEDURE")); |
183 | 188 |
stmt.addRule(stmt.require_identifier("FUNCTION_NAME")); |
184 | 189 |
stmt.addRule(stmt.optional_any_token("(")); |
185 |
stmt.addRule(stmt.optional_identifiers("PARAM_NAMES", ","));
|
|
190 |
stmt.addRule(stmt.optional_identifiers("PARAMETERS", ","));
|
|
186 | 191 |
stmt.addRule(stmt.optional_any_token(")")); |
187 | 192 |
stmt.addRule(stmt.require_any_token("AS")); |
188 | 193 |
stmt.addRule(stmt.optional_any_token("$$","BEGIN") |
... | ... | |
203 | 208 |
// stmt.addRule(stmt.optional_any_token("FUNCTION", "PROCEDURE")); |
204 | 209 |
stmt.code( |
205 | 210 |
CreateFnFunction.NAME, |
206 |
stmt.args_names("FUNCTION_NAME","PARAM_NAMES","BODY", "SCRIPT_PATH", "SCRIPT_FUNCTION", "LANGUAGE")
|
|
211 |
stmt.args_names("FUNCTION_NAME","PARAMETERS","BODY", "SCRIPT_PATH", "SCRIPT_FUNCTION", "LANGUAGE")
|
|
207 | 212 |
); |
208 | 213 |
theGrammar.addStatement(stmt); |
209 | 214 |
|
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 | ||
---|---|---|
62 | 62 |
interpreter.setSymbolTable(symbolTable); |
63 | 63 |
return interpreter; |
64 | 64 |
} |
65 |
|
|
66 |
private void link(Code code) { |
|
67 |
code.link(createSymbolTable()); |
|
68 |
} |
|
65 | 69 |
|
66 | 70 |
public void testLet() { |
67 | 71 |
String source = "LET V1 = 23"; |
... | ... | |
96 | 100 |
Compiler compiler = createCompiler(); |
97 | 101 |
|
98 | 102 |
Code code = compiler.compileExpression(source); |
103 |
link(code); |
|
99 | 104 |
assertEquals("BLOCK(LET('V1', 11), LET('V2', 22))", code.toString()); |
100 | 105 |
} |
101 | 106 |
|
... | ... | |
105 | 110 |
Compiler compiler = createCompiler(); |
106 | 111 |
|
107 | 112 |
Code code = compiler.compileExpression(source); |
113 |
link(code); |
|
108 | 114 |
assertEquals("BLOCK_EXCEPT(LET('V1', 11), LET('V2', 22), -1)", code.toString()); |
109 | 115 |
} |
110 | 116 |
|
... | ... | |
113 | 119 |
|
114 | 120 |
String source = "BEGIN LET V1 = 11; LET V2 = 22; END"; |
115 | 121 |
Code code = compiler.compileExpression(source); |
122 |
link(code); |
|
116 | 123 |
assertEquals("BLOCK(LET('V1', 11), LET('V2', 22))", code.toString()); |
117 | 124 |
|
118 | 125 |
source = "BEGIN LET V1 = 11;; LET V2 = 22;;; END"; |
119 | 126 |
code = compiler.compileExpression(source); |
127 |
link(code); |
|
120 | 128 |
assertEquals("BLOCK(LET('V1', 11), LET('V2', 22))", code.toString()); |
121 | 129 |
} |
122 | 130 |
|
... | ... | |
126 | 134 |
Compiler compiler = createCompiler(); |
127 | 135 |
|
128 | 136 |
Code code = compiler.compileExpression(source); |
137 |
link(code); |
|
129 | 138 |
assertEquals("IFF((\"V1\" = 11), LET('V2', 22))", code.toString()); |
130 | 139 |
} |
131 | 140 |
|
... | ... | |
135 | 144 |
Compiler compiler = createCompiler(); |
136 | 145 |
|
137 | 146 |
Code code = compiler.compileExpression(source); |
147 |
link(code); |
|
138 | 148 |
assertEquals("IFF((\"V1\" = 11), LET('V2', 11), LET('V2', 22))", code.toString()); |
139 | 149 |
} |
140 | 150 |
|
... | ... | |
144 | 154 |
Compiler compiler = createCompiler(); |
145 | 155 |
|
146 | 156 |
Code code = compiler.compileExpression(source); |
157 |
link(code); |
|
147 | 158 |
assertEquals("IFF((\"V1\" = 11), BLOCK(LET('V2', 22), LET('V1', 10)))", code.toString()); |
148 | 159 |
} |
149 | 160 |
|
... | ... | |
153 | 164 |
Compiler compiler = createCompiler(); |
154 | 165 |
|
155 | 166 |
Code code = compiler.compileExpression(source); |
167 |
link(code); |
|
156 | 168 |
assertEquals("WHILE((\"n\" < 10), LET('n', (\"n\" + 1)))", code.toString()); |
157 | 169 |
} |
158 | 170 |
|
... | ... | |
162 | 174 |
Compiler compiler = createCompiler(); |
163 | 175 |
|
164 | 176 |
Code code = compiler.compileExpression(source); |
177 |
link(code); |
|
165 | 178 |
assertEquals("WHILE((\"n\" < 10), BLOCK(LET('n', (\"n\" + 1)), print(\"n\")))", code.toString()); |
166 | 179 |
} |
167 | 180 |
|
... | ... | |
171 | 184 |
Compiler compiler = createCompiler(); |
172 | 185 |
|
173 | 186 |
Code code = compiler.compileExpression(source); |
187 |
link(code); |
|
174 | 188 |
assertEquals("CAST(\"V1\", 'INTEGER')", code.toString()); |
175 | 189 |
} |
176 | 190 |
|
... | ... | |
180 | 194 |
Compiler compiler = createCompiler(); |
181 | 195 |
|
182 | 196 |
Code code = compiler.compileExpression(source); |
197 |
link(code); |
|
183 | 198 |
assertEquals("CAST(\"V1\", 'INTEGER')", code.toString()); |
184 | 199 |
} |
185 | 200 |
|
... | ... | |
190 | 205 |
|
191 | 206 |
source = "MATCH 'Hola', '[Hh]ola'"; |
192 | 207 |
code = compiler.compileExpression(source); |
208 |
link(code); |
|
193 | 209 |
assertEquals("~('Hola', '[Hh]ola')", code.toString()); |
194 | 210 |
|
195 | 211 |
source = "MATCH 'Hola' '[Hh]ola'"; |
196 | 212 |
code = compiler.compileExpression(source); |
213 |
link(code); |
|
197 | 214 |
assertEquals("~('Hola', '[Hh]ola')", code.toString()); |
198 | 215 |
|
199 | 216 |
source = "MATCH('Hola', '[Hh]ola')"; |
200 | 217 |
code = compiler.compileExpression(source); |
218 |
link(code); |
|
201 | 219 |
assertEquals("~('Hola', '[Hh]ola')", code.toString()); |
202 | 220 |
} |
203 | 221 |
|
... | ... | |
207 | 225 |
Compiler compiler = createCompiler(); |
208 | 226 |
|
209 | 227 |
Code code = compiler.compileExpression(source); |
228 |
link(code); |
|
210 | 229 |
assertEquals("FOREACH('n', RANGE(10), print(\"n\"))", code.toString()); |
211 | 230 |
} |
212 | 231 |
|
... | ... | |
225 | 244 |
Compiler compiler = createCompiler(); |
226 | 245 |
|
227 | 246 |
Code code = compiler.compileExpression(source); |
247 |
link(code); |
|
228 | 248 |
assertEquals("CASE((\"software\" LIKE '%gvSIG%'), 'gvSIG', 'Other')", code.toString()); |
229 | 249 |
} |
230 | 250 |
|
... | ... | |
234 | 254 |
Compiler compiler = createCompiler(); |
235 | 255 |
|
236 | 256 |
Code code = compiler.compileExpression(source); |
257 |
link(code); |
|
237 | 258 |
assertEquals("CASE((\"software\" LIKE '%gvSIG%'), 'gvSIG', 'Other')", code.toString()); |
238 | 259 |
} |
239 | 260 |
|
... | ... | |
243 | 264 |
Compiler compiler = createCompiler(); |
244 | 265 |
|
245 | 266 |
Code code = compiler.compileExpression(source); |
267 |
link(code); |
|
246 | 268 |
assertEquals("CASE(((\"Field_1\" >= 75) AND (\"Field_1\" <= 79)), ((\"Field_1\" >= 80) AND (\"Field_1\" <= 84)), 100, 110)", code.toString()); |
247 | 269 |
} |
248 | 270 |
|
... | ... | |
252 | 274 |
Compiler compiler = createCompiler(); |
253 | 275 |
|
254 | 276 |
Code code = compiler.compileExpression(source); |
277 |
link(code); |
|
255 | 278 |
assertEquals("CASE(((\"Field_1\" >= 75) AND (\"Field_1\" <= 79)), ((\"Field_1\" >= 80) AND (\"Field_1\" <= 84)), 100, 110, 120)", code.toString()); |
256 | 279 |
} |
257 | 280 |
|
... | ... | |
261 | 284 |
Compiler compiler = createCompiler(); |
262 | 285 |
|
263 | 286 |
Code code = compiler.compileExpression(source); |
264 |
assertEquals("CREATE_FUNCTION('test1', print('Hola'))", code.toString()); |
|
287 |
link(code); |
|
288 |
assertEquals("CREATE_FUNCTION(FUNCTION_NAME:'test1', BODY:print('Hola'))", code.toString()); |
|
289 |
|
|
265 | 290 |
} |
266 | 291 |
|
267 | 292 |
public void testDef2() { |
... | ... | |
270 | 295 |
Compiler compiler = createCompiler(); |
271 | 296 |
|
272 | 297 |
Code code = compiler.compileExpression(source); |
273 |
assertEquals("CREATE_FUNCTION('test1', LIST('nombre'), print(('Hola ' + \"nombre\")))", code.toString()); |
|
298 |
link(code); |
|
299 |
assertEquals("CREATE_FUNCTION(FUNCTION_NAME:'test1', PARAMETERS:LIST('nombre'), BODY:print(('Hola ' + \"nombre\")))", code.toString()); |
|
274 | 300 |
} |
275 | 301 |
|
276 | 302 |
public void testDef3() { |
... | ... | |
279 | 305 |
Compiler compiler = createCompiler(); |
280 | 306 |
|
281 | 307 |
Code code = compiler.compileExpression(source); |
282 |
assertEquals("CREATE_FUNCTION('test1', LIST('nombre'), RETURN(('Hola ' || \"nombre\")))", code.toString()); |
|
308 |
link(code); |
|
309 |
assertEquals("CREATE_FUNCTION(FUNCTION_NAME:'test1', PARAMETERS:LIST('nombre'), BODY:RETURN(('Hola ' || \"nombre\")))", code.toString()); |
|
283 | 310 |
} |
284 | 311 |
|
285 | 312 |
public void testCreateFunctionExtern1() { |
... | ... | |
288 | 315 |
Compiler compiler = createCompiler(); |
289 | 316 |
|
290 | 317 |
Code code = compiler.compileExpression(source); |
291 |
assertEquals("CREATE_FUNCTION('test1', LIST('nombre'), 'addons/test/test', 'test1', 'cosa')", code.toString()); |
|
318 |
link(code); |
|
319 |
assertEquals("CREATE_FUNCTION(FUNCTION_NAME:'test1', PARAMETERS:LIST('nombre'), SCRIPT_PATH:'addons/test/test', SCRIPT_FUNCTION:'test1', LANGUAGE:'cosa')", code.toString()); |
Also available in: Unified diff