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

History | View | Annotate | Download (14.8 KB)

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

    
3
import org.gvsig.expressionevaluator.Code;
4
import org.gvsig.expressionevaluator.Code.Caller;
5
import static org.gvsig.expressionevaluator.ExpressionBuilder.FUNCTION_CAST;
6
import static org.gvsig.expressionevaluator.ExpressionBuilder.FUNCTION_LIST;
7
import static org.gvsig.expressionevaluator.ExpressionBuilder.OPERATOR_REGEXP;
8
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
9
import org.gvsig.expressionevaluator.ExpressionEvaluatorManager;
10
import org.gvsig.expressionevaluator.Grammar;
11
import org.gvsig.expressionevaluator.Statement;
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;
16
import org.gvsig.expressionevaluator.impl.function.programming.IIFFunction;
17
import org.gvsig.expressionevaluator.impl.function.programming.LetFunction;
18
import org.gvsig.expressionevaluator.impl.function.programming.CaseFunction;
19
import org.gvsig.expressionevaluator.impl.function.programming.CodeBlockFunction;
20
import org.gvsig.expressionevaluator.impl.function.programming.CodeBlockWithExceptFunction;
21
import org.gvsig.expressionevaluator.impl.function.programming.CreateFnFunction;
22
import org.gvsig.expressionevaluator.impl.function.programming.ForEachFunction;
23
import org.gvsig.expressionevaluator.impl.function.programming.ForFunction;
24
import org.gvsig.expressionevaluator.impl.function.programming.ReturnFunction;
25
import org.gvsig.expressionevaluator.impl.function.programming.WhileFunction;
26
import org.gvsig.expressionevaluator.spi.AbstractGrammarFactory;
27

    
28
/**
29
 *
30
 * @author jjdelcerro
31
 */
32
public class BasicGrammarFactory extends AbstractGrammarFactory {
33

    
34
    private Grammar grammar;
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
    }
61
    public BasicGrammarFactory() {
62
        super("Basic", true);
63
    }
64
    
65
    @Override
66
    public Grammar create(Object... parameters) {
67
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
68
        if( this.grammar==null ) {
69
            Grammar theGrammar = manager.createGrammar(this.getName());
70
            Statement stmt;
71
        
72
            theGrammar.addReservedWord("BEGIN");
73
            theGrammar.addReservedWord("EXCEPT");
74
            theGrammar.addReservedWord("END");
75
            theGrammar.addReservedWord("IF");
76
            theGrammar.addReservedWord("THEN");
77
            theGrammar.addReservedWord("ELSE");
78
            theGrammar.addReservedWord("WHILE");
79
            theGrammar.addReservedWord("CASE");
80
            theGrammar.addReservedWord("WHEN");
81
            theGrammar.addReservedWord("FOR");
82
            theGrammar.addReservedWord("CREATE");
83
            theGrammar.addReservedWord("FUNCTION");
84
            theGrammar.addReservedWord("PROCEDURE");
85
            theGrammar.addReservedWord("AS");
86
            theGrammar.addReservedWord("MATCH");
87
            theGrammar.addReservedWord("CAST");
88
            theGrammar.addReservedWord("SET");
89
            theGrammar.addReservedWord("TO");
90
            theGrammar.addReservedWord("$$"); // ???? Asi van las funciones
91
            
92
            stmt = theGrammar.createStatement("BLOCK");
93
            stmt.addRule(stmt.require_any_token("BEGIN"));
94
            stmt.addRule(stmt.require_expressions("VALUES", ";"));
95
            stmt.addRule(stmt.optional_any_token("EXCEPT")
96
                    .addRuleOnTrue(stmt.require_expressions("EXCEPT", ";"))
97
            );
98
            stmt.addRule(stmt.require_any_token("END"));
99
            stmt.builder(new BeginStatementBuilder("VALUES","EXCEPT"));
100
            theGrammar.addStatement(stmt);
101

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

    
119
            stmt = theGrammar.createStatement("WHILE");
120
            stmt.addRule(stmt.require_any_token("WHILE"));
121
            stmt.addRule(stmt.require_expression("CONDITION"));
122
            stmt.addRule(stmt.require_any_token("BEGIN", ":"));
123
            stmt.addRule(stmt.require_expressions("BODY", ";"));
124
            stmt.addRule(stmt.require_any_token("END"));
125
            stmt.addRule(stmt.optional_any_token("WHILE"));
126
            stmt.code(
127
                    WhileFunction.NAME,
128
                    stmt.args_names("CONDITION","BODY")
129
            ); 
130
            theGrammar.addStatement(stmt);
131

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

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

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

    
215
            stmt = theGrammar.createStatement("RETURN");
216
            stmt.addRule(stmt.require_any_token("RETURN"));
217
            stmt.addRule(stmt.optional_any_token(";")
218
                    .addRuleOnTrue(stmt.set_expression("VALUES", null))
219
                    .addRuleOnFalse(stmt.require_expression("VALUES"))
220
                    .addRuleOnFalse(stmt.require_any_token(";"))
221
            );
222
            stmt.code(
223
                    ReturnFunction.NAME,
224
                    stmt.args_expand("VALUES")
225
            ); 
226
            theGrammar.addStatement(stmt);
227

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

    
245
            stmt = theGrammar.createStatement("LET");
246
            stmt.addRule(stmt.require_any_token("LET", "SET"));
247
            stmt.addRule(stmt.require_identifier("NAME"));
248
            stmt.addRule(stmt.optional_any_token("=","TO"));
249
            stmt.addRule(stmt.require_expression("VALUE"));
250
            stmt.code(
251
                    LetFunction.NAME, 
252
                    stmt.args_names("NAME", "VALUE")
253
            ); 
254
            theGrammar.addStatement(stmt);
255

    
256
            stmt = theGrammar.createStatement("ARRAY");
257
            stmt.addRule(stmt.require_any_token("ARRAY"));
258
            stmt.addRule(stmt.require_any_token("["));
259
            stmt.addRule(stmt.require_expressions("VALUES",","));
260
            stmt.addRule(stmt.require_any_token("]"));
261
            stmt.code(
262
                    FUNCTION_LIST, 
263
                    stmt.args_expand("VALUES")
264
            ); 
265
            theGrammar.addStatement(stmt);
266

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

    
312
            this.grammar = theGrammar;
313
        }
314
        return grammar;
315
    }
316
    
317
}