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
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