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

History | View | Annotate | Download (17.1 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

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

    
37
    private Grammar grammar;
38

    
39
    private class BeginStatementBuilder extends StatementBuilderBase {
40

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

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

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

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

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

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

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

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

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

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

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

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

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

    
316

    
317

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

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

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

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

    
349
            this.grammar = theGrammar;
350

    
351

    
352
        }
353
        return grammar;
354
    }
355
    
356
}