Revision 44738

View differences:

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());
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff