Revision 44384

View differences:

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
29 29
        public Code parse_expression();
30 30

  
31 31
        public Codes parse_expressions(String separator);
32
        
33
        public boolean isReservedWord(String s);
34

  
32 35
    }
33 36

  
34 37
    public interface Rule {
......
53 56
        public Codes build(StatementContext context);
54 57
    }
55 58

  
59
    public interface StatementBuilder {
60
        
61
        public String getCodeID();
62
        
63
        public ArgsBuilder getArgsBuilder();
64
        
65
        public Code build(StatementContext context);
56 66

  
67
    }
68

  
57 69
    public String getName();
58 70

  
59 71
    public Statement addRule(Rule rule);
......
80 92
    
81 93
    public void code(String id, ArgsBuilder argsBuilder);
82 94

  
95
    public void builder(StatementBuilder stmtBuilder);
96

  
83 97
    public Code parse(StatementContext context);
84 98

  
85 99
    public boolean isApplicable(StatementContext context);
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/TestCompiler.java
96 96
        assertEquals("NULL", code.toString());
97 97
    }
98 98

  
99
    public void testIsNull() {
100
        String source = "10 is null";
101

  
102
        Compiler compiler = createCompiler();
103
        Code code = compiler.compileExpression(source);
104
        assertEquals("(10 IS NULL)", code.toString());
105
    }
106

  
107
    public void testIsNotNull() {
108
        String source = "10 is not null";
109

  
110
        Compiler compiler = createCompiler();
111
        Code code = compiler.compileExpression(source);
112
        assertEquals("NOT((10 IS NULL))", code.toString());
113
    }
114

  
99 115
    public void testNotTrue() {
100 116
        String source = "not true";
101 117

  
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.impl/src/test/java/org/gvsig/expresionevaluator/impl/TestGrammarInterpreter.java
247 247
        assertEquals("gvSIG", v);
248 248
    }
249 249

  
250
    public void testCaseUnWhenSolo() {
251
        MutableSymbolTable symbolTable = createSymbolTable();
252
        Compiler compiler = createCompiler();
253
        Interpreter interpreter = createInterpreter(symbolTable);
254

  
255
        symbolTable.setVar("software","unknown");
256
        String source = "CASE WHEN software LIKE '%gvSIG%' THEN 'gvSIG' END"; // ;)
257
        Code code = compiler.compileExpression(source);
258
        Object v = interpreter.run(code);
259
        assertEquals(null, v);
260
    }
261

  
250 262
    public void testCase2() {
251 263
        MutableSymbolTable symbolTable = createSymbolTable();
252 264
        Compiler compiler = createCompiler();
......
282 294
        Compiler compiler = createCompiler();
283 295
        Interpreter interpreter = createInterpreter(symbolTable);
284 296

  
285
        String source = "CREATE FUNCTION test1() RETURN 'Hola'; END FUNCTION"; 
297
        String source = "CREATE PROCEDURE test1 AS RETURN 'Hola'; END PROCEDURE"; 
286 298
        Code code = compiler.compileExpression(source);
287 299
        Object v = interpreter.run(code);
288 300

  
......
298 310
        Compiler compiler = createCompiler();
299 311
        Interpreter interpreter = createInterpreter(symbolTable);
300 312

  
301
        String source = "CREATE FUNCTION test1(nombre) RETURN 'Hola ' || nombre; END FUNCTION";
313
        String source = "CREATE PROCEDURE test1 nombre AS RETURN 'Hola ' || nombre; END PROCEDURE";
302 314
        Code code = compiler.compileExpression(source);
303 315
        Object v = interpreter.run(code);
304 316

  
......
314 326
        Compiler compiler = createCompiler();
315 327
        Interpreter interpreter = createInterpreter(symbolTable);
316 328

  
317
        String source = "CREATE FUNCTION test1(nombre) RETURN 'Hola ' || nombre; END FUNCTION";
329
        String source = "CREATE PROCEDURE test1 nombre AS RETURN 'Hola ' || nombre; END PROCEDURE";
318 330
        Code code = compiler.compileExpression(source);
319 331
        Object v = interpreter.run(code);
320 332

  
......
330 342
        Compiler compiler = createCompiler();
331 343
        Interpreter interpreter = createInterpreter(symbolTable);
332 344

  
333
        String source = "CREATE FUNCTION test1(nombre) RETURN 'Hola ' || nombre; END FUNCTION";
345
        String source = "CREATE PROCEDURE test1 nombre AS RETURN 'Hola ' || nombre; END PROCEDURE";
334 346
        Code code = compiler.compileExpression(source);
335 347
        Object v = interpreter.run(code);
336 348

  
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
81 81
        assertEquals("BLOCK(LET('V1', 23))", code.toString());
82 82
    }
