Przeglądaj źródła

为表达式添加变量支持

master
youseries 6 lat temu
rodzic
commit
add20a7811
  1. 30
      ureport2-core/dsl/ReportParser.g4
  2. 12
      ureport2-core/src/main/java/com/bstek/ureport/build/Context.java
  3. 1
      ureport2-core/src/main/java/com/bstek/ureport/build/DataCompute.java
  4. 88
      ureport2-core/src/main/java/com/bstek/ureport/dsl/ReportParser.tokens
  5. 42
      ureport2-core/src/main/java/com/bstek/ureport/dsl/ReportParserBaseVisitor.java
  6. 286
      ureport2-core/src/main/java/com/bstek/ureport/dsl/ReportParserLexer.java
  7. 88
      ureport2-core/src/main/java/com/bstek/ureport/dsl/ReportParserLexer.tokens
  8. 1451
      ureport2-core/src/main/java/com/bstek/ureport/dsl/ReportParserParser.java
  9. 36
      ureport2-core/src/main/java/com/bstek/ureport/dsl/ReportParserVisitor.java
  10. 4
      ureport2-core/src/main/java/com/bstek/ureport/expression/ExpressionUtils.java
  11. 58
      ureport2-core/src/main/java/com/bstek/ureport/expression/model/expr/ExpressionBlock.java
  12. 81
      ureport2-core/src/main/java/com/bstek/ureport/expression/model/expr/VariableAssignExpression.java
  13. 39
      ureport2-core/src/main/java/com/bstek/ureport/expression/model/expr/VariableExpression.java
  14. 12
      ureport2-core/src/main/java/com/bstek/ureport/expression/model/expr/ifelse/ElseExpression.java
  15. 13
      ureport2-core/src/main/java/com/bstek/ureport/expression/model/expr/ifelse/ElseIfExpression.java
  16. 12
      ureport2-core/src/main/java/com/bstek/ureport/expression/model/expr/ifelse/IfExpression.java
  17. 197
      ureport2-core/src/main/java/com/bstek/ureport/expression/parse/ExpressionVisitor.java
  18. 37
      ureport2-core/src/main/java/com/bstek/ureport/expression/parse/builder/VariableExpressionBuilder.java
  19. 3
      ureport2-core/src/main/java/com/bstek/ureport/utils/ElCompute.java

30
ureport2-core/dsl/ReportParser.g4

@ -1,9 +1,13 @@
grammar ReportParser;
import ReportLexer;
entry : expression+ EOF;
expression : exprComposite
| ifExpr
| caseExpr
| returnExpr
| variableAssign
;
exprComposite : expr #singleExprComposite
@ -12,23 +16,36 @@ exprComposite : expr #singleExprComposite
| exprComposite Operator exprComposite #complexExprComposite
;
ternaryExpr : ifCondition (join ifCondition)* '?' expr ':' expr ;
ternaryExpr : ifCondition (join ifCondition)* '?' block ':' block ;
caseExpr : 'case' '{' casePart (',' casePart)* '}' ;
casePart : ifCondition (join ifCondition)* ':'? 'return'? expr ;
casePart : ifCondition (join ifCondition)* ':'? block ;
ifExpr: ifPart elseIfPart* elsePart? ;
ifPart : 'if' '(' ifCondition (join ifCondition)* ')' '{' 'return'? expr ';'? '}';
ifPart : 'if' '(' ifCondition (join ifCondition)* ')' '{' block '}';
elseIfPart : 'else' 'if' '(' ifCondition (join ifCondition)* ')' '{' block '}' ;
elseIfPart : 'else' 'if' '(' ifCondition (join ifCondition)* ')' '{' 'return'? expr ';'? '}' ;
elsePart : 'else' '{' block '}' ;
elsePart : 'else' '{' 'return'? expr ';'? '}' ;
block : exprBlock* returnExpr? ;
exprBlock : variableAssign
| ifExpr
| caseExpr
;
returnExpr : 'return'? expr ';'?;
expr : item (Operator item)* ;
ifCondition : expr OP expr ;
variableAssign : 'var'? variable '=' item ';'?;
item : unit (Operator unit)* #simpleJoin
| LeftParen item RightParen #singleParenJoin
@ -43,6 +60,7 @@ unit : dataset
| currentCellValue
| currentCellData
| cell
| variable
| INTEGER
| BOOLEAN
| STRING
@ -50,6 +68,8 @@ unit : dataset
| NULL
;
variable : Identifier ;
cellPosition : '&'Cell ;//表示单元格位置
relativeCell : '$'Cell ; //表示当前引用对应的单元格的值

12
ureport2-core/src/main/java/com/bstek/ureport/build/Context.java

