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

History | View | Annotate | Download (14.6 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.ReturnFunction;
24
import org.gvsig.expressionevaluator.impl.function.programming.WhileFunction;
25
import org.gvsig.expressionevaluator.spi.AbstractGrammarFactory;
26

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

    
33
    private Grammar grammar;
34

    
35
    private class BeginStatementBuilder extends StatementBuilderBase {
36

    
37
        private final String blockID;
38
        private final String exceptID;
39

    
40
        public BeginStatementBuilder(String blockID, String exceptID) {
41
            super(CodeBlockFunction.NAME, new ArgsBuilderFromNames(blockID));
42
            this.blockID = blockID;
43
            this.exceptID = exceptID;
44
        }
45

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

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

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

    
131
//            stmt = theGrammar.createStatement("FOR");
132
//            stmt.addRule(stmt.require_token("FOR"));
133
//            stmt.addRule(stmt.require_expression("INIT"));
134
//            stmt.addRule(stmt.require_token(";"));
135
//            stmt.addRule(stmt.require_expression("CONDITION"));
136
//            stmt.addRule(stmt.require_token(";"));
137
//            stmt.addRule(stmt.require_expression("STEP"));
138
//            stmt.addRule(stmt.optional_token(":"));
139
//            stmt.addRule(stmt.require_expression("BODY"));
140
//            stmt.addRule(stmt.optional_token("END"));
141
//            stmt.code(ForFunction.NAME,"INIT","CONDITION","STEP","BODY"); 
142
//            theGrammar.addStatement(stmt);
143

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

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

    
210
            stmt = theGrammar.createStatement("RETURN");
211
            stmt.addRule(stmt.require_any_token("RETURN"));
212
            stmt.addRule(stmt.optional_any_token(";")
213
                    .addRuleOnTrue(stmt.set_expression("VALUES", null))
214
                    .addRuleOnFalse(stmt.require_expression("VALUES"))
215
                    .addRuleOnFalse(stmt.require_any_token(";"))
216
            );
217
            stmt.code(
218
                    ReturnFunction.NAME,
219
                    stmt.args_expand("VALUES")
220
            ); 
221
            theGrammar.addStatement(stmt);
222

    
223
//            stmt = theGrammar.createStatement("TRY");
224
//            stmt.addRule(stmt.require_any_token("TRY"));
225
//            stmt.addRule(stmt.optional_any_token(":"));
226
//            stmt.addRule(stmt.require_expressions("VALUE", ";"));
227
//            stmt.addRule(stmt.optional_any_token(";"));
228
//            stmt.addRule(stmt.require_any_token("EXCEPT","CATH"));
229
//            stmt.addRule(stmt.optional_any_token(":"));
230
//            stmt.addRule(stmt.require_expressions("ONERROR", ";"));
231
//            stmt.addRule(stmt.optional_any_token(";"));
232
//            stmt.addRule(stmt.require_any_token("END"));
233
//            stmt.addRule(stmt.optional_any_token("TRY"));
234
//            stmt.code(
235
//                    TryFunction.NAME,
236
//                    stmt.args_names("VALUE","ONERROR")
237
//            ); 
238
//            theGrammar.addStatement(stmt);
239

    
240
            stmt = theGrammar.createStatement("LET");
241
            stmt.addRule(stmt.require_any_token("LET", "SET"));
242
            stmt.addRule(stmt.require_identifier("NAME"));
243
            stmt.addRule(stmt.optional_any_token("=","TO"));
244
            stmt.addRule(stmt.require_expression("VALUE"));
245
            stmt.code(
246
                    LetFunction.NAME, 
247
                    stmt.args_names("NAME", "VALUE")
248
            ); 
249
            theGrammar.addStatement(stmt);
250

    
251
            stmt = theGrammar.createStatement("ARRAY");
252
            stmt.addRule(stmt.require_any_token("ARRAY"));
253
            stmt.addRule(stmt.require_any_token("["));
254
            stmt.addRule(stmt.require_expressions("VALUES",","));
255
            stmt.addRule(stmt.require_any_token("]"));
256
            stmt.code(
257
                    FUNCTION_LIST, 
258
                    stmt.args_expand("VALUES")
259
            ); 
260
            theGrammar.addStatement(stmt);
261

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

    
307
            this.grammar = theGrammar;
308
        }
309
        return grammar;
310
    }
311
    
312
}