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

View differences:

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