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

History | View | Annotate | Download (9.75 KB)

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

    
3
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
4
import org.gvsig.expressionevaluator.ExpressionEvaluatorManager;
5
import org.gvsig.expressionevaluator.Grammar;
6
import org.gvsig.expressionevaluator.Statement;
7
import org.gvsig.expressionevaluator.impl.function.operator.RegExpOperator;
8
import org.gvsig.expressionevaluator.impl.function.programming.IIFFunction;
9
import org.gvsig.expressionevaluator.impl.function.programming.LetFunction;
10
import org.gvsig.expressionevaluator.impl.function.programming.CaseFunction;
11
import org.gvsig.expressionevaluator.impl.function.programming.CodeBlockFunction;
12
import org.gvsig.expressionevaluator.impl.function.programming.CreateFnFunction;
13
import org.gvsig.expressionevaluator.impl.function.programming.ForEachFunction;
14
import org.gvsig.expressionevaluator.impl.function.programming.ReturnFunction;
15
import org.gvsig.expressionevaluator.impl.function.programming.WhileFunction;
16
import org.gvsig.expressionevaluator.impl.function.typeconversion.CastFunction;
17
import org.gvsig.expressionevaluator.spi.AbstractGrammarFactory;
18

    
19
/**
20
 *
21
 * @author jjdelcerro
22
 */
