Revision 45153

View differences:

trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.impl/src/test/java/org/gvsig/expresionevaluator/impl/TestGrammarCompiler.java
296 296

  
297 297
        Code code = compiler.compileExpression(source);
298 298
        link(code);
299
        assertEquals("CREATE_FUNCTION('test1', [ 'nombre' ], print(('Hola ' + \"nombre\")), NULL, NULL, NULL)", code.toString());
299
        assertEquals("CREATE_FUNCTION('test1', ARRAY[ 'nombre' ], print(('Hola ' + \"nombre\")), NULL, NULL, NULL)", code.toString());
300 300
    }
301 301

  
302 302
    public void testDef3() {
......
306 306

  
307 307
        Code code = compiler.compileExpression(source);
308 308
        link(code);
309
        assertEquals("CREATE_FUNCTION('test1', [ 'nombre' ], RETURN(('Hola ' || \"nombre\")), NULL, NULL, NULL)", code.toString());
309
        assertEquals("CREATE_FUNCTION('test1', ARRAY[ 'nombre' ], RETURN(('Hola ' || \"nombre\")), NULL, NULL, NULL)", code.toString());
310 310
    }
311 311
    
312 312
    public void testCreateFunctionExtern1() {
......
316 316

  
317 317
        Code code = compiler.compileExpression(source);
318 318
        link(code);
319
        assertEquals("CREATE_FUNCTION('test1', [ 'nombre' ], NULL, 'addons/test/test', 'test1', 'cosa')", code.toString());
319
        assertEquals("CREATE_FUNCTION('test1', ARRAY[ 'nombre' ], NULL, 'addons/test/test', 'test1', 'cosa')", code.toString());
320 320
    }
321 321
    
322 322
    public void testList() {
......
326 326

  
327 327
        Code code = compiler.compileExpression(source);
328 328
        link(code);
329
        assertEquals("LET('x', [ 'hola', 'adios', 'fin' ])", code.toString());
329
        assertEquals("LET('x', ARRAY[ 'hola', 'adios', 'fin' ])", code.toString());
330 330
    }
331 331
    
332 332
    public void testList2() {
......
336 336

  
337 337
        Code code = compiler.compileExpression(source);
338 338
        link(code);
339
        assertEquals("LET('x', [ 'hola', 'adios', 'fin' ])", code.toString());
339
        assertEquals("LET('x', ARRAY[ 'hola', 'adios', 'fin' ])", code.toString());
340 340
    }
341 341
    
342 342
    public void testTuple() {
......
350 350
    }
351 351
    
352 352
    public void testArray() {
353
        String source = "set x TO ARRAY('hola','adios','fin')";
353
        String source = "set x TO ARRAY['hola','adios','fin']";
354 354

  
355 355
        Compiler compiler = createCompiler();
356 356

  
357 357
        Code code = compiler.compileExpression(source);
358 358
        link(code);
359
        assertEquals("LET('x', ARRAY('hola', 'adios', 'fin'))", code.toString());
359
        assertEquals("LET('x', ARRAY[ 'hola', 'adios', 'fin' ])", code.toString());
360 360
    }
361 361
    
362 362
    public void testUseCase1() {
363
        String source = "begin set x = ''; for n in list('hola','adios','fin'): let x = x || ' ' || n; end for; end";
363
        String source = "begin set x = ''; for n in ARRAY['hola','adios','fin']: let x = x || ' ' || n; end for; end";
364 364

  
365 365
        Compiler compiler = createCompiler();
366 366

  
367 367
        Code code = compiler.compileExpression(source);
368 368
        link(code);
369
        assertEquals("BLOCK(LET('x', ''), FOREACH('n', [ 'hola', 'adios', 'fin' ], LET('x', ((\"x\" || ' ') || \"n\"))))", code.toString());
369
        assertEquals("BLOCK(LET('x', ''), FOREACH('n', ARRAY[ 'hola', 'adios', 'fin' ], LET('x', ((\"x\" || ' ') || \"n\"))))", code.toString());
370 370
    }
371 371

  
372 372
    public void testUseCase2() {
373
        String source = "begin set s = ''; set x = [ 'hola','adios','fin' ]; FOR n in RANGE(3): set s = s || ' ' || x[n]; end for; end";
373
        String source = "begin set s = ''; set x = ARRAY[ 'hola','adios','fin' ]; FOR n in RANGE(3): set s = s || ' ' || x[n]; end for; end";
374 374

  
375 375
        Compiler compiler = createCompiler();
376 376

  
377 377
        Code code = compiler.compileExpression(source);
378 378
        link(code);
379
        assertEquals("BLOCK(LET('s', ''), LET('x', [ 'hola', 'adios', 'fin' ]), FOREACH('n', RANGE(3), LET('s', ((\"s\" || ' ') || \"x\"[\"n\"]))))", code.toString());
379
        assertEquals("BLOCK(LET('s', ''), LET('x', ARRAY[ 'hola', 'adios', 'fin' ]), FOREACH('n', RANGE(3), LET('s', ((\"s\" || ' ') || \"x\"[\"n\"]))))", code.toString());
380 380
    }
381 381

  
382 382

  
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/TestJsonInterpreter.java
78 78
        Code code = compiler.compileExpression(source);
79 79
        Object v = interpreter.run(code);
80 80
        
81
        assertEquals("[ 10, 20, 'adios' ]", code.toString());
81
        assertEquals("ARRAY[ 10, 20, 'adios' ]", code.toString());
82 82
        assertTrue("List expected", v instanceof List);
83 83
        assertEquals(3, ((List)v).size());
84 84
        assertEquals(10, ((List)v).get(0));
......
165 165
        Compiler compiler = createCompiler();
166 166
        Interpreter interpreter = createInterpreter(symbolTable);
167 167

  
168
        String source = "to_json([ 10, 20, 'adios' ])";
168
        String source = "to_json(ARRAY[ 10, 20, 'adios' ])";
169 169

  
170 170
        Code code = compiler.compileExpression(source);
171 171
        Object v = interpreter.run(code);
172 172
        
173
        assertEquals("to_json([ 10, 20, 'adios' ])", code.toString());
173
        assertEquals("to_json(ARRAY[ 10, 20, 'adios' ])", code.toString());
174 174
        
175 175
        assertTrue("JsonArray expected", v instanceof JsonArray);
176 176
        assertEquals(3, ((JsonArray)v).size());
......
184 184
        Compiler compiler = createCompiler();
185 185
        Interpreter interpreter = createInterpreter(symbolTable);
186 186

  
187
        String source = "to_json([ 10, 20, { diez:10, veinte:20, despedida:'adios' }, 'adios' ])";
187
        String source = "to_json(ARRAY[ 10, 20, { diez:10, veinte:20, despedida:'adios' }, 'adios' ])";
188 188

  
189 189
        Code code = compiler.compileExpression(source);
190 190
        Object v = interpreter.run(code);
191 191
        
192
        assertEquals("to_json([ 10, 20, { 'diez':10, 'veinte':20, 'despedida':'adios' }, 'adios' ])", code.toString());
192
        assertEquals("to_json(ARRAY[ 10, 20, { 'diez':10, 'veinte':20, 'despedida':'adios' }, 'adios' ])", code.toString());
193 193
        
194 194
        assertTrue("JsonArray expected", v instanceof JsonArray);
