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

History | View | Annotate | Download (13.9 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.ListFunction;
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 createGrammar() {
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_token("FOR"));
134
//            stmt.addRule(stmt.require_expression("INIT"));
135
//            stmt.addRule(stmt.require_token(";"));
136
//            stmt.addRule(stmt.require_expression("CONDITION"));
137
//            stmt.addRule(stmt.require_token(";"));
138
//            stmt.addRule(stmt.require_expression("STEP"));
139
//            stmt.addRule(stmt.optional_token(":"));
140
//            stmt.addRule(stmt.require_expression("BODY"));
141
//            stmt.addRule(stmt.optional_token("END"));
142
//            stmt.code(ForFunction.NAME,"INIT","CONDITION","STEP","BODY"); 
143
//            theGrammar.addStatement(stmt);
144

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

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

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

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

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

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

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

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