Revision 44384 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
BasicGrammarFactory.java | ||
---|---|---|
1 | 1 |
package org.gvsig.expressionevaluator.impl.grammars; |
2 | 2 |
|
3 |
import org.gvsig.expressionevaluator.Code; |
|
4 |
import org.gvsig.expressionevaluator.Code.Caller; |
|
3 | 5 |
import static org.gvsig.expressionevaluator.ExpressionBuilder.FUNCTION_CAST; |
6 |
import static org.gvsig.expressionevaluator.ExpressionBuilder.FUNCTION_LIST; |
|
4 | 7 |
import static org.gvsig.expressionevaluator.ExpressionBuilder.OPERATOR_REGEXP; |
5 | 8 |
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator; |
6 | 9 |
import org.gvsig.expressionevaluator.ExpressionEvaluatorManager; |
7 | 10 |
import org.gvsig.expressionevaluator.Grammar; |
8 | 11 |
import org.gvsig.expressionevaluator.Statement; |
9 |
import org.gvsig.expressionevaluator.impl.function.operator.RegExpOperator; |
|
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; |
|
10 | 16 |
import org.gvsig.expressionevaluator.impl.function.programming.IIFFunction; |
11 | 17 |
import org.gvsig.expressionevaluator.impl.function.programming.LetFunction; |
12 | 18 |
import org.gvsig.expressionevaluator.impl.function.programming.CaseFunction; |
13 | 19 |
import org.gvsig.expressionevaluator.impl.function.programming.CodeBlockFunction; |
20 |
import org.gvsig.expressionevaluator.impl.function.programming.CodeBlockWithExceptFunction; |
|
14 | 21 |
import org.gvsig.expressionevaluator.impl.function.programming.CreateFnFunction; |
15 | 22 |
import org.gvsig.expressionevaluator.impl.function.programming.ForEachFunction; |
23 |
import org.gvsig.expressionevaluator.impl.function.programming.ListFunction; |
|
16 | 24 |
import org.gvsig.expressionevaluator.impl.function.programming.ReturnFunction; |
17 |
import org.gvsig.expressionevaluator.impl.function.programming.TryFunction; |
|
18 | 25 |
import org.gvsig.expressionevaluator.impl.function.programming.WhileFunction; |
19 | 26 |
import org.gvsig.expressionevaluator.spi.AbstractGrammarFactory; |
20 | 27 |
|
... | ... | |
26 | 33 |
|
27 | 34 |
private Grammar grammar; |
28 | 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 |
} |
|
29 | 61 |
public BasicGrammarFactory() { |
30 | 62 |
super("Basic", true); |
31 | 63 |
} |
... | ... | |
38 | 70 |
Statement stmt; |
39 | 71 |
|
40 | 72 |
theGrammar.addReservedWord("BEGIN"); |
73 |
theGrammar.addReservedWord("EXCEPT"); |
|
41 | 74 |
theGrammar.addReservedWord("END"); |
42 | 75 |
theGrammar.addReservedWord("IF"); |
43 | 76 |
theGrammar.addReservedWord("THEN"); |
... | ... | |
45 | 78 |
theGrammar.addReservedWord("WHILE"); |
46 | 79 |
theGrammar.addReservedWord("CASE"); |
47 | 80 |
theGrammar.addReservedWord("WHEN"); |
48 |
theGrammar.addReservedWord("DEF"); |
|
81 |
theGrammar.addReservedWord("FOR"); |
|
82 |
theGrammar.addReservedWord("CREATE"); |
|
83 |
theGrammar.addReservedWord("FUNCTION"); |
|
84 |
theGrammar.addReservedWord("PROCEDURE"); |
|
85 |
theGrammar.addReservedWord("AS"); |
|
49 | 86 |
theGrammar.addReservedWord("MATCH"); |
50 | 87 |
theGrammar.addReservedWord("CAST"); |
51 |
theGrammar.addReservedWord("TRY"); |
|
52 |
theGrammar.addReservedWord("EXCEPT"); |
|
88 |
theGrammar.addReservedWord("SET"); |
|
89 |
theGrammar.addReservedWord("TO"); |
|
90 |
theGrammar.addReservedWord("$$"); // ???? Asi van las funciones |
|
53 | 91 |
|
54 |
/* |
|
55 |
|
|
56 |
BEGIN |
|
57 |
SET x = 0; |
|
58 |
FOR n in FETCH GEOMETRY FROM STORE 'view','points': |
|
59 |
IF ST_Intersects(n,GEOMETRY) THEN |
|
60 |
SET x = x+1 |
|
61 |
EXCEPT |
|
62 |
SET x = -1 |
|
63 |
END WITH VALUE x |
|
64 |
|
|
65 |
*/ |
|
66 |
|
|
67 |
|
|
68 | 92 |
stmt = theGrammar.createStatement("BLOCK"); |
69 | 93 |
stmt.addRule(stmt.require_any_token("BEGIN")); |
70 | 94 |
stmt.addRule(stmt.require_expressions("VALUES", ";")); |
71 |
// stmt.addRule(stmt.optional_any_token("EXCEPT")
|
|
72 |
// .addRuleOnTrue(stmt.require_expression("EXCEPT"))
|
|
73 |
// );
|
|
95 |
stmt.addRule(stmt.optional_any_token("EXCEPT") |
|
96 |
.addRuleOnTrue(stmt.require_expressions("EXCEPT", ";"))
|
|
97 |
); |
|
74 | 98 |
stmt.addRule(stmt.require_any_token("END")); |
75 |
// stmt.addRule(stmt.optional_any_token("WITH") |
|
76 |
// .addRuleOnTrue(stmt.require_any_token("VALUE")) |
|
77 |
// .addRuleOnTrue(stmt.require_expression("VALUE")) |
|
78 |
// ); |
|
79 |
stmt.code( |
|
80 |
CodeBlockFunction.NAME, |
|
81 |
// stmt.args_names("EXCEPT","VALUE"), |
|
82 |
stmt.args_expand("VALUES") |
|
83 |
); |
|
99 |
stmt.builder(new BeginStatementBuilder("VALUES","EXCEPT")); |
|
84 | 100 |
theGrammar.addStatement(stmt); |
85 | 101 |
|
86 | 102 |
stmt = theGrammar.createStatement("IF"); |
... | ... | |
163 | 179 |
theGrammar.addStatement(stmt); |
164 | 180 |
|
165 | 181 |
stmt = theGrammar.createStatement("USERFUNCTION"); |
166 |
stmt.addRule(stmt.require_any_token("DEF", "CREATE"));
|
|
167 |
stmt.addRule(stmt.optional_any_token("FUNCTION")); |
|
182 |
stmt.addRule(stmt.require_any_token("CREATE")); |
|
183 |
stmt.addRule(stmt.optional_any_token("FUNCTION", "PROCEDURE"));
|
|
168 | 184 |
stmt.addRule(stmt.require_identifier("FUNCTION_NAME")); |
169 |
stmt.addRule(stmt.require_any_token("("));
|
|
185 |
stmt.addRule(stmt.optional_any_token("("));
|
|
170 | 186 |
stmt.addRule(stmt.optional_identifiers("PARAM_NAMES", ",")); |
171 |
stmt.addRule(stmt.require_any_token(")")); |
|
172 |
stmt.addRule(stmt.optional_any_token(":")); |
|
187 |
stmt.addRule(stmt.optional_any_token(")")); |
|
188 |
stmt.addRule(stmt.require_any_token("AS")); |
|
189 |
stmt.addRule(stmt.optional_any_token("$$","BEGIN")); |
|
173 | 190 |
stmt.addRule(stmt.require_expressions("BODY", ";")); |
174 |
stmt.addRule(stmt.require_any_token("END")); |
|
175 |
stmt.addRule(stmt.optional_any_token("FUNCTION")); |
|
191 |
stmt.addRule(stmt.require_any_token("$$", "END"));
|
|
192 |
stmt.addRule(stmt.optional_any_token("FUNCTION", "PROCEDURE"));
|
|
176 | 193 |
stmt.code( |
177 | 194 |
CreateFnFunction.NAME, |
178 | 195 |
stmt.args_names("FUNCTION_NAME","PARAM_NAMES","BODY") |
... | ... | |
192 | 209 |
); |
193 | 210 |
theGrammar.addStatement(stmt); |
194 | 211 |
|
195 |
stmt = theGrammar.createStatement("TRY"); |
|
196 |
stmt.addRule(stmt.require_any_token("TRY")); |
|
197 |
stmt.addRule(stmt.optional_any_token(":")); |
|
198 |
stmt.addRule(stmt.require_expressions("VALUE", ";")); |
|
199 |
stmt.addRule(stmt.optional_any_token(";")); |
|
200 |
stmt.addRule(stmt.require_any_token("EXCEPT","CATH")); |
|
201 |
stmt.addRule(stmt.optional_any_token(":")); |
|
202 |
stmt.addRule(stmt.require_expressions("ONERROR", ";")); |
|
203 |
stmt.addRule(stmt.optional_any_token(";")); |
|
204 |
stmt.addRule(stmt.require_any_token("END")); |
|
205 |
stmt.addRule(stmt.optional_any_token("TRY")); |
|
206 |
stmt.code( |
|
207 |
TryFunction.NAME, |
|
208 |
stmt.args_names("VALUE","ONERROR") |
|
209 |
); |
|
210 |
theGrammar.addStatement(stmt); |
|
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);
|
|
211 | 228 |
|
212 | 229 |
stmt = theGrammar.createStatement("LET"); |
213 | 230 |
stmt.addRule(stmt.require_any_token("LET", "SET")); |
214 | 231 |
stmt.addRule(stmt.require_identifier("NAME")); |
215 |
stmt.addRule(stmt.require_any_token("="));
|
|
232 |
stmt.addRule(stmt.optional_any_token("=","TO"));
|
|
216 | 233 |
stmt.addRule(stmt.require_expression("VALUE")); |
217 | 234 |
stmt.code( |
218 | 235 |
LetFunction.NAME, |
... | ... | |
220 | 237 |
); |
221 | 238 |
theGrammar.addStatement(stmt); |
222 | 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 |
|
|
223 | 251 |
stmt = theGrammar.createStatement("CAST"); |
224 | 252 |
stmt.addRule(stmt.require_any_token("CAST")); |
225 | 253 |
stmt.addRule(stmt.optional_any_token("(") |
Also available in: Unified diff