@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.
Files changed (73) hide show
  1. package/CollectionPolicyCustomVisitor.js +544 -0
  2. package/CollectionPolicyDecompiler.js +131 -0
  3. package/CollectionPolicyErrorLexerListener.js +23 -0
  4. package/CollectionPolicyErrorListener.js +22 -0
  5. package/README.md +398 -0
  6. package/TransitionEventArgsMatchUtil.js +79 -0
  7. package/gen/CollectionPolicyLexer.js +705 -0
  8. package/gen/CollectionPolicyListener.js +672 -0
  9. package/gen/CollectionPolicyParser.js +7301 -0
  10. package/gen/CollectionPolicyVisitor.js +454 -0
  11. package/gen/LexToken.js +680 -0
  12. package/index.js +53 -0
  13. package/indexTest.js +23 -0
  14. package/package.json +32 -0
  15. package/resources/event_definition.json +169 -0
  16. package/resources/function_definite.json +79 -0
  17. package/resources/test/CalculatorTest.json +26 -0
  18. package/resources/test/FunctionHelperTest.json +21 -0
  19. package/resources/variable_definite.json +10 -0
  20. package/resources/zhaojn.json +68 -0
  21. package/resources/zhaojn.sc +8 -0
  22. package/src/calculator/ExpArgsGroupCalculator.ts +34 -0
  23. package/src/calculator/ExpBooleanCalculator.ts +77 -0
  24. package/src/calculator/ExpCalculator.ts +68 -0
  25. package/src/calculator/ExpCollectionCalculator.ts +0 -0
  26. package/src/calculator/ExpConditionCalculator.ts +43 -0
  27. package/src/function-executor/FunctionHandle.ts +45 -0
  28. package/src/function-executor/api/FunctionApiExecutor.ts +11 -0
  29. package/src/function-executor/fun/FunctionFunExecutor.ts +31 -0
  30. package/src/function-executor/kit/FunctionKitExecutor.ts +11 -0
  31. package/src/function-executor/query/FunctionQueryExecutor.ts +11 -0
  32. package/src/function-executor/time/FunctionTimeExecutor.ts +11 -0
  33. package/src/helper/ExpHelper.ts +66 -0
  34. package/src/helper/FunctionHelper.ts +97 -0
  35. package/src/helper/PolicyHelper.ts +99 -0
  36. package/src/interface/Calculator.ts +6 -0
  37. package/src/interface/DefaultFunctionInvoke.ts +12 -0
  38. package/src/interface/FunctionInvoke.ts +6 -0
  39. package/src/interface/VarContextCapable.ts +3 -0
  40. package/src/model/AssignmentClauseInfo.ts +3 -0
  41. package/src/model/exp/EntityInfo.ts +7 -0
  42. package/src/model/exp/Exp.ts +5 -0
  43. package/src/model/exp/ExpAtom.ts +5 -0
  44. package/src/model/exp/ExpOp.ts +8 -0
  45. package/src/model/exp/ExpParen.ts +6 -0
  46. package/src/model/exp/ExpSigned.ts +7 -0
  47. package/src/model/exp/FunctionCallInfo.ts +13 -0
  48. package/src/model/exp/NumberInfo.ts +6 -0
  49. package/src/model/exp/StringInfo.ts +6 -0
  50. package/src/model/exp/VariableChainInfo.ts +7 -0
  51. package/src/model/exp-args-group/ExpArgsGroup.ts +10 -0
  52. package/src/model/exp-boolean/BooleanInfo.ts +6 -0
  53. package/src/model/exp-boolean/ExpBoolean.ts +5 -0
  54. package/src/model/exp-boolean/ExpBooleanAtom.ts +5 -0
  55. package/src/model/exp-boolean/ExpBooleanOpCollection.ts +8 -0
  56. package/src/model/exp-boolean/ExpBooleanOpCompare.ts +9 -0
  57. package/src/model/exp-boolean/ExpBooleanOpLogic.ts +8 -0
  58. package/src/model/exp-boolean/ExpBooleanParen.ts +6 -0
  59. package/src/model/exp-collection/ExpCollection.ts +10 -0
  60. package/src/model/exp-condition/ExpCondition.ts +12 -0
  61. package/src/model/policy/ActionInfo.ts +23 -0
  62. package/src/model/policy/EventInfo.ts +13 -0
  63. package/src/model/policy/PolicyInfo.ts +20 -0
  64. package/src/model/policy/VarDeclarationInfo.ts +8 -0
  65. package/test/calculator/CalculatorTest.test.ts +13 -0
  66. package/test/function/FunAddElements.ts +9 -0
  67. package/test/function/FunctionFunExecutorTest.test.ts +11 -0
  68. package/test/function/FunctionHandleTest.test.ts +9 -0
  69. package/test/helper/ExpHelperTest.test.ts +7 -0
  70. package/test/helper/FunctionHelperTest.test.ts +16 -0
  71. package/test/helper/PolicyHelperTest.test.ts +14 -0
  72. package/test/tsconfig.test.json +6 -0
  73. 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,10 @@
1
+ [
2
+ {
3
+ "name": "this.all",
4
+ "type": "serviceState"
5
+ },
6
+ {
7
+ "name": "context.id",
8
+ "type": "serviceState"
9
+ }
10
+ ]
@@ -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,8 @@
1
+ // 这里的echoSubject是用户组标的物,统一是用该标的物来取所有依托于该用户组的权限
2
+ FOR PUBLIC
3
+
4
+ // 用户组标的物
5
+ a = (-1)
6
+
7
+ AUTH_VIP Partial{set1}:
8
+ Event.Transaction.Pay(amount = 0.5 * 2, elemsNum = 1) -> AUTH_VIP
@@ -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