@freelog/freelog-cg-collection 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CollectionPolicyCustomVisitor.js +544 -0
- package/CollectionPolicyDecompiler.js +131 -0
- package/CollectionPolicyErrorLexerListener.js +23 -0
- package/CollectionPolicyErrorListener.js +22 -0
- package/README.md +398 -0
- package/TransitionEventArgsMatchUtil.js +79 -0
- package/gen/CollectionPolicyLexer.js +705 -0
- package/gen/CollectionPolicyListener.js +672 -0
- package/gen/CollectionPolicyParser.js +7301 -0
- package/gen/CollectionPolicyVisitor.js +454 -0
- package/gen/LexToken.js +680 -0
- package/index.js +53 -0
- package/indexTest.js +23 -0
- package/package.json +32 -0
- package/resources/event_definition.json +169 -0
- package/resources/function_definite.json +79 -0
- package/resources/test/CalculatorTest.json +26 -0
- package/resources/test/FunctionHelperTest.json +21 -0
- package/resources/variable_definite.json +10 -0
- package/resources/zhaojn.json +68 -0
- package/resources/zhaojn.sc +8 -0
- package/src/calculator/ExpArgsGroupCalculator.ts +34 -0
- package/src/calculator/ExpBooleanCalculator.ts +77 -0
- package/src/calculator/ExpCalculator.ts +68 -0
- package/src/calculator/ExpCollectionCalculator.ts +0 -0
- package/src/calculator/ExpConditionCalculator.ts +43 -0
- package/src/function-executor/FunctionHandle.ts +45 -0
- package/src/function-executor/api/FunctionApiExecutor.ts +11 -0
- package/src/function-executor/fun/FunctionFunExecutor.ts +31 -0
- package/src/function-executor/kit/FunctionKitExecutor.ts +11 -0
- package/src/function-executor/query/FunctionQueryExecutor.ts +11 -0
- package/src/function-executor/time/FunctionTimeExecutor.ts +11 -0
- package/src/helper/ExpHelper.ts +66 -0
- package/src/helper/FunctionHelper.ts +97 -0
- package/src/helper/PolicyHelper.ts +99 -0
- package/src/interface/Calculator.ts +6 -0
- package/src/interface/DefaultFunctionInvoke.ts +12 -0
- package/src/interface/FunctionInvoke.ts +6 -0
- package/src/interface/VarContextCapable.ts +3 -0
- package/src/model/AssignmentClauseInfo.ts +3 -0
- package/src/model/exp/EntityInfo.ts +7 -0
- package/src/model/exp/Exp.ts +5 -0
- package/src/model/exp/ExpAtom.ts +5 -0
- package/src/model/exp/ExpOp.ts +8 -0
- package/src/model/exp/ExpParen.ts +6 -0
- package/src/model/exp/ExpSigned.ts +7 -0
- package/src/model/exp/FunctionCallInfo.ts +13 -0
- package/src/model/exp/NumberInfo.ts +6 -0
- package/src/model/exp/StringInfo.ts +6 -0
- package/src/model/exp/VariableChainInfo.ts +7 -0
- package/src/model/exp-args-group/ExpArgsGroup.ts +10 -0
- package/src/model/exp-boolean/BooleanInfo.ts +6 -0
- package/src/model/exp-boolean/ExpBoolean.ts +5 -0
- package/src/model/exp-boolean/ExpBooleanAtom.ts +5 -0
- package/src/model/exp-boolean/ExpBooleanOpCollection.ts +8 -0
- package/src/model/exp-boolean/ExpBooleanOpCompare.ts +9 -0
- package/src/model/exp-boolean/ExpBooleanOpLogic.ts +8 -0
- package/src/model/exp-boolean/ExpBooleanParen.ts +6 -0
- package/src/model/exp-collection/ExpCollection.ts +10 -0
- package/src/model/exp-condition/ExpCondition.ts +12 -0
- package/src/model/policy/ActionInfo.ts +23 -0
- package/src/model/policy/EventInfo.ts +13 -0
- package/src/model/policy/PolicyInfo.ts +20 -0
- package/src/model/policy/VarDeclarationInfo.ts +8 -0
- package/test/calculator/CalculatorTest.test.ts +13 -0
- package/test/function/FunAddElements.ts +9 -0
- package/test/function/FunctionFunExecutorTest.test.ts +11 -0
- package/test/function/FunctionHandleTest.test.ts +9 -0
- package/test/helper/ExpHelperTest.test.ts +7 -0
- package/test/helper/FunctionHelperTest.test.ts +16 -0
- package/test/helper/PolicyHelperTest.test.ts +14 -0
- package/test/tsconfig.test.json +6 -0
- package/tsconfig.json +24 -0
package/index.js
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict"
|
|
2
|
+
|
|
3
|
+
const antlr4 = require("antlr4");
|
|
4
|
+
const gen_dir = "./gen";
|
|
5
|
+
const LexToken = require(`${gen_dir}/LexToken`);
|
|
6
|
+
const {CollectionPolicyErrorLexerListener} = require("./CollectionPolicyErrorLexerListener");
|
|
7
|
+
const {CollectionPolicyErrorListener} = require("./CollectionPolicyErrorListener");
|
|
8
|
+
const {CollectionPolicyVisitor} = require("./gen/CollectionPolicyVisitor");
|
|
9
|
+
const {CollectionPolicyCustomVisitor} = require("./CollectionPolicyCustomVisitor");
|
|
10
|
+
const {CollectionPolicyParser} = require("./gen/CollectionPolicyParser");
|
|
11
|
+
|
|
12
|
+
exports.compile = async function (policyText) {
|
|
13
|
+
let chars = new antlr4.InputStream(policyText);
|
|
14
|
+
|
|
15
|
+
let lexer = new LexToken.LexToken(chars);
|
|
16
|
+
lexer.removeErrorListeners();
|
|
17
|
+
let lexerErrorListener = new CollectionPolicyErrorLexerListener();
|
|
18
|
+
lexer.addErrorListener(lexerErrorListener);
|
|
19
|
+
let stream = new antlr4.CommonTokenStream(lexer);
|
|
20
|
+
let parser = new CollectionPolicyParser(stream);
|
|
21
|
+
parser.removeErrorListeners();
|
|
22
|
+
let errorListener = new CollectionPolicyErrorListener();
|
|
23
|
+
parser.addErrorListener(errorListener);
|
|
24
|
+
// 关闭恢复机制
|
|
25
|
+
// parser._errHandler = new antlr4.error.BailErrorStrategy();
|
|
26
|
+
|
|
27
|
+
let tree = parser.policy();
|
|
28
|
+
if (lexerErrorListener.errors.length !== 0) {
|
|
29
|
+
// console.error(`lexer -- ${lexerErrorListener.errors}`);
|
|
30
|
+
return {
|
|
31
|
+
errors: lexerErrorListener.errors,
|
|
32
|
+
errorObjects: lexerErrorListener.errorObjects
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
if (errorListener.errors.length !== 0) {
|
|
36
|
+
// console.error(`parse -- ${errorListener.errors}`);
|
|
37
|
+
return {
|
|
38
|
+
errors: errorListener.errors,
|
|
39
|
+
errorObjects: errorListener.errorObjects
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
let visitor = new CollectionPolicyCustomVisitor();
|
|
44
|
+
visitor.visit(tree);
|
|
45
|
+
// await visitor.verify();
|
|
46
|
+
// visitor.combine();
|
|
47
|
+
|
|
48
|
+
return {
|
|
49
|
+
audienceSection: visitor.audienceSection,
|
|
50
|
+
varDeclarationList: visitor.varDeclarationList,
|
|
51
|
+
stateMachine: visitor.stateMachine,
|
|
52
|
+
};
|
|
53
|
+
}
|
package/indexTest.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
const fs = require("fs");
|
|
2
|
+
const policy_lang = require("./index");
|
|
3
|
+
const {CollectionPolicyDecompiler} = require("./CollectionPolicyDecompiler");
|
|
4
|
+
|
|
5
|
+
main();
|
|
6
|
+
|
|
7
|
+
async function main() {
|
|
8
|
+
try {
|
|
9
|
+
let result = await policy_lang.compile(fs.readFileSync("./resources/zhaojn.sc", "utf-8"));
|
|
10
|
+
fs.writeFile("./resources/zhaojn.json", JSON.stringify(result, null, 4), (err) => {
|
|
11
|
+
if (err) throw err;
|
|
12
|
+
});
|
|
13
|
+
} catch (e) {
|
|
14
|
+
console.log(e);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// try {
|
|
18
|
+
// let result = JSON.parse(fs.readFileSync("./resources/zhaojn.json", "utf-8"));
|
|
19
|
+
// console.log(new CollectionPolicyDecompiler().decompile(result));
|
|
20
|
+
// } catch (e) {
|
|
21
|
+
// console.log(e);
|
|
22
|
+
// }
|
|
23
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@freelog/freelog-cg-collection",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"main": "index.js",
|
|
5
|
+
"dependencies": {
|
|
6
|
+
"antlr4": "4.8.0",
|
|
7
|
+
"decimal.js": "^10.2.1",
|
|
8
|
+
"moment": "^2.29.1"
|
|
9
|
+
},
|
|
10
|
+
"devDependencies": {
|
|
11
|
+
"@types/chai": "^5.0.1",
|
|
12
|
+
"@types/mocha": "^5.2.7",
|
|
13
|
+
"@types/node": "^22.9.0",
|
|
14
|
+
"@types/sinon": "^17.0.3",
|
|
15
|
+
"chai": "^5.1.2",
|
|
16
|
+
"cross-env": "^6.0.3",
|
|
17
|
+
"mocha": "^10.8.2",
|
|
18
|
+
"nyc": "^17.1.0",
|
|
19
|
+
"sinon": "^19.0.2",
|
|
20
|
+
"ts-node": "^10.9.2",
|
|
21
|
+
"tsconfig-paths": "^4.2.0"
|
|
22
|
+
},
|
|
23
|
+
"scripts": {
|
|
24
|
+
"test": "cross-env TS_NODE_PROJECT='test/tsconfig.test.json' mocha test/**/**.test.ts"
|
|
25
|
+
},
|
|
26
|
+
"mocha": {
|
|
27
|
+
"require": [
|
|
28
|
+
"ts-node/register",
|
|
29
|
+
"tsconfig-paths/register"
|
|
30
|
+
]
|
|
31
|
+
}
|
|
32
|
+
}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"code": "S101",
|
|
4
|
+
"name": "SigningEvent",
|
|
5
|
+
"description": "acknowledge a resource",
|
|
6
|
+
"params": [
|
|
7
|
+
{
|
|
8
|
+
"name": "resourceName",
|
|
9
|
+
"type": "string"
|
|
10
|
+
}
|
|
11
|
+
],
|
|
12
|
+
"singleton": true
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"code": "A101",
|
|
16
|
+
"name": "CycleEndEvent",
|
|
17
|
+
"description": "raise when n cycle ends",
|
|
18
|
+
"params": [
|
|
19
|
+
{
|
|
20
|
+
"name": "cycleCount",
|
|
21
|
+
"type": "decimal"
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"name": "timeUnit",
|
|
25
|
+
"type": "timeUnit",
|
|
26
|
+
"enum": ["year","month","week","day","cycle"]
|
|
27
|
+
}
|
|
28
|
+
],
|
|
29
|
+
"singleton": false
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"code": "S201",
|
|
33
|
+
"name": "TransactionEvent",
|
|
34
|
+
"description": "one time transaction",
|
|
35
|
+
"params": [
|
|
36
|
+
{
|
|
37
|
+
"name": "amount",
|
|
38
|
+
"type": "decimal"
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"name": "account",
|
|
42
|
+
"type": "none"
|
|
43
|
+
}
|
|
44
|
+
],
|
|
45
|
+
"singleton": true
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"code": "S202",
|
|
49
|
+
"name": "SettlementEvent",
|
|
50
|
+
"description": "fired when settlement cleared",
|
|
51
|
+
"params": [
|
|
52
|
+
{
|
|
53
|
+
"name": "account",
|
|
54
|
+
"type": "none"
|
|
55
|
+
}
|
|
56
|
+
],
|
|
57
|
+
"singleton": true
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"code": "A102",
|
|
61
|
+
"name": "TimeEvent",
|
|
62
|
+
"description": "fired on a pre-determined time",
|
|
63
|
+
"params": [
|
|
64
|
+
{
|
|
65
|
+
"name": "dateTime",
|
|
66
|
+
"type": "dateTime"
|
|
67
|
+
}
|
|
68
|
+
],
|
|
69
|
+
"singleton": false
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"code": "A103",
|
|
73
|
+
"name": "RelativeTimeEvent",
|
|
74
|
+
"description": "fired when certain amount of time elapsed",
|
|
75
|
+
"params": [
|
|
76
|
+
{
|
|
77
|
+
"name": "elapsed",
|
|
78
|
+
"type": "decimal"
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
"name": "timeUnit",
|
|
82
|
+
"type": "timeUnit",
|
|
83
|
+
"enum": ["year","month","week","day","cycle","hour","minute"]
|
|
84
|
+
}
|
|
85
|
+
],
|
|
86
|
+
"singleton": false
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
"code": "S301",
|
|
90
|
+
"name": "ViewCountEvent",
|
|
91
|
+
"description": "reserve a target number of authorizations, fires when such number reached",
|
|
92
|
+
"params": [
|
|
93
|
+
{
|
|
94
|
+
"name": "amount",
|
|
95
|
+
"type": "decimal"
|
|
96
|
+
}
|
|
97
|
+
],
|
|
98
|
+
"singleton": true
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
"code": "S302",
|
|
102
|
+
"name": "ReContractCountEvent",
|
|
103
|
+
"description": "",
|
|
104
|
+
"params": [
|
|
105
|
+
{
|
|
106
|
+
"name": "amount",
|
|
107
|
+
"type": "decimal"
|
|
108
|
+
}
|
|
109
|
+
],
|
|
110
|
+
"singleton": true
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
"code": "S303",
|
|
114
|
+
"name": "PresentCountEvent",
|
|
115
|
+
"description": "",
|
|
116
|
+
"params": [
|
|
117
|
+
{
|
|
118
|
+
"name": "amount",
|
|
119
|
+
"type": "decimal"
|
|
120
|
+
}
|
|
121
|
+
],
|
|
122
|
+
"singleton": true
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
"code": "S210",
|
|
126
|
+
"name": "EscrowExceedAmount",
|
|
127
|
+
"description": "",
|
|
128
|
+
"params": [
|
|
129
|
+
{
|
|
130
|
+
"name": "account",
|
|
131
|
+
"type": "none"
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
"name": "amount",
|
|
135
|
+
"type": "decimal"
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
"name": "currencyUnit",
|
|
139
|
+
"type": "string",
|
|
140
|
+
"enum": ["feather","dollar","yuan","jiao","fen"]
|
|
141
|
+
}
|
|
142
|
+
],
|
|
143
|
+
"singleton": true
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
"code": "S211",
|
|
147
|
+
"name": "EscrowConfiscated",
|
|
148
|
+
"description": "",
|
|
149
|
+
"params": [
|
|
150
|
+
{
|
|
151
|
+
"name": "account",
|
|
152
|
+
"type": "none"
|
|
153
|
+
}
|
|
154
|
+
],
|
|
155
|
+
"singleton": true
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
"code": "S212",
|
|
159
|
+
"name": "EscrowRefunded",
|
|
160
|
+
"description": "",
|
|
161
|
+
"params": [
|
|
162
|
+
{
|
|
163
|
+
"name": "account",
|
|
164
|
+
"type": "none"
|
|
165
|
+
}
|
|
166
|
+
],
|
|
167
|
+
"singleton": true
|
|
168
|
+
}
|
|
169
|
+
]
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"name": "range",
|
|
4
|
+
"caller": "serviceState",
|
|
5
|
+
"params": [
|
|
6
|
+
{
|
|
7
|
+
"name": "index",
|
|
8
|
+
"type": "int"
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"name": "limit",
|
|
12
|
+
"type": "int"
|
|
13
|
+
}
|
|
14
|
+
],
|
|
15
|
+
"description": "取某个色块中的第${index}到${limit}之间的单品"
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"name": "exclude",
|
|
19
|
+
"caller": "serviceState",
|
|
20
|
+
"params": [
|
|
21
|
+
{
|
|
22
|
+
"name": "a",
|
|
23
|
+
"type": "serviceState"
|
|
24
|
+
}
|
|
25
|
+
],
|
|
26
|
+
"description": "取某个色块中的第${index}到${limit}之间的单品"
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"name": "unionSet",
|
|
30
|
+
"caller": "serviceState",
|
|
31
|
+
"params": [
|
|
32
|
+
{
|
|
33
|
+
"name": "a",
|
|
34
|
+
"type": "serviceState"
|
|
35
|
+
}
|
|
36
|
+
],
|
|
37
|
+
"description": "caller色块同a色块做并集运算"
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"name": "intersection",
|
|
41
|
+
"caller": "serviceState",
|
|
42
|
+
"params": [
|
|
43
|
+
{
|
|
44
|
+
"name": "a",
|
|
45
|
+
"type": "serviceState"
|
|
46
|
+
}
|
|
47
|
+
],
|
|
48
|
+
"description": "caller色块同a色块做交集运算"
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"name": "set",
|
|
52
|
+
"caller": "serviceState",
|
|
53
|
+
"params": [
|
|
54
|
+
{
|
|
55
|
+
"name": "a",
|
|
56
|
+
"type": "string"
|
|
57
|
+
}
|
|
58
|
+
],
|
|
59
|
+
"description": "将单品a添加到caller色块中"
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
"name": "unset",
|
|
63
|
+
"caller": "serviceState",
|
|
64
|
+
"params": [
|
|
65
|
+
{
|
|
66
|
+
"name": "a",
|
|
67
|
+
"type": "string"
|
|
68
|
+
}
|
|
69
|
+
],
|
|
70
|
+
"description": "将单品a从caller色块中移除"
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
"name": "clean",
|
|
74
|
+
"caller": "serviceState",
|
|
75
|
+
"params": [
|
|
76
|
+
],
|
|
77
|
+
"description": "清空caller色块中的单品"
|
|
78
|
+
}
|
|
79
|
+
]
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"type": "varGlobal",
|
|
3
|
+
"content": "amount=1+2*3",
|
|
4
|
+
"varName": "amount",
|
|
5
|
+
"varValue": "1+2*3",
|
|
6
|
+
"varValueObj": {
|
|
7
|
+
"expType": "expOp",
|
|
8
|
+
"var1": {
|
|
9
|
+
"expType": "number",
|
|
10
|
+
"value": "1"
|
|
11
|
+
},
|
|
12
|
+
"var2": {
|
|
13
|
+
"expType": "expOp",
|
|
14
|
+
"var1": {
|
|
15
|
+
"expType": "number",
|
|
16
|
+
"value": "2"
|
|
17
|
+
},
|
|
18
|
+
"var2": {
|
|
19
|
+
"expType": "number",
|
|
20
|
+
"value": "3"
|
|
21
|
+
},
|
|
22
|
+
"op": "*"
|
|
23
|
+
},
|
|
24
|
+
"op": "+"
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"funcName": "Max",
|
|
3
|
+
"paramList": [
|
|
4
|
+
{
|
|
5
|
+
"paramValue": "5",
|
|
6
|
+
"paramValueObj": {
|
|
7
|
+
"expType": "number",
|
|
8
|
+
"value": "5"
|
|
9
|
+
}
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
"paramValue": "6",
|
|
13
|
+
"paramValueObj": {
|
|
14
|
+
"expType": "number",
|
|
15
|
+
"value": "6"
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
],
|
|
19
|
+
"expType": "functionCall",
|
|
20
|
+
"varChain": "Kit"
|
|
21
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
{
|
|
2
|
+
"audienceSection": {
|
|
3
|
+
"audiences": [
|
|
4
|
+
"PUBLIC"
|
|
5
|
+
]
|
|
6
|
+
},
|
|
7
|
+
"varDeclarationList": [
|
|
8
|
+
{
|
|
9
|
+
"type": "varGlobal",
|
|
10
|
+
"content": "a=(-1)",
|
|
11
|
+
"varName": "a",
|
|
12
|
+
"varValue": "(-1)",
|
|
13
|
+
"varValueObj": {
|
|
14
|
+
"expType": "expParen",
|
|
15
|
+
"var1": {
|
|
16
|
+
"expType": "expSigned",
|
|
17
|
+
"var1": {
|
|
18
|
+
"expType": "number",
|
|
19
|
+
"value": "1"
|
|
20
|
+
},
|
|
21
|
+
"symbol": "-"
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
],
|
|
26
|
+
"stateMachine": [
|
|
27
|
+
{
|
|
28
|
+
"stateName": "AUTH_VIP",
|
|
29
|
+
"assignments": [],
|
|
30
|
+
"events": [
|
|
31
|
+
{
|
|
32
|
+
"type": "normal",
|
|
33
|
+
"content": "Event.Transaction.Pay(amount=0.5*2,elemsNum=1)->AUTH_VIP",
|
|
34
|
+
"eventName": "Pay",
|
|
35
|
+
"eventParamList": [
|
|
36
|
+
{
|
|
37
|
+
"paramValue": "0.5*2",
|
|
38
|
+
"paramValueObj": {
|
|
39
|
+
"expType": "expOp",
|
|
40
|
+
"var1": {
|
|
41
|
+
"expType": "number",
|
|
42
|
+
"value": "0.5"
|
|
43
|
+
},
|
|
44
|
+
"var2": {
|
|
45
|
+
"expType": "number",
|
|
46
|
+
"value": "2"
|
|
47
|
+
},
|
|
48
|
+
"op": "*"
|
|
49
|
+
},
|
|
50
|
+
"paramName": "amount"
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"paramValue": "1",
|
|
54
|
+
"paramValueObj": {
|
|
55
|
+
"expType": "number",
|
|
56
|
+
"value": "1"
|
|
57
|
+
},
|
|
58
|
+
"paramName": "elemsNum"
|
|
59
|
+
}
|
|
60
|
+
],
|
|
61
|
+
"toState": "AUTH_VIP",
|
|
62
|
+
"actions": [],
|
|
63
|
+
"eventPath": "Transaction"
|
|
64
|
+
}
|
|
65
|
+
]
|
|
66
|
+
}
|
|
67
|
+
]
|
|
68
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import {Calculator} from "../interface/Calculator";
|
|
2
|
+
import {AssignmentClauseInfo} from "../model/AssignmentClauseInfo";
|
|
3
|
+
import {VarContextCapable} from "../interface/VarContextCapable";
|
|
4
|
+
import {ExpHelper} from "../helper/ExpHelper";
|
|
5
|
+
import {ExpArgsGroup} from "../model/exp-args-group/ExpArgsGroup";
|
|
6
|
+
|
|
7
|
+
export class ExpArgsGroupCalculator implements Calculator {
|
|
8
|
+
|
|
9
|
+
private expHelper: ExpHelper;
|
|
10
|
+
|
|
11
|
+
getExpValue(varObj: AssignmentClauseInfo, varContextCapable: VarContextCapable<any>): any {
|
|
12
|
+
if (varObj.expType == "expArgsGroup") {
|
|
13
|
+
return this.generateExpArgsGroupValue(varObj as any, varContextCapable);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
throw new Error("getExpValue fail [ExpArgsGroupCalculator]...");
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
generateExpArgsGroupValue(expArgsGroup: ExpArgsGroup, varContextCapable: VarContextCapable<any>) {
|
|
20
|
+
let result = {};
|
|
21
|
+
// @ts-ignore
|
|
22
|
+
if (expArgsGroup.paramList.length != 0) {
|
|
23
|
+
expArgsGroup.paramList.forEach(param => {
|
|
24
|
+
result[param.paramName] = this.expHelper.getExpValue(param.paramValueObj, varContextCapable);
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
return result;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
setExpHelper(expHelper: ExpHelper) {
|
|
32
|
+
this.expHelper = expHelper;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import {Calculator} from "../interface/Calculator";
|
|
2
|
+
import {AssignmentClauseInfo} from "../model/AssignmentClauseInfo";
|
|
3
|
+
import {VarContextCapable} from "../interface/VarContextCapable";
|
|
4
|
+
import {ExpHelper} from "../helper/ExpHelper";
|
|
5
|
+
import {ExpBooleanOpCompare} from "../model/exp-boolean/ExpBooleanOpCompare";
|
|
6
|
+
import {ExpBooleanOpLogic} from "../model/exp-boolean/ExpBooleanOpLogic";
|
|
7
|
+
|
|
8
|
+
export class ExpBooleanCalculator implements Calculator {
|
|
9
|
+
|
|
10
|
+
private expHelper: ExpHelper;
|
|
11
|
+
|
|
12
|
+
getExpValue(varObj: AssignmentClauseInfo, varContextCapable: VarContextCapable<any>): boolean {
|
|
13
|
+
if (varObj.expType == "expBooleanOpLogic") {
|
|
14
|
+
return this.calculateExpBooleanOpLogic(varObj as any, varContextCapable);
|
|
15
|
+
}
|
|
16
|
+
if (varObj.expType == "expBooleanOpCompare") {
|
|
17
|
+
return this.calculateExpBooleanOpCompare(varObj as any, varContextCapable);
|
|
18
|
+
}
|
|
19
|
+
if (varObj.expType == "boolean") {
|
|
20
|
+
return varObj["value"] == "true";
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
throw new Error("getExpValue fail [ExpBooleanCalculator]...");
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
calculateExpBooleanOpLogic(expBooleanOpLogic: ExpBooleanOpLogic, varContextCapable: VarContextCapable<any>): boolean {
|
|
27
|
+
let var1 = this.expHelper.getExpValue(expBooleanOpLogic.var1, varContextCapable);
|
|
28
|
+
if (expBooleanOpLogic.op == "not") {
|
|
29
|
+
return !var1;
|
|
30
|
+
} else {
|
|
31
|
+
let var2 = this.expHelper.getExpValue(expBooleanOpLogic.var2, varContextCapable);
|
|
32
|
+
if (expBooleanOpLogic.op == "and") {
|
|
33
|
+
return var1 && var2;
|
|
34
|
+
}
|
|
35
|
+
if (expBooleanOpLogic.op == "or") {
|
|
36
|
+
return var1 || var2;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
calculateExpBooleanOpCompare(expBooleanOpCompare: ExpBooleanOpCompare, varContextCapable: VarContextCapable<any>): boolean {
|
|
44
|
+
let var1 = this.expHelper.getExpValue(expBooleanOpCompare.var1, varContextCapable);
|
|
45
|
+
let var2 = this.expHelper.getExpValue(expBooleanOpCompare.var2, varContextCapable);
|
|
46
|
+
if (expBooleanOpCompare.op == "less" || expBooleanOpCompare.op == "<") {
|
|
47
|
+
return var1 < var2;
|
|
48
|
+
}
|
|
49
|
+
if (expBooleanOpCompare.op == "before") {
|
|
50
|
+
return var1 < var2;
|
|
51
|
+
}
|
|
52
|
+
if (expBooleanOpCompare.op == "lessOrEqual" || expBooleanOpCompare.op == "<=") {
|
|
53
|
+
return var1 <= var2;
|
|
54
|
+
}
|
|
55
|
+
if (expBooleanOpCompare.op == "greater" || expBooleanOpCompare.op == ">") {
|
|
56
|
+
return var1 > var2;
|
|
57
|
+
}
|
|
58
|
+
if (expBooleanOpCompare.op == "after") {
|
|
59
|
+
return var1 > var2;
|
|
60
|
+
}
|
|
61
|
+
if (expBooleanOpCompare.op == "greaterOrEqual" || expBooleanOpCompare.op == ">=") {
|
|
62
|
+
return var1 >= var2;
|
|
63
|
+
}
|
|
64
|
+
if (expBooleanOpCompare.op == "equal" || expBooleanOpCompare.op == "==") {
|
|
65
|
+
return var1 == var2;
|
|
66
|
+
}
|
|
67
|
+
if (expBooleanOpCompare.op == "notEqual" || expBooleanOpCompare.op == "!=") {
|
|
68
|
+
return var1 != var2;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
setExpHelper(expHelper: ExpHelper) {
|
|
75
|
+
this.expHelper = expHelper;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import {ExpOp} from "../model/exp/ExpOp";
|
|
2
|
+
import {VarContextCapable} from "../interface/VarContextCapable";
|
|
3
|
+
import {FunctionHelper} from "../helper/FunctionHelper";
|
|
4
|
+
import {AssignmentClauseInfo} from "../model/AssignmentClauseInfo";
|
|
5
|
+
import {Calculator} from "../interface/Calculator";
|
|
6
|
+
import {ExpHelper} from "../helper/ExpHelper";
|
|
7
|
+
import {ExpSigned} from "../model/exp/ExpSigned";
|
|
8
|
+
|
|
9
|
+
export class ExpCalculator implements Calculator {
|
|
10
|
+
|
|
11
|
+
private functionHelper: FunctionHelper;
|
|
12
|
+
|
|
13
|
+
private expHelper: ExpHelper;
|
|
14
|
+
|
|
15
|
+
getExpValue(varObj: AssignmentClauseInfo, varContextCapable: VarContextCapable<any>): any {
|
|
16
|
+
if (varObj.expType == "expOp") {
|
|
17
|
+
return this.calculateExpOp(varObj as any, varContextCapable);
|
|
18
|
+
}
|
|
19
|
+
if (varObj.expType == "number") {
|
|
20
|
+
return parseInt(varObj["value"]);
|
|
21
|
+
}
|
|
22
|
+
if (varObj.expType == "string") {
|
|
23
|
+
return varObj["value"];
|
|
24
|
+
}
|
|
25
|
+
if (varObj.expType == "entity") {
|
|
26
|
+
return varObj;
|
|
27
|
+
}
|
|
28
|
+
if (varObj.expType == "variableChain") {
|
|
29
|
+
return varContextCapable.getVarContext(varObj["content"]);
|
|
30
|
+
}
|
|
31
|
+
if (varObj.expType == "functionCall") {
|
|
32
|
+
return this.functionHelper.getFunctionValue(varObj as any, varContextCapable);
|
|
33
|
+
}
|
|
34
|
+
if (varObj.expType == "expParen") {
|
|
35
|
+
return this.expHelper.getExpValue(varObj["var1"], varContextCapable);
|
|
36
|
+
}
|
|
37
|
+
if (varObj.expType == "expSigned") {
|
|
38
|
+
return this.calculateExpSigned(varObj as any, varContextCapable);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
throw new Error("getExpValue fail [ExpCalculator]...");
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
calculateExpOp(expOp: ExpOp, varContextCapable: VarContextCapable<any>): number {
|
|
45
|
+
let var1 = this.expHelper.getExpValue(expOp.var1, varContextCapable);
|
|
46
|
+
let var2 = this.expHelper.getExpValue(expOp.var2, varContextCapable);
|
|
47
|
+
let expStr = `${var1} ${expOp.op} ${var2}`;
|
|
48
|
+
|
|
49
|
+
return eval(expStr);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
calculateExpSigned(expSigned: ExpSigned, varContextCapable: VarContextCapable<any>): number {
|
|
53
|
+
let var1 = this.expHelper.getExpValue(expSigned.var1, varContextCapable);
|
|
54
|
+
if (expSigned.symbol == "-") {
|
|
55
|
+
return -var1;
|
|
56
|
+
} else {
|
|
57
|
+
return var1;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
setFunctionHelper(functionHelper: FunctionHelper) {
|
|
62
|
+
this.functionHelper = functionHelper;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
setExpHelper(expHelper: ExpHelper) {
|
|
66
|
+
this.expHelper = expHelper;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
File without changes
|