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

History | View | Annotate | Download (13.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.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
            stmt.addRule(stmt.require_expressions("BODY", ";"));
190
            stmt.addRule(stmt.require_any_token("$$", "END"));
191
            stmt.addRule(stmt.optional_any_token("FUNCTION", "PROCEDURE"));
192
            stmt.code(
193
                    CreateFnFunction.NAME,
194
                    stmt.args_names("FUNCTION_NAME","PARAM_NAMES","BODY")
195
            ); 
196
            theGrammar.addStatement(stmt);
197

    
198
            stmt = theGrammar.createStatement("RETURN");
199
            stmt.addRule(stmt.require_any_token("RETURN"));
200
            stmt.addRule(stmt.optional_any_token(";")
201
                    .addRuleOnTrue(stmt.set_expression("VALUES", null))
202
                    .addRuleOnFalse(stmt.require_expression("VALUES"))
203
                    .addRuleOnFalse(stmt.require_any_token(";"))
204
            );
205
            stmt.code(
206
                    ReturnFunction.NAME,
207
                    stmt.args_expand("VALUES")
208
            ); 
209
            theGrammar.addStatement(stmt);
210

    
211
//            stmt = theGrammar.createStatement("TRY");
212
//            stmt.addRule(stmt.require_any_token("TRY"));
213
//            stmt.addRule(stmt.optional_any_token(":"));
214
//            stmt.addRule(stmt.require_expressions("VALUE", ";"));
215
//            stmt.addRule(stmt.optional_any_token(";"));
216
//            stmt.addRule(stmt.require_any_token("EXCEPT","CATH"));
217
//            stmt.addRule(stmt.optional_any_token(":"));
218
//            stmt.addRule(stmt.require_expressions("ONERROR", ";"));
219
//            stmt.addRule(stmt.optional_any_token(";"));
220
//            stmt.addRule(stmt.require_any_token("END"));
221
//            stmt.addRule(stmt.optional_any_token("TRY"));
222
//            stmt.code(
223
//                    TryFunction.NAME,
224
//                    stmt.args_names("VALUE","ONERROR")
225
//            ); 
226
//            theGrammar.addStatement(stmt);
227

    
228
            stmt = theGrammar.createStatement("LET");
229
            stmt.addRule(stmt.require_any_token("LET", "SET"));
230
            stmt.addRule(stmt.require_identifier("NAME"));
231
            stmt.addRule(stmt.optional_any_token("=","TO"));
232
            stmt.addRule(stmt.require_expression("VALUE"));
233
            stmt.code(
234
                    LetFunction.NAME, 
235
                    stmt.args_names("NAME", "VALUE")
236
            ); 
237
            theGrammar.addStatement(stmt);
238

    
239
            stmt = theGrammar.createStatement("ARRAY");
240
            stmt.addRule(stmt.require_any_token("ARRAY"));
241
            stmt.addRule(stmt.require_any_token("["));
242
            stmt.addRule(stmt.require_expressions("VALUES",","));
243
            stmt.addRule(stmt.require_any_token("]"));
244
            stmt.code(
245
                    FUNCTION_LIST, 
246
                    stmt.args_expand("VALUES")
247
            ); 
248
            theGrammar.addStatement(stmt);
249

    
250
            stmt = theGrammar.createStatement("CAST");
251
            stmt.addRule(stmt.require_any_token("CAST"));
252
            stmt.addRule(stmt.optional_any_token("(")
253
                .addRuleOnTrue(stmt.require_expression("VALUE"))
254
                .addRuleOnTrue(stmt.require_any_token("AS"))
255
                .addRuleOnTrue(stmt.require_identifier("TYPE"))
256
                .addRuleOnTrue(stmt.require_any_token(")"))                    
257
                .addRuleOnFalse(stmt.require_expression("VALUE"))
258
                .addRuleOnFalse(stmt.require_any_token("AS"))
259
                .addRuleOnFalse(stmt.require_identifier("TYPE"))
260
            );
261
            stmt.code(
262
                    FUNCTION_CAST,
263
                    stmt.args_names("VALUE","TYPE")
264
            );
265
            theGrammar.addStatement(stmt);
266
            
267
            stmt = theGrammar.createStatement("MATCH");
268
            stmt.addRule(stmt.require_any_token("MATCH"));
269
            stmt.addRule(stmt.optional_any_token("(")
270
                .addRuleOnTrue(stmt.require_expression("VALUE"))
271
                .addRuleOnTrue(stmt.require_any_token(","))
272
                .addRuleOnTrue(stmt.require_expression("PATTERN"))
273
                .addRuleOnTrue(stmt.require_any_token(")"))                    
274
                .addRuleOnFalse(stmt.require_expression("VALUE"))
275
                .addRuleOnFalse(stmt.optional_any_token(","))
276
                .addRuleOnFalse(stmt.require_expression("PATTERN"))
277
            );
278
            stmt.code(
279
                    OPERATOR_REGEXP,
280
                    stmt.args_names("VALUE","PATTERN")
281
            );
282
            theGrammar.addStatement(stmt);
283
            
284
//            stmt = theGrammar.createStatement("FETCHFIRST");
285
//            stmt.addRule(stmt.require_token("FETCH"));
286
//            stmt.addRule(stmt.require_token("FIRST"));
287
//            stmt.addRule(stmt.require_expression("VALUE"));
288
//            stmt.addRule(stmt.optional_token("FROM"));
289
//            stmt.addRule(stmt.require_expression("FROM"));
290
//            stmt.addRule(stmt.optional_token("WHERE").addRuleOnTrue(stmt.require_expression("WHERE")));
291
//            stmt.addRule(stmt.optional_token("ORDER","BY").addRuleOnTrue(stmt.require_expression("ORDER")));
292
//            stmt.code("FETCH_FIRST","VALUE","FROM","WHERE");
293
//            theGrammar.addStatement(stmt);
294

    
295
            this.grammar = theGrammar;
296
        }
297
        return grammar;
298
    }
299
    
300
}