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

History | View | Annotate | Download (17.1 KB)

1 44139 jjdelcerro
package org.gvsig.expressionevaluator.impl.grammars;
2
3 44384 jjdelcerro
import org.gvsig.expressionevaluator.Code;
4
import org.gvsig.expressionevaluator.Code.Caller;
5 44198 jjdelcerro
import static org.gvsig.expressionevaluator.ExpressionBuilder.FUNCTION_CAST;
6 44750 jjdelcerro
import static org.gvsig.expressionevaluator.ExpressionBuilder.FUNCTION_DATE;
7
import static org.gvsig.expressionevaluator.ExpressionBuilder.FUNCTION_EXTRACT;
8 44384 jjdelcerro
import static org.gvsig.expressionevaluator.ExpressionBuilder.FUNCTION_LIST;
9 44750 jjdelcerro
import static org.gvsig.expressionevaluator.ExpressionBuilder.FUNCTION_TIME;
10
import static org.gvsig.expressionevaluator.ExpressionBuilder.FUNCTION_TIMESTAMP;
11 44207 jjdelcerro
import static org.gvsig.expressionevaluator.ExpressionBuilder.OPERATOR_REGEXP;
12 44139 jjdelcerro
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
13
import org.gvsig.expressionevaluator.ExpressionEvaluatorManager;
14
import org.gvsig.expressionevaluator.Grammar;
15
import org.gvsig.expressionevaluator.Statement;
16 44384 jjdelcerro
import org.gvsig.expressionevaluator.Statement.StatementContext;
17
import org.gvsig.expressionevaluator.impl.DefaultCodeBuilder.BaseCodes;
18
import org.gvsig.expressionevaluator.impl.DefaultStatement.StatementBuilderBase;
19
import org.gvsig.expressionevaluator.impl.DefaultStatement.ArgsBuilderFromNames;
20 44139 jjdelcerro
import org.gvsig.expressionevaluator.impl.function.programming.IIFFunction;
21
import org.gvsig.expressionevaluator.impl.function.programming.LetFunction;
22
import org.gvsig.expressionevaluator.impl.function.programming.CaseFunction;
23
import org.gvsig.expressionevaluator.impl.function.programming.CodeBlockFunction;
24 44384 jjdelcerro
import org.gvsig.expressionevaluator.impl.function.programming.CodeBlockWithExceptFunction;
25 44139 jjdelcerro
import org.gvsig.expressionevaluator.impl.function.programming.CreateFnFunction;
26
import org.gvsig.expressionevaluator.impl.function.programming.ForEachFunction;
27
import org.gvsig.expressionevaluator.impl.function.programming.ReturnFunction;
28
import org.gvsig.expressionevaluator.impl.function.programming.WhileFunction;
29
import org.gvsig.expressionevaluator.spi.AbstractGrammarFactory;
30
31
/**
32
 *
33
 * @author jjdelcerro
34
 */
