yukigo 0.2.3 → 0.3.2
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/.mocharc.json +3 -3
- package/CHANGELOG.md +105 -40
- package/README.md +193 -193
- package/dist/analyzer/GraphBuilder.d.ts +1 -0
- package/dist/analyzer/GraphBuilder.js +2 -1
- package/dist/analyzer/index.d.ts +0 -7
- package/dist/analyzer/index.js +3 -3
- package/dist/analyzer/inspections/functional/functional.d.ts +1 -1
- package/dist/analyzer/inspections/functional/functional.js +1 -1
- package/dist/analyzer/inspections/functional/smells.d.ts +3 -3
- package/dist/analyzer/inspections/functional/smells.js +27 -35
- package/dist/analyzer/inspections/generic/generic.d.ts +22 -14
- package/dist/analyzer/inspections/generic/generic.js +82 -60
- package/dist/analyzer/inspections/generic/smells.d.ts +2 -0
- package/dist/analyzer/inspections/generic/smells.js +55 -64
- package/dist/analyzer/inspections/imperative/imperative.d.ts +3 -3
- package/dist/analyzer/inspections/imperative/imperative.js +3 -3
- package/dist/analyzer/inspections/imperative/smells.d.ts +1 -0
- package/dist/analyzer/inspections/imperative/smells.js +8 -5
- package/dist/analyzer/inspections/logic/logic.d.ts +8 -8
- package/dist/analyzer/inspections/logic/logic.js +5 -5
- package/dist/analyzer/inspections/logic/smells.js +2 -2
- package/dist/analyzer/inspections/object/object.d.ts +5 -5
- package/dist/analyzer/inspections/object/object.js +22 -21
- package/dist/analyzer/inspections/object/smells.js +11 -23
- package/dist/analyzer/utils.d.ts +6 -2
- package/dist/analyzer/utils.js +6 -2
- package/dist/interpreter/components/EnvBuilder.d.ts +20 -1
- package/dist/interpreter/components/EnvBuilder.js +211 -66
- package/dist/interpreter/components/EqualityComparer.d.ts +15 -0
- package/dist/interpreter/components/EqualityComparer.js +69 -0
- package/dist/interpreter/components/Operations.d.ts +17 -14
- package/dist/interpreter/components/Operations.js +61 -62
- package/dist/interpreter/components/PatternMatcher.d.ts +19 -58
- package/dist/interpreter/components/PatternMatcher.js +185 -286
- package/dist/interpreter/components/RuntimeContext.d.ts +24 -15
- package/dist/interpreter/components/RuntimeContext.js +43 -4
- package/dist/interpreter/components/TestRunner.d.ts +15 -13
- package/dist/interpreter/components/TestRunner.js +86 -53
- package/dist/interpreter/components/evaluators/BaseEvaluator.d.ts +19 -0
- package/dist/interpreter/components/evaluators/BaseEvaluator.js +20 -0
- package/dist/interpreter/components/evaluators/ExpressionEvaluator.d.ts +34 -0
- package/dist/interpreter/components/evaluators/ExpressionEvaluator.js +298 -0
- package/dist/interpreter/components/evaluators/OperationEvaluator.d.ts +25 -0
- package/dist/interpreter/components/evaluators/OperationEvaluator.js +226 -0
- package/dist/interpreter/components/evaluators/PrimitiveEvaluator.d.ts +19 -0
- package/dist/interpreter/components/evaluators/PrimitiveEvaluator.js +50 -0
- package/dist/interpreter/components/evaluators/StatementEvaluator.d.ts +28 -0
- package/dist/interpreter/components/evaluators/StatementEvaluator.js +240 -0
- package/dist/interpreter/components/evaluators/TestingEvaluator.d.ts +15 -0
- package/dist/interpreter/components/evaluators/TestingEvaluator.js +14 -0
- package/dist/interpreter/components/evaluators/index.d.ts +110 -0
- package/dist/interpreter/components/evaluators/index.js +21 -0
- package/dist/interpreter/components/evaluators/utils.d.ts +7 -0
- package/dist/interpreter/components/evaluators/utils.js +50 -0
- package/dist/interpreter/components/hooks/YukigoHook.d.ts +27 -0
- package/dist/interpreter/components/hooks/YukigoHook.js +1 -0
- package/dist/interpreter/components/kernel/commands.d.ts +122 -0
- package/dist/interpreter/components/kernel/commands.js +203 -0
- package/dist/interpreter/components/kernel/index.d.ts +51 -0
- package/dist/interpreter/components/kernel/index.js +176 -0
- package/dist/interpreter/components/logic/LogicEngine.d.ts +26 -23
- package/dist/interpreter/components/logic/LogicEngine.js +234 -221
- package/dist/interpreter/components/logic/LogicResolver.d.ts +22 -51
- package/dist/interpreter/components/logic/LogicResolver.js +73 -440
- package/dist/interpreter/components/logic/LogicTerm.d.ts +104 -0
- package/dist/interpreter/components/logic/LogicTerm.js +423 -0
- package/dist/interpreter/components/logic/LogicTranslator.d.ts +25 -9
- package/dist/interpreter/components/logic/LogicTranslator.js +211 -74
- package/dist/interpreter/components/runtimes/FunctionRuntime.d.ts +6 -4
- package/dist/interpreter/components/runtimes/FunctionRuntime.js +82 -84
- package/dist/interpreter/components/runtimes/LazyRuntime.d.ts +13 -14
- package/dist/interpreter/components/runtimes/LazyRuntime.js +112 -239
- package/dist/interpreter/components/runtimes/ObjectRuntime.d.ts +17 -14
- package/dist/interpreter/components/runtimes/ObjectRuntime.js +105 -74
- package/dist/interpreter/errors.d.ts +10 -0
- package/dist/interpreter/errors.js +17 -0
- package/dist/interpreter/index.d.ts +9 -5
- package/dist/interpreter/index.js +11 -13
- package/dist/interpreter/primitives/YuValue.d.ts +21 -0
- package/dist/interpreter/primitives/YuValue.js +40 -0
- package/dist/interpreter/primitives/capabilities.d.ts +90 -0
- package/dist/interpreter/primitives/capabilities.js +1 -0
- package/dist/interpreter/primitives/entities/LazyList.d.ts +48 -0
- package/dist/interpreter/primitives/entities/LazyList.js +164 -0
- package/dist/interpreter/primitives/entities/LogicResult.d.ts +51 -0
- package/dist/interpreter/primitives/entities/LogicResult.js +101 -0
- package/dist/interpreter/primitives/entities/RuntimeClass.d.ts +24 -0
- package/dist/interpreter/primitives/entities/RuntimeClass.js +57 -0
- package/dist/interpreter/primitives/entities/RuntimeFunction.d.ts +40 -0
- package/dist/interpreter/primitives/entities/RuntimeFunction.js +73 -0
- package/dist/interpreter/primitives/entities/RuntimeObject.d.ts +27 -0
- package/dist/interpreter/primitives/entities/RuntimeObject.js +82 -0
- package/dist/interpreter/primitives/entities/RuntimePredicate.d.ts +19 -0
- package/dist/interpreter/primitives/entities/RuntimePredicate.js +59 -0
- package/dist/interpreter/primitives/index.d.ts +14 -0
- package/dist/interpreter/primitives/index.js +14 -0
- package/dist/interpreter/primitives/scalars/YuBoolean.d.ts +24 -0
- package/dist/interpreter/primitives/scalars/YuBoolean.js +69 -0
- package/dist/interpreter/primitives/scalars/YuChar.d.ts +28 -0
- package/dist/interpreter/primitives/scalars/YuChar.js +78 -0
- package/dist/interpreter/primitives/scalars/YuNil.d.ts +25 -0
- package/dist/interpreter/primitives/scalars/YuNil.js +73 -0
- package/dist/interpreter/primitives/scalars/YuNumber.d.ts +49 -0
- package/dist/interpreter/primitives/scalars/YuNumber.js +165 -0
- package/dist/interpreter/primitives/sequences/YuArray.d.ts +33 -0
- package/dist/interpreter/primitives/sequences/YuArray.js +150 -0
- package/dist/interpreter/primitives/sequences/YuString.d.ts +40 -0
- package/dist/interpreter/primitives/sequences/YuString.js +130 -0
- package/dist/interpreter/utils.d.ts +23 -10
- package/dist/interpreter/utils.js +25 -30
- package/dist/tester/index.d.ts +3 -3
- package/dist/tester/index.js +39 -28
- package/dist/utils/helpers.d.ts +13 -5
- package/dist/utils/helpers.js +38 -85
- package/package.json +3 -16
- package/src/analyzer/GraphBuilder.ts +143 -142
- package/src/analyzer/index.ts +185 -194
- package/src/analyzer/inspections/functional/functional.ts +121 -121
- package/src/analyzer/inspections/functional/smells.ts +88 -102
- package/src/analyzer/inspections/generic/generic.ts +610 -577
- package/src/analyzer/inspections/generic/smells.ts +355 -365
- package/src/analyzer/inspections/imperative/imperative.ts +104 -101
- package/src/analyzer/inspections/imperative/smells.ts +58 -54
- package/src/analyzer/inspections/logic/logic.ts +84 -90
- package/src/analyzer/inspections/logic/smells.ts +54 -54
- package/src/analyzer/inspections/object/object.ts +295 -264
- package/src/analyzer/inspections/object/smells.ts +130 -144
- package/src/analyzer/utils.ts +115 -109
- package/src/index.ts +3 -3
- package/src/interpreter/components/EnvBuilder.ts +405 -202
- package/src/interpreter/components/EqualityComparer.ts +107 -0
- package/src/interpreter/components/Operations.ts +126 -99
- package/src/interpreter/components/PatternMatcher.ts +375 -475
- package/src/interpreter/components/RuntimeContext.ts +181 -119
- package/src/interpreter/components/TestRunner.ts +223 -151
- package/src/interpreter/components/evaluators/BaseEvaluator.ts +36 -0
- package/src/interpreter/components/evaluators/ExpressionEvaluator.ts +475 -0
- package/src/interpreter/components/evaluators/OperationEvaluator.ts +477 -0
- package/src/interpreter/components/evaluators/PrimitiveEvaluator.ts +80 -0
- package/src/interpreter/components/evaluators/StatementEvaluator.ts +372 -0
- package/src/interpreter/components/evaluators/TestingEvaluator.ts +26 -0
- package/src/interpreter/components/evaluators/index.ts +34 -0
- package/src/interpreter/components/evaluators/utils.ts +64 -0
- package/src/interpreter/components/hooks/YukigoHook.ts +45 -0
- package/src/interpreter/components/kernel/commands.ts +255 -0
- package/src/interpreter/components/kernel/index.ts +222 -0
- package/src/interpreter/components/logic/LogicEngine.ts +509 -519
- package/src/interpreter/components/logic/LogicResolver.ts +209 -858
- package/src/interpreter/components/logic/LogicTerm.ts +477 -0
- package/src/interpreter/components/logic/LogicTranslator.ts +362 -149
- package/src/interpreter/components/runtimes/FunctionRuntime.ts +249 -227
- package/src/interpreter/components/runtimes/LazyRuntime.ts +226 -334
- package/src/interpreter/components/runtimes/ObjectRuntime.ts +262 -224
- package/src/interpreter/errors.ts +68 -47
- package/src/interpreter/index.ts +50 -52
- package/src/interpreter/primitives/YuValue.ts +64 -0
- package/src/interpreter/primitives/capabilities.ts +111 -0
- package/src/interpreter/primitives/entities/LazyList.ts +225 -0
- package/src/interpreter/primitives/entities/LogicResult.ts +133 -0
- package/src/interpreter/primitives/entities/RuntimeClass.ts +70 -0
- package/src/interpreter/primitives/entities/RuntimeFunction.ts +108 -0
- package/src/interpreter/primitives/entities/RuntimeObject.ts +110 -0
- package/src/interpreter/primitives/entities/RuntimePredicate.ts +77 -0
- package/src/interpreter/primitives/index.ts +17 -0
- package/src/interpreter/primitives/scalars/YuBoolean.ts +79 -0
- package/src/interpreter/primitives/scalars/YuChar.ts +94 -0
- package/src/interpreter/primitives/scalars/YuNil.ts +84 -0
- package/src/interpreter/primitives/scalars/YuNumber.ts +187 -0
- package/src/interpreter/primitives/sequences/YuArray.ts +178 -0
- package/src/interpreter/primitives/sequences/YuString.ts +165 -0
- package/src/interpreter/utils.ts +105 -84
- package/src/tester/index.ts +157 -128
- package/src/utils/helpers.ts +113 -169
- package/tests/analyzer/functional.spec.ts +221 -207
- package/tests/analyzer/generic.spec.ts +178 -178
- package/tests/analyzer/helpers.spec.ts +83 -89
- package/tests/analyzer/logic.spec.ts +237 -237
- package/tests/analyzer/oop.spec.ts +320 -323
- package/tests/analyzer/transitive.spec.ts +166 -166
- package/tests/interpreter/EnvBuilder.spec.ts +181 -183
- package/tests/interpreter/FunctionRuntime.spec.ts +224 -223
- package/tests/interpreter/LazyRuntime.spec.ts +227 -225
- package/tests/interpreter/LogicEngine.spec.ts +371 -327
- package/tests/interpreter/LogicSubstitution.spec.ts +90 -80
- package/tests/interpreter/ObjectRuntime.spec.ts +431 -606
- package/tests/interpreter/Operations.spec.ts +312 -220
- package/tests/interpreter/PatternSystem.spec.ts +254 -213
- package/tests/interpreter/Tests.spec.ts +122 -122
- package/tests/interpreter/interpreter.spec.ts +1143 -991
- package/tests/kernel/YukigoKernel.spec.ts +112 -0
- package/tests/tester/Tester.spec.ts +156 -152
- package/tsconfig.build.json +16 -15
- package/tsconfig.json +27 -25
- package/dist/interpreter/components/Visitor.d.ts +0 -70
- package/dist/interpreter/components/Visitor.js +0 -634
- package/dist/interpreter/entities.d.ts +0 -105
- package/dist/interpreter/entities.js +0 -96
- package/dist/interpreter/trampoline.d.ts +0 -17
- package/dist/interpreter/trampoline.js +0 -38
- package/dist/src/analyzer/GraphBuilder.d.ts +0 -30
- package/dist/src/analyzer/GraphBuilder.js +0 -100
- package/dist/src/analyzer/index.d.ts +0 -59
- package/dist/src/analyzer/index.js +0 -152
- package/dist/src/analyzer/inspections/functional/functional.d.ts +0 -44
- package/dist/src/analyzer/inspections/functional/functional.js +0 -149
- package/dist/src/analyzer/inspections/functional/smells.d.ts +0 -16
- package/dist/src/analyzer/inspections/functional/smells.js +0 -98
- package/dist/src/analyzer/inspections/generic/generic.d.ts +0 -178
- package/dist/src/analyzer/inspections/generic/generic.js +0 -604
- package/dist/src/analyzer/inspections/generic/smells.d.ts +0 -61
- package/dist/src/analyzer/inspections/generic/smells.js +0 -349
- package/dist/src/analyzer/inspections/imperative/imperative.d.ts +0 -35
- package/dist/src/analyzer/inspections/imperative/imperative.js +0 -109
- package/dist/src/analyzer/inspections/imperative/smells.d.ts +0 -16
- package/dist/src/analyzer/inspections/imperative/smells.js +0 -58
- package/dist/src/analyzer/inspections/logic/logic.d.ts +0 -32
- package/dist/src/analyzer/inspections/logic/logic.js +0 -96
- package/dist/src/analyzer/inspections/logic/smells.d.ts +0 -15
- package/dist/src/analyzer/inspections/logic/smells.js +0 -60
- package/dist/src/analyzer/inspections/object/object.d.ts +0 -90
- package/dist/src/analyzer/inspections/object/object.js +0 -321
- package/dist/src/analyzer/inspections/object/smells.d.ts +0 -30
- package/dist/src/analyzer/inspections/object/smells.js +0 -135
- package/dist/src/analyzer/utils.d.ts +0 -30
- package/dist/src/analyzer/utils.js +0 -78
- package/dist/src/index.d.ts +0 -4
- package/dist/src/index.js +0 -4
- package/dist/src/interpreter/components/EnvBuilder.d.ts +0 -21
- package/dist/src/interpreter/components/EnvBuilder.js +0 -155
- package/dist/src/interpreter/components/Operations.d.ts +0 -14
- package/dist/src/interpreter/components/Operations.js +0 -84
- package/dist/src/interpreter/components/PatternMatcher.d.ts +0 -73
- package/dist/src/interpreter/components/PatternMatcher.js +0 -358
- package/dist/src/interpreter/components/RuntimeContext.d.ts +0 -35
- package/dist/src/interpreter/components/RuntimeContext.js +0 -93
- package/dist/src/interpreter/components/TestRunner.d.ts +0 -19
- package/dist/src/interpreter/components/TestRunner.js +0 -110
- package/dist/src/interpreter/components/Visitor.d.ts +0 -71
- package/dist/src/interpreter/components/Visitor.js +0 -638
- package/dist/src/interpreter/components/logic/LogicEngine.d.ts +0 -29
- package/dist/src/interpreter/components/logic/LogicEngine.js +0 -259
- package/dist/src/interpreter/components/logic/LogicResolver.d.ts +0 -53
- package/dist/src/interpreter/components/logic/LogicResolver.js +0 -484
- package/dist/src/interpreter/components/logic/LogicTranslator.d.ts +0 -14
- package/dist/src/interpreter/components/logic/LogicTranslator.js +0 -99
- package/dist/src/interpreter/components/runtimes/FunctionRuntime.d.ts +0 -12
- package/dist/src/interpreter/components/runtimes/FunctionRuntime.js +0 -149
- package/dist/src/interpreter/components/runtimes/LazyRuntime.d.ts +0 -19
- package/dist/src/interpreter/components/runtimes/LazyRuntime.js +0 -269
- package/dist/src/interpreter/components/runtimes/ObjectRuntime.d.ts +0 -35
- package/dist/src/interpreter/components/runtimes/ObjectRuntime.js +0 -126
- package/dist/src/interpreter/errors.d.ts +0 -19
- package/dist/src/interpreter/errors.js +0 -36
- package/dist/src/interpreter/index.d.ts +0 -24
- package/dist/src/interpreter/index.js +0 -41
- package/dist/src/interpreter/trampoline.d.ts +0 -17
- package/dist/src/interpreter/trampoline.js +0 -38
- package/dist/src/interpreter/utils.d.ts +0 -11
- package/dist/src/interpreter/utils.js +0 -65
- package/dist/src/tester/index.d.ts +0 -25
- package/dist/src/tester/index.js +0 -113
- package/dist/src/utils/helpers.d.ts +0 -13
- package/dist/src/utils/helpers.js +0 -52
- package/src/interpreter/components/Visitor.ts +0 -1065
- package/src/interpreter/trampoline.ts +0 -71
|
@@ -1,202 +1,405 @@
|
|
|
1
|
-
import {
|
|
2
|
-
AST,
|
|
3
|
-
ASTNode,
|
|
4
|
-
Attribute,
|
|
5
|
-
Class,
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
const
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
const
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
identifier
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
const
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
});
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
const
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
1
|
+
import {
|
|
2
|
+
AST,
|
|
3
|
+
ASTNode,
|
|
4
|
+
Attribute,
|
|
5
|
+
Class,
|
|
6
|
+
Fact,
|
|
7
|
+
Function,
|
|
8
|
+
Method,
|
|
9
|
+
Rule,
|
|
10
|
+
TraverseVisitor,
|
|
11
|
+
Object,
|
|
12
|
+
Variable,
|
|
13
|
+
Sequence,
|
|
14
|
+
NamedArgument,
|
|
15
|
+
} from "yukigo-ast";
|
|
16
|
+
import { RuntimeContext } from "./RuntimeContext.js";
|
|
17
|
+
import { InterpreterError, UnexpectedNode } from "../errors.js";
|
|
18
|
+
import { YukigoKernel } from "./kernel/index.js";
|
|
19
|
+
import { EvalCommand } from "./kernel/commands.js";
|
|
20
|
+
import {
|
|
21
|
+
RuntimeFunction,
|
|
22
|
+
EquationRuntime,
|
|
23
|
+
RuntimeClass,
|
|
24
|
+
RuntimeObject,
|
|
25
|
+
isRuntimePredicate,
|
|
26
|
+
RuntimePredicate,
|
|
27
|
+
YuValue,
|
|
28
|
+
} from "../primitives/index.js";
|
|
29
|
+
import { InterpreterVisitor } from "./evaluators/index.js";
|
|
30
|
+
|
|
31
|
+
class NotValidPredicate extends InterpreterError {
|
|
32
|
+
constructor(identifier: string) {
|
|
33
|
+
super(
|
|
34
|
+
"[EnvBuilder]",
|
|
35
|
+
`"${identifier}" is not a predicate. Maybe there is something else defined as "${identifier}"?`,
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
class FunctionWithNoEquations extends InterpreterError {
|
|
41
|
+
constructor(identifier: string) {
|
|
42
|
+
super("[EnvBuilder]", `Function ${identifier} has no equations`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
class FunctionArityMismatch extends InterpreterError {
|
|
47
|
+
constructor(identifier: string) {
|
|
48
|
+
super(
|
|
49
|
+
"[EnvBuilder]",
|
|
50
|
+
`All equations of ${identifier} must have the same arity`,
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Builds the initial environment by collecting all top-level function declarations.
|
|
57
|
+
* Each function captures a closure of the environment at its definition time,
|
|
58
|
+
* allowing recursion by including itself in the closure.
|
|
59
|
+
*/
|
|
60
|
+
export class EnvBuilderVisitor extends TraverseVisitor {
|
|
61
|
+
private deferredInitializations: DeferredInitialization[] = [];
|
|
62
|
+
constructor(private ctx: RuntimeContext) {
|
|
63
|
+
super();
|
|
64
|
+
}
|
|
65
|
+
public build(ast: AST): void {
|
|
66
|
+
this.declareGlobalSymbols(ast);
|
|
67
|
+
this.initializeGlobalStates();
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
private declareGlobalSymbols(ast: AST): void {
|
|
71
|
+
for (const node of ast) node.accept(this);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
private initializeGlobalStates(): void {
|
|
75
|
+
for (const initialization of this.deferredInitializations) {
|
|
76
|
+
initialization.execute(this.ctx);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
visitSequence(node: Sequence): void {
|
|
81
|
+
for (const stmt of node.statements) stmt.accept(this);
|
|
82
|
+
}
|
|
83
|
+
visitFunction(node: Function): void {
|
|
84
|
+
const name = node.identifier.value;
|
|
85
|
+
|
|
86
|
+
if (this.ctx.config.debug)
|
|
87
|
+
console.log(`[EnvBuilder] Defining function: ${name}`);
|
|
88
|
+
|
|
89
|
+
if (node.equations.length === 0) throw new FunctionWithNoEquations(name);
|
|
90
|
+
|
|
91
|
+
const arity = node.equations[0].patterns.length;
|
|
92
|
+
|
|
93
|
+
if (node.equations.some((eq) => eq.patterns.length !== arity))
|
|
94
|
+
throw new FunctionArityMismatch(name);
|
|
95
|
+
|
|
96
|
+
let placeholder = new RuntimeFunction(0, []);
|
|
97
|
+
this.ctx.defineGlobal(name, placeholder);
|
|
98
|
+
|
|
99
|
+
const equations: EquationRuntime[] = node.equations.map((eq) => ({
|
|
100
|
+
patterns: eq.patterns,
|
|
101
|
+
body: eq.body,
|
|
102
|
+
}));
|
|
103
|
+
|
|
104
|
+
const runtimeFunc = new RuntimeFunction(
|
|
105
|
+
arity,
|
|
106
|
+
equations,
|
|
107
|
+
name,
|
|
108
|
+
undefined,
|
|
109
|
+
this.ctx.env,
|
|
110
|
+
);
|
|
111
|
+
this.ctx.defineGlobal(name, runtimeFunc);
|
|
112
|
+
}
|
|
113
|
+
visitClass(node: Class): void {
|
|
114
|
+
const identifier = node.identifier.value;
|
|
115
|
+
|
|
116
|
+
if (this.ctx.config.debug)
|
|
117
|
+
console.log(`[EnvBuilder] Defining class: ${identifier}`);
|
|
118
|
+
|
|
119
|
+
const superclass = node.extendsSymbol?.value;
|
|
120
|
+
const mixins = node.includes.map((symbol) => symbol.value);
|
|
121
|
+
|
|
122
|
+
const collector = new OOPCollector(this.ctx);
|
|
123
|
+
node.expression.accept(collector);
|
|
124
|
+
|
|
125
|
+
const fields = collector.collectedFields;
|
|
126
|
+
const methods = collector.collectedMethods;
|
|
127
|
+
|
|
128
|
+
const runtimeClass = new RuntimeClass(
|
|
129
|
+
identifier,
|
|
130
|
+
fields,
|
|
131
|
+
methods,
|
|
132
|
+
mixins,
|
|
133
|
+
superclass,
|
|
134
|
+
collector.fieldInitializers,
|
|
135
|
+
);
|
|
136
|
+
|
|
137
|
+
this.ctx.defineGlobal(identifier, runtimeClass);
|
|
138
|
+
}
|
|
139
|
+
visitObject(node: Object): void {
|
|
140
|
+
const identifier = node.identifier.value;
|
|
141
|
+
|
|
142
|
+
if (this.ctx.config.debug)
|
|
143
|
+
console.log(`[EnvBuilder] Defining object: ${identifier}`);
|
|
144
|
+
|
|
145
|
+
const collector = new OOPCollector(this.ctx);
|
|
146
|
+
node.expression.accept(collector);
|
|
147
|
+
|
|
148
|
+
const fields = this.resolveObjectFields(node, collector);
|
|
149
|
+
const methods = collector.collectedMethods;
|
|
150
|
+
|
|
151
|
+
const runtimeObject = new RuntimeObject(
|
|
152
|
+
identifier,
|
|
153
|
+
(node as any).extendsSymbol?.value || "",
|
|
154
|
+
fields,
|
|
155
|
+
methods,
|
|
156
|
+
);
|
|
157
|
+
|
|
158
|
+
// Encolamos de forma declarativa la inicialización tardía delegando la tarea
|
|
159
|
+
const initializers = this.collectAllInitializers(node, collector);
|
|
160
|
+
this.deferredInitializations.push(
|
|
161
|
+
new DeferredInitialization(runtimeObject, initializers),
|
|
162
|
+
);
|
|
163
|
+
|
|
164
|
+
this.ctx.defineGlobal(identifier, runtimeObject);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
private resolveObjectFields(
|
|
168
|
+
node: Object,
|
|
169
|
+
collector: OOPCollector,
|
|
170
|
+
): Map<string, YuValue> {
|
|
171
|
+
const fields = collector.collectedFields;
|
|
172
|
+
const extendsSymbol = (node as any).extendsSymbol?.value;
|
|
173
|
+
|
|
174
|
+
if (extendsSymbol) {
|
|
175
|
+
const classDef = this.ctx.lookup(extendsSymbol);
|
|
176
|
+
if (classDef && classDef instanceof RuntimeClass) {
|
|
177
|
+
const inheritedFields = this.getClassFields(classDef);
|
|
178
|
+
for (const [k, v] of inheritedFields.entries()) {
|
|
179
|
+
if (!fields.has(k)) fields.set(k, v);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return fields;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
private collectAllInitializers(
|
|
187
|
+
node: Object,
|
|
188
|
+
collector: OOPCollector,
|
|
189
|
+
): Map<string, ASTNode> {
|
|
190
|
+
const initializers = new Map<string, ASTNode>();
|
|
191
|
+
const extendsSymbol = (node as any).extendsSymbol?.value;
|
|
192
|
+
|
|
193
|
+
// 1. Heredados de la Clase Madre
|
|
194
|
+
if (extendsSymbol) {
|
|
195
|
+
const classDef = this.ctx.lookup(extendsSymbol);
|
|
196
|
+
if (classDef && classDef instanceof RuntimeClass) {
|
|
197
|
+
for (const [k, expr] of this.getClassInitializers(classDef).entries()) {
|
|
198
|
+
initializers.set(k, expr);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// 2. Definiciones locales del propio Objeto
|
|
204
|
+
for (const [k, expr] of collector.fieldInitializers.entries()) {
|
|
205
|
+
initializers.set(k, expr);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// 3. Argumentos nombrados por constructor inline
|
|
209
|
+
const extendsArgs = (node as any).extendsArgs || [];
|
|
210
|
+
for (const arg of extendsArgs) {
|
|
211
|
+
if (
|
|
212
|
+
arg instanceof NamedArgument ||
|
|
213
|
+
arg.constructor.name === "NamedArgument"
|
|
214
|
+
) {
|
|
215
|
+
initializers.set(
|
|
216
|
+
(arg as any).identifier.value,
|
|
217
|
+
(arg as any).expression,
|
|
218
|
+
);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
return initializers;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
visitFact(node: Fact): void {
|
|
226
|
+
const identifier = node.identifier.value;
|
|
227
|
+
|
|
228
|
+
if (this.ctx.config.debug)
|
|
229
|
+
console.log(`[EnvBuilder] Defining fact: ${identifier}`);
|
|
230
|
+
|
|
231
|
+
if (this.ctx.isDefined(identifier)) {
|
|
232
|
+
const runtimeValue = this.ctx.lookup(identifier);
|
|
233
|
+
if (!isRuntimePredicate(runtimeValue))
|
|
234
|
+
throw new NotValidPredicate(identifier);
|
|
235
|
+
runtimeValue.addClause(node);
|
|
236
|
+
} else {
|
|
237
|
+
const predicate = new RuntimePredicate(identifier, [node]);
|
|
238
|
+
this.ctx.defineGlobal(identifier, predicate);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
visitRule(node: Rule): void {
|
|
243
|
+
const identifier = node.identifier.value;
|
|
244
|
+
|
|
245
|
+
if (this.ctx.config.debug)
|
|
246
|
+
console.log(`[EnvBuilder] Defining rule: ${identifier}`);
|
|
247
|
+
|
|
248
|
+
if (this.ctx.isDefined(identifier)) {
|
|
249
|
+
const runtimeValue = this.ctx.lookup(identifier);
|
|
250
|
+
if (!isRuntimePredicate(runtimeValue))
|
|
251
|
+
throw new NotValidPredicate(identifier);
|
|
252
|
+
runtimeValue.addClause(node);
|
|
253
|
+
} else {
|
|
254
|
+
const predicate = new RuntimePredicate(identifier, [node]);
|
|
255
|
+
this.ctx.defineGlobal(identifier, predicate);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
private getClassFields(classDef: RuntimeClass): Map<string, YuValue> {
|
|
259
|
+
const fields = new Map<string, YuValue>();
|
|
260
|
+
const collect = (c: RuntimeClass) => {
|
|
261
|
+
if (c.superclass) {
|
|
262
|
+
const superDef = this.ctx.lookup(c.superclass);
|
|
263
|
+
if (superDef && superDef instanceof RuntimeClass) {
|
|
264
|
+
collect(superDef);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
for (const mixin of c.mixins) {
|
|
268
|
+
const mixinDef = this.ctx.lookup(mixin);
|
|
269
|
+
if (mixinDef && mixinDef instanceof RuntimeClass) {
|
|
270
|
+
collect(mixinDef);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
for (const [k, v] of c.fields.entries()) {
|
|
274
|
+
fields.set(k, v);
|
|
275
|
+
}
|
|
276
|
+
};
|
|
277
|
+
collect(classDef);
|
|
278
|
+
return fields;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
private getClassInitializers(classDef: RuntimeClass): Map<string, any> {
|
|
282
|
+
const initializers = new Map<string, any>();
|
|
283
|
+
const collect = (c: RuntimeClass) => {
|
|
284
|
+
if (c.superclass) {
|
|
285
|
+
const superDef = this.ctx.lookup(c.superclass);
|
|
286
|
+
if (superDef && superDef instanceof RuntimeClass) {
|
|
287
|
+
collect(superDef);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
for (const mixin of c.mixins) {
|
|
291
|
+
const mixinDef = this.ctx.lookup(mixin);
|
|
292
|
+
if (mixinDef && mixinDef instanceof RuntimeClass) {
|
|
293
|
+
collect(mixinDef);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
const cInitializers = c.fieldInitializers;
|
|
297
|
+
if (cInitializers) {
|
|
298
|
+
for (const [k, v] of cInitializers.entries()) {
|
|
299
|
+
initializers.set(k, v);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
};
|
|
303
|
+
collect(classDef);
|
|
304
|
+
return initializers;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
visitVariable(node: Variable): void {
|
|
308
|
+
const identifier = node.identifier.value;
|
|
309
|
+
|
|
310
|
+
if (this.ctx.config.debug)
|
|
311
|
+
console.log(`[EnvBuilder] Defining variable: ${identifier}`);
|
|
312
|
+
|
|
313
|
+
const visitor = new InterpreterVisitor(this.ctx);
|
|
314
|
+
const kernel = new YukigoKernel(visitor);
|
|
315
|
+
this.ctx.defineGlobal(
|
|
316
|
+
identifier,
|
|
317
|
+
kernel.run(new EvalCommand(node.expression)),
|
|
318
|
+
);
|
|
319
|
+
}
|
|
320
|
+
visit(node: ASTNode): void {
|
|
321
|
+
return node.accept(this);
|
|
322
|
+
}
|
|
323
|
+
public fallback(node: ASTNode): string {
|
|
324
|
+
throw new UnexpectedNode(node.constructor.name, "EnvBuilderVisitor");
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
class DeferredInitialization {
|
|
329
|
+
constructor(
|
|
330
|
+
private runtimeObject: RuntimeObject,
|
|
331
|
+
private initializers: Map<string, ASTNode>,
|
|
332
|
+
) {}
|
|
333
|
+
|
|
334
|
+
public execute(ctx: RuntimeContext): void {
|
|
335
|
+
for (const [fieldName, expression] of this.initializers.entries()) {
|
|
336
|
+
this.initializeField(fieldName, expression, ctx);
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
private initializeField(
|
|
341
|
+
fieldName: string,
|
|
342
|
+
expr: ASTNode,
|
|
343
|
+
ctx: RuntimeContext,
|
|
344
|
+
): void {
|
|
345
|
+
try {
|
|
346
|
+
const rawResult = InterpreterVisitor.evaluateLiteral(expr, ctx);
|
|
347
|
+
const evaluatedValue = this.resolveExecutionValue(rawResult, ctx);
|
|
348
|
+
|
|
349
|
+
this.runtimeObject.setField(fieldName, evaluatedValue);
|
|
350
|
+
} catch (error) {
|
|
351
|
+
this.logWarning(fieldName, error, ctx);
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
private resolveExecutionValue(rawResult: any, ctx: RuntimeContext): YuValue {
|
|
356
|
+
// Si el resultado requiere ejecución diferida en el Kernel de Yukigo, lo resolvemos de forma atómica
|
|
357
|
+
if (rawResult && typeof rawResult.execute === "function") {
|
|
358
|
+
const visitor = new InterpreterVisitor(ctx);
|
|
359
|
+
const uniqueKernel = new YukigoKernel(visitor, "first");
|
|
360
|
+
return uniqueKernel.run(rawResult);
|
|
361
|
+
}
|
|
362
|
+
return rawResult;
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
private logWarning(fieldName: string, error: any, ctx: RuntimeContext): void {
|
|
366
|
+
if (ctx.config.debug) {
|
|
367
|
+
console.log(
|
|
368
|
+
`[EnvBuilder] [Warning Tardío] No se pudo evaluar el atributo ${fieldName} en '${this.runtimeObject.identifier}':`,
|
|
369
|
+
error,
|
|
370
|
+
);
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
export class OOPCollector extends TraverseVisitor {
|
|
376
|
+
public collectedMethods: Map<string, RuntimeFunction> = new Map();
|
|
377
|
+
public collectedFields: Map<string, YuValue> = new Map();
|
|
378
|
+
public fieldInitializers: Map<string, ASTNode> = new Map();
|
|
379
|
+
|
|
380
|
+
constructor(private ctx: RuntimeContext) {
|
|
381
|
+
super();
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
visitMethod(node: Method) {
|
|
385
|
+
const name = node.identifier.value;
|
|
386
|
+
const arity = node.equations[0].patterns.length;
|
|
387
|
+
const key = `${name}/${arity}`;
|
|
388
|
+
const runtimeMethod = new RuntimeFunction(arity, [...node.equations], name);
|
|
389
|
+
this.collectedMethods.set(key, runtimeMethod);
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
visitAttribute(node: Attribute) {
|
|
393
|
+
const fieldName = node.identifier.value;
|
|
394
|
+
// Registramos la expresión diferida
|
|
395
|
+
this.fieldInitializers.set(fieldName, node.expression);
|
|
396
|
+
|
|
397
|
+
// Inicializamos transitoriamente el campo con YuNil para reservar su espacio en la firma
|
|
398
|
+
const initialPlaceholder = (global as any).YuNil?.getInstance() || null;
|
|
399
|
+
this.collectedFields.set(fieldName, initialPlaceholder);
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
public fallback(node: ASTNode): string {
|
|
403
|
+
throw new UnexpectedNode(node.constructor.name, "OOPCollector");
|
|
404
|
+
}
|
|
405
|
+
}
|