Revision 44750 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
2 2

  
3 3
import java.util.HashMap;
4 4
import java.util.Map;
5
import java.util.Stack;
5 6
import org.apache.commons.lang3.StringUtils;
6 7
import org.gvsig.expressionevaluator.Compiler;
7 8
import org.gvsig.expressionevaluator.LexicalAnalyzer;
......
27 28
    protected static final Logger LOGGER = LoggerFactory.getLogger(DefaultCompiler.class);
28 29
    
29 30
    class DefaultStatementContext implements StatementContext {
31
      
32
        private class State {
33
          public String codeClassifier;
34
          public Map<String,Code> codes;
35
        }
36
        
37
        private State state;
38
        private final Stack<State> states;
30 39

  
31
        private String codeClassifier;
32
        private Map<String,Code> codes;
40
        public DefaultStatementContext() {
41
          this.state = new State();
42
          this.states = new Stack<>();
43
        }
44
        
45
        @Override
46
        public void save_state() {
47
          ((AbstractLexicalAnalyzer)lexer).save_state();
48
          this.states.push(state);
49
        }
33 50

  
34 51
        @Override
52
        public void restore_state() {
53
          ((AbstractLexicalAnalyzer)lexer).restore_state();
54
          state = this.states.pop();
55
        }
56

  
57
        @Override
58
        public void drop_state() {
59
          ((AbstractLexicalAnalyzer)lexer).drop_state();
60
          this.states.pop();
61
        }
62
        
63
        @Override
35 64
        public Compiler getCompiler() {
36 65
            return DefaultCompiler.this;
37 66
        }
......
43 72

  
44 73
        @Override
45 74
        public void setCode(String id, Code code) {
46
            if( this.codes == null ) {
47
                this.codes = new HashMap<>();
75
            if( this.state.codes == null ) {
76
                this.state.codes = new HashMap<>();
48 77
            }
49
            if( !StringUtils.isBlank(this.codeClassifier) ) {
78
            if( !StringUtils.isBlank(this.state.codeClassifier) ) {
50 79
                if( id.contains("#") ) {
51
                    id = StringUtils.replace(id,"#",this.codeClassifier,1);
80
                    id = StringUtils.replace(id,"#",this.state.codeClassifier,1);
52 81
                }
53 82
            }
54
            this.codes.put(id, code);
83
            this.state.codes.put(id.toUpperCase(), code);
55 84
        }
56 85

  
57 86
        @Override
58 87
        public Code getCode(String id) {
59
            return this.codes.get(id);
88
            return this.state.codes.get(id.toUpperCase());
60 89
        }
61 90
        
62 91
        @Override
63 92
        public void setCodeClassifier(String classifier) {
64
            this.codeClassifier = classifier;
93
            this.state.codeClassifier = classifier;
65 94
        }
66 95

  
67 96
        @Override
68 97
        public String getCodeClassifier() {
69
            return this.codeClassifier;
98
            return this.state.codeClassifier;
70 99
        }
71 100

  
72 101
        @Override
......
514 543
                String id = (String) token.getLiteral();
515 544
                Token next = lexer.look();
516 545
                if( next.getType() == Token.PARENTHESIS_OPEN ) {
517
                    lexer.next();
546
                    next = lexer.next();
518 547
                    Codes args = parse_arguments();
519 548
                    next = lexer.next();
520 549
                    switch(next.getType()) {
......
607 636
        String sep = ",";
608 637
        BaseCodes codes = null;
609 638
        while( true ) {
610
            ((AbstractLexicalAnalyzer)lexer).push_state();
611
            String argName = null;
612
            Token tok0 = lexer.next();
613
            Token tok1 = lexer.next();
614
            if( tok0.getType()==Token.IDENTIFIER && tok1.is(":") ) {
615
              argName = (String) tok0.getValue();
616
            } else {
617
              ((AbstractLexicalAnalyzer)lexer).pop_state();
618
            }
619 639
            Code code = parse_expression();
620 640
            if( code!=null ) {
621 641
                if( codes == null ) {
622 642
                    codes = (BaseCodes) codeBuilder.args();
623 643
                }
624
                codes.add(argName, code);
644
                codes.add(code);
625 645
            }
626 646
            Token next = lexer.look();
627 647
            String literal = next.getLiteral();

Also available in: Unified diff