Revision 43983 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
6 6
import org.gvsig.expressionevaluator.LexicalAnalyzer.Token;
7 7
import org.gvsig.expressionevaluator.Code;
8 8
import org.gvsig.expressionevaluator.CodeBuilder;
9
import org.gvsig.expressionevaluator.ExpressionSyntaxException;
9 10

  
10 11
public class DefaultCompiler implements Compiler {
11 12

  
......
35 36
    public void setLexicalAnalyzer(LexicalAnalyzer lexer) {
36 37
        this.lexer = lexer;
37 38
    }
39

  
40
    @Override
41
    public LexicalAnalyzer getLexicalAnalyzer() {
42
        return this.lexer;
43
    }
38 44
    
39 45
    @Override
40 46
    public void setCodeBuilder(CodeBuilder codeBuilder) {
......
58 64
    
59 65
    @Override
60 66
    public Code compileExpression(String expression) {
61
        this.lexer.setSource(expression);
62
        return parseExpression();
67
        this.lexer.setSource(expression.trim());
68
        Code code = parseExpression();
69
        if( !this.lexer.isEOF() ) {
70
            throw new ExpressionSyntaxException(lexer);
71
        }
72
        return code;
63 73
    }
64 74

  
65 75
    private Code parseExpression() {
66
        return parse_relational();
76
        Code code = parse_relational();
77
        return code;
67 78
    }
68 79

  
69 80
    private Code parse_relational() {
......
75 86
            case Token.OP_OR:
76 87
                lexer.next();
77 88
                op2 = parse_not();
89
                if( op2==null ) {
90
                    throw new ExpressionSyntaxException(lexer);
91
                }
78 92
                op1 = codeBuilder.or(op1, op2);
79 93
                break;
80 94
            case Token.OP_AND:
81 95
                lexer.next();
82 96
                op2 = parse_not();
97
                if( op2==null ) {
98
                    throw new ExpressionSyntaxException(lexer);
99
                }
83 100
                op1 = codeBuilder.and(op1, op2);
84 101
                break;
85 102
            default:
......
110 127
            case Token.OP_LT:
111 128
                lexer.next();
112 129
                op2 = parse_sum();
130
                if( op2==null ) {
131
                    throw new ExpressionSyntaxException(lexer);
132
                }
113 133
                op1 = codeBuilder.lt(op1, op2);
114 134
                break;
115 135
            case Token.OP_GT:
116 136
                lexer.next();
117 137
                op2 = parse_sum();
138
                if( op2==null ) {
139
                    throw new ExpressionSyntaxException(lexer);
140
                }
118 141
                op1 = codeBuilder.gt(op1, op2);
119 142
                break;
120 143
            case Token.OP_LE:
121 144
                lexer.next();
122 145
                op2 = parse_sum();
146
                if( op2==null ) {
147
                    throw new ExpressionSyntaxException(lexer);
148
                }
123 149
                op1 = codeBuilder.le(op1, op2);
124 150
                break;
125 151
            case Token.OP_GE:
126 152
                lexer.next();
127 153
                op2 = parse_sum();
154
                if( op2==null ) {
155
                    throw new ExpressionSyntaxException(lexer);
156
                }
128 157
                op1 = codeBuilder.ge(op1, op2);
129 158
                break;
130 159
            case Token.OP_EQ:
131 160
                lexer.next();
132 161
                op2 = parse_sum();
162
                if( op2==null ) {
163
                    throw new ExpressionSyntaxException(lexer);
164
                }
133 165
                op1 = codeBuilder.eq(op1, op2);
134 166
                break;
135 167
            case Token.OP_NE:
136 168
                lexer.next();
137 169
                op2 = parse_sum();
170
                if( op2==null ) {
171
                    throw new ExpressionSyntaxException(lexer);
172
                }
138 173
                op1 = codeBuilder.ne(op1, op2);
139 174
                break;
140 175
            case Token.PRED_IS: {
......
145 180
                        op1 = codeBuilder.not(op1);
146 181
                    } else {
147 182
                        op2 = parse_sum();
183
                        if( op2==null ) {
184
                            throw new ExpressionSyntaxException(lexer);
185
                        }
148 186
                        op1 = codeBuilder.is(op1, op2);
149 187
                    }
150 188
                }
......
156 194
            case Token.OP_REGEXP:
157 195
                lexer.next();
158 196
                op2 = parse_sum();
197
                if( op2==null ) {
198
                    throw new ExpressionSyntaxException(lexer);
199
                }
159 200
                op1 = codeBuilder.regexp(op1, op2);
160 201
                break;
161 202
            case Token.PRED_LIKE:
162 203
                lexer.next();
163 204
                op2 = parse_sum();
205
                if( op2==null ) {
206
                    throw new ExpressionSyntaxException(lexer);
207
                }
164 208
                op1 = codeBuilder.like(op1, op2);
165 209
                break;
166 210
            case Token.PRED_ILIKE:
167 211
                lexer.next();
168 212
                op2 = parse_sum();
213
                if( op2==null ) {
214
                    throw new ExpressionSyntaxException(lexer);
215
                }
169 216
                op1 = codeBuilder.ilike(op1, op2);
170 217
                break;
171 218
            default:
......
205 252
            case Token.OP_MULT:
206 253
                lexer.next();
207 254
                op2 = parse_getattr();
255
                if( op2==null ) {
256
                    throw new ExpressionSyntaxException(lexer);
257
                }
208 258
                op1 = codeBuilder.mult(op1, op2);
209 259
                break;
210 260
            case Token.OP_DIV:
211 261
                lexer.next();
212 262
                op2 = parse_getattr();
263
                if( op2==null ) {
264
                    throw new ExpressionSyntaxException(lexer);
265
                }
213 266
                op1 = codeBuilder.div(op1, op2);
214 267
                break;
215 268
            case Token.OP_MOD:
216 269
                lexer.next();
217 270
                op2 = parse_getattr();
271
                if( op2==null ) {
272
                    throw new ExpressionSyntaxException(lexer);
273
                }
218 274
                op1 = codeBuilder.mod(op1, op2);
219 275
                break;
220 276
            default:
......
235 291
                lexer.next();
236 292
                next = lexer.look();
237 293
                if( next.getType()!=Token.IDENTIFIER ) {
238
                    throw new RuntimeException("An attribute identifier was expected and '"+next.getLiteral()+"' was found");
294
                    throw new ExpressionSyntaxException(
295
                        "An attribute identifier was expected and '"+next.getLiteral()+"' was found", 
296
                        lexer.getSource(),
297
                        lexer.getPosition()
298
                    );
239 299
                }
240 300
                String id = (String) next.getLiteral();
241 301
                lexer.next();
......
245 305
                    Arguments args = parseArgs();
246 306
                    next = lexer.next();
247 307
                    if( next.getType() != Token.PARENTHESIS_CLOSE ) {
248
                        throw new RuntimeException("Closing parenthesis was expected and '"+next.getLiteral()+"' was found");
308
                        throw new ExpressionSyntaxException(
309
                            "Closing parenthesis was expected and '"+next.getLiteral()+"' was found", 
310
                            lexer.getSource(),
311
                            lexer.getPosition()
312
                        );
249 313
                    }
250 314
                    return codeBuilder.method(op1, id, args);
251 315
                } else {
......
266 330
                Code value = parseExpression();
267 331
                Token next = lexer.next();
268 332
                if( next.getType() != Token.PARENTHESIS_CLOSE ) {
269
                    throw new RuntimeException("Closing parenthesis was expected and '"+next.getLiteral()+"' was found");
333
                    throw new ExpressionSyntaxException(
334
                        "Closing parenthesis was expected and '"+next.getLiteral()+"' was found",
335
                        lexer.getSource(),
336
                        lexer.getPosition()
337
                    );
270 338
                }
271 339
                return value;
272 340
            }
......
279 347
                    Arguments args = parseArgs();
280 348
                    next = lexer.next();
281 349
                    if( next.getType() != Token.PARENTHESIS_CLOSE ) {
282
                        throw new RuntimeException("Closing parenthesis was expected and '"+next.getLiteral()+"' was found");
350
                        throw new ExpressionSyntaxException(
351
                            "Closing parenthesis was expected and '"+next.getLiteral()+"' was found", 
352
                            lexer.getSource(),
353
                            lexer.getPosition()
354
                        );
283 355
                    }
284 356
                    return codeBuilder.function(id, args);
285 357
                } else {

Also available in: Unified diff