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

View differences:

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