23
public class BasicGrammarFactory extends AbstractGrammarFactory {
24

    
25
    private Grammar grammar;
26

    
27
    public BasicGrammarFactory() {
28
        super("Basic", true);
29
    }
30
    
31
    @Override
32
    public Grammar createGrammar() {
33
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
34
        if( this.grammar==null ) {
35
            Grammar theGrammar = manager.createGrammar(this.getName());
36
            Statement stmt;
37
        
38
            theGrammar.addReservedWord("BEGIN");
39
            theGrammar.addReservedWord("END");
40
            theGrammar.addReservedWord("IF");
41
            theGrammar.addReservedWord("THEN");
42
            theGrammar.addReservedWord("ELSE");
43
            theGrammar.addReservedWord("WHILE");
44
            theGrammar.addReservedWord("CASE");
45
            theGrammar.addReservedWord("WHEN");
46
            theGrammar.addReservedWord("DEF");
47
            theGrammar.addReservedWord("MATCH");
48
            theGrammar.addReservedWord("CAST");
49
            
50
            stmt = theGrammar.createStatement("LET");
51
            stmt.addRule(stmt.require_token("LET", "SET"));
52
            stmt.addRule(stmt.require_identifier("NAME"));
53
            stmt.addRule(stmt.require_token("="));
54
            stmt.addRule(stmt.require_expression("VALUE"));
55
            stmt.code(
56
                    LetFunction.NAME, 
57
                    stmt.args_names("NAME", "VALUE")
58
            ); 
59
            theGrammar.addStatement(stmt);
60

    
61
            stmt = theGrammar.createStatement("BLOCK");
62
            stmt.addRule(stmt.require_token("BEGIN"));
63
            stmt.addRule(stmt.require_expressions("VALUES", ";"));
64
            stmt.addRule(stmt.require_token("END"));
65
            stmt.code(
66
                    CodeBlockFunction.NAME, 
67
                    stmt.args_expand("VALUES")
68
            );
69
            theGrammar.addStatement(stmt);
70

    
71
            stmt = theGrammar.createStatement("IF");
72
            stmt.addRule(stmt.require_token("IF"));
73
            stmt.addRule(stmt.require_expression("CONDITION"));
74
            stmt.addRule(stmt.optional_token("THEN"));
75
            stmt.addRule(stmt.optional_token(":"));
76
            stmt.addRule(stmt.require_expression("ONTRUE"));
77
            stmt.addRule(stmt.optional_token("ELSE")
78
                    .addRuleOnTrue(stmt.optional_token(":"))
79
                    .addRuleOnTrue(stmt.require_expression("ONFALSE"))
80
            );
81
            stmt.code(
82
                    IIFFunction.NAME,
83
                    stmt.args_names("CONDITION","ONTRUE","ONFALSE")
84
            ); 
85
            theGrammar.addStatement(stmt);
86

    
87
            stmt = theGrammar.createStatement("WHILE");
88
            stmt.addRule(stmt.require_token("WHILE"));
89
            stmt.addRule(stmt.require_expression("CONDITION"));
90
            stmt.addRule(stmt.optional_token("DO"));
91
            stmt.addRule(stmt.optional_token(":"));
92
            stmt.addRule(stmt.require_expression("BODY"));
93
            stmt.addRule(stmt.optional_token("DONE"));
94
            stmt.code(
95
                    WhileFunction.NAME,
96
                    stmt.args_names("CONDITION","BODY")
97
            ); 
98
            theGrammar.addStatement(stmt);
99

    
100
            stmt = theGrammar.createStatement("CAST");
101
            stmt.addRule(stmt.require_token("CAST"));
102
            stmt.addRule(stmt.optional_token("(")
103
                .addRuleOnTrue(stmt.require_expression("VALUE"))
104
                .addRuleOnTrue(stmt.require_token("AS"))
105
                .addRuleOnTrue(stmt.require_identifier("TYPE"))
106
                .addRuleOnTrue(stmt.require_token(")"))                    
107
                .addRuleOnFalse(stmt.require_expression("VALUE"))
108
                .addRuleOnFalse(stmt.require_token("AS"))
109
                .addRuleOnFalse(stmt.require_identifier("TYPE"))
110
            );
111
            stmt.code(
112
                    CastFunction.NAME,
113
                    stmt.args_names("VALUE","TYPE")
114
            );
115
            theGrammar.addStatement(stmt);
116
            
117
            stmt = theGrammar.createStatement("MATCH");
118
            stmt.addRule(stmt.require_token("MATCH"));
119
            stmt.addRule(stmt.optional_token("(")
120
                .addRuleOnTrue(stmt.require_expression("VALUE"))
121
                .addRuleOnTrue(stmt.require_token(","))
122
                .addRuleOnTrue(stmt.require_expression("PATTERN"))
123
                .addRuleOnTrue(stmt.require_token(")"))                    
124
                .addRuleOnFalse(stmt.require_expression("VALUE"))
125
                .addRuleOnFalse(stmt.optional_token(","))
126
                .addRuleOnFalse(stmt.require_expression("PATTERN"))
127
            );
128
            stmt.code(
129
                    RegExpOperator.NAME,
130
                    stmt.args_names("VALUE","PATTERN")
131
            );
132
            theGrammar.addStatement(stmt);
133
            
134
//            stmt = theGrammar.createStatement("FOR");
135
//            stmt.addRule(stmt.require_token("FOR"));
136
//            stmt.addRule(stmt.require_expression("INIT"));
137
//            stmt.addRule(stmt.require_token(";"));
138
//            stmt.addRule(stmt.require_expression("CONDITION"));
139
//            stmt.addRule(stmt.require_token(";"));
140
//            stmt.addRule(stmt.require_expression("STEP"));
141
//            stmt.addRule(stmt.optional_token(":"));
142
//            stmt.addRule(stmt.require_expression("BODY"));
143
//            stmt.addRule(stmt.optional_token("END"));
144
//            stmt.code(ForFunction.NAME,"INIT","CONDITION","STEP","BODY"); 
145
//            theGrammar.addStatement(stmt);
146

    
147
            stmt = theGrammar.createStatement("FOREACH");
148
            stmt.addRule(stmt.require_token("FOR"));
149
            stmt.addRule(stmt.require_identifier("VAR"));
150
            stmt.addRule(stmt.require_token("IN"));
151
            stmt.addRule(stmt.require_expression("ITERABLE"));
152
            stmt.addRule(stmt.optional_token(":"));
153
            stmt.addRule(stmt.require_expression("BODY"));
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_token("CASE"));
162
            stmt.addRule(
163
                stmt.repeat_until_tokens("END","ELSE")
164
                    .addRule(stmt.require_token("WHEN"))
165
                    .addRule(stmt.require_expression("CONDITION#"))
166
                    .addRule(stmt.optional_token("THEN"))
167
                    .addRule(stmt.optional_token(":"))
168
                    .addRule(stmt.require_expression("ONTRUE#"))
169
            );
170
            stmt.addRule(stmt.optional_token("ELSE")
171
                    .addRuleOnTrue(stmt.optional_token(":"))
172
                    .addRuleOnTrue(stmt.require_expression("ELSE"))
173
            );
174
            stmt.addRule(stmt.optional_token("END"));
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_token("DEF"));
183
            stmt.addRule(stmt.require_identifier("FUNCTION_NAME"));
184
            stmt.addRule(stmt.require_token("("));
185
            stmt.addRule(stmt.optional_identifiers("PARAM_NAMES", ","));
186
            stmt.addRule(stmt.require_token(")"));
187
            stmt.addRule(stmt.optional_token(":"));
188
            stmt.addRule(stmt.require_expression("BODY"));
189
            stmt.code(
190
                    CreateFnFunction.NAME,
191
                    stmt.args_names("FUNCTION_NAME","PARAM_NAMES","BODY")
192
            ); 
193
            theGrammar.addStatement(stmt);
194

    
195
            stmt = theGrammar.createStatement("RETURN");
196
            stmt.addRule(stmt.require_token("RETURN"));
197
            stmt.addRule(stmt.require_expressions("VALUES", ","));
198
            stmt.code(
199
                    ReturnFunction.NAME,
200
                    stmt.args_expand("VALUES")
201
            ); 
202
            theGrammar.addStatement(stmt);
203

    
204
//            stmt = theGrammar.createStatement("FETCHFIRST");
205
//            stmt.addRule(stmt.require_token("FETCH"));
206
//            stmt.addRule(stmt.require_token("FIRST"));
207
//            stmt.addRule(stmt.require_expression("VALUE"));
208
//            stmt.addRule(stmt.optional_token("FROM"));
209
//            stmt.addRule(stmt.require_expression("FROM"));
210
//            stmt.addRule(stmt.optional_token("WHERE").addRuleOnTrue(stmt.require_expression("WHERE")));
211
//            stmt.addRule(stmt.optional_token("ORDER","BY").addRuleOnTrue(stmt.require_expression("ORDER")));
212
//            stmt.code("FETCH_FIRST","VALUE","FROM","WHERE");
213
//            theGrammar.addStatement(stmt);
214

    
215
            this.grammar = theGrammar;
216
        }
217
        return grammar;
218
    }
219
    
220
}