195 195
        assertEquals(4, ((JsonArray)v).size());
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/TestExpression.java
7 7
import org.gvsig.expressionevaluator.ExpressionEvaluatorManager;
8 8
import org.gvsig.expressionevaluator.Interpreter;
9 9
import org.gvsig.expressionevaluator.MutableSymbolTable;
10
import org.gvsig.expressionevaluator.impl.DefaultSymbolTable;
10 11
import org.gvsig.expressionevaluator.spi.AbstractFunction;
11
import org.gvsig.expressionevaluator.spi.AbstractSymbolTable;
12 12
import org.gvsig.tools.library.impl.DefaultLibrariesInitializer;
13 13

  
14 14
public class TestExpression extends TestCase {
15 15

  
16
    private static class MyValueSymbolTable extends AbstractSymbolTable {
16
    private static class MyValueSymbolTable extends DefaultSymbolTable {
17 17

  
18 18
        private class MyValueFunction extends AbstractFunction {
19 19

  
......
128 128

  
129 129
    }
130 130

  
131
    public void testAs() {
131 132

  
133
        Expression expression = createExpression();
134
        expression.setPhrase("MYVALUE()*10 as n");
135

  
136
        MyValueSymbolTable t1 = new MyValueSymbolTable("MyValueSymbolTable1");
137
        t1.setValue(2);
138
        Object v1 = expression.execute(t1);
139
        assertEquals(20, (int) v1);
140
        assertEquals(20, (int) expression.getSymbolTable().value("n"));
141

  
142
        t1.setValue(3);
143
        v1 = expression.execute(t1);
144
        assertEquals(30, (int) v1);
145
        assertEquals(30, (int) expression.getSymbolTable().value("n"));
146

  
147
        MyValueSymbolTable t2 = new MyValueSymbolTable("MyValueSymbolTable2");
148
        t2.setValue(4);
149
        v1 = expression.execute(t2);
150
        assertEquals(40, (int) v1);
151
        assertEquals(40, (int) expression.getSymbolTable().value("n"));
152

  
153
    }
154
    
155
    public void testCast1() {
156

  
157
        Expression expression = createExpression();
158
        expression.setPhrase("CAST 10.1 AS INTEGER");
159

  
160
        Object v1 = expression.execute(null);
161
        assertEquals("Integer", v1.getClass().getSimpleName());
162
        assertEquals(10, (int) v1);
163
    }
164
    
165
    public void testCast2() {
166

  
167
        Expression expression = createExpression();
168
        expression.setPhrase("CAST(10.1 AS INTEGER)");
169

  
170
        Object v1 = expression.execute(null);
171
        assertEquals("Integer", v1.getClass().getSimpleName());
172
        assertEquals(10, (int) v1);
173
    }
174
    
175
    public void testCastAndAs() {
176

  
177
        Expression expression = createExpression();
178
        expression.setPhrase("CAST 10.1 AS INTEGER AS N");
179

  
180
        Object v1 = expression.execute(null);
181
        assertEquals("Integer", v1.getClass().getSimpleName());
182
        assertEquals(10, (int) v1);
183

  
184
        Object n = expression.getSymbolTable().value("n");
185
        assertEquals("Integer", n.getClass().getSimpleName());
186
        assertEquals(10, (int) n);
187
    }
132 188
}
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
41 41
    @Override
42 42
    public String toString(Codes args, Formatter<Code> formatter) {
43 43
        StringBuilder builder = new StringBuilder();
44
        builder.append("[ ");
44
        builder.append("ARRAY[ ");
45 45
        builder.append(args.toString(formatter));
46 46
        builder.append(" ]");
47 47
        return builder.toString();
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/LetFunction.java
1 1
package org.gvsig.expressionevaluator.impl.function.programming;
2 2

  
3 3
import org.apache.commons.lang3.Range;
4
import org.gvsig.expressionevaluator.ExpressionBuilder;
4 5
import org.gvsig.expressionevaluator.Function;
5 6
import org.gvsig.expressionevaluator.Interpreter;
6 7
import org.gvsig.expressionevaluator.MutableSymbolTable;
......
9 10

  
10 11
public class LetFunction extends AbstractFunction {
11 12

  
12
    public static final String NAME = "LET";
13
    
14 13
    public LetFunction() {
15 14
        super(Function.GROUP_PROGRAMMING, 
16
            NAME, 
15
                ExpressionBuilder.FUNCTION_LET, 
17 16
            Range.is(2),
18 17
            "Assigns the value indicated in the second argument to the variable indicated in the first argument.",
19 18
            "SET {{identifier}} = expression",
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
180 180
    public class RuleRequireExpression implements Rule {
181 181

  
182 182
        private String id;
183
        boolean allow_assignement;
183 184

  
184
        public RuleRequireExpression() {
185
        public RuleRequireExpression(boolean allow_assignement) {
186
            this.allow_assignement = allow_assignement;
185 187
        }
186 188

  
187 189
        @Override
......
193 195
        @Override
194 196
        public void parse(StatementContext context) {
195 197
            context.trace(this.toString()+".parse");
196
            Code code = context.parse_expression();
198
            Code code = context.parse_expression(allow_assignement);
197 199
            if (code == null) {
198 200
                throw new ExpressionSyntaxException(context.getLexicalAnalyzer());
199 201
            }
......
941 943

  
942 944
    @Override
943 945
    public Rule require_expression() {
944
        return new RuleRequireExpression();
946
        return this.require_expression(true);
945 947
    }
946 948

  
947 949
    @Override
950
    public Rule require_expression(boolean allow_assignement) {
951
        return new RuleRequireExpression(allow_assignement);
952
    }
953

  
954
    @Override
948 955
    public Rule require_expressions(String separator) {
949 956
        return new RuleRequiereExpressions(separator);
950 957
    }
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
46 46
        
47 47
        @Override
48 48
        public void save_state() {
49
          this.trace("save_state");
49 50
          ((AbstractLexicalAnalyzer)lexer).save_state();
50 51
          this.states.push(state);
51 52
        }
......
54 55
        public void restore_state() {
55 56
          ((AbstractLexicalAnalyzer)lexer).restore_state();
56 57
          state = this.states.pop();
58
          this.trace("restore_state");
57 59
        }
58 60

  
59 61
        @Override
60 62
        public void drop_state() {
61 63
          ((AbstractLexicalAnalyzer)lexer).drop_state();
62 64
          this.states.pop();
65
          this.trace("drop_state");
63 66
        }
64 67
        
65 68
        @Override
......
116 119
        }
117 120

  
118 121
        @Override
119
        public Code parse_expression() {
120
            return DefaultCompiler.this.parse_expression();
122
        public Code parse_expression(boolean allow_assignement) {
123
            return DefaultCompiler.this.parse_expression(allow_assignement);
121 124
        }
122 125

  
123 126
        @Override
......
132 135
        
133 136
        @Override
134 137
        public void trace(String msg) {
135
//          System.out.println(msg+". "+this.getLexicalAnalyzer().getSourceContext());
138
//            LexicalAnalyzer lex = this.getLexicalAnalyzer();
139
//            String s = StringUtils.left(lex.getSource(), lex.getPosition()) + "[*]" + StringUtils.mid(lex.getSource(), lex.getPosition(), 200);
140
//            if( s.length()>200 ) {
141
//                s = "..."+StringUtils.mid(s, lex.getPosition()-100, 200)+"...";
142
//            }            
143
//            System.out.println(msg+". "+s);
136 144
        } 
137 145
    }
138 146

  
......
206 214
        }
207 215
        return code;
208 216
    }
217
    
218
    public Code parse_expression() {
219
        return this.parse_expression(true);
220
    }
209 221

  
210
    public Code parse_expression() {
222
    public Code parse_expression(boolean allow_assignement) {
211 223
        Code code = parse_relational();
224
        if( code != null && allow_assignement) {
225
            Token token = lexer.look();
226
            if( token.is("AS") ) {
227
                lexer.next();
228
                token = lexer.look();
229
                if( token.getType() != Token.IDENTIFIER ) {
230
                    throw new ExpressionSyntaxException(
231
                        I18N.An_identifier_was_expected_and_XliteralX_was_found(token.getLiteral()),
232
                        lexer
233
                    );                    
234
                }
235
                token = lexer.next();
236
                code = codeBuilder.let(token.getLiteral(),code);
237
            }
238
        }
212 239
        return code;
213 240
    }
214 241

  
......
703 730
        StatementContext context = new DefaultStatementContext();
704 731
        Code code;
705 732
        BaseCodes args = (BaseCodes) this.codeBuilder.args();
733
        context.trace("compiler.parse_gramars");
706 734
        Statement stmt = this.grammars.getApplicableStatement(context);
707 735
        while( stmt!=null ) {
708 736
            code = stmt.parse(context);
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/DefaultSymbolTable.java
18 18
    {
19 19

  
20 20

  
21
    public DefaultSymbolTable() {
22
        super();
21
    public DefaultSymbolTable(String name) {
22
        super(name);
23 23
        this.vars = new HashMap<>();
24 24
        this.functions = new HashMap<>();
25 25
//        this.scripts = new ArrayList<>();
26 26
        this.init();
27 27
    }
28 28
    
29
    public DefaultSymbolTable() {
30
        this(null);
31
    }
32
    
29 33
    private void init() {
30 34
        DefaultExpressionEvaluatorManager manager = (DefaultExpressionEvaluatorManager) ExpressionEvaluatorLocator.getManager();
31 35
        manager.populateSymbolTable(this);
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
53 53
import org.gvsig.expressionevaluator.Code.Callable;
54 54
import static org.gvsig.expressionevaluator.ExpressionBuilder.FUNCTION_DICT;
55 55
import static org.gvsig.expressionevaluator.ExpressionBuilder.FUNCTION_GETITEM;
56
import static org.gvsig.expressionevaluator.ExpressionBuilder.FUNCTION_LET;
56 57
import static org.gvsig.expressionevaluator.ExpressionBuilder.FUNCTION_MOD;
57 58

  
58 59
@SuppressWarnings("UseSpecificCatch")
......
771 772
    }
772 773

  
773 774
    @Override
775
    public Code let(String identifier, Code value) {
776
        BaseCodes args = args();
777
        args.add(this.constant(identifier));
778
        args.add(value);
779
        return function(FUNCTION_LET, Callable.FUNCTION, args);
780
    }
781

  
782
    @Override
774 783
    public Code add(Code op1, Code op2) {
775 784
        return operator(OPERATOR_ADD, op1, op2);
776 785
    }
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
18 18
import org.gvsig.expressionevaluator.impl.DefaultStatement.StatementBuilderBase;
19 19
import org.gvsig.expressionevaluator.impl.DefaultStatement.ArgsBuilderFromNames;
20 20
import org.gvsig.expressionevaluator.impl.function.programming.IIFFunction;
21
import org.gvsig.expressionevaluator.impl.function.programming.LetFunction;
22 21
import org.gvsig.expressionevaluator.impl.function.programming.CaseFunction;
23 22
import org.gvsig.expressionevaluator.impl.function.programming.CodeBlockFunction;
24 23
import org.gvsig.expressionevaluator.impl.function.programming.CodeBlockWithExceptFunction;
......
29 28
import org.gvsig.expressionevaluator.spi.AbstractGrammarFactory;
30 29
import org.gvsig.expressionevaluator.Code.Callable;
31 30
import org.gvsig.expressionevaluator.Codes;
31
import org.gvsig.expressionevaluator.ExpressionBuilder;
32 32
import static org.gvsig.expressionevaluator.ExpressionBuilder.FUNCTION_DICT;
33 33

  
34 34
/**
......
51 51

  
52 52
        @Override
53 53
        public String toString() {
54
          return "dict_args("+this.keyName+","+this.valueName+")";
54
            return "dict_args(" + this.keyName + "," + this.valueName + ")";
55 55
        }
56
        
56

  
57 57
        @Override
58 58
        public Codes build(StatementContext context) {
59
            context.trace(this.toString()+".build");
59
            context.trace(this.toString() + ".build");
60 60
            BaseCodes args = (BaseCodes) context.getCodeBuilder().args();
61 61
            if (keyName.contains("#")) {
62 62
                int n = 1;
......
80 80
        }
81 81
    }
82 82

  
83

  
84 83
    private class BeginStatementBuilder extends StatementBuilderBase {
85 84

  
86 85
        private final String blockID;
......
96 95
        public Code build(StatementContext context) {
97 96
            Callable code = (Callable) super.build(context);
98 97
            Code exceptCode = context.getCode(this.exceptID);
99
            if( exceptCode==null ) {
98
            if (exceptCode == null) {
100 99
                return code;
101 100
            }
102 101
            BaseCodes args = (BaseCodes) code.parameters();
......
104 103
            code = context.getCodeBuilder().function(CodeBlockWithExceptFunction.NAME, args);
105 104
            return code;
106 105
        }
107
        
106

  
108 107
    }
108

  
109 109
    public BasicGrammarFactory() {
110 110
        super("Basic", true);
111 111
    }
112
    
112

  
113 113
    @Override
114 114
    public Grammar create(Object... parameters) {
115 115
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
116
        if( this.grammar==null ) {
116
        if (this.grammar == null) {
117 117
            Grammar theGrammar = manager.createGrammar(this.getName());
118
            Statement stmt;
119
        
120
            theGrammar.addReservedWord("BEGIN");
121
            theGrammar.addReservedWord("EXCEPT");
122
            theGrammar.addReservedWord("END");
123
            theGrammar.addReservedWord("IF");
124
            theGrammar.addReservedWord("THEN");
125
            theGrammar.addReservedWord("ELSE");
126
            theGrammar.addReservedWord("WHILE");
127
            theGrammar.addReservedWord("CASE");
128
            theGrammar.addReservedWord("WHEN");
129
            theGrammar.addReservedWord("LOOP");
130
            theGrammar.addReservedWord("FOR");
131
            theGrammar.addReservedWord("CREATE");
132
            theGrammar.addReservedWord("FUNCTION");
133
            theGrammar.addReservedWord("PROCEDURE");
134
            theGrammar.addReservedWord("AS");
135
            theGrammar.addReservedWord("MATCH");
136
            theGrammar.addReservedWord("CAST");
137
            theGrammar.addReservedWord("SET");
138
            theGrammar.addReservedWord("TO");
139
            theGrammar.addReservedWord("FROM");
140
            theGrammar.addReservedWord("$$"); // ???? Asi van las funciones
141
            theGrammar.addReservedWord("PASS");
142
            theGrammar.addReservedWord("LAMBDA");
143
            
144
            stmt = theGrammar.createStatement("BLOCK");
145
            stmt.addRule(stmt.require_any_token("BEGIN"));
146
            stmt.addRule(stmt.require_expressions(";").capture_as("VALUES"));
147
            stmt.addRule(stmt.optional_any_token("EXCEPT")
148
                    .addRuleOnTrue(stmt.require_expressions(";").capture_as("EXCEPT"))
149
            );
150
            stmt.addRule(stmt.require_any_token("END"));
151
            stmt.builder(new BeginStatementBuilder("VALUES","EXCEPT"));
152
            theGrammar.addStatement(stmt);
153 118

  
154
            stmt = theGrammar.createStatement("IF");
155
            stmt.addRule(stmt.require_any_token("IF"));
156
            stmt.addRule(stmt.require_expression().capture_as("CONDITION"));
157
            stmt.addRule(stmt.require_any_token("THEN", ":"));
158
            stmt.addRule(stmt.require_expressions(";").capture_as("ONTRUE"));
159
            stmt.addRule(stmt.optional_any_token("ELSE")
160
                    .addRuleOnTrue(stmt.optional_any_token(":"))
161
                    .addRuleOnTrue(stmt.require_expressions(";").capture_as("ONFALSE"))
162
            );
163
            stmt.addRule(stmt.require_any_token("END"));
164
            stmt.addRule(stmt.optional_any_token("IF"));
165
            stmt.code(
166
                    IIFFunction.NAME,
167
                    stmt.args_names("CONDITION","ONTRUE","ONFALSE")
168
            ); 
169
            theGrammar.addStatement(stmt);
119
            theGrammar.addStatement(this.createArrayStatement(theGrammar));
120
            theGrammar.addStatement(this.createBlockStatement(theGrammar));
121
            theGrammar.addStatement(this.createCallStatement(theGrammar));
122
            theGrammar.addStatement(this.createCaseStatement(theGrammar));
123
            theGrammar.addStatement(this.createCastStatement(theGrammar));
124
            theGrammar.addStatement(this.createDateStatement(theGrammar));
125
            theGrammar.addStatement(this.createDictStatement(theGrammar));
126
            theGrammar.addStatement(this.createExtractStatement(theGrammar));
127
            theGrammar.addStatement(this.createForeachStatement(theGrammar));
128
            theGrammar.addStatement(this.createFunctionStatement(theGrammar));
129
            theGrammar.addStatement(this.createIfStatement(theGrammar));
130
            theGrammar.addStatement(this.createLambdaStatement(theGrammar));
131
            theGrammar.addStatement(this.createLet1Statement(theGrammar));
132
            theGrammar.addStatement(this.createLet2Statement(theGrammar));
133
            theGrammar.addStatement(this.createListStatement(theGrammar));
134
            theGrammar.addStatement(this.createMatchStatement(theGrammar));
135
            theGrammar.addStatement(this.createPassStatement(theGrammar));
136
            theGrammar.addStatement(this.createReturnStatement(theGrammar));
137
            theGrammar.addStatement(this.createTimeStatement(theGrammar));
138
            theGrammar.addStatement(this.createTimestampStatement(theGrammar));
139
            theGrammar.addStatement(this.createWhileStatement(theGrammar));
170 140

  
171
            stmt = theGrammar.createStatement("WHILE");
172
            stmt.addRule(stmt.require_any_token("WHILE"));
173
            stmt.addRule(stmt.require_expression().capture_as("CONDITION"));
174
            stmt.addRule(stmt.require_any_token("BEGIN", ":","LOOP"));
175
            stmt.addRule(stmt.require_expressions(";").capture_as("BODY"));
176
            stmt.addRule(stmt.require_any_token("END"));
177
            stmt.addRule(stmt.optional_any_token("WHILE","LOOP"));
178
            stmt.code(
179
                    WhileFunction.NAME,
180
                    stmt.args_names("CONDITION","BODY")
181
            ); 
182
            theGrammar.addStatement(stmt);
141
            this.grammar = theGrammar;
142
        }
143
        return grammar;
144
    }
183 145

  
184
//            stmt = theGrammar.createStatement("FOR");
185
//            stmt.addRule(stmt.require_any_token("FOR"));
186
//            stmt.addRule(stmt.require_expression("INIT"));
187
//            stmt.addRule(stmt.require_any_token(";"));
188
//            stmt.addRule(stmt.require_expression("CONDITION"));
189
//            stmt.addRule(stmt.require_any_token(";"));
190
//            stmt.addRule(stmt.require_expression("STEP"));
191
//            stmt.addRule(stmt.require_any_token("BEGIN", ":"));
192
//            stmt.addRule(stmt.require_expression("BODY"));
193
//            stmt.addRule(stmt.require_any_token("END"));
194
//            stmt.addRule(stmt.optional_any_token("FOR"));
195
//            stmt.code(
196
//                    ForFunction.NAME,
197
//                    stmt.args_names("INIT","CONDITION","STEP","BODY")
198
//            ); 
199
//            theGrammar.addStatement(stmt);
146
    private Statement createBlockStatement(Grammar theGrammar) {
147
        Statement stmt;
200 148

  
201
            stmt = theGrammar.createStatement("FOREACH");
202
            stmt.addRule(stmt.require_any_token("FOR","FOREACH"));
203
            stmt.addRule(stmt.require_identifier().capture_as("VAR"));
204
            stmt.addRule(stmt.require_any_token("IN"));
205
            stmt.addRule(stmt.require_expression().capture_as("ITERABLE"));
206
            stmt.addRule(stmt.require_any_token("BEGIN", ":", "LOOP"));
207
            stmt.addRule(stmt.require_expressions(";").capture_as("BODY"));
208
            stmt.addRule(stmt.require_any_token("END"));
209
            stmt.addRule(stmt.optional_any_token("FOR","LOOP"));
210
            stmt.code(
211
                    ForEachFunction.NAME,
212
                    stmt.args_names("VAR","ITERABLE","BODY")
213
            ); 
214
            theGrammar.addStatement(stmt);
149
        theGrammar.addReservedWord("BEGIN");
150
        theGrammar.addReservedWord("EXCEPT");
151
        theGrammar.addReservedWord("END");
215 152

  
216
            stmt = theGrammar.createStatement("CASE");
217
            stmt.addRule(stmt.require_any_token("CASE"));
218
            stmt.addRule(
219
                stmt.repeat_until_any_tokens("END","ELSE")
220
                    .addRule(stmt.require_any_token("WHEN"))
221
                    .addRule(stmt.require_expression().capture_as("CONDITION#"))
222
                    .addRule(stmt.require_any_token("THEN",":"))
223
                    .addRule(stmt.require_expressions(";").capture_as("ONTRUE#"))
224
            );
225
            stmt.addRule(stmt.optional_any_token("ELSE")
226
                    .addRuleOnTrue(stmt.optional_any_token(":"))
227
                    .addRuleOnTrue(stmt.require_expressions(";").capture_as("ELSE"))
228
            );
229
            stmt.addRule(stmt.require_any_token("END"));
230
            stmt.addRule(stmt.optional_any_token("CASE"));
231
            stmt.code(
232
                    CaseFunction.NAME,
233
                    stmt.args_names("CONDITION#","ONTRUE#","ELSE")
234
            ); 
235
            theGrammar.addStatement(stmt);
236
            
237
            stmt = theGrammar.createStatement("USERFUNCTION");
238
            stmt.addRule(stmt.require_any_token("CREATE"));
239
            stmt.addRule(stmt.optional_any_token("OR")
240
               .addRuleOnTrue(stmt.optional_any_token("REPLACE"))
241
            );
242
            stmt.addRule(stmt.optional_any_token("FUNCTION", "PROCEDURE"));
243
            stmt.addRule(stmt.require_identifier().capture_as("FUNCTION_NAME"));
244
            stmt.addRule(stmt.optional_any_token("("));
245
            stmt.addRule(stmt.optional_identifiers(",").capture_as("PARAMETERS"));
246
            stmt.addRule(stmt.optional_any_token(")"));
247
            stmt.addRule(stmt.require_any_token("AS"));
248
            stmt.addRule(stmt.optional_any_token("$$","BEGIN")
249
                    .addRuleOnTrue(stmt.require_expressions(";").capture_as("BODY"))
250
                    .addRuleOnTrue(stmt.require_any_token("$$", "END"))
251
                    .addRuleOnTrue(stmt.optional_any_token("FUNCTION", "PROCEDURE"))
252
                    .addRuleOnFalse(stmt.optional_literal_string().capture_as("SCRIPT_PATH")
153
        stmt = theGrammar.createStatement("BLOCK");
154
        stmt.addRule(stmt.require_any_token("BEGIN"));
155
        stmt.addRule(stmt.require_expressions(";").capture_as("VALUES"));
156
        stmt.addRule(stmt.optional_any_token("EXCEPT")
157
                .addRuleOnTrue(stmt.require_expressions(";").capture_as("EXCEPT"))
158
        );
159
        stmt.addRule(stmt.require_any_token("END"));
160
        stmt.builder(new BeginStatementBuilder("VALUES", "EXCEPT"));
161
        return stmt;
162
    }
163

  
164
    private Statement createIfStatement(Grammar theGrammar) {
165
        Statement stmt;
166

  
167
        theGrammar.addReservedWord("IF");
168
        theGrammar.addReservedWord("THEN");
169
        theGrammar.addReservedWord("ELSE");
170
        theGrammar.addReservedWord("END");
171

  
172
        stmt = theGrammar.createStatement("IF");
173
        stmt.addRule(stmt.require_any_token("IF"));
174
        stmt.addRule(stmt.require_expression().capture_as("CONDITION"));
175
        stmt.addRule(stmt.require_any_token("THEN", ":"));
176
        stmt.addRule(stmt.require_expressions(";").capture_as("ONTRUE"));
177
        stmt.addRule(stmt.optional_any_token("ELSE")
178
                .addRuleOnTrue(stmt.optional_any_token(":"))
179
                .addRuleOnTrue(stmt.require_expressions(";").capture_as("ONFALSE"))
180
        );
181
        stmt.addRule(stmt.require_any_token("END"));
182
        stmt.addRule(stmt.optional_any_token("IF"));
183
        stmt.code(
184
                IIFFunction.NAME,
185
                stmt.args_names("CONDITION", "ONTRUE", "ONFALSE")
186
        );
187
        return stmt;
188
    }
189

  
190
    private Statement createWhileStatement(Grammar theGrammar) {
191
        Statement stmt;
192

  
193
        theGrammar.addReservedWord("WHILE");
194
        theGrammar.addReservedWord("BEGIN");
195
        theGrammar.addReservedWord("END");
196
        theGrammar.addReservedWord("LOOP");
197

  
198
        stmt = theGrammar.createStatement("WHILE");
199
        stmt.addRule(stmt.require_any_token("WHILE"));
200
        stmt.addRule(stmt.require_expression().capture_as("CONDITION"));
201
        stmt.addRule(stmt.require_any_token("BEGIN", ":", "LOOP"));
202
        stmt.addRule(stmt.require_expressions(";").capture_as("BODY"));
203
        stmt.addRule(stmt.require_any_token("END"));
204
        stmt.addRule(stmt.optional_any_token("WHILE", "LOOP"));
205
        stmt.code(
206
                WhileFunction.NAME,
207
                stmt.args_names("CONDITION", "BODY")
208
        );
209
        return stmt;
210
    }
211

  
212
    private Statement createForeachStatement(Grammar theGrammar) {
213
        Statement stmt;
214

  
215
        theGrammar.addReservedWord("FOR");
216
        theGrammar.addReservedWord("IN");
217
        theGrammar.addReservedWord("BEGIN");
218
        theGrammar.addReservedWord("END");
219
        theGrammar.addReservedWord("LOOP");
220

  
221
        stmt = theGrammar.createStatement("FOREACH");
222
        stmt.addRule(stmt.require_any_token("FOR", "FOREACH"));
223
        stmt.addRule(stmt.require_identifier().capture_as("VAR"));
224
        stmt.addRule(stmt.require_any_token("IN"));
225
        stmt.addRule(stmt.require_expression().capture_as("ITERABLE"));
226
        stmt.addRule(stmt.require_any_token("BEGIN", ":", "LOOP"));
227
        stmt.addRule(stmt.require_expressions(";").capture_as("BODY"));
228
        stmt.addRule(stmt.require_any_token("END"));
229
        stmt.addRule(stmt.optional_any_token("FOR", "LOOP"));
230
        stmt.code(
231
                ForEachFunction.NAME,
232
                stmt.args_names("VAR", "ITERABLE", "BODY")
233
        );
234
        return stmt;
235
    }
236

  
237
    private Statement createCaseStatement(Grammar theGrammar) {
238
        Statement stmt;
239

  
240
        theGrammar.addReservedWord("CASE");
241
        theGrammar.addReservedWord("WHEN");
242
        theGrammar.addReservedWord("THEN");
243
        theGrammar.addReservedWord("ELSE");
244
        theGrammar.addReservedWord("END");
245

  
246
        stmt = theGrammar.createStatement("CASE");
247
        stmt.addRule(stmt.require_any_token("CASE"));
248
        stmt.addRule(
249
                stmt.repeat_until_any_tokens("END", "ELSE")
250
                        .addRule(stmt.require_any_token("WHEN"))
251
                        .addRule(stmt.require_expression().capture_as("CONDITION#"))
252
                        .addRule(stmt.require_any_token("THEN", ":"))
253
                        .addRule(stmt.require_expressions(";").capture_as("ONTRUE#"))
254
        );
255
        stmt.addRule(stmt.optional_any_token("ELSE")
256
                .addRuleOnTrue(stmt.optional_any_token(":"))
257
                .addRuleOnTrue(stmt.require_expressions(";").capture_as("ELSE"))
258
        );
259
        stmt.addRule(stmt.require_any_token("END"));
260
        stmt.addRule(stmt.optional_any_token("CASE"));
261
        stmt.code(
262
                CaseFunction.NAME,
263
                stmt.args_names("CONDITION#", "ONTRUE#", "ELSE")
264
        );
265
        return stmt;
266
    }
267

  
268
    private Statement createFunctionStatement(Grammar theGrammar) {
269
        Statement stmt;
270

  
271
        theGrammar.addReservedWord("CREATE");
272
        theGrammar.addReservedWord("FUNCTION");
273
        theGrammar.addReservedWord("PROCEDURE");
274
        theGrammar.addReservedWord("AS");
275
        theGrammar.addReservedWord("BEGIN");
276
        theGrammar.addReservedWord("END");
277
        theGrammar.addReservedWord("$$"); // ???? Asi van las funciones en PostgreSQL
278

  
279
        stmt = theGrammar.createStatement("USERFUNCTION");
280
        stmt.addRule(stmt.require_any_token("CREATE"));
281
        stmt.addRule(stmt.optional_any_token("OR")
282
                .addRuleOnTrue(stmt.optional_any_token("REPLACE"))
283
        );
284
        stmt.addRule(stmt.optional_any_token("FUNCTION", "PROCEDURE"));
285
        stmt.addRule(stmt.require_identifier().capture_as("FUNCTION_NAME"));
286
        stmt.addRule(stmt.optional_any_token("("));
287
        stmt.addRule(stmt.optional_identifiers(",").capture_as("PARAMETERS"));
288
        stmt.addRule(stmt.optional_any_token(")"));
289
        stmt.addRule(stmt.require_any_token("AS"));
290
        stmt.addRule(stmt.optional_any_token("$$", "BEGIN")
291
                .addRuleOnTrue(stmt.require_expressions(";").capture_as("BODY"))
292
                .addRuleOnTrue(stmt.require_any_token("$$", "END"))
293
                .addRuleOnTrue(stmt.optional_any_token("FUNCTION", "PROCEDURE"))
294
                .addRuleOnFalse(stmt.optional_literal_string().capture_as("SCRIPT_PATH")
253 295
                        .addRuleOnTrue(stmt.require_any_token(","))
254 296
                        .addRuleOnTrue(stmt.require_literal_string().capture_as("SCRIPT_FUNCTION"))
255 297
                        .addRuleOnTrue(stmt.optional_any_token("LANGUAGE")
256 298
                                .addRuleOnTrue(stmt.require_literal_string().capture_as("LANGUAGE"))
257 299
                        )
258
                    )
259
            );
260
            stmt.code(
261
                    CreateFnFunction.NAME,
262
                    stmt.fixed_args_names("FUNCTION_NAME","PARAMETERS","BODY", "SCRIPT_PATH", "SCRIPT_FUNCTION", "LANGUAGE")
263
            ); 
264
            theGrammar.addStatement(stmt);
265
                    
266
            stmt = theGrammar.createStatement("LAMBDA");
267
            stmt.addRule(stmt.require_any_token("LAMBDA"));
268
            stmt.addRule(stmt.optional_identifiers(",").capture_as("PARAMETERS"));
269
            stmt.addRule(stmt.require_any_token(":"));
270
            stmt.addRule(stmt.require_expression().capture_as("BODY"));
271
            stmt.code(
272
                    CreateFnFunction.NAME,
273
                    stmt.fixed_args_names("PARAMETERS","BODY")
274
            ); 
275
            theGrammar.addStatement(stmt);
300
                )
301
        );
302
        stmt.code(
303
                CreateFnFunction.NAME,
304
                stmt.fixed_args_names("FUNCTION_NAME", "PARAMETERS", "BODY", "SCRIPT_PATH", "SCRIPT_FUNCTION", "LANGUAGE")
305
        );
306
        return stmt;
307
    }
276 308

  
277
            stmt = theGrammar.createStatement("RETURN");
278
            stmt.addRule(stmt.require_any_token("RETURN"));
279
            stmt.addRule(stmt.optional_any_token(";")
280
                    .addRuleOnTrue(stmt.set_expression("VALUES", null))
281
                    .addRuleOnFalse(stmt.require_expression().capture_as("VALUES"))
282
                    .addRuleOnFalse(stmt.require_any_token(";"))
283
            );
284
            stmt.code(
285
                    ReturnFunction.NAME,
286
                    stmt.args_expand("VALUES")
287
            ); 
288
            theGrammar.addStatement(stmt);
309
    private Statement createLambdaStatement(Grammar theGrammar) {
310
        Statement stmt;
289 311

  
290
            stmt = theGrammar.createStatement("LET");
291
            stmt.addRule(stmt.require_any_token("LET", "SET"));
292
            stmt.addRule(stmt.require_identifier().capture_as("NAME"));
293
            stmt.addRule(stmt.optional_any_token("=","TO"));
294
            stmt.addRule(stmt.require_expression().capture_as("VALUE"));
295
            stmt.code(
296
                    LetFunction.NAME, 
297
                    stmt.args_names("NAME", "VALUE")
298
            ); 
299
            
300
            theGrammar.addStatement(stmt);
301
            stmt = theGrammar.createStatement("LET2");
302
            stmt.addRule(stmt.require_identifier().capture_as("NAME"));
303
            stmt.addRule(stmt.require_any_token(":="));
304
            stmt.addRule(stmt.require_expression().capture_as("VALUE"));
305
            stmt.code(
306
                    LetFunction.NAME, 
307
                    stmt.args_names("NAME", "VALUE")
308
            ); 
309
            theGrammar.addStatement(stmt);
310
            
311
            stmt = theGrammar.createStatement("ARRAY");
312
            stmt.addRule(stmt.require_any_token("ARRAY"));
313
            stmt.addRule(stmt.require_any_token("["));
314
            stmt.addRule(stmt.require_expressions(",").capture_as("VALUES"));
315
            stmt.addRule(stmt.require_any_token("]"));
316
            stmt.code(
317
                    FUNCTION_LIST, 
318
                    stmt.args_expand("VALUES")
319
            ); 
320
            theGrammar.addStatement(stmt);
312
        theGrammar.addReservedWord("LAMBDA");
321 313

  
322
            stmt = theGrammar.createStatement("CAST");
323
            stmt.addRule(stmt.require_any_token("CAST"));
324
            stmt.addRule(stmt.optional_any_token("(")
325
                .addRuleOnTrue(stmt.require_expression().capture_as("VALUE"))
314
        stmt = theGrammar.createStatement("LAMBDA");
315
        stmt.addRule(stmt.require_any_token("LAMBDA"));
316
        stmt.addRule(stmt.optional_identifiers(",").capture_as("PARAMETERS"));
317
        stmt.addRule(stmt.require_any_token(":"));
318
        stmt.addRule(stmt.require_expression().capture_as("BODY"));
319
        stmt.code(
320
                CreateFnFunction.NAME,
321
                stmt.fixed_args_names("PARAMETERS", "BODY")
322
        );
323
        return stmt;
324
    }
325

  
326
    private Statement createReturnStatement(Grammar theGrammar) {
327
        Statement stmt;
328

  
329
        theGrammar.addReservedWord("RETURN");
330

  
331
        stmt = theGrammar.createStatement("RETURN");
332
        stmt.addRule(stmt.require_any_token("RETURN"));
333
        stmt.addRule(stmt.optional_any_token(";")
334
                .addRuleOnTrue(stmt.set_expression("VALUES", null))
335
                .addRuleOnFalse(stmt.require_expression().capture_as("VALUES"))
336
                .addRuleOnFalse(stmt.require_any_token(";"))
337
        );
338
        stmt.code(
339
                ReturnFunction.NAME,
340
                stmt.args_expand("VALUES")
341
        );
342
        return stmt;
343
    }
344

  
345
    private Statement createLet1Statement(Grammar theGrammar) {
346
        Statement stmt;
347

  
348
        theGrammar.addReservedWord("LET");
349
        theGrammar.addReservedWord("SET");
350
        theGrammar.addReservedWord("TO");
351

  
352
        stmt = theGrammar.createStatement("LET");
353
        stmt.addRule(stmt.require_any_token("LET", "SET"));
354
        stmt.addRule(stmt.require_identifier().capture_as("NAME"));
355
        stmt.addRule(stmt.optional_any_token("=", "TO"));
356
        stmt.addRule(stmt.require_expression().capture_as("VALUE"));
357
        stmt.code(
358
                ExpressionBuilder.FUNCTION_LET,
359
                stmt.args_names("NAME", "VALUE")
360
        );
361
        return stmt;
362
    }
363

  
364
    private Statement createLet2Statement(Grammar theGrammar) {
365
        Statement stmt;
366

  
367
        stmt = theGrammar.createStatement("LET2");
368
        stmt.addRule(stmt.require_identifier().capture_as("NAME"));
369
        stmt.addRule(stmt.require_any_token(":="));
370
        stmt.addRule(stmt.require_expression().capture_as("VALUE"));
371
        stmt.code(
372
                ExpressionBuilder.FUNCTION_LET,
373
                stmt.args_names("NAME", "VALUE")
374
        );
375
        return stmt;
376
    }
377

  
378
    private Statement createArrayStatement(Grammar theGrammar) {
379
        Statement stmt;
380

  
381
        theGrammar.addReservedWord("ARRAY");
382

  
383
        stmt = theGrammar.createStatement("ARRAY");
384
        stmt.addRule(stmt.require_any_token("ARRAY"));
385
        stmt.addRule(stmt.require_any_token("["));
386
        stmt.addRule(stmt.require_expressions(",").capture_as("VALUES"));
387
        stmt.addRule(stmt.require_any_token("]"));
388
        stmt.code(
389
                FUNCTION_LIST,
390
                stmt.args_expand("VALUES")
391
        );
392
        return stmt;
393
    }
394

  
395
    private Statement createCastStatement(Grammar theGrammar) {
396
        Statement stmt;
397

  
398
        theGrammar.addReservedWord("CAST");
399
        theGrammar.addReservedWord("AS");
400

  
401
        stmt = theGrammar.createStatement("CAST");
402
        stmt.addRule(stmt.require_any_token("CAST"));
403
        stmt.addRule(stmt.optional_any_token("(")
404
                .addRuleOnTrue(stmt.require_expression(false).capture_as("VALUE"))
326 405
                .addRuleOnTrue(stmt.require_any_token("AS"))
327 406
                .addRuleOnTrue(stmt.require_identifier().capture_as("TYPE"))
328
                .addRuleOnTrue(stmt.require_any_token(")"))                    
329
                .addRuleOnFalse(stmt.require_expression().capture_as("VALUE"))
407
                .addRuleOnTrue(stmt.require_any_token(")"))
408
                .addRuleOnFalse(stmt.require_expression(false).capture_as("VALUE"))
330 409
                .addRuleOnFalse(stmt.require_any_token("AS"))
331 410
                .addRuleOnFalse(stmt.require_identifier().capture_as("TYPE"))
332
            );
333
            stmt.code(
334
                    FUNCTION_CAST,
335
                    stmt.args_names("VALUE","TYPE")
336
            );
337
            theGrammar.addStatement(stmt);
338
            
339
            stmt = theGrammar.createStatement("MATCH");
340
            stmt.addRule(stmt.require_any_token("MATCH"));
341
            stmt.addRule(stmt.optional_any_token("(")
411
        );
412
        stmt.code(
413
                FUNCTION_CAST,
414
                stmt.args_names("VALUE", "TYPE")
415
        );
416
        return stmt;
417
    }
418

  
419
    private Statement createMatchStatement(Grammar theGrammar) {
420
        Statement stmt;
421

  
422
        theGrammar.addReservedWord("MATCH");
423

  
424
        stmt = theGrammar.createStatement("MATCH");
425
        stmt.addRule(stmt.require_any_token("MATCH"));
426
        stmt.addRule(stmt.optional_any_token("(")
342 427
                .addRuleOnTrue(stmt.require_expression().capture_as("VALUE"))
343 428
                .addRuleOnTrue(stmt.require_any_token(","))
344 429
                .addRuleOnTrue(stmt.require_expression().capture_as("PATTERN"))
345
                .addRuleOnTrue(stmt.require_any_token(")"))                    
430
                .addRuleOnTrue(stmt.require_any_token(")"))
346 431
                .addRuleOnFalse(stmt.require_expression().capture_as("VALUE"))
347 432
                .addRuleOnFalse(stmt.optional_any_token(","))
348 433
                .addRuleOnFalse(stmt.require_expression().capture_as("PATTERN"))
349
            );
350
            stmt.code(
351
                    OPERATOR_REGEXP,
352
                    stmt.args_names("VALUE","PATTERN")
353
            );
354
            theGrammar.addStatement(stmt);
355
            
356
            stmt = theGrammar.createStatement("DATE");
357
            stmt.addRule(stmt.require_any_token("DATE"));
358
            stmt.addRule(stmt.require_expression().capture_as("EXP"));
359
            stmt.code(FUNCTION_DATE,stmt.args_names("EXP"));
360
            theGrammar.addStatement(stmt);
434
        );
435
        stmt.code(
436
                OPERATOR_REGEXP,
437
                stmt.args_names("VALUE", "PATTERN")
438
        );
439
        return stmt;
440
    }
361 441

  
362
            stmt = theGrammar.createStatement("TIME");
363
            stmt.addRule(stmt.require_any_token("TIME"));
364
            stmt.addRule(stmt.require_expression().capture_as("EXP"));
365
            stmt.code(FUNCTION_TIME,stmt.args_names("EXP"));
366
            theGrammar.addStatement(stmt);
442
    private Statement createDateStatement(Grammar theGrammar) {
443
        Statement stmt;
367 444

  
368
            stmt = theGrammar.createStatement("TIMESTAMP");
369
            stmt.addRule(stmt.require_any_token("TIMESTAMP"));
370
            stmt.addRule(stmt.require_expression().capture_as("EXP"));
371
            stmt.code(FUNCTION_TIMESTAMP,stmt.args_names("EXP"));
372
            theGrammar.addStatement(stmt);
445
        stmt = theGrammar.createStatement("DATE");
446
        stmt.addRule(stmt.require_any_token("DATE"));
447
        stmt.addRule(stmt.require_expression().capture_as("EXP"));
448
        stmt.code(FUNCTION_DATE, stmt.args_names("EXP"));
449
        return stmt;
450
    }
373 451

  
374
            stmt = theGrammar.createStatement("EXTRACT");
375
            stmt.addRule(stmt.require_any_token("EXTRACT"));
376
            stmt.addRule(stmt.require_any_token("("));
377
            stmt.addRule(stmt.require_any_token("CENTURY","DAY","DECADE",
378
                    "DOW","DOY","HOUR","ISODOW","ISOYEAR","MICROSECONDS",
379
                    "MILLENNIUM","MILLUSECONDS","MINUTE","MONTH","QUARTER",
380
                    "SECOND","WEEK","YEAR").capture_as("FIELD"));
381
            stmt.addRule(stmt.require_any_token("FROM"));
382
            stmt.addRule(stmt.require_expression().capture_as("EXP"));
383
            stmt.addRule(stmt.require_any_token(")"));
384
            stmt.code(FUNCTION_EXTRACT,stmt.args_names("FIELD", "EXP"));
385
            theGrammar.addStatement(stmt);
452
    private Statement createTimeStatement(Grammar theGrammar) {
453
        Statement stmt;
386 454

  
387
            stmt = theGrammar.createStatement("DICT");
388
            stmt.addRule(stmt.require_any_token("{"));
389
            stmt.addRule(stmt.repeat()
390
                    .addRule(stmt.optional_literal_string().capture_as("NAME#")
391
                            .addRuleOnFalse(stmt.require_identifier().capture_as("NAME#"))
392
                    )
393
                    .addRule(stmt.require_any_token(":","=>"))
394
                    .addRule(stmt.require_expression().capture_as("VALUE#"))
395
                    .addRule(stmt.optional_any_token(",")
396
                            .addRuleOnFalse(stmt.break_loop())
397
                    )
398
            );      
399
            stmt.addRule(stmt.require_any_token("}"));
400
            stmt.code(FUNCTION_DICT,new DictArgsBuilder("NAME#", "VALUE#"));
401
            theGrammar.addStatement(stmt);
455
        stmt = theGrammar.createStatement("TIME");
456
        stmt.addRule(stmt.require_any_token("TIME"));
457
        stmt.addRule(stmt.require_expression().capture_as("EXP"));
458
        stmt.code(FUNCTION_TIME, stmt.args_names("EXP"));
459
        return stmt;
460
    }
402 461

  
403
            stmt = theGrammar.createStatement("LIST");
404
            stmt.addRule(stmt.require_any_token("["));
405
            stmt.addRule(stmt.repeat()
406
                    .addRule(stmt.require_expression().capture_as("VALUE#"))
407
                    .addRule(stmt.optional_any_token(",")
408
                            .addRuleOnFalse(stmt.break_loop())
409
                    )
410
            );      
411
            stmt.addRule(stmt.require_any_token("]"));
412
            stmt.code(FUNCTION_LIST,stmt.args_names("VALUE#"));
413
            theGrammar.addStatement(stmt);
414
            
415
            this.grammar = theGrammar;
462
    private Statement createTimestampStatement(Grammar theGrammar) {
463
        Statement stmt;
416 464

  
417
            stmt = theGrammar.createStatement("PASS");
418
            stmt.addRule(stmt.require_any_token("PASS"));
419
            stmt.addRule(stmt.optional_any_token("(")
465
        stmt = theGrammar.createStatement("TIMESTAMP");
466
        stmt.addRule(stmt.require_any_token("TIMESTAMP"));
467
        stmt.addRule(stmt.require_expression().capture_as("EXP"));
468
        stmt.code(FUNCTION_TIMESTAMP, stmt.args_names("EXP"));
469
        return stmt;
470
    }
471

  
472
    private Statement createExtractStatement(Grammar theGrammar) {
473
        Statement stmt;
474

  
475
        stmt = theGrammar.createStatement("EXTRACT");
476
        stmt.addRule(stmt.require_any_token("EXTRACT"));
477
        stmt.addRule(stmt.require_any_token("("));
478
        stmt.addRule(stmt.require_any_token("CENTURY", "DAY", "DECADE",
479
                "DOW", "DOY", "HOUR", "ISODOW", "ISOYEAR", "MICROSECONDS",
480
                "MILLENNIUM", "MILLUSECONDS", "MINUTE", "MONTH", "QUARTER",
481
                "SECOND", "WEEK", "YEAR").capture_as("FIELD"));
482
        stmt.addRule(stmt.require_any_token("FROM"));
483
        stmt.addRule(stmt.require_expression().capture_as("EXP"));
484
        stmt.addRule(stmt.require_any_token(")"));
485
        stmt.code(FUNCTION_EXTRACT, stmt.args_names("FIELD", "EXP"));
486
        return stmt;
487
    }
488

  
489
    private Statement createDictStatement(Grammar theGrammar) {
490
        Statement stmt;
491

  
492
        stmt = theGrammar.createStatement("DICT");
493
        stmt.addRule(stmt.require_any_token("{"));
494
        stmt.addRule(stmt.repeat()
495
                .addRule(stmt.optional_literal_string().capture_as("NAME#")
496
                        .addRuleOnFalse(stmt.require_identifier().capture_as("NAME#"))
497
                )
498
                .addRule(stmt.require_any_token(":", "=>"))
499
                .addRule(stmt.require_expression().capture_as("VALUE#"))
500
                .addRule(stmt.optional_any_token(",")
501
                        .addRuleOnFalse(stmt.break_loop())
502
                )
503
        );
504
        stmt.addRule(stmt.require_any_token("}"));
505
        stmt.code(FUNCTION_DICT, new DictArgsBuilder("NAME#", "VALUE#"));
506
        return stmt;
507
    }
508

  
509
    private Statement createListStatement(Grammar theGrammar) {
510
        Statement stmt;
511

  
512
        stmt = theGrammar.createStatement("LIST");
513
        stmt.addRule(stmt.require_any_token("["));
514
        stmt.addRule(stmt.repeat()
515
                .addRule(stmt.require_expression().capture_as("VALUE#"))
516
                .addRule(stmt.optional_any_token(",")
517
                        .addRuleOnFalse(stmt.break_loop())
518
                )
519
        );
520
        stmt.addRule(stmt.require_any_token("]"));
521
        stmt.code(FUNCTION_LIST, stmt.args_names("VALUE#"));
522
        return stmt;
523
    }
524

  
525
    private Statement createPassStatement(Grammar theGrammar) {
526
        Statement stmt;
527

  
528
        theGrammar.addReservedWord("PASS");
529

  
530
        stmt = theGrammar.createStatement("PASS");
531
        stmt.addRule(stmt.require_any_token("PASS"));
532
        stmt.addRule(stmt.optional_any_token("(")
420 533
                .addRuleOnTrue(stmt.require_expressions(",").capture_as("ARGS#"))
421
                .addRuleOnTrue(stmt.require_any_token(")"))                    
422
            );
423
            stmt.code(
424
                    "PASS",
425
                    stmt.args_names("ARGS#")
426
            );
427
            theGrammar.addStatement(stmt);
534
                .addRuleOnTrue(stmt.require_any_token(")"))
535
        );
536
        stmt.code(
537
                "PASS",
538
                stmt.args_names("ARGS#")
539
        );
540
        return stmt;
541
    }
428 542

  
429
            stmt = theGrammar.createStatement("CALL");
430
            stmt.addRule(stmt.require_any_token("CALL"));
431
            stmt.addRule(stmt.require_identifier().capture_as("CALLABLE"));
432
            stmt.addRule(stmt.optional_any_token("(")
543
    private Statement createCallStatement(Grammar theGrammar) {
544
        Statement stmt;
545

  
546
        theGrammar.addReservedWord("CALL");
547

  
548
        stmt = theGrammar.createStatement("CALL");
549
        stmt.addRule(stmt.require_any_token("CALL"));
550
        stmt.addRule(stmt.require_identifier().capture_as("CALLABLE"));
551
        stmt.addRule(stmt.optional_any_token("(")
433 552
                .addRuleOnTrue(stmt.require_expressions(",").capture_as("ARGS#"))
434
                .addRuleOnTrue(stmt.require_any_token(")"))                    
435
            );
436
            stmt.code(
437
                    "CALL",
438
                    stmt.args_names("CALLABLE","ARGS#")
439
            );
440
            theGrammar.addStatement(stmt);
441
        }
442
        return grammar;
553
                .addRuleOnTrue(stmt.require_any_token(")"))
554
        );
555
        stmt.code(
556
                "CALL",
557
                stmt.args_names("CALLABLE", "ARGS#")
558
        );
559
        return stmt;
443 560
    }
444
    
561

  
445 562
}
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
26 26

  
27 27
        public LexicalAnalyzer.Token next_token();
28 28

  
29
        public Code parse_expression();
29
        public Code parse_expression(boolean allow_assignement);
30 30

  
31 31
        public Codes parse_expressions(String separator);
32 32
        
......
105 105

  
106 106
    public Rule require_expression();
107 107

  
108
    public Rule require_expression(boolean allow_assignement);
109

  
108 110
    public Rule require_expressions(String separator);
109 111

  
110 112
    public Rule break_loop();
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.api/src/main/java/org/gvsig/expressionevaluator/CodeBuilder.java
77 77
    Code dict(Map<String,Code>map);
78 78

  
79 79
    Code method(Code obj, String methodname, Codes args);
80
    
81
    Code let(String identifier, Code value);
80 82
}
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.swing/org.gvsig.expressionevaluator.swing.impl/src/main/java/org/gvsig/expressionevaluator/swing/impl/DefaultCalculatorController.java
174 174
    }
175 175

  
176 176
    private Object doCalculate(boolean updateText) {
177
        if( !this.text.isEditable() ||!this.text.isEnabled() ) {
177
        if( !this.text.isEditable() ||!this.text.isEnabled() && StringUtils.isBlank(this.text.getText()) ) {
178 178
            return null;
179 179
        }
180 180
        String source = this.text.getText();

Also available in: Unified diff