83 83

  
84
    public void testBlockExcept() {
85
        String source = "BEGIN LET V1 = 23; EXCEPT NULL; END";
86

  
87
        Compiler compiler = createCompiler();
88

  
89
        Code code = compiler.compileExpression(source);
90
        assertEquals("BLOCK_EXCEPT(LET('V1', 23), NULL)", code.toString());
91
    }
92

  
84 93
    public void testBlock2() {
85 94
        String source = "BEGIN LET V1 = 11; LET V2 = 22;  END";
86 95

  
......
90 99
        assertEquals("BLOCK(LET('V1', 11), LET('V2', 22))", code.toString());
91 100
    }
92 101

  
102
    public void testBlockExcept2() {
103
        String source = "BEGIN LET V1 = 11; LET V2 = 22; EXCEPT -1; END";
104

  
105
        Compiler compiler = createCompiler();
106

  
107
        Code code = compiler.compileExpression(source);
108
        assertEquals("BLOCK_EXCEPT(LET('V1', 11), LET('V2', 22), -1)", code.toString());
109
    }
110

  
93 111
    public void testBlock3() {
94 112
        Compiler compiler = createCompiler();
95 113

  
......
238 256
    }
239 257
    
240 258
    public void testDef1() {
241
        String source = "CREATE FUNCTION test1() print('Hola'); END FUNCTION"; 
259
        String source = "CREATE PROCEDURE test1 AS print('Hola'); END PROCEDURE"; 
242 260

  
243 261
        Compiler compiler = createCompiler();
244 262

  
......
247 265
    }
248 266
    
249 267
    public void testDef2() {
250
        String source = "CREATE FUNCTION test1(nombre) print('Hola '+nombre); END FUNCTION";
268
        String source = "CREATE PROCEDURE test1 nombre AS print('Hola '+nombre); END PROCEDURE";
251 269

  
252 270
        Compiler compiler = createCompiler();
253 271

  
......
256 274
    }
257 275

  
258 276
    public void testDef3() {
259
        String source = "CREATE FUNCTION test1(nombre) RETURN 'Hola '||nombre; END FUNCTION";
277
        String source = "CREATE PROCEDURE test1 nombre AS RETURN 'Hola '||nombre; END PROCEDURE";
260 278

  
261 279
        Compiler compiler = createCompiler();
262 280

  
......
264 282
        assertEquals("CREATE_FUNCTION('test1', LIST('nombre'), RETURN(('Hola ' || \"nombre\")))", code.toString());
265 283
    }
266 284

  
285
    public void testList() {
286
        String source = "set x TO LIST('hola','adios','fin')";
287

  
288
        Compiler compiler = createCompiler();
289

  
290
        Code code = compiler.compileExpression(source);
291
        assertEquals("LET('x', LIST('hola', 'adios', 'fin'))", code.toString());
292
    }
293
    
294
    public void testArray() {
295
        String source = "set x TO ARRAY['hola','adios','fin']";
296

  
297
        Compiler compiler = createCompiler();
298

  
299
        Code code = compiler.compileExpression(source);
300
        assertEquals("LET('x', LIST('hola', 'adios', 'fin'))", code.toString());
301
    }
302
    
267 303
    public void testUseCase1() {
268 304
        String source = "begin set x = ''; for n in list('hola','adios','fin'): let x = x || ' ' || n; end for; end";
269 305

  
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/TestInterpreter.java
118 118
        assertEquals(null, interpreter.run(code));
119 119
    }
120 120
    
121
    public void testIsNull() {
122
        SymbolTable symbolTable = createSymbolTable();
123
        Compiler compiler = createCompiler();
124
        Interpreter interpreter = createInterpreter(symbolTable);
125
        
126
        String source = "10 is null";
127

  
128
        Code code = compiler.compileExpression(source);
129
        assertEquals(false, interpreter.run(code));
130
    }
