Statistics
| Revision:

svn-gvsig-desktop / 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 @ 44924

History | View | Annotate | Download (18.5 KB)

1
package org.gvsig.expressionevaluator.impl.grammars;
2

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

    
32
/**
33
 *
34
 * @author jjdelcerro
35
 */
36
public class BasicGrammarFactory extends AbstractGrammarFactory {
37

    
38
    private Grammar grammar;
39

    
40
    private class BeginStatementBuilder extends StatementBuilderBase {
41

    
42
        private final String blockID;
43
        private final String exceptID;
44

    
45
        public BeginStatementBuilder(String blockID, String exceptID) {
46
            super(CodeBlockFunction.NAME, new ArgsBuilderFromNames(blockID));
47
            this.blockID = blockID;
48
            this.exceptID = exceptID;
49
        }
50

    
51
        @Override
52
        public Code build(StatementContext context) {
53
            Callable code = (Callable) super.build(context);
54
            Code exceptCode = context.getCode(this.exceptID);
55
            if( exceptCode==null ) {
56
                return code;
57
            }
58
            BaseCodes args = (BaseCodes) code.parameters();
59
            args.add(exceptCode);
60
            code = context.getCodeBuilder().function(CodeBlockWithExceptFunction.NAME, args);
61
            return code;
62
        }
63
        
64
    }
65
    public BasicGrammarFactory() {
66
        super("Basic", true);
67
    }
68
    
69
    @Override
70
    public Grammar create(Object... parameters) {
71
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
72
        if( this.grammar==null ) {
73
            Grammar theGrammar = manager.createGrammar(this.getName());
74
            Statement stmt;
75
        
76
            theGrammar.addReservedWord("BEGIN");
77
            theGrammar.addReservedWord("EXCEPT");
78
            theGrammar.addReservedWord("END");
79
            theGrammar.addReservedWord("IF");
80
            theGrammar.addReservedWord("THEN");
81
            theGrammar.addReservedWord("ELSE");
82
            theGrammar.addReservedWord("WHILE");
83
            theGrammar.addReservedWord("CASE");
84
            theGrammar.addReservedWord("WHEN");
85
            theGrammar.addReservedWord("FOR");
86
            theGrammar.addReservedWord("FOREACH");
87
            theGrammar.addReservedWord("CREATE");
88
            theGrammar.addReservedWord("FUNCTION");
89
            theGrammar.addReservedWord("PROCEDURE");
90
            theGrammar.addReservedWord("AS");
91
            theGrammar.addReservedWord("MATCH");
92
            theGrammar.addReservedWord("CAST");
93
            theGrammar.addReservedWord("SET");
94
            theGrammar.addReservedWord("TO");
95
            theGrammar.addReservedWord("FROM");
96
            theGrammar.addReservedWord("$$"); // ???? Asi van las funciones
97
            theGrammar.addReservedWord("PASS");
98
            
99
            stmt = theGrammar.createStatement("BLOCK");
100
            stmt.addRule(stmt.require_any_token("BEGIN"));
101
            stmt.addRule(stmt.require_expressions(";").capture_as("VALUES"));
102
            stmt.addRule(stmt.optional_any_token("EXCEPT")
103
                    .addRuleOnTrue(stmt.require_expressions(";").capture_as("EXCEPT"))
104
            );
105
            stmt.addRule(stmt.require_any_token("END"));
106
            stmt.builder(new BeginStatementBuilder("VALUES","EXCEPT"));
107
            theGrammar.addStatement(stmt);
108

    
109
            stmt = theGrammar.createStatement("IF");
110
            stmt.addRule(stmt.require_any_token("IF"));
111
            stmt.addRule(stmt.require_expression().capture_as("CONDITION"));
112
            stmt.addRule(stmt.require_any_token("THEN", ":"));
113
            stmt.addRule(stmt.require_expressions(";").capture_as("ONTRUE"));
114
            stmt.addRule(stmt.optional_any_token("ELSE")
115
                    .addRuleOnTrue(stmt.optional_any_token(":"))
116
                    .addRuleOnTrue(stmt.require_expressions(";").capture_as("ONFALSE"))
117
            );
118
            stmt.addRule(stmt.require_any_token("END"));
119
            stmt.addRule(stmt.optional_any_token("IF"));
120
            stmt.code(
121
                    IIFFunction.NAME,
122
                    stmt.args_names("CONDITION","ONTRUE","ONFALSE")
123
            ); 
124
            theGrammar.addStatement(stmt);
125

    
126
            stmt = theGrammar.createStatement("WHILE");
127
            stmt.addRule(stmt.require_any_token("WHILE"));
128
            stmt.addRule(stmt.require_expression().capture_as("CONDITION"));
129
            stmt.addRule(stmt.require_any_token("BEGIN", ":"));
130
            stmt.addRule(stmt.require_expressions(";").capture_as("BODY"));
131
            stmt.addRule(stmt.require_any_token("END"));
132
            stmt.addRule(stmt.optional_any_token("WHILE"));
133
            stmt.code(
134
                    WhileFunction.NAME,
135
                    stmt.args_names("CONDITION","BODY")
136
            ); 
137
            theGrammar.addStatement(stmt);
138

    
139
//            stmt = theGrammar.createStatement("FOR");
140
//            stmt.addRule(stmt.require_any_token("FOR"));
141
//            stmt.addRule(stmt.require_expression("INIT"));
142
//            stmt.addRule(stmt.require_any_token(";"));
143
//            stmt.addRule(stmt.require_expression("CONDITION"));
144
//            stmt.addRule(stmt.require_any_token(";"));
145
//            stmt.addRule(stmt.require_expression("STEP"));
146
//            stmt.addRule(stmt.require_any_token("BEGIN", ":"));
147
//            stmt.addRule(stmt.require_expression("BODY"));
148
//            stmt.addRule(stmt.require_any_token("END"));
149
//            stmt.addRule(stmt.optional_any_token("FOR"));
150
//            stmt.code(
151
//                    ForFunction.NAME,
152
//                    stmt.args_names("INIT","CONDITION","STEP","BODY")
153
//            ); 
154
//            theGrammar.addStatement(stmt);
155

    
156
            stmt = theGrammar.createStatement("FOREACH");
157
            stmt.addRule(stmt.require_any_token("FOR","FOREACH"));
158
            stmt.addRule(stmt.require_identifier().capture_as("VAR"));
159
            stmt.addRule(stmt.require_any_token("IN"));
160
            stmt.addRule(stmt.require_expression().capture_as("ITERABLE"));
161
            stmt.addRule(stmt.require_any_token("BEGIN", ":"));
162
            stmt.addRule(stmt.require_expressions(";").capture_as("BODY"));
163
            stmt.addRule(stmt.require_any_token("END"));
164
            stmt.addRule(stmt.optional_any_token("FOR"));
165
            stmt.code(
166
                    ForEachFunction.NAME,
167
                    stmt.args_names("VAR","ITERABLE","BODY")
168
            ); 
169
            theGrammar.addStatement(stmt);
170

    
171
            stmt = theGrammar.createStatement("CASE");
172
            stmt.addRule(stmt.require_any_token("CASE"));
173
            stmt.addRule(
174
                stmt.repeat_until_any_tokens("END","ELSE")
175
                    .addRule(stmt.require_any_token("WHEN"))
176
                    .addRule(stmt.require_expression().capture_as("CONDITION#"))
177
                    .addRule(stmt.require_any_token("THEN",":"))
178
                    .addRule(stmt.require_expressions(";").capture_as("ONTRUE#"))
179
            );
180
            stmt.addRule(stmt.optional_any_token("ELSE")
181
                    .addRuleOnTrue(stmt.optional_any_token(":"))
182
                    .addRuleOnTrue(stmt.require_expressions(";").capture_as("ELSE"))
183
            );
184
            stmt.addRule(stmt.require_any_token("END"));
185
            stmt.addRule(stmt.optional_any_token("CASE"));
186
            stmt.code(
187
                    CaseFunction.NAME,
188
                    stmt.args_names("CONDITION#","ONTRUE#","ELSE")
189
            ); 
190
            theGrammar.addStatement(stmt);
191
            
192
            stmt = theGrammar.createStatement("USERFUNCTION");
193
            stmt.addRule(stmt.require_any_token("CREATE"));
194
            stmt.addRule(stmt.optional_any_token("FUNCTION", "PROCEDURE"));
195
            stmt.addRule(stmt.require_identifier().capture_as("FUNCTION_NAME"));
196
            stmt.addRule(stmt.optional_any_token("("));
197
            stmt.addRule(stmt.optional_identifiers(",").capture_as("PARAMETERS"));
198
            stmt.addRule(stmt.optional_any_token(")"));
199
            stmt.addRule(stmt.require_any_token("AS"));
200
            stmt.addRule(stmt.optional_any_token("$$","BEGIN")
201
                    .addRuleOnTrue(stmt.require_expressions(";").capture_as("BODY"))
202
                    .addRuleOnTrue(stmt.require_any_token("$$", "END"))
203
                    .addRuleOnTrue(stmt.optional_any_token("FUNCTION", "PROCEDURE"))
204
                    .addRuleOnFalse(stmt.optional_literal_string().capture_as("SCRIPT_PATH")
205
                        .addRuleOnTrue(stmt.require_any_token(","))
206
                        .addRuleOnTrue(stmt.require_literal_string().capture_as("SCRIPT_FUNCTION"))
207
                        .addRuleOnTrue(stmt.optional_any_token("LANGUAGE")
208
                                .addRuleOnTrue(stmt.require_literal_string().capture_as("LANGUAGE"))
209
                        )
210
                    )
211
            );
212
                    
213
//            stmt.addRule(stmt.require_expressions("BODY", ";"));
214
//            stmt.addRule(stmt.require_any_token("$$", "END"));
215
//            stmt.addRule(stmt.optional_any_token("FUNCTION", "PROCEDURE"));
216
            stmt.code(
217
                    CreateFnFunction.NAME,
218
                    stmt.fixed_args_names("FUNCTION_NAME","PARAMETERS","BODY", "SCRIPT_PATH", "SCRIPT_FUNCTION", "LANGUAGE")
219
            ); 
220
            theGrammar.addStatement(stmt);
221

    
222
            stmt = theGrammar.createStatement("RETURN");
223
            stmt.addRule(stmt.require_any_token("RETURN"));
224
            stmt.addRule(stmt.optional_any_token(";")
225
                    .addRuleOnTrue(stmt.set_expression("VALUES", null))
226
                    .addRuleOnFalse(stmt.require_expression().capture_as("VALUES"))
227
                    .addRuleOnFalse(stmt.require_any_token(";"))
228
            );
229
            stmt.code(
230
                    ReturnFunction.NAME,
231
                    stmt.args_expand("VALUES")
232
            ); 
233
            theGrammar.addStatement(stmt);
234

    
235
//            stmt = theGrammar.createStatement("TRY");
236
//            stmt.addRule(stmt.require_any_token("TRY"));
237
//            stmt.addRule(stmt.optional_any_token(":"));
238
//            stmt.addRule(stmt.require_expressions("VALUE", ";"));
239
//            stmt.addRule(stmt.optional_any_token(";"));
240
//            stmt.addRule(stmt.require_any_token("EXCEPT","CATH"));
241
//            stmt.addRule(stmt.optional_any_token(":"));
242
//            stmt.addRule(stmt.require_expressions("ONERROR", ";"));
243
//            stmt.addRule(stmt.optional_any_token(";"));
244
//            stmt.addRule(stmt.require_any_token("END"));
245
//            stmt.addRule(stmt.optional_any_token("TRY"));
246
//            stmt.code(
247
//                    TryFunction.NAME,
248
//                    stmt.args_names("VALUE","ONERROR")
249
//            ); 
250
//            theGrammar.addStatement(stmt);
251

    
252
            stmt = theGrammar.createStatement("LET");
253
            stmt.addRule(stmt.require_any_token("LET", "SET"));
254
            stmt.addRule(stmt.require_identifier().capture_as("NAME"));
255
            stmt.addRule(stmt.optional_any_token("=","TO"));
256
            stmt.addRule(stmt.require_expression().capture_as("VALUE"));
257
            stmt.code(
258
                    LetFunction.NAME, 
259
                    stmt.args_names("NAME", "VALUE")
260
            ); 
261
            theGrammar.addStatement(stmt);
262

    
263
            stmt = theGrammar.createStatement("ARRAY");
264
            stmt.addRule(stmt.require_any_token("ARRAY"));
265
            stmt.addRule(stmt.require_any_token("["));
266
            stmt.addRule(stmt.require_expressions(",").capture_as("VALUES"));
267
            stmt.addRule(stmt.require_any_token("]"));
268
            stmt.code(
269
                    FUNCTION_LIST, 
270
                    stmt.args_expand("VALUES")
271
            ); 
272
            theGrammar.addStatement(stmt);
273

    
274
            stmt = theGrammar.createStatement("CAST");
275
            stmt.addRule(stmt.require_any_token("CAST"));
276
            stmt.addRule(stmt.optional_any_token("(")
277
                .addRuleOnTrue(stmt.require_expression().capture_as("VALUE"))
278
                .addRuleOnTrue(stmt.require_any_token("AS"))
279
                .addRuleOnTrue(stmt.require_identifier().capture_as("TYPE"))
280
                .addRuleOnTrue(stmt.require_any_token(")"))                    
281
                .addRuleOnFalse(stmt.require_expression().capture_as("VALUE"))
282
                .addRuleOnFalse(stmt.require_any_token("AS"))
283
                .addRuleOnFalse(stmt.require_identifier().capture_as("TYPE"))
284
            );
285
            stmt.code(
286
                    FUNCTION_CAST,
287
                    stmt.args_names("VALUE","TYPE")
288
            );
289
            theGrammar.addStatement(stmt);
290
            
291
            stmt = theGrammar.createStatement("MATCH");
292
            stmt.addRule(stmt.require_any_token("MATCH"));
293
            stmt.addRule(stmt.optional_any_token("(")
294
                .addRuleOnTrue(stmt.require_expression().capture_as("VALUE"))
295
                .addRuleOnTrue(stmt.require_any_token(","))
296
                .addRuleOnTrue(stmt.require_expression().capture_as("PATTERN"))
297
                .addRuleOnTrue(stmt.require_any_token(")"))                    
298
                .addRuleOnFalse(stmt.require_expression().capture_as("VALUE"))
299
                .addRuleOnFalse(stmt.optional_any_token(","))
300
                .addRuleOnFalse(stmt.require_expression().capture_as("PATTERN"))
301
            );
302
            stmt.code(
303
                    OPERATOR_REGEXP,
304
                    stmt.args_names("VALUE","PATTERN")
305
            );
306
            theGrammar.addStatement(stmt);
307
            
308
//            stmt = theGrammar.createStatement("FETCHFIRST");
309
//            stmt.addRule(stmt.require_token("FETCH"));
310
//            stmt.addRule(stmt.require_token("FIRST"));
311
//            stmt.addRule(stmt.require_expression("VALUE"));
312
//            stmt.addRule(stmt.optional_token("FROM"));
313
//            stmt.addRule(stmt.require_expression("FROM"));
314
//            stmt.addRule(stmt.optional_token("WHERE").addRuleOnTrue(stmt.require_expression("WHERE")));
315
//            stmt.addRule(stmt.optional_token("ORDER","BY").addRuleOnTrue(stmt.require_expression("ORDER")));
316
//            stmt.code("FETCH_FIRST","VALUE","FROM","WHERE");
317
//            theGrammar.addStatement(stmt);
318

    
319

    
320

    
321
            stmt = theGrammar.createStatement("DATE");
322
            stmt.addRule(stmt.require_any_token("DATE"));
323
            stmt.addRule(stmt.require_expression().capture_as("EXP"));
324
            stmt.code(FUNCTION_DATE,stmt.args_names("EXP"));
325
            theGrammar.addStatement(stmt);
326

    
327
            stmt = theGrammar.createStatement("TIME");
328
            stmt.addRule(stmt.require_any_token("TIME"));
329
            stmt.addRule(stmt.require_expression().capture_as("EXP"));
330
            stmt.code(FUNCTION_TIME,stmt.args_names("EXP"));
331
            theGrammar.addStatement(stmt);
332

    
333
            stmt = theGrammar.createStatement("TIMESTAMP");
334
            stmt.addRule(stmt.require_any_token("TIMESTAMP"));
335
            stmt.addRule(stmt.require_expression().capture_as("EXP"));
336
            stmt.code(FUNCTION_TIMESTAMP,stmt.args_names("EXP"));
337
            theGrammar.addStatement(stmt);
338

    
339
            stmt = theGrammar.createStatement("EXTRACT");
340
            stmt.addRule(stmt.require_any_token("EXTRACT"));
341
            stmt.addRule(stmt.require_any_token("("));
342
            stmt.addRule(stmt.require_any_token("CENTURY","DAY","DECADE",
343
                    "DOW","DOY","HOUR","ISODOW","ISOYEAR","MICROSECONDS",
344
                    "MILLENNIUM","MILLUSECONDS","MINUTE","MONTH","QUARTER",
345
                    "SECOND","WEEK","YEAR").capture_as("FIELD"));
346
            stmt.addRule(stmt.require_any_token("FROM"));
347
            stmt.addRule(stmt.require_expression().capture_as("EXP"));
348
            stmt.addRule(stmt.require_any_token(")"));
349
            stmt.code(FUNCTION_EXTRACT,stmt.args_names("FIELD", "EXP"));
350
            theGrammar.addStatement(stmt);
351

    
352
            stmt = theGrammar.createStatement("MAP");
353
            stmt.addRule(stmt.require_any_token("MAP"));
354
            stmt.addRule(stmt.require_any_token("("));
355
            stmt.addRule(stmt.repeat()
356
                    .addRule(stmt.require_identifier().capture_as("NAME#"))
357
                    .addRule(stmt.require_any_token("="))
358
                    .addRule(stmt.require_expression().capture_as("VALUE#"))
359
                    .addRule(stmt.optional_any_token(",")
360
                            .addRuleOnFalse(stmt.break_loop())
361
                    )
362
            );      
363
            stmt.addRule(stmt.require_any_token(")"));
364
            stmt.code(FUNCTION_MAP,stmt.args_names("NAME#", "VALUE#"));
365
            theGrammar.addStatement(stmt);
366

    
367
            this.grammar = theGrammar;
368

    
369
            stmt = theGrammar.createStatement("PASS");
370
            stmt.addRule(stmt.require_any_token("PASS"));
371
            stmt.addRule(stmt.optional_any_token("(")
372
                .addRuleOnTrue(stmt.require_expressions(",").capture_as("ARGS#"))
373
                .addRuleOnTrue(stmt.require_any_token(")"))                    
374
            );
375
            stmt.code(
376
                    "PASS",
377
                    stmt.args_names("ARGS#")
378
            );
379
            theGrammar.addStatement(stmt);
380

    
381
        }
382
        return grammar;
383
    }
384
    
385
}