35
public class BasicGrammarFactory extends AbstractGrammarFactory {
36
37
    private Grammar grammar;
38
39 44384 jjdelcerro
    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
            Caller code = (Caller) 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 44139 jjdelcerro
    public BasicGrammarFactory() {
65
        super("Basic", true);
66
    }
67
68
    @Override
69 44389 jjdelcerro
    public Grammar create(Object... parameters) {
70 44139 jjdelcerro
        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 44384 jjdelcerro
            theGrammar.addReservedWord("EXCEPT");
77 44139 jjdelcerro
            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 44384 jjdelcerro
            theGrammar.addReservedWord("FOR");
85
            theGrammar.addReservedWord("CREATE");
86
            theGrammar.addReservedWord("FUNCTION");
87
            theGrammar.addReservedWord("PROCEDURE");
88
            theGrammar.addReservedWord("AS");
89 44139 jjdelcerro
            theGrammar.addReservedWord("MATCH");
90
            theGrammar.addReservedWord("CAST");
91 44384 jjdelcerro
            theGrammar.addReservedWord("SET");
92
            theGrammar.addReservedWord("TO");
93 44750 jjdelcerro
            theGrammar.addReservedWord("FROM");
94 44384 jjdelcerro
            theGrammar.addReservedWord("$$"); // ???? Asi van las funciones
95 44139 jjdelcerro
96
            stmt = theGrammar.createStatement("BLOCK");
97 44144 jjdelcerro
            stmt.addRule(stmt.require_any_token("BEGIN"));
98 44750 jjdelcerro
            stmt.addRule(stmt.require_expressions(";").capture_as("VALUES"));
99 44384 jjdelcerro
            stmt.addRule(stmt.optional_any_token("EXCEPT")
100 44750 jjdelcerro
                    .addRuleOnTrue(stmt.require_expressions(";").capture_as("EXCEPT"))
101 44384 jjdelcerro
            );
102 44144 jjdelcerro
            stmt.addRule(stmt.require_any_token("END"));
103 44384 jjdelcerro
            stmt.builder(new BeginStatementBuilder("VALUES","EXCEPT"));
104 44139 jjdelcerro
            theGrammar.addStatement(stmt);
105
106
            stmt = theGrammar.createStatement("IF");
107 44144 jjdelcerro
            stmt.addRule(stmt.require_any_token("IF"));
108 44750 jjdelcerro
            stmt.addRule(stmt.require_expression().capture_as("CONDITION"));
109 44379 jjdelcerro
            stmt.addRule(stmt.require_any_token("THEN", ":"));
110 44750 jjdelcerro
            stmt.addRule(stmt.require_expressions(";").capture_as("ONTRUE"));
111 44144 jjdelcerro
            stmt.addRule(stmt.optional_any_token("ELSE")
112
                    .addRuleOnTrue(stmt.optional_any_token(":"))
113 44750 jjdelcerro
                    .addRuleOnTrue(stmt.require_expressions(";").capture_as("ONFALSE"))
114 44139 jjdelcerro
            );
115 44379 jjdelcerro
            stmt.addRule(stmt.require_any_token("END"));
116
            stmt.addRule(stmt.optional_any_token("IF"));
117 44139 jjdelcerro
            stmt.code(
118
                    IIFFunction.NAME,
119
                    stmt.args_names("CONDITION","ONTRUE","ONFALSE")
120
            );
121
            theGrammar.addStatement(stmt);
122
123
            stmt = theGrammar.createStatement("WHILE");
124 44144 jjdelcerro
            stmt.addRule(stmt.require_any_token("WHILE"));
125 44750 jjdelcerro
            stmt.addRule(stmt.require_expression().capture_as("CONDITION"));
126 44379 jjdelcerro
            stmt.addRule(stmt.require_any_token("BEGIN", ":"));
127 44750 jjdelcerro
            stmt.addRule(stmt.require_expressions(";").capture_as("BODY"));
128 44379 jjdelcerro
            stmt.addRule(stmt.require_any_token("END"));
129
            stmt.addRule(stmt.optional_any_token("WHILE"));
130 44139 jjdelcerro
            stmt.code(
131
                    WhileFunction.NAME,
132
                    stmt.args_names("CONDITION","BODY")
133
            );
134
            theGrammar.addStatement(stmt);
135
136
//            stmt = theGrammar.createStatement("FOR");
137 44738 jjdelcerro
//            stmt.addRule(stmt.require_any_token("FOR"));
138 44139 jjdelcerro
//            stmt.addRule(stmt.require_expression("INIT"));
139 44738 jjdelcerro
//            stmt.addRule(stmt.require_any_token(";"));
140 44139 jjdelcerro
//            stmt.addRule(stmt.require_expression("CONDITION"));
141 44738 jjdelcerro
//            stmt.addRule(stmt.require_any_token(";"));
142 44139 jjdelcerro
//            stmt.addRule(stmt.require_expression("STEP"));
143 44738 jjdelcerro
//            stmt.addRule(stmt.require_any_token("BEGIN", ":"));
144 44139 jjdelcerro
//            stmt.addRule(stmt.require_expression("BODY"));
145 44738 jjdelcerro
//            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 44139 jjdelcerro
//            theGrammar.addStatement(stmt);
152
153
            stmt = theGrammar.createStatement("FOREACH");
154 44144 jjdelcerro
            stmt.addRule(stmt.require_any_token("FOR"));
155 44750 jjdelcerro
            stmt.addRule(stmt.require_identifier().capture_as("VAR"));
156 44144 jjdelcerro
            stmt.addRule(stmt.require_any_token("IN"));
157 44750 jjdelcerro
            stmt.addRule(stmt.require_expression().capture_as("ITERABLE"));
158 44379 jjdelcerro
            stmt.addRule(stmt.require_any_token("BEGIN", ":"));
159 44750 jjdelcerro
            stmt.addRule(stmt.require_expressions(";").capture_as("BODY"));
160 44379 jjdelcerro
            stmt.addRule(stmt.require_any_token("END"));
161
            stmt.addRule(stmt.optional_any_token("FOR"));
162 44139 jjdelcerro
            stmt.code(
163
                    ForEachFunction.NAME,
164
                    stmt.args_names("VAR","ITERABLE","BODY")
165
            );
166
            theGrammar.addStatement(stmt);
167
168
            stmt = theGrammar.createStatement("CASE");
169 44144 jjdelcerro
            stmt.addRule(stmt.require_any_token("CASE"));
170 44139 jjdelcerro
            stmt.addRule(
171 44144 jjdelcerro
                stmt.repeat_until_any_tokens("END","ELSE")
172
                    .addRule(stmt.require_any_token("WHEN"))
173 44750 jjdelcerro
                    .addRule(stmt.require_expressions(";").capture_as("CONDITION#"))
174 44379 jjdelcerro
                    .addRule(stmt.require_any_token("THEN",":"))
175 44750 jjdelcerro
                    .addRule(stmt.require_expressions(";").capture_as("ONTRUE#"))
176 44139 jjdelcerro
            );
177 44144 jjdelcerro
            stmt.addRule(stmt.optional_any_token("ELSE")
178
                    .addRuleOnTrue(stmt.optional_any_token(":"))
179 44750 jjdelcerro
                    .addRuleOnTrue(stmt.require_expressions(";").capture_as("ELSE"))
180 44139 jjdelcerro
            );
181 44379 jjdelcerro
            stmt.addRule(stmt.require_any_token("END"));
182
            stmt.addRule(stmt.optional_any_token("CASE"));
183 44139 jjdelcerro
            stmt.code(
184
                    CaseFunction.NAME,
185
                    stmt.args_names("CONDITION#","ONTRUE#","ELSE")
186
            );
187
            theGrammar.addStatement(stmt);
188
189
            stmt = theGrammar.createStatement("USERFUNCTION");
190 44384 jjdelcerro
            stmt.addRule(stmt.require_any_token("CREATE"));
191
            stmt.addRule(stmt.optional_any_token("FUNCTION", "PROCEDURE"));
192 44750 jjdelcerro
            stmt.addRule(stmt.require_identifier().capture_as("FUNCTION_NAME"));
193 44384 jjdelcerro
            stmt.addRule(stmt.optional_any_token("("));
194 44750 jjdelcerro
            stmt.addRule(stmt.optional_identifiers(",").capture_as("PARAMETERS"));
195 44384 jjdelcerro
            stmt.addRule(stmt.optional_any_token(")"));
196
            stmt.addRule(stmt.require_any_token("AS"));
197 44533 jjdelcerro
            stmt.addRule(stmt.optional_any_token("$$","BEGIN")
198 44750 jjdelcerro
                    .addRuleOnTrue(stmt.require_expressions(";").capture_as("BODY"))
199 44533 jjdelcerro
                    .addRuleOnTrue(stmt.require_any_token("$$", "END"))
200
                    .addRuleOnTrue(stmt.optional_any_token("FUNCTION", "PROCEDURE"))
201 44750 jjdelcerro
                    .addRuleOnFalse(stmt.optional_literal_string().capture_as("SCRIPT_PATH")
202 44533 jjdelcerro
                        .addRuleOnTrue(stmt.require_any_token(","))
203 44750 jjdelcerro
                        .addRuleOnTrue(stmt.require_literal_string().capture_as("SCRIPT_FUNCTION"))
204 44533 jjdelcerro
                        .addRuleOnTrue(stmt.optional_any_token("LANGUAGE")
205 44750 jjdelcerro
                                .addRuleOnTrue(stmt.require_literal_string().capture_as("LANGUAGE"))
206 44533 jjdelcerro
                        )
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 44139 jjdelcerro
            stmt.code(
214
                    CreateFnFunction.NAME,
215 44750 jjdelcerro
                    stmt.fixed_args_names("FUNCTION_NAME","PARAMETERS","BODY", "SCRIPT_PATH", "SCRIPT_FUNCTION", "LANGUAGE")
216 44139 jjdelcerro
            );
217
            theGrammar.addStatement(stmt);
218
219
            stmt = theGrammar.createStatement("RETURN");
220 44144 jjdelcerro
            stmt.addRule(stmt.require_any_token("RETURN"));
221 44379 jjdelcerro
            stmt.addRule(stmt.optional_any_token(";")
222
                    .addRuleOnTrue(stmt.set_expression("VALUES", null))
223 44750 jjdelcerro
                    .addRuleOnFalse(stmt.require_expression().capture_as("VALUES"))
224 44379 jjdelcerro
                    .addRuleOnFalse(stmt.require_any_token(";"))
225
            );
226 44139 jjdelcerro
            stmt.code(
227
                    ReturnFunction.NAME,
228
                    stmt.args_expand("VALUES")
229
            );
230
            theGrammar.addStatement(stmt);
231
232 44384 jjdelcerro
//            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 44144 jjdelcerro
249 44379 jjdelcerro
            stmt = theGrammar.createStatement("LET");
250
            stmt.addRule(stmt.require_any_token("LET", "SET"));
251 44750 jjdelcerro
            stmt.addRule(stmt.require_identifier().capture_as("NAME"));
252 44384 jjdelcerro
            stmt.addRule(stmt.optional_any_token("=","TO"));
253 44750 jjdelcerro
            stmt.addRule(stmt.require_expression().capture_as("VALUE"));
254 44379 jjdelcerro
            stmt.code(
255
                    LetFunction.NAME,
256
                    stmt.args_names("NAME", "VALUE")
257
            );
258
            theGrammar.addStatement(stmt);
259
260 44384 jjdelcerro
            stmt = theGrammar.createStatement("ARRAY");
261
            stmt.addRule(stmt.require_any_token("ARRAY"));
262
            stmt.addRule(stmt.require_any_token("["));
263 44750 jjdelcerro
            stmt.addRule(stmt.require_expressions(",").capture_as("VALUES"));
264 44384 jjdelcerro
            stmt.addRule(stmt.require_any_token("]"));
265
            stmt.code(
266
                    FUNCTION_LIST,
267
                    stmt.args_expand("VALUES")
268
            );
269
            theGrammar.addStatement(stmt);
270
271 44379 jjdelcerro
            stmt = theGrammar.createStatement("CAST");
272
            stmt.addRule(stmt.require_any_token("CAST"));
273
            stmt.addRule(stmt.optional_any_token("(")
274 44750 jjdelcerro
                .addRuleOnTrue(stmt.require_expression().capture_as("VALUE"))
275 44379 jjdelcerro
                .addRuleOnTrue(stmt.require_any_token("AS"))
276 44750 jjdelcerro
                .addRuleOnTrue(stmt.require_identifier().capture_as("TYPE"))
277 44379 jjdelcerro
                .addRuleOnTrue(stmt.require_any_token(")"))
278 44750 jjdelcerro
                .addRuleOnFalse(stmt.require_expression().capture_as("VALUE"))
279 44379 jjdelcerro
                .addRuleOnFalse(stmt.require_any_token("AS"))
280 44750 jjdelcerro
                .addRuleOnFalse(stmt.require_identifier().capture_as("TYPE"))
281 44379 jjdelcerro
            );
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 44750 jjdelcerro
                .addRuleOnTrue(stmt.require_expression().capture_as("VALUE"))
292 44379 jjdelcerro
                .addRuleOnTrue(stmt.require_any_token(","))
293 44750 jjdelcerro
                .addRuleOnTrue(stmt.require_expression().capture_as("PATTERN"))
294 44379 jjdelcerro
                .addRuleOnTrue(stmt.require_any_token(")"))
295 44750 jjdelcerro
                .addRuleOnFalse(stmt.require_expression().capture_as("VALUE"))
296 44379 jjdelcerro
                .addRuleOnFalse(stmt.optional_any_token(","))
297 44750 jjdelcerro
                .addRuleOnFalse(stmt.require_expression().capture_as("PATTERN"))
298 44379 jjdelcerro
            );
299
            stmt.code(
300
                    OPERATOR_REGEXP,
301
                    stmt.args_names("VALUE","PATTERN")
302
            );
303
            theGrammar.addStatement(stmt);
304
305 44139 jjdelcerro
//            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 44750 jjdelcerro
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 44139 jjdelcerro
            this.grammar = theGrammar;
350 44750 jjdelcerro
351
352 44139 jjdelcerro
        }
353
        return grammar;
354
    }
355
356
}