@ -48,6 +48,7 @@ public class Context {
private int pageIndex;
private int totalPages;
private boolean doPaging;
private Map<String,Object> variableMap=new HashMap<String,Object>();
private Map<Integer,List<Row>> currentPageRowsMap=new HashMap<Integer,List<Row>>();
private Map<String,Dataset> datasetMap;
private ApplicationContext applicationContext;
@ -314,4 +315,15 @@ public class Context {
public Cell getRootCell() {
return rootCell;
}
public void putVariable(String key,Object value){
variableMap.put(key, value);
}
public void resetVariableMap(){
variableMap.clear();
}
public Object getVariable(String key){
return variableMap.get(key);
}
}

1
ureport2-core/src/main/java/com/bstek/ureport/build/DataCompute.java

@ -57,6 +57,7 @@ public class DataCompute {
}
public static List<BindData> buildCellData(Cell cell,Context context) {
context.resetVariableMap();
Value value = cell.getValue();
ValueCompute valueCompute=valueComputesMap.get(value.getType().name());
if(valueCompute!=null){

88
ureport2-core/src/main/java/com/bstek/ureport/dsl/ReportParser.tokens

@ -15,49 +15,53 @@ T__13=14
T__14=15
T__15=16
T__16=17
Cell=18
Operator=19
OP=20
ORDER=21
BOOLEAN=22
COLON=23
COMMA=24
NULL=25
LeftParen=26
RightParen=27
STRING=28
AND=29
OR=30
INTEGER=31
NUMBER=32
EXCLAMATION=33
EXP=34
Identifier=35
LETTER=36
Char=37
DIGIT=38
WS=39
NL=40
T__17=18
T__18=19
Cell=20
Operator=21
OP=22
ORDER=23
BOOLEAN=24
COLON=25
COMMA=26
NULL=27
LeftParen=28
RightParen=29
STRING=30
AND=31
OR=32
INTEGER=33
NUMBER=34
EXCLAMATION=35
EXP=36
Identifier=37
LETTER=38
Char=39
DIGIT=40
WS=41
NL=42
'?'=1
'case'=2
'{'=3
'}'=4
'return'=5
'if'=6
';'=7
'else'=8
'&'=9
'$'=10
'#'=11
'.'=12
'cell'=13
'['=14
']'=15
'to'=16
'@'=17
':'=23
','=24
'null'=25
'('=26
')'=27
'!'=33
'if'=5
'else'=6
'return'=7
';'=8
'var'=9
'='=10
'&'=11
'$'=12
'#'=13
'.'=14
'cell'=15
'['=16
']'=17
'to'=18
'@'=19
':'=25
','=26
'null'=27
'('=28
')'=29
'!'=35

42
ureport2-core/src/main/java/com/bstek/ureport/dsl/ReportParserBaseVisitor.java

@ -11,6 +11,13 @@ import org.antlr.v4.runtime.tree.AbstractParseTreeVisitor;
* operations with no return type.
*/
public class ReportParserBaseVisitor<T> extends AbstractParseTreeVisitor<T> implements ReportParserVisitor<T> {
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitEntry(ReportParserParser.EntryContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
@ -95,6 +102,27 @@ public class ReportParserBaseVisitor<T> extends AbstractParseTreeVisitor<T> impl
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitElsePart(ReportParserParser.ElsePartContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitBlock(ReportParserParser.BlockContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitExprBlock(ReportParserParser.ExprBlockContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitReturnExpr(ReportParserParser.ReturnExprContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
@ -109,6 +137,13 @@ public class ReportParserBaseVisitor<T> extends AbstractParseTreeVisitor<T> impl
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitIfCondition(ReportParserParser.IfConditionContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitVariableAssign(ReportParserParser.VariableAssignContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
@ -137,6 +172,13 @@ public class ReportParserBaseVisitor<T> extends AbstractParseTreeVisitor<T> impl
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitUnit(ReportParserParser.UnitContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitVariable(ReportParserParser.VariableContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*

286
ureport2-core/src/main/java/com/bstek/ureport/dsl/ReportParserLexer.java

@ -19,10 +19,10 @@ public class ReportParserLexer extends Lexer {
public static final int
T__0=1, T__1=2, T__2=3, T__3=4, T__4=5, T__5=6, T__6=7, T__7=8, T__8=9,
T__9=10, T__10=11, T__11=12, T__12=13, T__13=14, T__14=15, T__15=16, T__16=17,
Cell=18, Operator=19, OP=20, ORDER=21, BOOLEAN=22, COLON=23, COMMA=24,
NULL=25, LeftParen=26, RightParen=27, STRING=28, AND=29, OR=30, INTEGER=31,
NUMBER=32, EXCLAMATION=33, EXP=34, Identifier=35, LETTER=36, Char=37,
DIGIT=38, WS=39, NL=40;
T__17=18, T__18=19, Cell=20, Operator=21, OP=22, ORDER=23, BOOLEAN=24,
COLON=25, COMMA=26, NULL=27, LeftParen=28, RightParen=29, STRING=30, AND=31,
OR=32, INTEGER=33, NUMBER=34, EXCLAMATION=35, EXP=36, Identifier=37, LETTER=38,
Char=39, DIGIT=40, WS=41, NL=42;
public static String[] modeNames = {
"DEFAULT_MODE"
};
@ -30,24 +30,24 @@ public class ReportParserLexer extends Lexer {
public static final String[] ruleNames = {
"T__0", "T__1", "T__2", "T__3", "T__4", "T__5", "T__6", "T__7", "T__8",
"T__9", "T__10", "T__11", "T__12", "T__13", "T__14", "T__15", "T__16",
"Cell", "Operator", "OP", "ORDER", "BOOLEAN", "COLON", "COMMA", "NULL",
"LeftParen", "RightParen", "STRING", "AND", "OR", "INTEGER", "NUMBER",
"EXCLAMATION", "EXP", "Identifier", "LETTER", "Char", "DIGIT", "STRING_CONTENT",
"EscapeSequence", "OctalEscape", "UnicodeEscape", "HEX", "StartChar",
"WS", "NL"
"T__17", "T__18", "Cell", "Operator", "OP", "ORDER", "BOOLEAN", "COLON",
"COMMA", "NULL", "LeftParen", "RightParen", "STRING", "AND", "OR", "INTEGER",
"NUMBER", "EXCLAMATION", "EXP", "Identifier", "LETTER", "Char", "DIGIT",
"STRING_CONTENT", "EscapeSequence", "OctalEscape", "UnicodeEscape", "HEX",
"StartChar", "WS", "NL"
};
private static final String[] _LITERAL_NAMES = {
null, "'?'", "'case'", "'{'", "'}'", "'return'", "'if'", "';'", "'else'",
"'&'", "'$'", "'#'", "'.'", "'cell'", "'['", "']'", "'to'", "'@'", null,
null, null, null, null, "':'", "','", "'null'", "'('", "')'", null, null,
null, null, null, "'!'"
null, "'?'", "'case'", "'{'", "'}'", "'if'", "'else'", "'return'", "';'",
"'var'", "'='", "'&'", "'$'", "'#'", "'.'", "'cell'", "'['", "']'", "'to'",
"'@'", null, null, null, null, null, "':'", "','", "'null'", "'('", "')'",
null, null, null, null, null, "'!'"
};
private static final String[] _SYMBOLIC_NAMES = {
null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, "Cell", "Operator", "OP", "ORDER",
"BOOLEAN", "COLON", "COMMA", "NULL", "LeftParen", "RightParen", "STRING",
"AND", "OR", "INTEGER", "NUMBER", "EXCLAMATION", "EXP", "Identifier",
null, null, null, null, null, null, null, null, "Cell", "Operator", "OP",
"ORDER", "BOOLEAN", "COLON", "COMMA", "NULL", "LeftParen", "RightParen",
"STRING", "AND", "OR", "INTEGER", "NUMBER", "EXCLAMATION", "EXP", "Identifier",
"LETTER", "Char", "DIGIT", "WS", "NL"
};
public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES);
@ -105,136 +105,140 @@ public class ReportParserLexer extends Lexer {
public ATN getATN() { return _ATN; }
public static final String _serializedATN =
"\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\2*\u016d\b\1\4\2\t"+
"\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\2,\u0177\b\1\4\2\t"+
"\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13"+
"\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+
"\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+
"\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t\36\4\37\t\37\4 \t \4!"+
"\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\4&\t&\4\'\t\'\4(\t(\4)\t)\4*\t*\4+\t+\4"+
",\t,\4-\t-\4.\t.\4/\t/\3\2\3\2\3\3\3\3\3\3\3\3\3\3\3\4\3\4\3\5\3\5\3\6"+
"\3\6\3\6\3\6\3\6\3\6\3\6\3\7\3\7\3\7\3\b\3\b\3\t\3\t\3\t\3\t\3\t\3\n\3"+
"\n\3\13\3\13\3\f\3\f\3\r\3\r\3\16\3\16\3\16\3\16\3\16\3\17\3\17\3\20\3"+
"\20\3\21\3\21\3\21\3\22\3\22\3\23\3\23\6\23\u0094\n\23\r\23\16\23\u0095"+
"\3\24\3\24\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25"+
"\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25"+
"\3\25\3\25\5\25\u00b6\n\25\3\26\3\26\3\26\3\26\3\26\3\26\3\26\5\26\u00bf"+
"\n\26\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\5\27\u00ca\n\27\3\30"+
"\3\30\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\33\3\33\3\34\3\34\3\35\3\35"+
"\3\35\3\35\3\35\3\35\3\35\3\35\5\35\u00e1\n\35\3\36\3\36\3\36\3\36\3\36"+
"\5\36\u00e8\n\36\3\37\3\37\3\37\3\37\5\37\u00ee\n\37\3 \5 \u00f1\n \3"+
" \6 \u00f4\n \r \16 \u00f5\3!\5!\u00f9\n!\3!\6!\u00fc\n!\r!\16!\u00fd"+
"\3!\3!\6!\u0102\n!\r!\16!\u0103\3!\5!\u0107\n!\3!\5!\u010a\n!\3!\6!\u010d"+
"\n!\r!\16!\u010e\3!\3!\3!\5!\u0114\n!\3!\6!\u0117\n!\r!\16!\u0118\5!\u011b"+
"\n!\3\"\3\"\3#\3#\5#\u0121\n#\3#\6#\u0124\n#\r#\16#\u0125\3$\3$\7$\u012a"+
"\n$\f$\16$\u012d\13$\3%\6%\u0130\n%\r%\16%\u0131\3&\3&\3&\3&\5&\u0138"+
"\n&\3\'\3\'\3(\3(\7(\u013e\n(\f(\16(\u0141\13(\3)\3)\3)\3)\5)\u0147\n"+
")\3*\3*\3*\3*\3*\3*\3*\3*\3*\5*\u0152\n*\3+\3+\3+\3+\3+\3+\3+\3,\3,\3"+
"-\5-\u015e\n-\3.\6.\u0161\n.\r.\16.\u0162\3.\3.\3/\5/\u0168\n/\3/\3/\3"+
"/\3/\2\2\60\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f\27\r\31\16\33"+
"\17\35\20\37\21!\22#\23%\24\'\25)\26+\27-\30/\31\61\32\63\33\65\34\67"+
"\359\36;\37= ?!A\"C#E$G%I&K\'M(O\2Q\2S\2U\2W\2Y\2[)]*\3\2\17\6\2\'\',"+
"-//\61\61\4\2>>@@\4\2GGgg\4\2--//\3\2C\\\4\2//aa\5\2\u00b9\u00b9\u0302"+
"\u0371\u2041\u2042\3\2\62;\4\2$$))\n\2$$))^^ddhhppttvv\5\2\62;CHch\t\2"+
"C\\c|\u2072\u2191\u2c02\u2ff1\u3003\ud801\uf902\ufdd1\ufdf2\uffff\5\2"+
"\13\f\17\17\"\"\u018f\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2\2\2\t\3\2\2\2"+
"\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21\3\2\2\2\2\23\3\2\2\2\2\25"+
"\3\2\2\2\2\27\3\2\2\2\2\31\3\2\2\2\2\33\3\2\2\2\2\35\3\2\2\2\2\37\3\2"+
"\2\2\2!\3\2\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2\2\2\2+\3\2\2"+
"\2\2-\3\2\2\2\2/\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2\2\2\65\3\2\2\2\2\67\3"+
"\2\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2\2\2\2A\3\2\2\2\2C\3\2\2"+
"\2\2E\3\2\2\2\2G\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2M\3\2\2\2\2[\3\2\2\2\2"+
"]\3\2\2\2\3_\3\2\2\2\5a\3\2\2\2\7f\3\2\2\2\th\3\2\2\2\13j\3\2\2\2\rq\3"+
"\2\2\2\17t\3\2\2\2\21v\3\2\2\2\23{\3\2\2\2\25}\3\2\2\2\27\177\3\2\2\2"+
"\31\u0081\3\2\2\2\33\u0083\3\2\2\2\35\u0088\3\2\2\2\37\u008a\3\2\2\2!"+
"\u008c\3\2\2\2#\u008f\3\2\2\2%\u0091\3\2\2\2\'\u0097\3\2\2\2)\u00b5\3"+
"\2\2\2+\u00be\3\2\2\2-\u00c9\3\2\2\2/\u00cb\3\2\2\2\61\u00cd\3\2\2\2\63"+
"\u00cf\3\2\2\2\65\u00d4\3\2\2\2\67\u00d6\3\2\2\29\u00e0\3\2\2\2;\u00e7"+
"\3\2\2\2=\u00ed\3\2\2\2?\u00f0\3\2\2\2A\u011a\3\2\2\2C\u011c\3\2\2\2E"+
"\u011e\3\2\2\2G\u0127\3\2\2\2I\u012f\3\2\2\2K\u0137\3\2\2\2M\u0139\3\2"+
"\2\2O\u013f\3\2\2\2Q\u0146\3\2\2\2S\u0151\3\2\2\2U\u0153\3\2\2\2W\u015a"+
"\3\2\2\2Y\u015d\3\2\2\2[\u0160\3\2\2\2]\u0167\3\2\2\2_`\7A\2\2`\4\3\2"+
"\2\2ab\7e\2\2bc\7c\2\2cd\7u\2\2de\7g\2\2e\6\3\2\2\2fg\7}\2\2g\b\3\2\2"+
"\2hi\7\177\2\2i\n\3\2\2\2jk\7t\2\2kl\7g\2\2lm\7v\2\2mn\7w\2\2no\7t\2\2"+
"op\7p\2\2p\f\3\2\2\2qr\7k\2\2rs\7h\2\2s\16\3\2\2\2tu\7=\2\2u\20\3\2\2"+
"\2vw\7g\2\2wx\7n\2\2xy\7u\2\2yz\7g\2\2z\22\3\2\2\2{|\7(\2\2|\24\3\2\2"+
"\2}~\7&\2\2~\26\3\2\2\2\177\u0080\7%\2\2\u0080\30\3\2\2\2\u0081\u0082"+
"\7\60\2\2\u0082\32\3\2\2\2\u0083\u0084\7e\2\2\u0084\u0085\7g\2\2\u0085"+
"\u0086\7n\2\2\u0086\u0087\7n\2\2\u0087\34\3\2\2\2\u0088\u0089\7]\2\2\u0089"+
"\36\3\2\2\2\u008a\u008b\7_\2\2\u008b \3\2\2\2\u008c\u008d\7v\2\2\u008d"+
"\u008e\7q\2\2\u008e\"\3\2\2\2\u008f\u0090\7B\2\2\u0090$\3\2\2\2\u0091"+
"\u0093\5I%\2\u0092\u0094\5M\'\2\u0093\u0092\3\2\2\2\u0094\u0095\3\2\2"+
"\2\u0095\u0093\3\2\2\2\u0095\u0096\3\2\2\2\u0096&\3\2\2\2\u0097\u0098"+
"\t\2\2\2\u0098(\3\2\2\2\u0099\u00b6\t\3\2\2\u009a\u009b\7?\2\2\u009b\u00b6"+
"\7?\2\2\u009c\u009d\7#\2\2\u009d\u00b6\7?\2\2\u009e\u009f\7@\2\2\u009f"+
"\u00b6\7?\2\2\u00a0\u00a1\7>\2\2\u00a1\u00b6\7?\2\2\u00a2\u00a3\7k\2\2"+
"\u00a3\u00b6\7p\2\2\u00a4\u00a5\7p\2\2\u00a5\u00a6\7q\2\2\u00a6\u00a7"+
"\7v\2\2\u00a7\u00a8\7\"\2\2\u00a8\u00a9\7k\2\2\u00a9\u00b6\7p\2\2\u00aa"+
"\u00ab\7p\2\2\u00ab\u00ac\7q\2\2\u00ac\u00ad\7v\2\2\u00ad\u00ae\7\"\2"+
"\2\u00ae\u00af\7\"\2\2\u00af\u00b0\7k\2\2\u00b0\u00b6\7p\2\2\u00b1\u00b2"+
"\7n\2\2\u00b2\u00b3\7k\2\2\u00b3\u00b4\7m\2\2\u00b4\u00b6\7g\2\2\u00b5"+
"\u0099\3\2\2\2\u00b5\u009a\3\2\2\2\u00b5\u009c\3\2\2\2\u00b5\u009e\3\2"+
"\2\2\u00b5\u00a0\3\2\2\2\u00b5\u00a2\3\2\2\2\u00b5\u00a4\3\2\2\2\u00b5"+
"\u00aa\3\2\2\2\u00b5\u00b1\3\2\2\2\u00b6*\3\2\2\2\u00b7\u00b8\7f\2\2\u00b8"+
"\u00b9\7g\2\2\u00b9\u00ba\7u\2\2\u00ba\u00bf\7e\2\2\u00bb\u00bc\7c\2\2"+
"\u00bc\u00bd\7u\2\2\u00bd\u00bf\7e\2\2\u00be\u00b7\3\2\2\2\u00be\u00bb"+
"\3\2\2\2\u00bf,\3\2\2\2\u00c0\u00c1\7v\2\2\u00c1\u00c2\7t\2\2\u00c2\u00c3"+
"\7w\2\2\u00c3\u00ca\7g\2\2\u00c4\u00c5\7h\2\2\u00c5\u00c6\7c\2\2\u00c6"+
"\u00c7\7n\2\2\u00c7\u00c8\7u\2\2\u00c8\u00ca\7g\2\2\u00c9\u00c0\3\2\2"+
"\2\u00c9\u00c4\3\2\2\2\u00ca.\3\2\2\2\u00cb\u00cc\7<\2\2\u00cc\60\3\2"+
"\2\2\u00cd\u00ce\7.\2\2\u00ce\62\3\2\2\2\u00cf\u00d0\7p\2\2\u00d0\u00d1"+
"\7w\2\2\u00d1\u00d2\7n\2\2\u00d2\u00d3\7n\2\2\u00d3\64\3\2\2\2\u00d4\u00d5"+
"\7*\2\2\u00d5\66\3\2\2\2\u00d6\u00d7\7+\2\2\u00d78\3\2\2\2\u00d8\u00d9"+
"\7$\2\2\u00d9\u00da\5O(\2\u00da\u00db\7$\2\2\u00db\u00e1\3\2\2\2\u00dc"+
"\u00dd\7)\2\2\u00dd\u00de\5O(\2\u00de\u00df\7)\2\2\u00df\u00e1\3\2\2\2"+
"\u00e0\u00d8\3\2\2\2\u00e0\u00dc\3\2\2\2\u00e1:\3\2\2\2\u00e2\u00e3\7"+
"c\2\2\u00e3\u00e4\7p\2\2\u00e4\u00e8\7f\2\2\u00e5\u00e6\7(\2\2\u00e6\u00e8"+
"\7(\2\2\u00e7\u00e2\3\2\2\2\u00e7\u00e5\3\2\2\2\u00e8<\3\2\2\2\u00e9\u00ea"+
"\7q\2\2\u00ea\u00ee\7t\2\2\u00eb\u00ec\7~\2\2\u00ec\u00ee\7~\2\2\u00ed"+
"\u00e9\3\2\2\2\u00ed\u00eb\3\2\2\2\u00ee>\3\2\2\2\u00ef\u00f1\7/\2\2\u00f0"+
"\u00ef\3\2\2\2\u00f0\u00f1\3\2\2\2\u00f1\u00f3\3\2\2\2\u00f2\u00f4\5M"+
"\'\2\u00f3\u00f2\3\2\2\2\u00f4\u00f5\3\2\2\2\u00f5\u00f3\3\2\2\2\u00f5"+
"\u00f6\3\2\2\2\u00f6@\3\2\2\2\u00f7\u00f9\7/\2\2\u00f8\u00f7\3\2\2\2\u00f8"+
"\u00f9\3\2\2\2\u00f9\u00fb\3\2\2\2\u00fa\u00fc\5M\'\2\u00fb\u00fa\3\2"+
"\2\2\u00fc\u00fd\3\2\2\2\u00fd\u00fb\3\2\2\2\u00fd\u00fe\3\2\2\2\u00fe"+
"\u00ff\3\2\2\2\u00ff\u0101\7\60\2\2\u0100\u0102\5M\'\2\u0101\u0100\3\2"+
"\2\2\u0102\u0103\3\2\2\2\u0103\u0101\3\2\2\2\u0103\u0104\3\2\2\2\u0104"+
"\u0106\3\2\2\2\u0105\u0107\5E#\2\u0106\u0105\3\2\2\2\u0106\u0107\3\2\2"+
"\2\u0107\u011b\3\2\2\2\u0108\u010a\7/\2\2\u0109\u0108\3\2\2\2\u0109\u010a"+
"\3\2\2\2\u010a\u010c\3\2\2\2\u010b\u010d\5M\'\2\u010c\u010b\3\2\2\2\u010d"+
"\u010e\3\2\2\2\u010e\u010c\3\2\2\2\u010e\u010f\3\2\2\2\u010f\u0110\3\2"+
"\2\2\u0110\u0111\5E#\2\u0111\u011b\3\2\2\2\u0112\u0114\7/\2\2\u0113\u0112"+
"\3\2\2\2\u0113\u0114\3\2\2\2\u0114\u0116\3\2\2\2\u0115\u0117\5M\'\2\u0116"+
"\u0115\3\2\2\2\u0117\u0118\3\2\2\2\u0118\u0116\3\2\2\2\u0118\u0119\3\2"+
"\2\2\u0119\u011b\3\2\2\2\u011a\u00f8\3\2\2\2\u011a\u0109\3\2\2\2\u011a"+
"\u0113\3\2\2\2\u011bB\3\2\2\2\u011c\u011d\7#\2\2\u011dD\3\2\2\2\u011e"+
"\u0120\t\4\2\2\u011f\u0121\t\5\2\2\u0120\u011f\3\2\2\2\u0120\u0121\3\2"+
"\2\2\u0121\u0123\3\2\2\2\u0122\u0124\5M\'\2\u0123\u0122\3\2\2\2\u0124"+
"\u0125\3\2\2\2\u0125\u0123\3\2\2\2\u0125\u0126\3\2\2\2\u0126F\3\2\2\2"+
"\u0127\u012b\5Y-\2\u0128\u012a\5K&\2\u0129\u0128\3\2\2\2\u012a\u012d\3"+
"\2\2\2\u012b\u0129\3\2\2\2\u012b\u012c\3\2\2\2\u012cH\3\2\2\2\u012d\u012b"+
"\3\2\2\2\u012e\u0130\t\6\2\2\u012f\u012e\3\2\2\2\u0130\u0131\3\2\2\2\u0131"+
"\u012f\3\2\2\2\u0131\u0132\3\2\2\2\u0132J\3\2\2\2\u0133\u0138\5Y-\2\u0134"+
"\u0138\t\7\2\2\u0135\u0138\5M\'\2\u0136\u0138\t\b\2\2\u0137\u0133\3\2"+
"\2\2\u0137\u0134\3\2\2\2\u0137\u0135\3\2\2\2\u0137\u0136\3\2\2\2\u0138"+
"L\3\2\2\2\u0139\u013a\t\t\2\2\u013aN\3\2\2\2\u013b\u013e\5Q)\2\u013c\u013e"+
"\n\n\2\2\u013d\u013b\3\2\2\2\u013d\u013c\3\2\2\2\u013e\u0141\3\2\2\2\u013f"+
"\u013d\3\2\2\2\u013f\u0140\3\2\2\2\u0140P\3\2\2\2\u0141\u013f\3\2\2\2"+
"\u0142\u0143\7^\2\2\u0143\u0147\t\13\2\2\u0144\u0147\5U+\2\u0145\u0147"+
"\5S*\2\u0146\u0142\3\2\2\2\u0146\u0144\3\2\2\2\u0146\u0145\3\2\2\2\u0147"+
"R\3\2\2\2\u0148\u0149\7^\2\2\u0149\u014a\4\62\65\2\u014a\u014b\4\629\2"+
"\u014b\u0152\4\629\2\u014c\u014d\7^\2\2\u014d\u014e\4\629\2\u014e\u0152"+
"\4\629\2\u014f\u0150\7^\2\2\u0150\u0152\4\629\2\u0151\u0148\3\2\2\2\u0151"+
"\u014c\3\2\2\2\u0151\u014f\3\2\2\2\u0152T\3\2\2\2\u0153\u0154\7^\2\2\u0154"+
"\u0155\7w\2\2\u0155\u0156\5W,\2\u0156\u0157\5W,\2\u0157\u0158\5W,\2\u0158"+
"\u0159\5W,\2\u0159V\3\2\2\2\u015a\u015b\t\f\2\2\u015bX\3\2\2\2\u015c\u015e"+
"\t\r\2\2\u015d\u015c\3\2\2\2\u015eZ\3\2\2\2\u015f\u0161\t\16\2\2\u0160"+
"\u015f\3\2\2\2\u0161\u0162\3\2\2\2\u0162\u0160\3\2\2\2\u0162\u0163\3\2"+
"\2\2\u0163\u0164\3\2\2\2\u0164\u0165\b.\2\2\u0165\\\3\2\2\2\u0166\u0168"+
"\7\17\2\2\u0167\u0166\3\2\2\2\u0167\u0168\3\2\2\2\u0168\u0169\3\2\2\2"+
"\u0169\u016a\7\f\2\2\u016a\u016b\3\2\2\2\u016b\u016c\b/\2\2\u016c^\3\2"+
"\2\2!\2\u0095\u00b5\u00be\u00c9\u00e0\u00e7\u00ed\u00f0\u00f5\u00f8\u00fd"+
"\u0103\u0106\u0109\u010e\u0113\u0118\u011a\u0120\u0125\u012b\u0131\u0137"+
"\u013d\u013f\u0146\u0151\u015d\u0162\u0167\3\2\3\2";
",\t,\4-\t-\4.\t.\4/\t/\4\60\t\60\4\61\t\61\3\2\3\2\3\3\3\3\3\3\3\3\3\3"+
"\3\4\3\4\3\5\3\5\3\6\3\6\3\6\3\7\3\7\3\7\3\7\3\7\3\b\3\b\3\b\3\b\3\b\3"+
"\b\3\b\3\t\3\t\3\n\3\n\3\n\3\n\3\13\3\13\3\f\3\f\3\r\3\r\3\16\3\16\3\17"+
"\3\17\3\20\3\20\3\20\3\20\3\20\3\21\3\21\3\22\3\22\3\23\3\23\3\23\3\24"+
"\3\24\3\25\3\25\6\25\u009e\n\25\r\25\16\25\u009f\3\26\3\26\3\27\3\27\3"+
"\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3"+
"\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\5\27\u00c0"+
"\n\27\3\30\3\30\3\30\3\30\3\30\3\30\3\30\5\30\u00c9\n\30\3\31\3\31\3\31"+
"\3\31\3\31\3\31\3\31\3\31\3\31\5\31\u00d4\n\31\3\32\3\32\3\33\3\33\3\34"+
"\3\34\3\34\3\34\3\34\3\35\3\35\3\36\3\36\3\37\3\37\3\37\3\37\3\37\3\37"+
"\3\37\3\37\5\37\u00eb\n\37\3 \3 \3 \3 \3 \5 \u00f2\n \3!\3!\3!\3!\5!\u00f8"+
"\n!\3\"\5\"\u00fb\n\"\3\"\6\"\u00fe\n\"\r\"\16\"\u00ff\3#\5#\u0103\n#"+
"\3#\6#\u0106\n#\r#\16#\u0107\3#\3#\6#\u010c\n#\r#\16#\u010d\3#\5#\u0111"+
"\n#\3#\5#\u0114\n#\3#\6#\u0117\n#\r#\16#\u0118\3#\3#\3#\5#\u011e\n#\3"+
"#\6#\u0121\n#\r#\16#\u0122\5#\u0125\n#\3$\3$\3%\3%\5%\u012b\n%\3%\6%\u012e"+
"\n%\r%\16%\u012f\3&\3&\7&\u0134\n&\f&\16&\u0137\13&\3\'\6\'\u013a\n\'"+
"\r\'\16\'\u013b\3(\3(\3(\3(\5(\u0142\n(\3)\3)\3*\3*\7*\u0148\n*\f*\16"+
"*\u014b\13*\3+\3+\3+\3+\5+\u0151\n+\3,\3,\3,\3,\3,\3,\3,\3,\3,\5,\u015c"+
"\n,\3-\3-\3-\3-\3-\3-\3-\3.\3.\3/\5/\u0168\n/\3\60\6\60\u016b\n\60\r\60"+
"\16\60\u016c\3\60\3\60\3\61\5\61\u0172\n\61\3\61\3\61\3\61\3\61\2\2\62"+
"\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f\27\r\31\16\33\17\35\20"+
"\37\21!\22#\23%\24\'\25)\26+\27-\30/\31\61\32\63\33\65\34\67\359\36;\37"+
"= ?!A\"C#E$G%I&K\'M(O)Q*S\2U\2W\2Y\2[\2]\2_+a,\3\2\17\6\2\'\',-//\61\61"+
"\4\2>>@@\4\2GGgg\4\2--//\3\2C\\\4\2//aa\5\2\u00b9\u00b9\u0302\u0371\u2041"+
"\u2042\3\2\62;\4\2$$))\n\2$$))^^ddhhppttvv\5\2\62;CHch\t\2C\\c|\u2072"+
"\u2191\u2c02\u2ff1\u3003\ud801\uf902\ufdd1\ufdf2\uffff\5\2\13\f\17\17"+
"\"\"\u0199\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2\2"+
"\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21\3\2\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2\27"+
"\3\2\2\2\2\31\3\2\2\2\2\33\3\2\2\2\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2\2"+
"\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2\2\2"+
"\2/\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2\2\2\65\3\2\2\2\2\67\3\2\2\2\29\3\2"+
"\2\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2\2\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2"+
"\2G\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2_"+
"\3\2\2\2\2a\3\2\2\2\3c\3\2\2\2\5e\3\2\2\2\7j\3\2\2\2\tl\3\2\2\2\13n\3"+
"\2\2\2\rq\3\2\2\2\17v\3\2\2\2\21}\3\2\2\2\23\177\3\2\2\2\25\u0083\3\2"+
"\2\2\27\u0085\3\2\2\2\31\u0087\3\2\2\2\33\u0089\3\2\2\2\35\u008b\3\2\2"+
"\2\37\u008d\3\2\2\2!\u0092\3\2\2\2#\u0094\3\2\2\2%\u0096\3\2\2\2\'\u0099"+
"\3\2\2\2)\u009b\3\2\2\2+\u00a1\3\2\2\2-\u00bf\3\2\2\2/\u00c8\3\2\2\2\61"+
"\u00d3\3\2\2\2\63\u00d5\3\2\2\2\65\u00d7\3\2\2\2\67\u00d9\3\2\2\29\u00de"+
"\3\2\2\2;\u00e0\3\2\2\2=\u00ea\3\2\2\2?\u00f1\3\2\2\2A\u00f7\3\2\2\2C"+
"\u00fa\3\2\2\2E\u0124\3\2\2\2G\u0126\3\2\2\2I\u0128\3\2\2\2K\u0131\3\2"+
"\2\2M\u0139\3\2\2\2O\u0141\3\2\2\2Q\u0143\3\2\2\2S\u0149\3\2\2\2U\u0150"+
"\3\2\2\2W\u015b\3\2\2\2Y\u015d\3\2\2\2[\u0164\3\2\2\2]\u0167\3\2\2\2_"+
"\u016a\3\2\2\2a\u0171\3\2\2\2cd\7A\2\2d\4\3\2\2\2ef\7e\2\2fg\7c\2\2gh"+
"\7u\2\2hi\7g\2\2i\6\3\2\2\2jk\7}\2\2k\b\3\2\2\2lm\7\177\2\2m\n\3\2\2\2"+
"no\7k\2\2op\7h\2\2p\f\3\2\2\2qr\7g\2\2rs\7n\2\2st\7u\2\2tu\7g\2\2u\16"+
"\3\2\2\2vw\7t\2\2wx\7g\2\2xy\7v\2\2yz\7w\2\2z{\7t\2\2{|\7p\2\2|\20\3\2"+
"\2\2}~\7=\2\2~\22\3\2\2\2\177\u0080\7x\2\2\u0080\u0081\7c\2\2\u0081\u0082"+
"\7t\2\2\u0082\24\3\2\2\2\u0083\u0084\7?\2\2\u0084\26\3\2\2\2\u0085\u0086"+
"\7(\2\2\u0086\30\3\2\2\2\u0087\u0088\7&\2\2\u0088\32\3\2\2\2\u0089\u008a"+
"\7%\2\2\u008a\34\3\2\2\2\u008b\u008c\7\60\2\2\u008c\36\3\2\2\2\u008d\u008e"+
"\7e\2\2\u008e\u008f\7g\2\2\u008f\u0090\7n\2\2\u0090\u0091\7n\2\2\u0091"+
" \3\2\2\2\u0092\u0093\7]\2\2\u0093\"\3\2\2\2\u0094\u0095\7_\2\2\u0095"+
"$\3\2\2\2\u0096\u0097\7v\2\2\u0097\u0098\7q\2\2\u0098&\3\2\2\2\u0099\u009a"+
"\7B\2\2\u009a(\3\2\2\2\u009b\u009d\5M\'\2\u009c\u009e\5Q)\2\u009d\u009c"+
"\3\2\2\2\u009e\u009f\3\2\2\2\u009f\u009d\3\2\2\2\u009f\u00a0\3\2\2\2\u00a0"+
"*\3\2\2\2\u00a1\u00a2\t\2\2\2\u00a2,\3\2\2\2\u00a3\u00c0\t\3\2\2\u00a4"+
"\u00a5\7?\2\2\u00a5\u00c0\7?\2\2\u00a6\u00a7\7#\2\2\u00a7\u00c0\7?\2\2"+
"\u00a8\u00a9\7@\2\2\u00a9\u00c0\7?\2\2\u00aa\u00ab\7>\2\2\u00ab\u00c0"+
"\7?\2\2\u00ac\u00ad\7k\2\2\u00ad\u00c0\7p\2\2\u00ae\u00af\7p\2\2\u00af"+
"\u00b0\7q\2\2\u00b0\u00b1\7v\2\2\u00b1\u00b2\7\"\2\2\u00b2\u00b3\7k\2"+
"\2\u00b3\u00c0\7p\2\2\u00b4\u00b5\7p\2\2\u00b5\u00b6\7q\2\2\u00b6\u00b7"+
"\7v\2\2\u00b7\u00b8\7\"\2\2\u00b8\u00b9\7\"\2\2\u00b9\u00ba\7k\2\2\u00ba"+
"\u00c0\7p\2\2\u00bb\u00bc\7n\2\2\u00bc\u00bd\7k\2\2\u00bd\u00be\7m\2\2"+
"\u00be\u00c0\7g\2\2\u00bf\u00a3\3\2\2\2\u00bf\u00a4\3\2\2\2\u00bf\u00a6"+
"\3\2\2\2\u00bf\u00a8\3\2\2\2\u00bf\u00aa\3\2\2\2\u00bf\u00ac\3\2\2\2\u00bf"+
"\u00ae\3\2\2\2\u00bf\u00b4\3\2\2\2\u00bf\u00bb\3\2\2\2\u00c0.\3\2\2\2"+
"\u00c1\u00c2\7f\2\2\u00c2\u00c3\7g\2\2\u00c3\u00c4\7u\2\2\u00c4\u00c9"+
"\7e\2\2\u00c5\u00c6\7c\2\2\u00c6\u00c7\7u\2\2\u00c7\u00c9\7e\2\2\u00c8"+
"\u00c1\3\2\2\2\u00c8\u00c5\3\2\2\2\u00c9\60\3\2\2\2\u00ca\u00cb\7v\2\2"+
"\u00cb\u00cc\7t\2\2\u00cc\u00cd\7w\2\2\u00cd\u00d4\7g\2\2\u00ce\u00cf"+
"\7h\2\2\u00cf\u00d0\7c\2\2\u00d0\u00d1\7n\2\2\u00d1\u00d2\7u\2\2\u00d2"+
"\u00d4\7g\2\2\u00d3\u00ca\3\2\2\2\u00d3\u00ce\3\2\2\2\u00d4\62\3\2\2\2"+
"\u00d5\u00d6\7<\2\2\u00d6\64\3\2\2\2\u00d7\u00d8\7.\2\2\u00d8\66\3\2\2"+
"\2\u00d9\u00da\7p\2\2\u00da\u00db\7w\2\2\u00db\u00dc\7n\2\2\u00dc\u00dd"+
"\7n\2\2\u00dd8\3\2\2\2\u00de\u00df\7*\2\2\u00df:\3\2\2\2\u00e0\u00e1\7"+
"+\2\2\u00e1<\3\2\2\2\u00e2\u00e3\7$\2\2\u00e3\u00e4\5S*\2\u00e4\u00e5"+
"\7$\2\2\u00e5\u00eb\3\2\2\2\u00e6\u00e7\7)\2\2\u00e7\u00e8\5S*\2\u00e8"+
"\u00e9\7)\2\2\u00e9\u00eb\3\2\2\2\u00ea\u00e2\3\2\2\2\u00ea\u00e6\3\2"+
"\2\2\u00eb>\3\2\2\2\u00ec\u00ed\7c\2\2\u00ed\u00ee\7p\2\2\u00ee\u00f2"+
"\7f\2\2\u00ef\u00f0\7(\2\2\u00f0\u00f2\7(\2\2\u00f1\u00ec\3\2\2\2\u00f1"+
"\u00ef\3\2\2\2\u00f2@\3\2\2\2\u00f3\u00f4\7q\2\2\u00f4\u00f8\7t\2\2\u00f5"+
"\u00f6\7~\2\2\u00f6\u00f8\7~\2\2\u00f7\u00f3\3\2\2\2\u00f7\u00f5\3\2\2"+
"\2\u00f8B\3\2\2\2\u00f9\u00fb\7/\2\2\u00fa\u00f9\3\2\2\2\u00fa\u00fb\3"+
"\2\2\2\u00fb\u00fd\3\2\2\2\u00fc\u00fe\5Q)\2\u00fd\u00fc\3\2\2\2\u00fe"+
"\u00ff\3\2\2\2\u00ff\u00fd\3\2\2\2\u00ff\u0100\3\2\2\2\u0100D\3\2\2\2"+
"\u0101\u0103\7/\2\2\u0102\u0101\3\2\2\2\u0102\u0103\3\2\2\2\u0103\u0105"+
"\3\2\2\2\u0104\u0106\5Q)\2\u0105\u0104\3\2\2\2\u0106\u0107\3\2\2\2\u0107"+
"\u0105\3\2\2\2\u0107\u0108\3\2\2\2\u0108\u0109\3\2\2\2\u0109\u010b\7\60"+
"\2\2\u010a\u010c\5Q)\2\u010b\u010a\3\2\2\2\u010c\u010d\3\2\2\2\u010d\u010b"+
"\3\2\2\2\u010d\u010e\3\2\2\2\u010e\u0110\3\2\2\2\u010f\u0111\5I%\2\u0110"+
"\u010f\3\2\2\2\u0110\u0111\3\2\2\2\u0111\u0125\3\2\2\2\u0112\u0114\7/"+
"\2\2\u0113\u0112\3\2\2\2\u0113\u0114\3\2\2\2\u0114\u0116\3\2\2\2\u0115"+
"\u0117\5Q)\2\u0116\u0115\3\2\2\2\u0117\u0118\3\2\2\2\u0118\u0116\3\2\2"+
"\2\u0118\u0119\3\2\2\2\u0119\u011a\3\2\2\2\u011a\u011b\5I%\2\u011b\u0125"+
"\3\2\2\2\u011c\u011e\7/\2\2\u011d\u011c\3\2\2\2\u011d\u011e\3\2\2\2\u011e"+
"\u0120\3\2\2\2\u011f\u0121\5Q)\2\u0120\u011f\3\2\2\2\u0121\u0122\3\2\2"+
"\2\u0122\u0120\3\2\2\2\u0122\u0123\3\2\2\2\u0123\u0125\3\2\2\2\u0124\u0102"+
"\3\2\2\2\u0124\u0113\3\2\2\2\u0124\u011d\3\2\2\2\u0125F\3\2\2\2\u0126"+
"\u0127\7#\2\2\u0127H\3\2\2\2\u0128\u012a\t\4\2\2\u0129\u012b\t\5\2\2\u012a"+
"\u0129\3\2\2\2\u012a\u012b\3\2\2\2\u012b\u012d\3\2\2\2\u012c\u012e\5Q"+
")\2\u012d\u012c\3\2\2\2\u012e\u012f\3\2\2\2\u012f\u012d\3\2\2\2\u012f"+
"\u0130\3\2\2\2\u0130J\3\2\2\2\u0131\u0135\5]/\2\u0132\u0134\5O(\2\u0133"+
"\u0132\3\2\2\2\u0134\u0137\3\2\2\2\u0135\u0133\3\2\2\2\u0135\u0136\3\2"+
"\2\2\u0136L\3\2\2\2\u0137\u0135\3\2\2\2\u0138\u013a\t\6\2\2\u0139\u0138"+
"\3\2\2\2\u013a\u013b\3\2\2\2\u013b\u0139\3\2\2\2\u013b\u013c\3\2\2\2\u013c"+
"N\3\2\2\2\u013d\u0142\5]/\2\u013e\u0142\t\7\2\2\u013f\u0142\5Q)\2\u0140"+
"\u0142\t\b\2\2\u0141\u013d\3\2\2\2\u0141\u013e\3\2\2\2\u0141\u013f\3\2"+
"\2\2\u0141\u0140\3\2\2\2\u0142P\3\2\2\2\u0143\u0144\t\t\2\2\u0144R\3\2"+
"\2\2\u0145\u0148\5U+\2\u0146\u0148\n\n\2\2\u0147\u0145\3\2\2\2\u0147\u0146"+
"\3\2\2\2\u0148\u014b\3\2\2\2\u0149\u0147\3\2\2\2\u0149\u014a\3\2\2\2\u014a"+
"T\3\2\2\2\u014b\u0149\3\2\2\2\u014c\u014d\7^\2\2\u014d\u0151\t\13\2\2"+
"\u014e\u0151\5Y-\2\u014f\u0151\5W,\2\u0150\u014c\3\2\2\2\u0150\u014e\3"+
"\2\2\2\u0150\u014f\3\2\2\2\u0151V\3\2\2\2\u0152\u0153\7^\2\2\u0153\u0154"+
"\4\62\65\2\u0154\u0155\4\629\2\u0155\u015c\4\629\2\u0156\u0157\7^\2\2"+
"\u0157\u0158\4\629\2\u0158\u015c\4\629\2\u0159\u015a\7^\2\2\u015a\u015c"+
"\4\629\2\u015b\u0152\3\2\2\2\u015b\u0156\3\2\2\2\u015b\u0159\3\2\2\2\u015c"+
"X\3\2\2\2\u015d\u015e\7^\2\2\u015e\u015f\7w\2\2\u015f\u0160\5[.\2\u0160"+
"\u0161\5[.\2\u0161\u0162\5[.\2\u0162\u0163\5[.\2\u0163Z\3\2\2\2\u0164"+
"\u0165\t\f\2\2\u0165\\\3\2\2\2\u0166\u0168\t\r\2\2\u0167\u0166\3\2\2\2"+
"\u0168^\3\2\2\2\u0169\u016b\t\16\2\2\u016a\u0169\3\2\2\2\u016b\u016c\3"+
"\2\2\2\u016c\u016a\3\2\2\2\u016c\u016d\3\2\2\2\u016d\u016e\3\2\2\2\u016e"+
"\u016f\b\60\2\2\u016f`\3\2\2\2\u0170\u0172\7\17\2\2\u0171\u0170\3\2\2"+
"\2\u0171\u0172\3\2\2\2\u0172\u0173\3\2\2\2\u0173\u0174\7\f\2\2\u0174\u0175"+
"\3\2\2\2\u0175\u0176\b\61\2\2\u0176b\3\2\2\2!\2\u009f\u00bf\u00c8\u00d3"+
"\u00ea\u00f1\u00f7\u00fa\u00ff\u0102\u0107\u010d\u0110\u0113\u0118\u011d"+
"\u0122\u0124\u012a\u012f\u0135\u013b\u0141\u0147\u0149\u0150\u015b\u0167"+
"\u016c\u0171\3\2\3\2";
public static final ATN _ATN =
new ATNDeserializer().deserialize(_serializedATN.toCharArray());
static {

88
ureport2-core/src/main/java/com/bstek/ureport/dsl/ReportParserLexer.tokens

@ -15,49 +15,53 @@ T__13=14
T__14=15
T__15=16
T__16=17
Cell=18
Operator=19
OP=20
ORDER=21
BOOLEAN=22
COLON=23
COMMA=24
NULL=25
LeftParen=26
RightParen=27
STRING=28
AND=29
OR=30
INTEGER=31
NUMBER=32
EXCLAMATION=33
EXP=34
Identifier=35
LETTER=36
Char=37
DIGIT=38
WS=39
NL=40
T__17=18
T__18=19
Cell=20
Operator=21
OP=22
ORDER=23
BOOLEAN=24
COLON=25
COMMA=26
NULL=27
LeftParen=28
RightParen=29
STRING=30
AND=31
OR=32
INTEGER=33
NUMBER=34
EXCLAMATION=35
EXP=36
Identifier=37
LETTER=38
Char=39
DIGIT=40
WS=41
NL=42
'?'=1
'case'=2
'{'=3
'}'=4
'return'=5
'if'=6
';'=7
'else'=8
'&'=9
'$'=10
'#'=11
'.'=12
'cell'=13
'['=14
']'=15
'to'=16
'@'=17
':'=23
','=24
'null'=25
'('=26
')'=27
'!'=33
'if'=5
'else'=6
'return'=7
';'=8
'var'=9
'='=10
'&'=11
'$'=12
'#'=13
'.'=14
'cell'=15
'['=16
']'=17
'to'=18
'@'=19
':'=25
','=26
'null'=27
'('=28
')'=29
'!'=35

1451
ureport2-core/src/main/java/com/bstek/ureport/dsl/ReportParserParser.java

Plik diff jest za duży

36
ureport2-core/src/main/java/com/bstek/ureport/dsl/ReportParserVisitor.java

@ -10,6 +10,12 @@ import org.antlr.v4.runtime.tree.ParseTreeVisitor;
* operations with no return type.
*/
public interface ReportParserVisitor<T> extends ParseTreeVisitor<T> {
/**
* Visit a parse tree produced by {@link ReportParserParser#entry}.
* @param ctx the parse tree
* @return the visitor result
*/
T visitEntry(ReportParserParser.EntryContext ctx);
/**
* Visit a parse tree produced by {@link ReportParserParser#expression}.
* @param ctx the parse tree
@ -86,6 +92,24 @@ public interface ReportParserVisitor<T> extends ParseTreeVisitor<T> {
* @return the visitor result
*/
T visitElsePart(ReportParserParser.ElsePartContext ctx);
/**
* Visit a parse tree produced by {@link ReportParserParser#block}.
* @param ctx the parse tree
* @return the visitor result
*/
T visitBlock(ReportParserParser.BlockContext ctx);
/**
* Visit a parse tree produced by {@link ReportParserParser#exprBlock}.
* @param ctx the parse tree
* @return the visitor result
*/
T visitExprBlock(ReportParserParser.ExprBlockContext ctx);
/**
* Visit a parse tree produced by {@link ReportParserParser#returnExpr}.
* @param ctx the parse tree
* @return the visitor result
*/
T visitReturnExpr(ReportParserParser.ReturnExprContext ctx);
/**
* Visit a parse tree produced by {@link ReportParserParser#expr}.
* @param ctx the parse tree
@ -98,6 +122,12 @@ public interface ReportParserVisitor<T> extends ParseTreeVisitor<T> {
* @return the visitor result
*/
T visitIfCondition(ReportParserParser.IfConditionContext ctx);
/**
* Visit a parse tree produced by {@link ReportParserParser#variableAssign}.
* @param ctx the parse tree
* @return the visitor result
*/
T visitVariableAssign(ReportParserParser.VariableAssignContext ctx);
/**
* Visit a parse tree produced by the {@code simpleJoin}
* labeled alternative in {@link ReportParserParser#item}.
@ -125,6 +155,12 @@ public interface ReportParserVisitor<T> extends ParseTreeVisitor<T> {
* @return the visitor result
*/
T visitUnit(ReportParserParser.UnitContext ctx);
/**
* Visit a parse tree produced by {@link ReportParserParser#variable}.
* @param ctx the parse tree
* @return the visitor result
*/
T visitVariable(ReportParserParser.VariableContext ctx);
/**
* Visit a parse tree produced by {@link ReportParserParser#cellPosition}.
* @param ctx the parse tree

4
ureport2-core/src/main/java/com/bstek/ureport/expression/ExpressionUtils.java

@ -59,6 +59,7 @@ import com.bstek.ureport.expression.parse.builder.NumberExpressionBuilder;
import com.bstek.ureport.expression.parse.builder.RelativeCellExpressionBuilder;
import com.bstek.ureport.expression.parse.builder.SetExpressionBuilder;
import com.bstek.ureport.expression.parse.builder.StringExpressionBuilder;
import com.bstek.ureport.expression.parse.builder.VariableExpressionBuilder;
/**
* @author Jacky.gao
@ -75,6 +76,7 @@ public class ExpressionUtils implements ApplicationContextAware{
private static String[] LETTERS={"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
static{
expressionBuilders.add(new StringExpressionBuilder());
expressionBuilders.add(new VariableExpressionBuilder());
expressionBuilders.add(new BooleanExpressionBuilder());
expressionBuilders.add(new IntegerExpressionBuilder());
expressionBuilders.add(new DatasetExpressionBuilder());
@ -136,7 +138,7 @@ public class ExpressionUtils implements ApplicationContextAware{
ExpressionErrorListener errorListener=new ExpressionErrorListener();
parser.addErrorListener(errorListener);
exprVisitor=new ExpressionVisitor(expressionBuilders);
Expression expression=exprVisitor.visitExpression(parser.expression());
Expression expression=exprVisitor.visitEntry(parser.entry());
String error=errorListener.getErrorMessage();
if(error!=null){
throw new ReportParseException("Expression parse error:"+error);

58
ureport2-core/src/main/java/com/bstek/ureport/expression/model/expr/ExpressionBlock.java

@ -0,0 +1,58 @@
/*******************************************************************************
* Copyright 2017 Bstek
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy
* of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
******************************************************************************/
package com.bstek.ureport.expression.model.expr;
import java.util.List;
import com.bstek.ureport.build.Context;
import com.bstek.ureport.expression.model.Expression;
import com.bstek.ureport.expression.model.data.ExpressionData;
import com.bstek.ureport.model.Cell;
/**
* @author Jacky.gao
* @since 2018年7月13日
*/
public class ExpressionBlock extends BaseExpression{
private static final long serialVersionUID = -400528304334443664L;
private List<Expression> expressionList;
private Expression returnExpression;
@Override
protected ExpressionData<?> compute(Cell cell, Cell currentCell,Context context) {
ExpressionData<?> data=null;
if(expressionList!=null){
for(Expression expr:expressionList){
data=expr.execute(cell, currentCell, context);
}
}
if(returnExpression!=null){
data=returnExpression.execute(cell, currentCell, context);
}
return data;
}
public List<Expression> getExpressionList() {
return expressionList;
}
public void setExpressionList(List<Expression> expressionList) {
this.expressionList = expressionList;
}
public Expression getReturnExpression() {
return returnExpression;
}
public void setReturnExpression(Expression returnExpression) {
this.returnExpression = returnExpression;
}
}

81
ureport2-core/src/main/java/com/bstek/ureport/expression/model/expr/VariableAssignExpression.java

@ -0,0 +1,81 @@
/*******************************************************************************
* Copyright 2017 Bstek
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy
* of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
******************************************************************************/
package com.bstek.ureport.expression.model.expr;
import java.util.List;
import com.bstek.ureport.build.BindData;
import com.bstek.ureport.build.Context;
import com.bstek.ureport.expression.model.Expression;
import com.bstek.ureport.expression.model.data.BindDataListExpressionData;
import com.bstek.ureport.expression.model.data.ExpressionData;
import com.bstek.ureport.expression.model.data.ObjectExpressionData;
import com.bstek.ureport.expression.model.data.ObjectListExpressionData;
import com.bstek.ureport.model.Cell;
/**
* @author Jacky.gao
* @since 2018年7月13日
*/
public class VariableAssignExpression extends BaseExpression {
private static final long serialVersionUID = 435511939569866187L;
private String variable;
private Expression expression;
@Override
protected ExpressionData<?> compute(Cell cell, Cell currentCell,Context context) {
ExpressionData<?> data=expression.execute(cell, currentCell, context);
Object obj=null;
if(data instanceof ObjectExpressionData){
ObjectExpressionData d=(ObjectExpressionData)data;
obj=d.getData();
}else if(data instanceof ObjectListExpressionData){
ObjectListExpressionData d=(ObjectListExpressionData)data;
obj=d.getData();
}else if(data instanceof BindDataListExpressionData){
BindDataListExpressionData dataList=(BindDataListExpressionData)data;
List<BindData> bindList=dataList.getData();
if(bindList.size()==1){
BindData bindData=bindList.get(0);
obj=bindData.getValue();
}else{
StringBuilder sb=new StringBuilder();
for(BindData bd:bindList){
if(sb.length()>0){
sb.append(",");
}
sb.append(bd.getValue());
}
obj=sb.toString();
}
}
if(obj!=null){
context.putVariable(variable, obj);
}
return null;
}
public String getVariable() {
return variable;
}
public void setVariable(String variable) {
this.variable = variable;
}
public Expression getExpression() {
return expression;
}
public void setExpression(Expression expression) {
this.expression = expression;
}
}

39
ureport2-core/src/main/java/com/bstek/ureport/expression/model/expr/VariableExpression.java

@ -0,0 +1,39 @@
/*******************************************************************************
* Copyright 2017 Bstek
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy
* of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
******************************************************************************/
package com.bstek.ureport.expression.model.expr;
import com.bstek.ureport.build.Context;
import com.bstek.ureport.expression.model.data.ExpressionData;
import com.bstek.ureport.expression.model.data.ObjectExpressionData;
import com.bstek.ureport.model.Cell;
/**
* @author Jacky.gao
* @since 2018年7月15日
*/
public class VariableExpression extends BaseExpression{
private static final long serialVersionUID = 4810887743258516630L;
private String text;
public VariableExpression(String text) {
this.text=text;
}
@Override
protected ExpressionData<?> compute(Cell cell, Cell currentCell,Context context) {
Object obj=context.getVariable(text);
return new ObjectExpressionData(obj);
}
}

12
ureport2-core/src/main/java/com/bstek/ureport/expression/model/expr/ifelse/ElseExpression.java

@ -16,9 +16,9 @@
package com.bstek.ureport.expression.model.expr.ifelse;
import com.bstek.ureport.build.Context;
import com.bstek.ureport.expression.model.Expression;
import com.bstek.ureport.expression.model.data.ExpressionData;
import com.bstek.ureport.expression.model.expr.BaseExpression;
import com.bstek.ureport.expression.model.expr.ExpressionBlock;
import com.bstek.ureport.model.Cell;
/**
@ -27,15 +27,15 @@ import com.bstek.ureport.model.Cell;
*/
public class ElseExpression extends BaseExpression {
private static final long serialVersionUID = 7686136494993309779L;
private Expression expression;
private ExpressionBlock expression;
@Override
protected ExpressionData<?> compute(Cell cell,Cell currentCell, Context context) {
return expression.execute(cell, currentCell,context);
}
public void setExpression(Expression expression) {
this.expression = expression;
}
public Expression getExpression() {
public ExpressionBlock getExpression() {
return expression;
}
public void setExpression(ExpressionBlock expression) {
this.expression = expression;
}
}

13
ureport2-core/src/main/java/com/bstek/ureport/expression/model/expr/ifelse/ElseIfExpression.java

@ -16,9 +16,9 @@
package com.bstek.ureport.expression.model.expr.ifelse;
import com.bstek.ureport.build.Context;
import com.bstek.ureport.expression.model.Expression;
import com.bstek.ureport.expression.model.data.ExpressionData;
import com.bstek.ureport.expression.model.expr.BaseExpression;
import com.bstek.ureport.expression.model.expr.ExpressionBlock;
import com.bstek.ureport.model.Cell;
/**
@ -28,7 +28,8 @@ import com.bstek.ureport.model.Cell;
public class ElseIfExpression extends BaseExpression {
private static final long serialVersionUID = -198920923804292977L;
private ExpressionConditionList conditionList;
private Expression expression;
private ExpressionBlock expression;
@Override
protected ExpressionData<?> compute(Cell cell,Cell currentCell, Context context) {
return expression.execute(cell, currentCell,context);
@ -39,10 +40,10 @@ public class ElseIfExpression extends BaseExpression {
public void setConditionList(ExpressionConditionList conditionList) {
this.conditionList = conditionList;
}
public void setExpression(Expression expression) {
this.expression = expression;
}
public Expression getExpression() {
public ExpressionBlock getExpression() {
return expression;
}
public void setExpression(ExpressionBlock expression) {
this.expression = expression;
}
}

12
ureport2-core/src/main/java/com/bstek/ureport/expression/model/expr/ifelse/IfExpression.java

@ -18,10 +18,10 @@ package com.bstek.ureport.expression.model.expr.ifelse;
import java.util.List;
import com.bstek.ureport.build.Context;
import com.bstek.ureport.expression.model.Expression;
import com.bstek.ureport.expression.model.data.ExpressionData;
import com.bstek.ureport.expression.model.data.ObjectExpressionData;
import com.bstek.ureport.expression.model.expr.BaseExpression;
import com.bstek.ureport.expression.model.expr.ExpressionBlock;
import com.bstek.ureport.model.Cell;
/**
@ -31,7 +31,7 @@ import com.bstek.ureport.model.Cell;
public class IfExpression extends BaseExpression {
private static final long serialVersionUID = -514395376408127087L;
private ExpressionConditionList conditionList;
private Expression expression;
private ExpressionBlock expression;
private List<ElseIfExpression> elseIfExpressions;
private ElseExpression elseExpression;
@Override
@ -66,12 +66,12 @@ public class IfExpression extends BaseExpression {
public void setElseIfExpressions(List<ElseIfExpression> elseIfExpressions) {
this.elseIfExpressions = elseIfExpressions;
}
public void setExpression(Expression expression) {
this.expression = expression;
}
public Expression getExpression() {
public ExpressionBlock getExpression() {
return expression;
}
public void setExpression(ExpressionBlock expression) {
this.expression = expression;
}
public ElseExpression getElseExpression() {
return elseExpression;
}

197
ureport2-core/src/main/java/com/bstek/ureport/expression/parse/ExpressionVisitor.java

@ -21,11 +21,14 @@ import java.util.List;
import org.antlr.v4.runtime.tree.TerminalNode;
import com.bstek.ureport.dsl.ReportParserBaseVisitor;
import com.bstek.ureport.dsl.ReportParserParser.BlockContext;
import com.bstek.ureport.dsl.ReportParserParser.CaseExprContext;
import com.bstek.ureport.dsl.ReportParserParser.CasePartContext;
import com.bstek.ureport.dsl.ReportParserParser.ComplexExprCompositeContext;
import com.bstek.ureport.dsl.ReportParserParser.ElseIfPartContext;
import com.bstek.ureport.dsl.ReportParserParser.ElsePartContext;
import com.bstek.ureport.dsl.ReportParserParser.EntryContext;
import com.bstek.ureport.dsl.ReportParserParser.ExprBlockContext;
import com.bstek.ureport.dsl.ReportParserParser.ExprCompositeContext;
import com.bstek.ureport.dsl.ReportParserParser.ExprContext;
import com.bstek.ureport.dsl.ReportParserParser.ExpressionContext;
@ -36,20 +39,25 @@ import com.bstek.ureport.dsl.ReportParserParser.ItemContext;
import com.bstek.ureport.dsl.ReportParserParser.JoinContext;
import com.bstek.ureport.dsl.ReportParserParser.ParenExprCompositeContext;
import com.bstek.ureport.dsl.ReportParserParser.ParenJoinContext;
import com.bstek.ureport.dsl.ReportParserParser.ReturnExprContext;
import com.bstek.ureport.dsl.ReportParserParser.SimpleJoinContext;
import com.bstek.ureport.dsl.ReportParserParser.SingleExprCompositeContext;
import com.bstek.ureport.dsl.ReportParserParser.SingleParenJoinContext;
import com.bstek.ureport.dsl.ReportParserParser.TernaryExprCompositeContext;
import com.bstek.ureport.dsl.ReportParserParser.TernaryExprContext;
import com.bstek.ureport.dsl.ReportParserParser.UnitContext;
import com.bstek.ureport.dsl.ReportParserParser.VariableAssignContext;
import com.bstek.ureport.dsl.ReportParserParser.VariableContext;
import com.bstek.ureport.exception.ReportParseException;
import com.bstek.ureport.expression.model.Expression;
import com.bstek.ureport.expression.model.Op;
import com.bstek.ureport.expression.model.Operator;
import com.bstek.ureport.expression.model.condition.Join;
import com.bstek.ureport.expression.model.expr.BaseExpression;
import com.bstek.ureport.expression.model.expr.ExpressionBlock;
import com.bstek.ureport.expression.model.expr.JoinExpression;
import com.bstek.ureport.expression.model.expr.ParenExpression;
import com.bstek.ureport.expression.model.expr.VariableAssignExpression;
import com.bstek.ureport.expression.model.expr.ifelse.ElseExpression;
import com.bstek.ureport.expression.model.expr.ifelse.ElseIfExpression;
import com.bstek.ureport.expression.model.expr.ifelse.ExpressionCondition;
@ -66,70 +74,51 @@ public class ExpressionVisitor extends ReportParserBaseVisitor<Expression>{
public ExpressionVisitor(List<ExpressionBuilder> expressionBuilders) {
this.expressionBuilders=expressionBuilders;
}
@Override
public Expression visitEntry(EntryContext ctx) {
StringBuilder sb=new StringBuilder();
List<ExpressionContext> exprs=ctx.expression();
List<Expression> list=new ArrayList<Expression>();
for(ExpressionContext exprContext:exprs){
sb.append(exprContext.getText());
Expression expr=visitExpression(exprContext);
list.add(expr);
}
ExpressionBlock block=new ExpressionBlock();
block.setExpressionList(list);
block.setExpr(sb.toString());
return block;
}
@Override
public Expression visitExpression(ExpressionContext ctx) {
ExprCompositeContext exprCompositeContext=ctx.exprComposite();
IfExprContext ifExprContext=ctx.ifExpr();
CaseExprContext caseExprContext=ctx.caseExpr();
VariableAssignContext assignCtx=ctx.variableAssign();
ReturnExprContext returnCtx=ctx.returnExpr();
if(exprCompositeContext!=null){
return parseExprComposite(exprCompositeContext);
}else if(ifExprContext!=null){
IfExpression expr=new IfExpression();
expr.setExpr(ctx.getText());
IfPartContext ifPartContext=ifExprContext.ifPart();
List<IfConditionContext> ifConditionContexts=ifPartContext.ifCondition();
List<JoinContext> joinContexts=ifPartContext.join();
expr.setConditionList(parseCondtionList(ifConditionContexts,joinContexts));
ExprContext ec=ifPartContext.expr();
Expression expression=parseExpr(ec);
expr.setExpression(expression);
List<ElseIfPartContext> elseIfPartContexts=ifExprContext.elseIfPart();
if(elseIfPartContexts!=null && elseIfPartContexts.size()>0){
List<ElseIfExpression> elseIfExpressionList=new ArrayList<ElseIfExpression>();
for(ElseIfPartContext elseIfContext:elseIfPartContexts){
ifConditionContexts=elseIfContext.ifCondition();
joinContexts=elseIfContext.join();
ElseIfExpression elseIfExpr=new ElseIfExpression();
elseIfExpr.setConditionList(parseCondtionList(ifConditionContexts,joinContexts));
ec=elseIfContext.expr();
elseIfExpr.setExpr(elseIfContext.getText());
elseIfExpr.setExpression(parseExpr(ec));
elseIfExpressionList.add(elseIfExpr);
}
expr.setElseIfExpressions(elseIfExpressionList);
}
ElsePartContext elsePartContext=ifExprContext.elsePart();
if(elsePartContext!=null){
ec=elsePartContext.expr();
ElseExpression elseExpression=new ElseExpression();
elseExpression.setExpr(elsePartContext.getText());
elseExpression.setExpression(parseExpr(ec));
expr.setElseExpression(elseExpression);
}
IfExpression expr = parseIfExprContext(ifExprContext);
return expr;
}else if(caseExprContext!=null){
IfExpression expr=new IfExpression();
expr.setExpr(ctx.getText());
List<ElseIfExpression> elseIfExpressionList=new ArrayList<ElseIfExpression>();
expr.setElseIfExpressions(elseIfExpressionList);
List<CasePartContext> casePartContexts=caseExprContext.casePart();
for(CasePartContext casePartContext:casePartContexts){
List<IfConditionContext> ifConditionContexts=casePartContext.ifCondition();
List<JoinContext> joinContexts=casePartContext.join();
ElseIfExpression elseIfExpr=new ElseIfExpression();
elseIfExpr.setConditionList(parseCondtionList(ifConditionContexts,joinContexts));
elseIfExpr.setExpr(casePartContext.getText());
ExprContext ec=casePartContext.expr();
elseIfExpr.setExpression(parseExpr(ec));
elseIfExpressionList.add(elseIfExpr);
}
IfExpression expr = parseCaseExprContext(caseExprContext);
return expr;
}else if(assignCtx!=null){
VariableAssignExpression expr=new VariableAssignExpression();
expr.setExpr(assignCtx.getText());
expr.setVariable(assignCtx.variable().Identifier().getText());
expr.setExpression(parseItemContext(assignCtx.item()));
return expr;
}else if(returnCtx!=null){
return visitExpr(returnCtx.expr());
}else{
throw new ReportParseException("Expression ["+ctx.getText()+"] is invalid.");
throw new ReportParseException("Expression ["+ctx.getText()+"] is invalid.");
}
}
private Expression parseExprComposite(ExprCompositeContext exprCompositeContext) {
if(exprCompositeContext instanceof SingleExprCompositeContext){
SingleExprCompositeContext singleExprCompositeContext=(SingleExprCompositeContext)exprCompositeContext;
@ -145,11 +134,12 @@ public class ExpressionVisitor extends ReportParserBaseVisitor<Expression>{
List<IfConditionContext> ifConditionContexts=ternaryExprContext.ifCondition();
IfExpression expr=new IfExpression();
expr.setConditionList(parseCondtionList(ifConditionContexts, ternaryExprContext.join()));
ExprContext firstExprContext=ternaryExprContext.expr(0);
ExprContext secondExprContext=ternaryExprContext.expr(1);
expr.setExpression(parseExpr(firstExprContext));
BlockContext firstBlockContext=ternaryExprContext.block(0);
expr.setExpression(parseBlock(firstBlockContext));
BlockContext secondBlockContext=ternaryExprContext.block(1);
ElseExpression elseExpr=new ElseExpression();
elseExpr.setExpression(parseExpr(secondExprContext));
elseExpr.setExpression(parseBlock(secondBlockContext));
expr.setElseExpression(elseExpr);
return expr;
}else if(exprCompositeContext instanceof ComplexExprCompositeContext){
@ -173,6 +163,105 @@ public class ExpressionVisitor extends ReportParserBaseVisitor<Expression>{
}
}
private ExpressionBlock parseExpressionBlock(List<ExprBlockContext> contexts){
StringBuilder sb=new StringBuilder();
List<Expression> expressionList=new ArrayList<Expression>();
for(ExprBlockContext ctx:contexts){
sb.append(ctx.getText());
VariableAssignContext assignContext=ctx.variableAssign();
if(assignContext!=null){
VariableContext varCtx=assignContext.variable();
String variableName=varCtx.Identifier().getText();
VariableAssignExpression assignExpr=new VariableAssignExpression();
assignExpr.setExpr(assignContext.getText());
assignExpr.setVariable(variableName);
ItemContext itemCtx=assignContext.item();
BaseExpression itemExpr=parseItemContext(itemCtx);
assignExpr.setExpression(itemExpr);
expressionList.add(assignExpr);
}
IfExprContext ifCtx=ctx.ifExpr();
if(ifCtx!=null){
IfExpression ifExpr=parseIfExprContext(ifCtx);
expressionList.add(ifExpr);
}
CaseExprContext caseCtx=ctx.caseExpr();
if(caseCtx!=null){
IfExpression caseExpr = parseCaseExprContext(caseCtx);
expressionList.add(caseExpr);
}
}
ExpressionBlock blockExpr=new ExpressionBlock();
blockExpr.setExpressionList(expressionList);
blockExpr.setExpr(sb.toString());
return blockExpr;
}
private IfExpression parseIfExprContext(IfExprContext ifExprContext) {
IfExpression expr=new IfExpression();
expr.setExpr(ifExprContext.getText());
IfPartContext ifPartContext=ifExprContext.ifPart();
List<IfConditionContext> ifConditionContexts=ifPartContext.ifCondition();
List<JoinContext> joinContexts=ifPartContext.join();
expr.setConditionList(parseCondtionList(ifConditionContexts,joinContexts));
ExpressionBlock blockExpr=parseBlock(ifPartContext.block());
expr.setExpression(blockExpr);
List<ElseIfPartContext> elseIfPartContexts=ifExprContext.elseIfPart();
if(elseIfPartContexts!=null && elseIfPartContexts.size()>0){
List<ElseIfExpression> elseIfExpressionList=new ArrayList<ElseIfExpression>();
for(ElseIfPartContext elseIfContext:elseIfPartContexts){
ifConditionContexts=elseIfContext.ifCondition();
joinContexts=elseIfContext.join();
ElseIfExpression elseIfExpr=new ElseIfExpression();
elseIfExpr.setConditionList(parseCondtionList(ifConditionContexts,joinContexts));
elseIfExpr.setExpression(parseBlock(elseIfContext.block()));
elseIfExpressionList.add(elseIfExpr);
}
expr.setElseIfExpressions(elseIfExpressionList);
}
ElsePartContext elsePartContext=ifExprContext.elsePart();
if(elsePartContext!=null){
ElseExpression elseExpression=new ElseExpression();
elseExpression.setExpression(parseBlock(elsePartContext.block()));
expr.setElseExpression(elseExpression);
}
return expr;
}
private ExpressionBlock parseBlock(BlockContext blockCtx){
List<ExprBlockContext> exprBlockCtxs=blockCtx.exprBlock();
ReturnExprContext returnCtx=blockCtx.returnExpr();
ExpressionBlock block=null;
if(exprBlockCtxs!=null){
block=parseExpressionBlock(exprBlockCtxs);
}
if(returnCtx!=null){
if(block==null)block=new ExpressionBlock();
block.setReturnExpression(visitExpr(returnCtx.expr()));
}
return block;
}
private IfExpression parseCaseExprContext(CaseExprContext caseExprContext) {
IfExpression expr=new IfExpression();
List<ElseIfExpression> elseIfExpressionList=new ArrayList<ElseIfExpression>();
expr.setElseIfExpressions(elseIfExpressionList);
List<CasePartContext> casePartContexts=caseExprContext.casePart();
for(CasePartContext casePartContext:casePartContexts){
List<IfConditionContext> ifConditionContexts=casePartContext.ifCondition();
List<JoinContext> joinContexts=casePartContext.join();
ElseIfExpression elseIfExpr=new ElseIfExpression();
elseIfExpr.setConditionList(parseCondtionList(ifConditionContexts,joinContexts));
elseIfExpr.setExpr(casePartContext.getText());
ExpressionBlock blockExpr=parseBlock(casePartContext.block());
elseIfExpr.setExpression(blockExpr);
elseIfExpressionList.add(elseIfExpr);
}
return expr;
}
private Expression parseExpr(ExprContext exprContext) {
List<BaseExpression> expressions=new ArrayList<BaseExpression>();
List<Operator> operators=new ArrayList<Operator>();

37
ureport2-core/src/main/java/com/bstek/ureport/expression/parse/builder/VariableExpressionBuilder.java

@ -0,0 +1,37 @@
/*******************************************************************************
* Copyright 2017 Bstek
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy
* of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
******************************************************************************/
package com.bstek.ureport.expression.parse.builder;
import com.bstek.ureport.dsl.ReportParserParser.UnitContext;
import com.bstek.ureport.expression.model.expr.BaseExpression;
import com.bstek.ureport.expression.model.expr.VariableExpression;
/**
* @author Jacky.gao
* @since 2018年7月15日
*/
public class VariableExpressionBuilder implements ExpressionBuilder {
@Override
public BaseExpression build(UnitContext unitContext) {
String text=unitContext.variable().Identifier().getText();
VariableExpression varExpr=new VariableExpression(text);
return varExpr;
}
@Override
public boolean support(UnitContext unitContext) {
return unitContext.variable()!=null;
}
}

3
ureport2-core/src/main/java/com/bstek/ureport/utils/ElCompute.java

@ -76,6 +76,7 @@ public class ElCompute {
}else {
dataSb.append(c);
}
prevChar=c;
continue;
}
switch(c){
@ -127,7 +128,7 @@ public class ElCompute {
}
private void doOp(StringBuilder dataSb,char op,char prevChar) {
if(dataSb.length()==0 && prevChar!=')'){
if(dataSb.length()==0 && prevChar!=')' && prevChar!='\"'){
dataSb.append(op);
} else {
addDataStack(dataSb);

Ładowanie…
Anuluj
Zapisz