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 @ 44858

History | View | Annotate | Download (17.9 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("CREATE");
87
            theGrammar.addReservedWord("FUNCTION");
88
            theGrammar.addReservedWord("PROCEDURE");
89
            theGrammar.addReservedWord("AS");
90
            theGrammar.addReservedWord("MATCH");
91
            theGrammar.addReservedWord("CAST");
92
            theGrammar.addReservedWord("SET");
93
            theGrammar.addReservedWord("TO");
94
            theGrammar.addReservedWord("FROM");
95
            theGrammar.addReservedWord("$$"); // ???? Asi van las funciones
96
            
97
            stmt = theGrammar.createStatement("BLOCK");
98
            stmt.addRule(stmt.require_any_token("BEGIN"));
99
            stmt.addRule(stmt.require_expressions(";").capture_as("VALUES"));
100
            stmt.addRule(stmt.optional_any_token("EXCEPT")
101
                    .addRuleOnTrue(stmt.require_expressions(";").capture_as("EXCEPT"))
102
            );
103
            stmt.addRule(stmt.require_any_token("END"));
104
            stmt.builder(new BeginStatementBuilder("VALUES","EXCEPT"));
105
            theGrammar.addStatement(stmt);
106

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

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

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

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

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

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

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

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

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

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

    
317

    
318

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

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

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

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

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

    
365
            this.grammar = theGrammar;
366

    
367

    
368
        }
369
        return grammar;
370
    }
371
    
372
}