131
    
132
    public void testIsNotNull() {
133
        SymbolTable symbolTable = createSymbolTable();
134
        Compiler compiler = createCompiler();
135
        Interpreter interpreter = createInterpreter(symbolTable);
136
        
137
        String source = "10 is not null";
138

  
139
        Code code = compiler.compileExpression(source);
140
        assertEquals(true, interpreter.run(code));
141
    }
142
    
121 143
    public void testAdd1() {
122 144
        SymbolTable symbolTable = createSymbolTable();
123 145
        Compiler compiler = createCompiler();
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.impl/src/test/resources/org/gvsig/expressionevaluator/impl/TestScript1_1.txt
1 1

  
2
create function form_onSetvalues(form, values)
3
  return;
4
end function
2
create procedure form_onSetvalues form, values as
3
begin
4
  print("form_onSetvalues");
5
end 
5 6

  
6
create function form_onFieldEnter(form, field)
7
  return;
8
end function
7
create procedure form_onFieldEnter form, field as
8
begin
9
  print("form_onFieldEnter");
10
end 
9 11

  
10
create function form_onFieldExit(form, field)
11
  return;
12
end function
12
create procedure form_onFieldExit form, field as
13
begin
14
  print("form_onFieldExit");
15
end 
13 16

  
14
create function form_onFieldChanged(form, field)
15
  return;
16
end function
17
create procedure form_onFieldChanged form, field as
18
begin
19
  print("form_onFieldChanged");
20
end 
17 21

  
18
create function form_validate(form)
22
create function form_validate form as
23
$$
19 24
  return true;
20
end function
25
$$ 
21 26

  
22
create function form_onLoad(form)
23
  return false;
24
end function
27
create procedure form_onLoad form as
28
$$
29
  print("form_onLoad");
30
$$
25 31

  
26
create function form_clear(form)
27
  return;
28
end function
32
create procedure form_clear form as
33
$$
34
  print("form_clear");
35
$$
29 36

  
30
create function form_isReadOnly(form)
37
create function form_isReadOnly form as
38
begin
31 39
    if not user().isAuthenticated() then
32 40
      return true;
33 41
    end if
......
41 49
    --   return true;
42 50
    -- end if
43 51
    -- return Date(fecha_de_cierre) > Date(fecha_accidente);
44
end function
52
end 
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.impl/src/test/resources/org/gvsig/expressionevaluator/impl/TestScript1_2.txt
1 1

  
2
CREATE FUNCTION test1()
3
    SET x = ''; 
2
CREATE FUNCTION test1 AS
3
BEGIN
4
    SET x  ''; 
4 5
    FOR n IN LIST('hola','adios','fin'):
5 6
        SET x = x || ' ' || n; 
6 7
    END FOR
7 8
    RETURN x;
8
END FUNCTION
9
END
9 10
  
10
CREATE FUNCTION test2()
11
    SET s = ''; 
12
    SET x = LIST('hola','adios','fin'); 
11
CREATE FUNCTION test2 AS
12
$$
13
    SET s  ''; 
14
    SET x TO LIST('hola','adios','fin'); 
13 15
    FOR n IN RANGE(3):
14 16
        SET s = s || ' ' || x[n]; 
15 17
    END FOR
16 18
    RETURN s;
17
END FUNCTION
19
$$
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.impl/src/main/java/org/gvsig/expressionevaluator/impl/symboltable/ProgrammingSymbolTable.java
7 7
import org.gvsig.expressionevaluator.impl.function.programming.ForEachFunction;
8 8
import org.gvsig.expressionevaluator.impl.function.programming.ForFunction;
9 9
import org.gvsig.expressionevaluator.impl.function.programming.CallStaticMethodFunction;
10
import org.gvsig.expressionevaluator.impl.function.programming.CodeBlockWithExceptFunction;
10 11
import org.gvsig.expressionevaluator.impl.function.programming.CreateFnFunction;
11 12
//import org.gvsig.expressionevaluator.impl.function.programming.EvalFunction;
12 13
import org.gvsig.expressionevaluator.impl.function.programming.FileFunction;
......
39 40

  
40 41
        this.addFunction(new CaseFunction());
41 42
        this.addFunction(new CodeBlockFunction());
43
        this.addFunction(new CodeBlockWithExceptFunction());
42 44
        this.addFunction(new ForEachFunction());
43 45
        this.addFunction(new ForFunction());
44 46
        this.addFunction(new LetFunction());
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/operator/IsOperator.java
22 22

  
23 23
        // FIXME: https://stackoverflow.com/questions/9822154/standard-sql-boolean-operator-is-vs-equals-operator
24 24

  
25
        if( op1==null && op2 == null) {
26
            return true;
27
        }
28
        if( op1==null || op2 == null ) {
29
            return false;
30
        }
31
        
25 32
        int type = this.getType(op1, op2);
26 33
        if( (type & TYPE_DOUBLE) == TYPE_DOUBLE ) {
27 34
            boolean value = MathUtils.compareTo(
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
1
package org.gvsig.expressionevaluator.impl.function.programming;
2

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

  
11
public class CodeBlockWithExceptFunction extends AbstractFunction {
12

  
13
    public static final String NAME = "BLOCK_EXCEPT";
14
    
15
    public CodeBlockWithExceptFunction() {
16
        super(Function.GROUP_PROGRAMMING, 
17
                NAME, 
18
                Range.between(1,Integer.MAX_VALUE),
19
                "Evaluate each of the arguments sequentially.",
20
                NAME+"( {{arguments...}} )",
21
                null,
22
                "Object",
23
                false
24
        );
25
    }
26

  
27
    @Override
28
    public boolean useArgumentsInsteadObjects() {
29
        return true;
30
    }
31

  
32
    @Override
33
    public boolean allowConstantFolding() {
34
        return false;
35
    }
36
    
37
    @Override
38
    public Object call(Interpreter interpreter, Object[] args) throws Exception {
39
        throw new UnsupportedOperationException("Not supported yet.");
40
    }
41
    
42
    @Override
43
    public Object call(Interpreter interpreter, Codes args) throws Exception {
44
        Object value = null;
45
        Code exceptionCode = args.get(args.size()-1);
46
        if( exceptionCode==null ) {
47
            for (int i = 0; i < args.size()-1; i++) {
48
                Code arg = args.get(i);
49
                // LLamamos a runCode para que no atrape los returns.
50
                value = ((DefaultInterpreter)interpreter).runCode(arg);
51
            }
52
        } else {
53
            for (int i = 0; i < args.size()-1; i++) {
54
                Code arg = args.get(i);
55
                try {
56
                    // LLamamos a runCode para que no atrape los returns.
57
                    value = ((DefaultInterpreter)interpreter).runCode(arg);
58
                } catch(Exception ex) {
59
                    value = ((DefaultInterpreter)interpreter).runCode(exceptionCode);
60
                    break;
61
                }
62
            }
63
        }
64
        return value;
65
    }
66
    
67
}
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/SQLLexicalAnalyzer.java
217 217
            parseNumber();
218 218
            return token;
219 219
        }
220
        if( Character.isAlphabetic(ch) ) {
220
        if( Character.isAlphabetic(ch) || ch =='$' ) {
221 221
            buffer.clear();
222
            while( Character.isLetterOrDigit(ch) || ch == '_' ) {
222
            while( Character.isLetterOrDigit(ch) || ch =='$' || ch == '_' ) {
223 223
                buffer.add(ch);
224 224
                ch = getch();
225 225
            }
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
26 26
public class DefaultStatement implements Statement {
27 27

  
28 28
    private final List<Rule> rules;
29
    private String codeId;
30
    private ArgsBuilder argsBuilder;
31 29
    private final String name;
30
    private StatementBuilder stmtBuilder;
31
//    private String codeId;
32
//    private ArgsBuilder argsBuilder;
32 33

  
33 34
    public interface RepeatRule extends CompoundRule {
34 35

  
......
49 50
            if (!token.is(this.required_token)) {
50 51
                throw new ExpressionSyntaxException(
51 52
                        I18N.A_XTokenX_was_expected_and_XliteralX_was_found(
52
                                StringUtils.join(this.required_token),
53
                                StringUtils.join(this.required_token,", "),
53 54
                                token.getLiteral()
54 55
                        ),
55 56
                        context.getLexicalAnalyzer()
......
290 291
            Token token = context.look_token();
291 292
            while (token.getType() == Token.IDENTIFIER) {
292 293
                String identifier = (String) token.getLiteral();
294
                if( context.isReservedWord(identifier) ) {
295
                    break;
296
                }
293 297
                Code code = context.getCodeBuilder().constant(identifier);
294 298
                args.add(code);
295 299
                context.next_token();
......
313 317
        }
314 318
    }
315 319

  
316
    private static class ArgsBuilderFromNames implements ArgsBuilder {
320
    public static class ArgsBuilderFromNames implements ArgsBuilder {
317 321

  
318 322
        private final String[] argNames;
319 323

  
320
        public ArgsBuilderFromNames(String[] argNames) {
324
        public ArgsBuilderFromNames(String... argNames) {
321 325
            this.argNames = argNames;
322 326
        }
323 327

  
......
338 342
                    }
339 343
                } else {
340 344
                    Code code = context.getCode(argName);
341
                    args.add(code);
345
                    if( code != null) {
346
                        args.add(code);
347
                    }
342 348
                }
343 349
            }
344 350
            return args;
345 351
        }
346 352
    }
347 353

  
348
    private static class ArgsBuilderExpand extends ArgsBuilderFromNames {
354
    public static class ArgsBuilderExpand extends ArgsBuilderFromNames {
349 355

  
350
        public ArgsBuilderExpand(String[] argNames) {
356
        public ArgsBuilderExpand(String... argNames) {
351 357
            super(argNames);
352 358
        }
353 359

  
......
371 377
        }
372 378
    }
373 379

  
380
    public static class StatementBuilderBase implements StatementBuilder {
381
        protected ArgsBuilder argsBuilder;
382
        protected String codeID;
383
        
384
        public StatementBuilderBase(String codeID, ArgsBuilder argsBuilder) {
385
            this.codeID = codeID;
386
            this.argsBuilder = argsBuilder;
387
        }
388
        
389
        @Override
390
        public String getCodeID() {
391
            return this.codeID;
392
        }
393

  
394
        @Override
395
        public ArgsBuilder getArgsBuilder() {
396
            return this.argsBuilder;
397
        }
398

  
399
        @Override
400
        public Code build(StatementContext context) {
401
            Codes args = this.getArgsBuilder().build(context);
402
            Code code = null;
403
            if (this.getCodeID() == null) {
404
                code = args.get(0);
405
            } else {
406
                if (args.size() == 0) {
407
                    code = context.getCodeBuilder().function(this.getCodeID(), null);
408
                } else {
409
                    // Si es un bloque dentro de otro, dejamos solo uno.
410
                    if( args.size()==1 && 
411
                        StringUtils.equalsIgnoreCase(CodeBlockFunction.NAME,this.getCodeID()) ) {
412
                        Code code0 = args.get(0);
413
                        if( code0.code() == Code.CALLER && 
414
                                StringUtils.equalsIgnoreCase(CodeBlockFunction.NAME,((Caller)code0).name())
415
                                ) {
416
                            code = code0;
417
                        }
418
                    }
419
                    if( code == null ) {
420
                        code = context.getCodeBuilder().function(this.getCodeID(), args);
421
                    }
422
                }
423
            }
424
            return code;
425
        }
426
    }
427
    
374 428
    public DefaultStatement(String name) {
375 429
        this.rules = new ArrayList<>();
376
        this.codeId = null;
377
        this.argsBuilder = null;
430
        this.stmtBuilder = null;
378 431
        this.name = name;
379 432
    }
380 433

  
......
454 507
    }
455 508
    
456 509
    @Override
457
    public void code(String id, ArgsBuilder argsBuilder) {
458
        this.codeId = id;
459
        this.argsBuilder = argsBuilder;
510
    public void code(final String id, final ArgsBuilder argsBuilder) {
511
        this.builder(new StatementBuilderBase(id, argsBuilder));
460 512
    }
461 513

  
514
    public void builder(StatementBuilder builder) {
515
        this.stmtBuilder = builder;
516
    }
517
    
462 518
    @Override
463 519
    public Code parse(StatementContext context) {
464 520
//        System.err.println("start parse "+this.getName());
465 521
        for (Rule rule : rules) {
466 522
            rule.parse(context);
467 523
        }
468
        Codes args = this.argsBuilder.build(context);
469
//        System.err.println("end parse "+this.getName()+ ": "+ args.toString());
470
        
471
        Code code;
472
        if (codeId == null) {
473
            code = args.get(0);
474
        } else {
475
            if (args.size() == 0) {
476
                code = context.getCodeBuilder().function(codeId, null);
477
            } else {
478
                code = context.getCodeBuilder().function(codeId, args);
479
            }
480
        }
524
        Code code = this.stmtBuilder.build(context);
481 525
        return code;
482 526
    }
483 527

  
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
88 88
            return DefaultCompiler.this.parse_expressions(separator);
89 89
        }
90 90
        
91
        public boolean isReservedWord(String s) {
92
            return grammars.isReservedWord(s);
93
        }
91 94
    }
92 95

  
93 96
    private boolean objectAccessSupported;
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
1 1
package org.gvsig.expressionevaluator.impl.grammars;
2 2

  
3
import org.gvsig.expressionevaluator.Code;
4
import org.gvsig.expressionevaluator.Code.Caller;
3 5
import static org.gvsig.expressionevaluator.ExpressionBuilder.FUNCTION_CAST;
6
import static org.gvsig.expressionevaluator.ExpressionBuilder.FUNCTION_LIST;
4 7
import static org.gvsig.expressionevaluator.ExpressionBuilder.OPERATOR_REGEXP;
5 8
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
6 9
import org.gvsig.expressionevaluator.ExpressionEvaluatorManager;
7 10
import org.gvsig.expressionevaluator.Grammar;
8 11
import org.gvsig.expressionevaluator.Statement;
9
import org.gvsig.expressionevaluator.impl.function.operator.RegExpOperator;
12
import org.gvsig.expressionevaluator.Statement.StatementContext;
13
import org.gvsig.expressionevaluator.impl.DefaultCodeBuilder.BaseCodes;
14
import org.gvsig.expressionevaluator.impl.DefaultStatement.StatementBuilderBase;
15
import org.gvsig.expressionevaluator.impl.DefaultStatement.ArgsBuilderFromNames;
10 16
import org.gvsig.expressionevaluator.impl.function.programming.IIFFunction;
11 17
import org.gvsig.expressionevaluator.impl.function.programming.LetFunction;
12 18
import org.gvsig.expressionevaluator.impl.function.programming.CaseFunction;
13 19
import org.gvsig.expressionevaluator.impl.function.programming.CodeBlockFunction;
20
import org.gvsig.expressionevaluator.impl.function.programming.CodeBlockWithExceptFunction;
14 21
import org.gvsig.expressionevaluator.impl.function.programming.CreateFnFunction;
15 22
import org.gvsig.expressionevaluator.impl.function.programming.ForEachFunction;
23
import org.gvsig.expressionevaluator.impl.function.programming.ListFunction;
16 24
import org.gvsig.expressionevaluator.impl.function.programming.ReturnFunction;
17
import org.gvsig.expressionevaluator.impl.function.programming.TryFunction;
18 25
import org.gvsig.expressionevaluator.impl.function.programming.WhileFunction;
19 26
import org.gvsig.expressionevaluator.spi.AbstractGrammarFactory;
20 27

  
......
26 33

  
27 34
    private Grammar grammar;
28 35

  
36
    private class BeginStatementBuilder extends StatementBuilderBase {
37

  
38
        private final String blockID;
39
        private final String exceptID;
40

  
41
        public BeginStatementBuilder(String blockID, String exceptID) {
42
            super(CodeBlockFunction.NAME, new ArgsBuilderFromNames(blockID));
43
            this.blockID = blockID;
44
            this.exceptID = exceptID;
45
        }
46

  
47
        @Override
48
        public Code build(StatementContext context) {
49
            Caller code = (Caller) super.build(context);
50
            Code exceptCode = context.getCode(this.exceptID);
51
            if( exceptCode==null ) {
52
                return code;
53
            }
54
            BaseCodes args = (BaseCodes) code.parameters();
55
            args.add(exceptCode);
56
            code = context.getCodeBuilder().function(CodeBlockWithExceptFunction.NAME, args);
57
            return code;
58
        }
59
        
60
    }
29 61
    public BasicGrammarFactory() {
30 62
        super("Basic", true);
31 63
    }
......
38 70
            Statement stmt;
39 71
        
40 72
            theGrammar.addReservedWord("BEGIN");
73
            theGrammar.addReservedWord("EXCEPT");
41 74
            theGrammar.addReservedWord("END");
42 75
            theGrammar.addReservedWord("IF");
43 76
            theGrammar.addReservedWord("THEN");
......
45 78
            theGrammar.addReservedWord("WHILE");
46 79
            theGrammar.addReservedWord("CASE");
47 80
            theGrammar.addReservedWord("WHEN");
48
            theGrammar.addReservedWord("DEF");
81
            theGrammar.addReservedWord("FOR");
82
            theGrammar.addReservedWord("CREATE");
83
            theGrammar.addReservedWord("FUNCTION");
84
            theGrammar.addReservedWord("PROCEDURE");
85
            theGrammar.addReservedWord("AS");
49 86
            theGrammar.addReservedWord("MATCH");
50 87
            theGrammar.addReservedWord("CAST");
51
            theGrammar.addReservedWord("TRY");
52
            theGrammar.addReservedWord("EXCEPT");
88
            theGrammar.addReservedWord("SET");
89
            theGrammar.addReservedWord("TO");
90
            theGrammar.addReservedWord("$$"); // ???? Asi van las funciones
53 91
            
54
/*
55
            
56
BEGIN
57
  SET x = 0; 
58
  FOR n in FETCH GEOMETRY FROM STORE 'view','points':  
59
    IF ST_Intersects(n,GEOMETRY) THEN
60
      SET x = x+1
61
EXCEPT
62
    SET x = -1
63
END WITH VALUE x
64
            
65
*/            
66
            
67
            
68 92
            stmt = theGrammar.createStatement("BLOCK");
69 93
            stmt.addRule(stmt.require_any_token("BEGIN"));
70 94
            stmt.addRule(stmt.require_expressions("VALUES", ";"));
71
//            stmt.addRule(stmt.optional_any_token("EXCEPT")
72
//                    .addRuleOnTrue(stmt.require_expression("EXCEPT"))
73
//            );
95
            stmt.addRule(stmt.optional_any_token("EXCEPT")
96
                    .addRuleOnTrue(stmt.require_expressions("EXCEPT", ";"))
97
            );
74 98
            stmt.addRule(stmt.require_any_token("END"));
75
//            stmt.addRule(stmt.optional_any_token("WITH")
76
//                    .addRuleOnTrue(stmt.require_any_token("VALUE"))
77
//                    .addRuleOnTrue(stmt.require_expression("VALUE"))
78
//            );
79
            stmt.code(
80
                    CodeBlockFunction.NAME, 
81
//                    stmt.args_names("EXCEPT","VALUE"),
82
                    stmt.args_expand("VALUES")
83
            );
99
            stmt.builder(new BeginStatementBuilder("VALUES","EXCEPT"));
84 100
            theGrammar.addStatement(stmt);
85 101

  
86 102
            stmt = theGrammar.createStatement("IF");
......
163 179
            theGrammar.addStatement(stmt);
164 180
            
165 181
            stmt = theGrammar.createStatement("USERFUNCTION");
166
            stmt.addRule(stmt.require_any_token("DEF", "CREATE"));
167
            stmt.addRule(stmt.optional_any_token("FUNCTION"));
182
            stmt.addRule(stmt.require_any_token("CREATE"));
183
            stmt.addRule(stmt.optional_any_token("FUNCTION", "PROCEDURE"));
168 184
            stmt.addRule(stmt.require_identifier("FUNCTION_NAME"));
169
            stmt.addRule(stmt.require_any_token("("));
185
            stmt.addRule(stmt.optional_any_token("("));
170 186
            stmt.addRule(stmt.optional_identifiers("PARAM_NAMES", ","));
171
            stmt.addRule(stmt.require_any_token(")"));
172
            stmt.addRule(stmt.optional_any_token(":"));
187
            stmt.addRule(stmt.optional_any_token(")"));
188
            stmt.addRule(stmt.require_any_token("AS"));
189
            stmt.addRule(stmt.optional_any_token("$$","BEGIN"));
173 190
            stmt.addRule(stmt.require_expressions("BODY", ";"));
174
            stmt.addRule(stmt.require_any_token("END"));
175
            stmt.addRule(stmt.optional_any_token("FUNCTION"));
191
            stmt.addRule(stmt.require_any_token("$$", "END"));
192
            stmt.addRule(stmt.optional_any_token("FUNCTION", "PROCEDURE"));
176 193
            stmt.code(
177 194
                    CreateFnFunction.NAME,
178 195
                    stmt.args_names("FUNCTION_NAME","PARAM_NAMES","BODY")
......
192 209
            ); 
193 210
            theGrammar.addStatement(stmt);
194 211

  
195
            stmt = theGrammar.createStatement("TRY");
196
            stmt.addRule(stmt.require_any_token("TRY"));
197
            stmt.addRule(stmt.optional_any_token(":"));
198
            stmt.addRule(stmt.require_expressions("VALUE", ";"));
199
            stmt.addRule(stmt.optional_any_token(";"));
200
            stmt.addRule(stmt.require_any_token("EXCEPT","CATH"));
201
            stmt.addRule(stmt.optional_any_token(":"));
202
            stmt.addRule(stmt.require_expressions("ONERROR", ";"));
203
            stmt.addRule(stmt.optional_any_token(";"));
204
            stmt.addRule(stmt.require_any_token("END"));
205
            stmt.addRule(stmt.optional_any_token("TRY"));
206
            stmt.code(
207
                    TryFunction.NAME,
208
                    stmt.args_names("VALUE","ONERROR")
209
            ); 
210
            theGrammar.addStatement(stmt);
212
//            stmt = theGrammar.createStatement("TRY");
213
//            stmt.addRule(stmt.require_any_token("TRY"));
214
//            stmt.addRule(stmt.optional_any_token(":"));
215
//            stmt.addRule(stmt.require_expressions("VALUE", ";"));
216
//            stmt.addRule(stmt.optional_any_token(";"));
217
//            stmt.addRule(stmt.require_any_token("EXCEPT","CATH"));
218
//            stmt.addRule(stmt.optional_any_token(":"));
219
//            stmt.addRule(stmt.require_expressions("ONERROR", ";"));
220
//            stmt.addRule(stmt.optional_any_token(";"));
221
//            stmt.addRule(stmt.require_any_token("END"));
222
//            stmt.addRule(stmt.optional_any_token("TRY"));
223
//            stmt.code(
224
//                    TryFunction.NAME,
225
//                    stmt.args_names("VALUE","ONERROR")
226
//            ); 
227
//            theGrammar.addStatement(stmt);
211 228

  
212 229
            stmt = theGrammar.createStatement("LET");
213 230
            stmt.addRule(stmt.require_any_token("LET", "SET"));
214 231
            stmt.addRule(stmt.require_identifier("NAME"));
215
            stmt.addRule(stmt.require_any_token("="));
232
            stmt.addRule(stmt.optional_any_token("=","TO"));
216 233
            stmt.addRule(stmt.require_expression("VALUE"));
217 234
            stmt.code(
218 235
                    LetFunction.NAME, 
......
220 237
            ); 
221 238
            theGrammar.addStatement(stmt);
222 239

  
240
            stmt = theGrammar.createStatement("ARRAY");
241
            stmt.addRule(stmt.require_any_token("ARRAY"));
242
            stmt.addRule(stmt.require_any_token("["));
243
            stmt.addRule(stmt.require_expressions("VALUES",","));
244
            stmt.addRule(stmt.require_any_token("]"));
245
            stmt.code(
246
                    FUNCTION_LIST, 
247
                    stmt.args_expand("VALUES")
248
            ); 
249
            theGrammar.addStatement(stmt);
250

  
223 251
            stmt = theGrammar.createStatement("CAST");
224 252
            stmt.addRule(stmt.require_any_token("CAST"));
225 253
            stmt.addRule(stmt.optional_any_token("(")

Also available in: Unified diff