Revision 43521 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/DefaultCompiler.java
DefaultCompiler.java | ||
---|---|---|
26 | 26 |
public void setCodeBuilder(CodeBuilder codeBuilder) { |
27 | 27 |
this.codeBuilder = codeBuilder; |
28 | 28 |
} |
29 |
|
|
30 | 29 |
@Override |
31 | 30 |
public Code compileExpression(String expression) { |
32 | 31 |
this.lexer.setSource(expression); |
... | ... | |
103 | 102 |
op2 = parse_sum(); |
104 | 103 |
op1 = codeBuilder.eq(op1, op2); |
105 | 104 |
break; |
106 |
case Token.PRED_IS: {
|
|
105 |
case Token.OP_NE:
|
|
107 | 106 |
lexer.next(); |
108 |
Token next = lexer.look(); |
|
109 |
if( next.getType() == Token.NOTNULL ) { |
|
110 |
op1 = codeBuilder.is(op1, codeBuilder.constant(null)); |
|
111 |
op1 = codeBuilder.not(op1); |
|
112 |
} else { |
|
113 |
op2 = parse_sum(); |
|
114 |
op1 = codeBuilder.is(op1, op2); |
|
107 |
op2 = parse_sum(); |
|
108 |
op1 = codeBuilder.ne(op1, op2); |
|
109 |
break; |
|
110 |
case Token.PRED_IS: { |
|
111 |
lexer.next(); |
|
112 |
Token next = lexer.look(); |
|
113 |
if( next.getType() == Token.NOTNULL ) { |
|
114 |
op1 = codeBuilder.is(op1, codeBuilder.constant(null)); |
|
115 |
op1 = codeBuilder.not(op1); |
|
116 |
} else { |
|
117 |
op2 = parse_sum(); |
|
118 |
op1 = codeBuilder.is(op1, op2); |
|
119 |
} |
|
115 | 120 |
} |
116 |
} |
|
117 |
break; |
|
121 |
break; |
|
118 | 122 |
case Token.ISNULL: |
119 | 123 |
lexer.next(); |
120 | 124 |
op1 = codeBuilder.is(op1, codeBuilder.constant(null)); |
121 | 125 |
break; |
122 |
case Token.OP_NE: |
|
123 |
lexer.next(); |
|
124 |
op2 = parse_sum(); |
|
125 |
op1 = codeBuilder.ne(op1, op2); |
|
126 |
break; |
|
127 | 126 |
case Token.PRED_LIKE: |
128 | 127 |
lexer.next(); |
129 | 128 |
op2 = parse_sum(); |
... | ... | |
194 | 193 |
Token token = lexer.look(); |
195 | 194 |
switch( token.getType() ) { |
196 | 195 |
case Token.PARENTHESIS_OPEN: { |
197 |
lexer.next(); |
|
198 |
Code value = parseExpression(); |
|
199 |
Token next = lexer.next(); |
|
200 |
if( next.getType() != Token.PARENTHESIS_CLOSE ) { |
|
201 |
throw new RuntimeException(); |
|
196 |
lexer.next(); |
|
197 |
Code value = parseExpression(); |
|
198 |
Token next = lexer.next(); |
|
199 |
if( next.getType() != Token.PARENTHESIS_CLOSE ) { |
|
200 |
throw new RuntimeException(); |
|
201 |
} |
|
202 |
return value; |
|
202 | 203 |
} |
203 |
return value; |
|
204 |
} |
|
205 | 204 |
case Token.IDENTIFIER: { |
206 |
lexer.next(); |
|
207 |
String id = (String) token.getLiteral(); |
|
208 |
Token next = lexer.look(); |
|
209 |
if( next.getType() == Token.PARENTHESIS_OPEN ) { |
|
210 | 205 |
lexer.next(); |
211 |
Arguments args = parseArgs(); |
|
212 |
next = lexer.next(); |
|
213 |
if( next.getType() != Token.PARENTHESIS_CLOSE ) { |
|
214 |
throw new RuntimeException("Expected ')'."); |
|
206 |
String id = (String) token.getLiteral(); |
|
207 |
Token next = lexer.look(); |
|
208 |
if( next.getType() == Token.PARENTHESIS_OPEN ) { |
|
209 |
lexer.next(); |
|
210 |
Arguments args = parseArgs(); |
|
211 |
next = lexer.next(); |
|
212 |
if( next.getType() != Token.PARENTHESIS_CLOSE ) { |
|
213 |
throw new RuntimeException("Expected ')'."); |
|
214 |
} |
|
215 |
return codeBuilder.function(id, args); |
|
216 |
} else { |
|
217 |
return codeBuilder.identifier(id); |
|
215 | 218 |
} |
216 |
return codeBuilder.function(id, args); |
|
217 |
} else { |
|
218 |
return codeBuilder.identifier(id); |
|
219 | 219 |
} |
220 |
} |
|
221 | 220 |
case Token.STRING_LITERAL: |
222 | 221 |
lexer.next(); |
223 | 222 |
return codeBuilder.constant(token.getValue()); |
Also available in: Unified diff