@rsconcept/domain 1.0.0 → 1.2.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/README.md +3 -3
- package/dist/analyzer-DlSq3Y3r.d.ts +39 -0
- package/dist/arguments-extractor-1acwjQNc.d.ts +38 -0
- package/dist/ast-C8sIpKdL.d.ts +51 -0
- package/dist/ast-annotations-BiMjkKvz.d.ts +16 -0
- package/dist/branded-ZlzIcxzu.d.ts +9 -0
- package/dist/calculator-C9W2jkSx.d.ts +39 -0
- package/dist/cctext/index.d.ts +2 -1
- package/dist/cctext/index.js +2 -42
- package/dist/cctext/language-api.d.ts +10 -12
- package/dist/cctext/language-api.js +157 -227
- package/dist/cctext/language-api.js.map +1 -1
- package/dist/cctext/language.d.ts +24 -22
- package/dist/cctext/language.js +43 -39
- package/dist/cctext/language.js.map +1 -1
- package/dist/error-E1LVq_3w.d.ts +87 -0
- package/dist/graph/graph.d.ts +2 -62
- package/dist/graph/graph.js +339 -382
- package/dist/graph/graph.js.map +1 -1
- package/dist/graph/index.d.ts +2 -1
- package/dist/graph/index.js +2 -384
- package/dist/graph-DR8rL2o3.d.ts +64 -0
- package/dist/hash-Y8I4c6Al.d.ts +8 -0
- package/dist/index-BKZ67WMa.d.ts +1 -0
- package/dist/index-BVVgDSdq.d.ts +1 -0
- package/dist/index-DmtQKWjk.d.ts +1 -0
- package/dist/index-_6s0AX1B.d.ts +1 -0
- package/dist/index.d.ts +27 -28
- package/dist/index.js +23 -5851
- package/dist/lezer-tree-iS7LpLBJ.d.ts +14 -0
- package/dist/library/folder-tree.d.ts +22 -20
- package/dist/library/folder-tree.js +108 -130
- package/dist/library/folder-tree.js.map +1 -1
- package/dist/library/index.d.ts +8 -17
- package/dist/library/index.js +7 -2800
- package/dist/library/library-api.d.ts +3 -1
- package/dist/library/library-api.js +9 -8
- package/dist/library/library-api.js.map +1 -1
- package/dist/library/library.d.ts +2 -56
- package/dist/library/library.js +23 -19
- package/dist/library/library.js.map +1 -1
- package/dist/library/oss-api.d.ts +26 -37
- package/dist/library/oss-api.js +258 -1096
- package/dist/library/oss-api.js.map +1 -1
- package/dist/library/oss-layout-api.d.ts +28 -28
- package/dist/library/oss-layout-api.js +239 -316
- package/dist/library/oss-layout-api.js.map +1 -1
- package/dist/library/oss-layout.d.ts +2 -25
- package/dist/library/oss-layout.js +1 -1
- package/dist/library/oss.d.ts +87 -89
- package/dist/library/oss.js +27 -26
- package/dist/library/oss.js.map +1 -1
- package/dist/library/rsengine.d.ts +100 -106
- package/dist/library/rsengine.js +439 -2599
- package/dist/library/rsengine.js.map +1 -1
- package/dist/library/rsform-api.d.ts +11 -16
- package/dist/library/rsform-api.js +313 -825
- package/dist/library/rsform-api.js.map +1 -1
- package/dist/library/rsform.d.ts +159 -167
- package/dist/library/rsform.js +29 -28
- package/dist/library/rsform.js.map +1 -1
- package/dist/library/rsmodel-api.d.ts +8 -15
- package/dist/library/rsmodel-api.js +172 -813
- package/dist/library/rsmodel-api.js.map +1 -1
- package/dist/library/rsmodel.d.ts +27 -33
- package/dist/library/rsmodel.js +16 -23
- package/dist/library/rsmodel.js.map +1 -1
- package/dist/library/structure-planner.d.ts +20 -26
- package/dist/library/structure-planner.js +106 -474
- package/dist/library/structure-planner.js.map +1 -1
- package/dist/library-CYun28Xz.d.ts +58 -0
- package/dist/oss-layout-3glgAqfn.d.ts +27 -0
- package/dist/parser-Bwd8LxJ1.d.ts +7 -0
- package/dist/parsing/ast.d.ts +2 -49
- package/dist/parsing/ast.js +68 -76
- package/dist/parsing/ast.js.map +1 -1
- package/dist/parsing/index.d.ts +3 -3
- package/dist/parsing/index.js +3 -141
- package/dist/parsing/lezer-tree.d.ts +2 -13
- package/dist/parsing/lezer-tree.js +50 -43
- package/dist/parsing/lezer-tree.js.map +1 -1
- package/dist/rslang/api.d.ts +9 -14
- package/dist/rslang/api.js +114 -827
- package/dist/rslang/api.js.map +1 -1
- package/dist/rslang/ast-annotations.d.ts +2 -18
- package/dist/rslang/ast-annotations.js +34 -45
- package/dist/rslang/ast-annotations.js.map +1 -1
- package/dist/rslang/error.d.ts +2 -85
- package/dist/rslang/error.js +88 -150
- package/dist/rslang/error.js.map +1 -1
- package/dist/rslang/eval/calculator.d.ts +2 -43
- package/dist/rslang/eval/calculator.js +81 -1636
- package/dist/rslang/eval/calculator.js.map +1 -1
- package/dist/rslang/eval/evaluation-cache.d.ts +22 -26
- package/dist/rslang/eval/evaluation-cache.js +168 -287
- package/dist/rslang/eval/evaluation-cache.js.map +1 -1
- package/dist/rslang/eval/evaluator.d.ts +59 -63
- package/dist/rslang/eval/evaluator.js +602 -1509
- package/dist/rslang/eval/evaluator.js.map +1 -1
- package/dist/rslang/eval/value-api.d.ts +2 -48
- package/dist/rslang/eval/value-api.js +2 -490
- package/dist/rslang/eval/value.d.ts +2 -36
- package/dist/rslang/eval/value.js +2 -118
- package/dist/rslang/index.d.ts +14 -17
- package/dist/rslang/index.js +12 -4314
- package/dist/rslang/labels.d.ts +6 -6
- package/dist/rslang/labels.js +139 -305
- package/dist/rslang/labels.js.map +1 -1
- package/dist/rslang/parser/expression-generator.d.ts +5 -5
- package/dist/rslang/parser/expression-generator.js +248 -446
- package/dist/rslang/parser/expression-generator.js.map +1 -1
- package/dist/rslang/parser/normalize.d.ts +4 -8
- package/dist/rslang/parser/normalize.js +286 -481
- package/dist/rslang/parser/normalize.js.map +1 -1
- package/dist/rslang/parser/parser.d.ts +2 -5
- package/dist/rslang/parser/parser.js +30 -21
- package/dist/rslang/parser/parser.js.map +1 -1
- package/dist/rslang/parser/parser.terms.d.ts +43 -41
- package/dist/rslang/parser/parser.terms.js +44 -83
- package/dist/rslang/parser/parser.terms.js.map +1 -1
- package/dist/rslang/parser/syntax-errors.d.ts +5 -8
- package/dist/rslang/parser/syntax-errors.js +113 -382
- package/dist/rslang/parser/syntax-errors.js.map +1 -1
- package/dist/rslang/parser/token.d.ts +2 -79
- package/dist/rslang/parser/token.js +81 -93
- package/dist/rslang/parser/token.js.map +1 -1
- package/dist/rslang/semantic/analyzer.d.ts +2 -39
- package/dist/rslang/semantic/analyzer.js +186 -2600
- package/dist/rslang/semantic/analyzer.js.map +1 -1
- package/dist/rslang/semantic/arguments-extractor.d.ts +2 -42
- package/dist/rslang/semantic/arguments-extractor.js +202 -361
- package/dist/rslang/semantic/arguments-extractor.js.map +1 -1
- package/dist/rslang/semantic/type-auditor.d.ts +64 -68
- package/dist/rslang/semantic/type-auditor.js +594 -1564
- package/dist/rslang/semantic/type-auditor.js.map +1 -1
- package/dist/rslang/semantic/typification-api.d.ts +4 -7
- package/dist/rslang/semantic/typification-api.js +162 -303
- package/dist/rslang/semantic/typification-api.js.map +1 -1
- package/dist/rslang/semantic/typification-parser.d.ts +2 -12
- package/dist/rslang/semantic/typification-parser.js +165 -219
- package/dist/rslang/semantic/typification-parser.js.map +1 -1
- package/dist/rslang/semantic/typification.d.ts +2 -119
- package/dist/rslang/semantic/typification.js +66 -52
- package/dist/rslang/semantic/typification.js.map +1 -1
- package/dist/rslang/semantic/value-auditor.d.ts +32 -38
- package/dist/rslang/semantic/value-auditor.js +206 -518
- package/dist/rslang/semantic/value-auditor.js.map +1 -1
- package/dist/rslang/semantic/value-class.d.ts +2 -10
- package/dist/rslang/semantic/value-class.js +8 -7
- package/dist/rslang/semantic/value-class.js.map +1 -1
- package/dist/rslang/typification-graph.d.ts +2 -33
- package/dist/rslang/typification-graph.js +94 -306
- package/dist/rslang/typification-graph.js.map +1 -1
- package/dist/shared/branded.d.ts +2 -7
- package/dist/shared/branded.js +1 -1
- package/dist/shared/hash.d.ts +2 -6
- package/dist/shared/hash.js +13 -13
- package/dist/shared/hash.js.map +1 -1
- package/dist/shared/index.d.ts +3 -2
- package/dist/shared/index.js +2 -18
- package/dist/token-DeXAmzwr.d.ts +81 -0
- package/dist/typification-Dk-fisgO.d.ts +120 -0
- package/dist/typification-graph-6HcZ-rKH.d.ts +30 -0
- package/dist/typification-parser-BBVx1RxP.d.ts +13 -0
- package/dist/value-B8UtCqaK.js +366 -0
- package/dist/value-B8UtCqaK.js.map +1 -0
- package/dist/value-CTjX6825.d.ts +33 -0
- package/dist/value-api-Bw-SgaYY.d.ts +49 -0
- package/dist/value-class-CNI-lqXJ.d.ts +12 -0
- package/package.json +8 -8
- package/src/library/oss-api.test.ts +76 -0
- package/src/library/oss-api.ts +4 -1
- package/src/library/rsform-api.test.ts +24 -0
- package/src/library/rsform-api.ts +12 -4
- package/dist/cctext/index.js.map +0 -1
- package/dist/graph/index.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/library/index.js.map +0 -1
- package/dist/library/oss-layout.js.map +0 -1
- package/dist/parsing/index.js.map +0 -1
- package/dist/rslang/eval/value-api.js.map +0 -1
- package/dist/rslang/eval/value.js.map +0 -1
- package/dist/rslang/index.js.map +0 -1
- package/dist/shared/branded.js.map +0 -1
- package/dist/shared/index.js.map +0 -1
|
@@ -1,403 +1,134 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
var AST_ERRORS_KEY = "rsErrors";
|
|
12
|
-
function annotateError(node, code, params) {
|
|
13
|
-
if (typeof node.annotation === "object" && node.annotation !== null && AST_ERRORS_KEY in node.annotation && isAstNodeErrorRef(node.annotation[AST_ERRORS_KEY])) {
|
|
14
|
-
return;
|
|
15
|
-
}
|
|
16
|
-
const entry = params !== void 0 && params.length > 0 ? { code, params: [...params] } : { code };
|
|
17
|
-
node.annotation = {
|
|
18
|
-
...typeof node.annotation === "object" && node.annotation !== null ? node.annotation : {},
|
|
19
|
-
[AST_ERRORS_KEY]: entry
|
|
20
|
-
};
|
|
21
|
-
}
|
|
22
|
-
function isAstNodeErrorRef(x) {
|
|
23
|
-
if (typeof x !== "object" || x === null || !("code" in x)) {
|
|
24
|
-
return false;
|
|
25
|
-
}
|
|
26
|
-
const code = x.code;
|
|
27
|
-
if (typeof code !== "number") {
|
|
28
|
-
return false;
|
|
29
|
-
}
|
|
30
|
-
if (!("params" in x)) {
|
|
31
|
-
return true;
|
|
32
|
-
}
|
|
33
|
-
const p = x.params;
|
|
34
|
-
if (p === void 0) {
|
|
35
|
-
return true;
|
|
36
|
-
}
|
|
37
|
-
return Array.isArray(p) && p.every((item) => typeof item === "string");
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
// src/rslang/error.ts
|
|
41
|
-
var RSErrorCode = {
|
|
42
|
-
unknownSyntax: 33792,
|
|
43
|
-
// 33792
|
|
44
|
-
missingParenthesis: 33798,
|
|
45
|
-
// 33798
|
|
46
|
-
missingCurlyBrace: 33799,
|
|
47
|
-
// 33799
|
|
48
|
-
missingSquareBracket: 33800,
|
|
49
|
-
// 33800
|
|
50
|
-
bracketMismatch: 33801,
|
|
51
|
-
// 33801
|
|
52
|
-
doubleParenthesis: 33802,
|
|
53
|
-
// 33802
|
|
54
|
-
missingOpenBracket: 33803,
|
|
55
|
-
// 33803
|
|
56
|
-
expectedLocal: 33813,
|
|
57
|
-
// 33813
|
|
58
|
-
expectedType: 33814,
|
|
59
|
-
// 33814
|
|
60
|
-
localDoubleDeclare: 10241,
|
|
61
|
-
// 10241
|
|
62
|
-
localNotUsed: 10242,
|
|
63
|
-
// 10242
|
|
64
|
-
localUndeclared: 34817,
|
|
65
|
-
// 34817
|
|
66
|
-
localShadowing: 34818,
|
|
67
|
-
// 34818
|
|
68
|
-
typesNotEqual: 34819,
|
|
69
|
-
// 34819
|
|
70
|
-
globalNotTyped: 34820,
|
|
71
|
-
// 34820
|
|
72
|
-
invalidDecart: 34821,
|
|
73
|
-
// 34821
|
|
74
|
-
invalidBoolean: 34822,
|
|
75
|
-
// 34822
|
|
76
|
-
invalidTypeOperation: 34823,
|
|
77
|
-
// 34823
|
|
78
|
-
invalidCard: 34824,
|
|
79
|
-
// 34824
|
|
80
|
-
invalidDebool: 34825,
|
|
81
|
-
// 34825
|
|
82
|
-
globalFuncWithoutArgs: 34827,
|
|
83
|
-
// 34827
|
|
84
|
-
invalidReduce: 34832,
|
|
85
|
-
// 34832
|
|
86
|
-
invalidProjectionTuple: 34833,
|
|
87
|
-
// 34833
|
|
88
|
-
invalidProjectionSet: 34834,
|
|
89
|
-
// 34834
|
|
90
|
-
invalidEnumeration: 34835,
|
|
91
|
-
// 34835
|
|
92
|
-
invalidCortegeDeclare: 34836,
|
|
93
|
-
// 34836
|
|
94
|
-
localOutOfScope: 34837,
|
|
95
|
-
// 34837
|
|
96
|
-
invalidElementPredicate: 34838,
|
|
97
|
-
// 34838
|
|
98
|
-
invalidEmptySetUsage: 34839,
|
|
99
|
-
// 34839
|
|
100
|
-
invalidArgsArity: 34840,
|
|
101
|
-
// 34840
|
|
102
|
-
invalidArgumentType: 34841,
|
|
103
|
-
// 34841
|
|
104
|
-
globalStructure: 34844,
|
|
105
|
-
// 34844
|
|
106
|
-
radicalUsage: 34849,
|
|
107
|
-
// 34849
|
|
108
|
-
invalidFilterArgumentType: 34850,
|
|
109
|
-
// 34850
|
|
110
|
-
invalidFilterArity: 34851,
|
|
111
|
-
// 34851
|
|
112
|
-
arithmeticNotSupported: 34852,
|
|
113
|
-
// 34852
|
|
114
|
-
typesNotCompatible: 34853,
|
|
115
|
-
// 34853
|
|
116
|
-
orderingNotSupported: 34854,
|
|
117
|
-
// 34854
|
|
118
|
-
expectedLogic: 34855,
|
|
119
|
-
// 34855
|
|
120
|
-
expectedSetexpr: 34856,
|
|
121
|
-
// 34856
|
|
122
|
-
invalidArgumentCortegeDeclare: 34857,
|
|
123
|
-
// 34857
|
|
124
|
-
globalNoValue: 34880,
|
|
125
|
-
// 34880
|
|
126
|
-
invalidPropertyUsage: 34881,
|
|
127
|
-
// 34881
|
|
128
|
-
// Value evaluation (runtime)
|
|
129
|
-
calcUnknownError: 33024,
|
|
130
|
-
// 35328
|
|
131
|
-
setOverflow: 33025,
|
|
132
|
-
// 35329
|
|
133
|
-
booleanBaseLimit: 33026,
|
|
134
|
-
// 35330
|
|
135
|
-
calcGlobalMissing: 33027,
|
|
136
|
-
// 35331
|
|
137
|
-
iterationsLimit: 33028,
|
|
138
|
-
// 35332
|
|
139
|
-
calcInvalidDebool: 33029,
|
|
140
|
-
// 35333
|
|
141
|
-
iterateInfinity: 33030,
|
|
142
|
-
// 35334
|
|
143
|
-
calculationNotSupported: 33031,
|
|
144
|
-
// 35335
|
|
145
|
-
cstEmptyDerived: 34913,
|
|
146
|
-
// 34913
|
|
147
|
-
definitionNotAllowed: 34914
|
|
148
|
-
// 34914
|
|
149
|
-
};
|
|
150
|
-
|
|
151
|
-
// src/rslang/parser/parser.terms.ts
|
|
152
|
-
var Variable = 4;
|
|
153
|
-
|
|
154
|
-
// src/rslang/parser/token.ts
|
|
155
|
-
var TokenID = {
|
|
156
|
-
// Global, local IDs and literals
|
|
157
|
-
ERROR: TOKEN_ERROR,
|
|
158
|
-
ID_LOCAL: 258,
|
|
159
|
-
ID_GLOBAL: 259,
|
|
160
|
-
ID_FUNCTION: 260,
|
|
161
|
-
ID_PREDICATE: 261,
|
|
162
|
-
ID_RADICAL: 262,
|
|
163
|
-
LIT_INTEGER: 263,
|
|
164
|
-
LIT_WHOLE_NUMBERS: 264,
|
|
165
|
-
LIT_EMPTYSET: 265,
|
|
166
|
-
// Arithmetic
|
|
167
|
-
PLUS: 266,
|
|
168
|
-
MINUS: 267,
|
|
169
|
-
MULTIPLY: 268,
|
|
170
|
-
// Integer predicate symbols
|
|
171
|
-
GREATER: 269,
|
|
172
|
-
LESSER: 270,
|
|
173
|
-
GREATER_OR_EQ: 271,
|
|
174
|
-
LESSER_OR_EQ: 272,
|
|
175
|
-
// Equality comparison
|
|
176
|
-
EQUAL: 273,
|
|
177
|
-
NOTEQUAL: 274,
|
|
178
|
-
// Logic predicate symbols
|
|
179
|
-
QUANTOR_UNIVERSAL: 275,
|
|
180
|
-
QUANTOR_EXISTS: 276,
|
|
181
|
-
LOGIC_NOT: 277,
|
|
182
|
-
LOGIC_EQUIVALENT: 278,
|
|
183
|
-
LOGIC_IMPLICATION: 279,
|
|
184
|
-
LOGIC_OR: 280,
|
|
185
|
-
LOGIC_AND: 281,
|
|
186
|
-
// Set theory predicate symbols
|
|
187
|
-
SET_IN: 282,
|
|
188
|
-
SET_NOT_IN: 283,
|
|
189
|
-
SUBSET: 284,
|
|
190
|
-
SUBSET_OR_EQ: 285,
|
|
191
|
-
NOT_SUBSET: 286,
|
|
192
|
-
// Set theory operators
|
|
193
|
-
DECART: 287,
|
|
194
|
-
SET_UNION: 288,
|
|
195
|
-
SET_INTERSECTION: 289,
|
|
196
|
-
SET_MINUS: 290,
|
|
197
|
-
SET_SYMMETRIC_MINUS: 291,
|
|
198
|
-
BOOLEAN: 292,
|
|
199
|
-
// Structure operations
|
|
200
|
-
BIGPR: 293,
|
|
201
|
-
SMALLPR: 294,
|
|
202
|
-
FILTER: 295,
|
|
203
|
-
CARD: 296,
|
|
204
|
-
BOOL: 297,
|
|
205
|
-
DEBOOL: 298,
|
|
206
|
-
REDUCE: 299,
|
|
207
|
-
// Term constructions prefixes
|
|
208
|
-
DECLARATIVE: 300,
|
|
209
|
-
RECURSIVE: 301,
|
|
210
|
-
IMPERATIVE: 302,
|
|
211
|
-
ITERATE: 303,
|
|
212
|
-
ASSIGN: 304,
|
|
213
|
-
// Punctuation
|
|
214
|
-
PUNCTUATION_DEFINE: 305,
|
|
215
|
-
PUNCTUATION_STRUCT: 306,
|
|
216
|
-
PUNCTUATION_PL: 307,
|
|
217
|
-
PUNCTUATION_PR: 308,
|
|
218
|
-
PUNCTUATION_CL: 309,
|
|
219
|
-
PUNCTUATION_CR: 310,
|
|
220
|
-
PUNCTUATION_SL: 311,
|
|
221
|
-
PUNCTUATION_SR: 312,
|
|
222
|
-
PUNCTUATION_BAR: 313,
|
|
223
|
-
PUNCTUATION_COMMA: 314,
|
|
224
|
-
PUNCTUATION_SEMICOLON: 315,
|
|
225
|
-
// ======= Non-terminal tokens =========
|
|
226
|
-
NT_ENUM_DECL: 316,
|
|
227
|
-
NT_TUPLE: 317,
|
|
228
|
-
NT_ENUMERATION: 318,
|
|
229
|
-
NT_TUPLE_DECL: 319,
|
|
230
|
-
NT_ARG_DECL: 320,
|
|
231
|
-
NT_FUNC_DEFINITION: 321,
|
|
232
|
-
NT_ARGUMENTS: 322,
|
|
233
|
-
NT_FUNC_CALL: 323,
|
|
234
|
-
NT_DECLARATIVE_EXPR: 324,
|
|
235
|
-
NT_IMPERATIVE_EXPR: 325,
|
|
236
|
-
NT_RECURSIVE_FULL: 326,
|
|
237
|
-
NT_RECURSIVE_SHORT: 327,
|
|
238
|
-
// ======= Helper tokens ========
|
|
239
|
-
INTERRUPT: 328,
|
|
240
|
-
END: 329
|
|
241
|
-
};
|
|
242
|
-
|
|
243
|
-
// src/rslang/parser/syntax-errors.ts
|
|
1
|
+
import { annotateError } from "../ast-annotations.js";
|
|
2
|
+
import { RSErrorCode } from "../error.js";
|
|
3
|
+
import { visitAstDFS } from "../../parsing/ast.js";
|
|
4
|
+
import "../../parsing/index.js";
|
|
5
|
+
import { TokenID } from "./token.js";
|
|
6
|
+
import "./parser.terms.js";
|
|
7
|
+
//#region src/rslang/parser/syntax-errors.ts
|
|
8
|
+
/**
|
|
9
|
+
* Module: Syntactic errors reporting.
|
|
10
|
+
*/
|
|
244
11
|
function extractSyntaxErrors(ast, expression, reporter, annotateErrors = false) {
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
const hasBracketErrors = bracketError !== null;
|
|
253
|
-
visitAstDFS(ast, (node) => extractInternal(node, reporter, annotateErrors, hasBracketErrors));
|
|
12
|
+
const bracketError = extractBracketErrors(expression);
|
|
13
|
+
if (bracketError !== null) {
|
|
14
|
+
reporter(bracketError);
|
|
15
|
+
if (annotateErrors) annotateError(ast, bracketError.code, bracketError.params);
|
|
16
|
+
}
|
|
17
|
+
const hasBracketErrors = bracketError !== null;
|
|
18
|
+
visitAstDFS(ast, (node) => extractInternal(node, reporter, annotateErrors, hasBracketErrors));
|
|
254
19
|
}
|
|
255
20
|
function extractInternal(node, reporter, annotateErrors, ignoreUnknownErrors) {
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
if (parent.typeID === Variable) {
|
|
273
|
-
return emit(parent, RSErrorCode.expectedLocal);
|
|
274
|
-
}
|
|
275
|
-
if (!ignoreUnknownErrors) {
|
|
276
|
-
emit(node.from === node.to ? parent : node, RSErrorCode.unknownSyntax);
|
|
277
|
-
}
|
|
21
|
+
if (node.typeID !== TokenID.ERROR) return;
|
|
22
|
+
function emit(target, code) {
|
|
23
|
+
reporter({
|
|
24
|
+
code,
|
|
25
|
+
from: target.from,
|
|
26
|
+
to: target.to
|
|
27
|
+
});
|
|
28
|
+
if (annotateErrors) annotateError(target, code);
|
|
29
|
+
}
|
|
30
|
+
const parent = node.parent;
|
|
31
|
+
if (parent === null) {
|
|
32
|
+
if (!ignoreUnknownErrors) return emit(node, RSErrorCode.unknownSyntax);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
if (parent.typeID === 4) return emit(parent, RSErrorCode.expectedLocal);
|
|
36
|
+
if (!ignoreUnknownErrors) emit(node.from === node.to ? parent : node, RSErrorCode.unknownSyntax);
|
|
278
37
|
}
|
|
279
38
|
function extractBracketErrors(expression) {
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
code,
|
|
322
|
-
from: expression.length,
|
|
323
|
-
to: expression.length
|
|
324
|
-
};
|
|
325
|
-
}
|
|
326
|
-
return null;
|
|
39
|
+
const stack = [];
|
|
40
|
+
for (let pos = 0; pos < expression.length; pos++) {
|
|
41
|
+
const symbol = expression[pos];
|
|
42
|
+
if (isOpenBracket(symbol)) {
|
|
43
|
+
if (isDoubleParenthesis(expression, pos)) return {
|
|
44
|
+
code: RSErrorCode.doubleParenthesis,
|
|
45
|
+
from: pos,
|
|
46
|
+
to: pos + 2
|
|
47
|
+
};
|
|
48
|
+
stack.push({
|
|
49
|
+
bracket: symbol,
|
|
50
|
+
index: pos
|
|
51
|
+
});
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
if (!isCloseBracket(symbol)) continue;
|
|
55
|
+
const expectedOpen = closeToOpen(symbol);
|
|
56
|
+
const top = stack[stack.length - 1];
|
|
57
|
+
if (top === void 0) return {
|
|
58
|
+
code: RSErrorCode.missingOpenBracket,
|
|
59
|
+
from: pos,
|
|
60
|
+
to: pos + 1,
|
|
61
|
+
params: [expectedOpen]
|
|
62
|
+
};
|
|
63
|
+
if (top.bracket !== expectedOpen) return {
|
|
64
|
+
code: RSErrorCode.bracketMismatch,
|
|
65
|
+
from: pos,
|
|
66
|
+
to: pos + 1,
|
|
67
|
+
params: [openToClose(top.bracket), symbol]
|
|
68
|
+
};
|
|
69
|
+
stack.pop();
|
|
70
|
+
}
|
|
71
|
+
if (stack.length > 0) {
|
|
72
|
+
const unclosed = stack[0];
|
|
73
|
+
return {
|
|
74
|
+
code: missingBracketCode(unclosed.bracket),
|
|
75
|
+
from: expression.length,
|
|
76
|
+
to: expression.length
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
return null;
|
|
327
80
|
}
|
|
328
81
|
function missingBracketCode(bracket) {
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
case "{":
|
|
335
|
-
return RSErrorCode.missingCurlyBrace;
|
|
336
|
-
}
|
|
82
|
+
switch (bracket) {
|
|
83
|
+
case "(": return RSErrorCode.missingParenthesis;
|
|
84
|
+
case "[": return RSErrorCode.missingSquareBracket;
|
|
85
|
+
case "{": return RSErrorCode.missingCurlyBrace;
|
|
86
|
+
}
|
|
337
87
|
}
|
|
338
88
|
function isOpenBracket(symbol) {
|
|
339
|
-
|
|
89
|
+
return symbol === "(" || symbol === "[" || symbol === "{";
|
|
340
90
|
}
|
|
341
91
|
function isCloseBracket(symbol) {
|
|
342
|
-
|
|
92
|
+
return symbol === ")" || symbol === "]" || symbol === "}";
|
|
343
93
|
}
|
|
344
94
|
function openToClose(symbol) {
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
case "{":
|
|
351
|
-
return "}";
|
|
352
|
-
}
|
|
95
|
+
switch (symbol) {
|
|
96
|
+
case "(": return ")";
|
|
97
|
+
case "[": return "]";
|
|
98
|
+
case "{": return "}";
|
|
99
|
+
}
|
|
353
100
|
}
|
|
354
101
|
function closeToOpen(symbol) {
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
case "}":
|
|
361
|
-
return "{";
|
|
362
|
-
}
|
|
102
|
+
switch (symbol) {
|
|
103
|
+
case ")": return "(";
|
|
104
|
+
case "]": return "[";
|
|
105
|
+
case "}": return "{";
|
|
106
|
+
}
|
|
363
107
|
}
|
|
364
108
|
function isDoubleParenthesis(expression, pos) {
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
const innerClose = findMatchingCloseBracket(expression, pos + 1);
|
|
371
|
-
if (outerClose < 0 || innerClose < 0) {
|
|
372
|
-
return false;
|
|
373
|
-
}
|
|
374
|
-
return outerClose === innerClose + 1;
|
|
109
|
+
if (!(expression[pos] === "(" && expression[pos + 1] === "(")) return false;
|
|
110
|
+
const outerClose = findMatchingCloseBracket(expression, pos);
|
|
111
|
+
const innerClose = findMatchingCloseBracket(expression, pos + 1);
|
|
112
|
+
if (outerClose < 0 || innerClose < 0) return false;
|
|
113
|
+
return outerClose === innerClose + 1;
|
|
375
114
|
}
|
|
376
115
|
function findMatchingCloseBracket(expression, openPos) {
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
if (top === void 0 || top !== closeToOpen(symbol)) {
|
|
392
|
-
return -1;
|
|
393
|
-
}
|
|
394
|
-
if (stack.length === 0) {
|
|
395
|
-
return index;
|
|
396
|
-
}
|
|
397
|
-
}
|
|
398
|
-
return -1;
|
|
116
|
+
if (expression[openPos] !== "(") return -1;
|
|
117
|
+
const stack = [];
|
|
118
|
+
for (let index = openPos; index < expression.length; index++) {
|
|
119
|
+
const symbol = expression[index];
|
|
120
|
+
if (isOpenBracket(symbol)) {
|
|
121
|
+
stack.push(symbol);
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
if (!isCloseBracket(symbol)) continue;
|
|
125
|
+
const top = stack.pop();
|
|
126
|
+
if (top === void 0 || top !== closeToOpen(symbol)) return -1;
|
|
127
|
+
if (stack.length === 0) return index;
|
|
128
|
+
}
|
|
129
|
+
return -1;
|
|
399
130
|
}
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
131
|
+
//#endregion
|
|
132
|
+
export { extractSyntaxErrors };
|
|
133
|
+
|
|
403
134
|
//# sourceMappingURL=syntax-errors.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/parsing/ast.ts","../../../src/rslang/ast-annotations.ts","../../../src/rslang/error.ts","../../../src/rslang/parser/parser.terms.ts","../../../src/rslang/parser/token.ts","../../../src/rslang/parser/syntax-errors.ts"],"sourcesContent":["import { type TreeCursor } from './lezer-tree';\n\nexport const TOKEN_ERROR = 0;\n\n/** Represents AST node data. */\ninterface AstNodeData extends Record<string, unknown> {\n dataType: string;\n value: unknown;\n}\n\n/** Represents AST structured node base. */\nexport interface AstNodeBase {\n typeID: number;\n data: AstNodeData;\n annotation?: Record<string, unknown>;\n}\n\n/** Represents AST structured node. */\nexport interface AstNode extends Record<string, unknown>, AstNodeBase {\n uid: number;\n from: number;\n to: number;\n hasError: boolean;\n parenthesis?: boolean;\n parent: AstNode | null;\n children: AstNode[];\n}\n\n/** Represents AST node. */\nexport interface FlatAstNode extends Record<string, unknown>, AstNodeBase {\n uid: number;\n parent: number | null;\n from: number;\n to: number;\n}\n\n/** Represents Syntax tree flat representation. */\nexport type FlatAST = FlatAstNode[];\n\n/** Builds AST tree from a given tree cursor, generating unique uids for each node. */\nexport function buildTree(cursor: TreeCursor): AstNode {\n let nextUid = 1;\n function genUid() {\n return nextUid++;\n }\n return buildTreeInternal(cursor, null, genUid);\n}\n\n/** Flattens AST tree to a array form. */\nexport function flattenAst(node: AstNode, parent: number | null = null, out: FlatAST = []): FlatAST {\n out.push({\n uid: node.uid,\n parent: parent,\n typeID: node.typeID,\n from: node.from,\n to: node.to,\n data: node.data,\n annotation: node.annotation\n });\n for (const child of node.children) {\n flattenAst(child, node.uid, out);\n }\n return out;\n}\n\n/** Visits AST tree in depth-first order. */\nexport function visitAstDFS(node: AstNode, callback: (node: AstNode) => void) {\n for (const child of node.children) {\n visitAstDFS(child, callback);\n }\n callback(node);\n}\n\n/** Finds and returns the AstNode with the given ui. */\nexport function findByUid(root: AstNode, uid: number): AstNode | null {\n let found: AstNode | null = null;\n visitAstDFS(root, node => {\n if (node.uid === uid && !found) {\n found = node;\n }\n });\n return found;\n}\n\n/** Prints AST tree. */\nexport function printAst(node: AstNode, printNode: (node: AstNode) => string): string {\n let children: string = '';\n for (const child of node.children) {\n children += `${printAst(child, printNode)}`;\n }\n return `[${printNode(node)}${children}]`;\n}\n\n/** Extracts node text. */\nexport function getNodeText(node: AstNode): string {\n if (node.data.dataType === 'string' && typeof node.data.value === 'string') {\n return node.data.value;\n }\n return `NO DATA NODE: ${node.typeID}`;\n}\n\n/** Extracts node indices. */\nexport function getNodeIndices(node: AstNode): number[] {\n if (node.data.dataType === 'string[]' && Array.isArray(node.data.value)) {\n return (node.data.value as string[]).map(s => parseInt(s, 10)).filter(n => !isNaN(n));\n }\n return [];\n}\n\n// ======== Internals ========\nfunction buildTreeInternal(cursor: TreeCursor, parent: AstNode | null = null, genUid: () => number): AstNode {\n const node = cursor.node;\n\n const result: AstNode = {\n uid: genUid(),\n typeID: node.type.isError ? 0 : node.type.id,\n from: node.from,\n to: node.to,\n hasError: node.type.isError,\n data: node.type.isError ? { dataType: 'null', value: null } : { dataType: 'string', value: node.type.name },\n parent,\n children: []\n };\n\n if (cursor.firstChild()) {\n do {\n const child = buildTreeInternal(cursor, result, genUid);\n if (child.hasError) {\n result.hasError = true;\n }\n result.children.push(child);\n } while (cursor.nextSibling());\n cursor.parent();\n }\n return result;\n}\n","/** Module: AST annotations. */\n\nimport { type AstNode } from '../parsing';\n\nimport { type ExpressionType } from './semantic/typification';\nimport { type RSErrorCode, type RSErrorInfo } from './error';\n\nconst AST_ERRORS_KEY = 'rsErrors' as const;\nconst AST_TYPE_KEY = 'rsType' as const;\n\n/** Appends {@link ExpressionType} onto the node's `annotation.rsType`. */\nexport function annotateType(node: AstNode, type: ExpressionType): void {\n node.annotation = {\n ...(typeof node.annotation === 'object' && node.annotation !== null ? node.annotation : {}),\n [AST_TYPE_KEY]: type\n };\n}\n\n/** Reads {@link ExpressionType} from node's `annotation`. */\nexport function readTypeAnnotation(node: AstNode): ExpressionType | null {\n if (node.annotation && AST_TYPE_KEY in node.annotation) {\n return node.annotation[AST_TYPE_KEY] as ExpressionType;\n }\n return null;\n}\n\n/** Appends {@link RSErrorInfo} onto the node's `annotation.rsErrors` if not already set. */\nexport function annotateError(node: AstNode, code: RSErrorCode, params?: readonly string[]): void {\n if (\n typeof node.annotation === 'object' &&\n node.annotation !== null &&\n AST_ERRORS_KEY in node.annotation &&\n isAstNodeErrorRef(node.annotation[AST_ERRORS_KEY])\n ) {\n return;\n }\n const entry: RSErrorInfo = params !== undefined && params.length > 0 ? { code, params: [...params] } : { code };\n node.annotation = {\n ...(typeof node.annotation === 'object' && node.annotation !== null ? node.annotation : {}),\n [AST_ERRORS_KEY]: entry\n };\n}\n\n/** Reads validated {@link RSErrorInfo} entry from node's `annotation`. */\nexport function readErrorAnnotation(node: AstNode): RSErrorInfo | null {\n const raw = node.annotation?.[AST_ERRORS_KEY];\n if (isAstNodeErrorRef(raw)) {\n return raw;\n }\n return null;\n}\n\n// ====== Internal ======\nfunction isAstNodeErrorRef(x: unknown): x is RSErrorInfo {\n if (typeof x !== 'object' || x === null || !('code' in x)) {\n return false;\n }\n const code = x.code;\n if (typeof code !== 'number') {\n return false;\n }\n if (!('params' in x)) {\n return true;\n }\n const p = (x as { params: unknown }).params;\n if (p === undefined) {\n return true;\n }\n return Array.isArray(p) && p.every(item => typeof item === 'string');\n}\n","/** Module: Error types and functions. */\n\n/** Represents error class. */\nexport const RSErrorClass = {\n LEXER: 0,\n PARSER: 1,\n SEMANTIC: 2,\n EVALUATION: 3,\n UNKNOWN: 4\n} as const;\nexport type RSErrorClass = (typeof RSErrorClass)[keyof typeof RSErrorClass];\n\n/** Represents RSLang expression error information. */\nexport interface RSErrorInfo {\n code: RSErrorCode;\n params?: readonly string[];\n}\n\n/** Represents RSLang expression error description. */\nexport interface RSErrorDescription extends RSErrorInfo {\n from: number;\n to: number;\n}\n\n/** Error reporter function type. */\nexport type ErrorReporter = (error: RSErrorDescription) => void;\n\n/** Represents RSLang expression error types. */\nexport const RSErrorCode = {\n unknownSyntax: 0x8400, // 33792\n missingParenthesis: 0x8406, // 33798\n missingCurlyBrace: 0x8407, // 33799\n missingSquareBracket: 0x8408, // 33800\n bracketMismatch: 0x8409, // 33801\n doubleParenthesis: 0x840a, // 33802\n missingOpenBracket: 0x840b, // 33803\n expectedLocal: 0x8415, // 33813\n expectedType: 0x8416, // 33814\n\n localDoubleDeclare: 0x2801, // 10241\n localNotUsed: 0x2802, // 10242\n\n localUndeclared: 0x8801, // 34817\n localShadowing: 0x8802, // 34818\n\n typesNotEqual: 0x8803, // 34819\n globalNotTyped: 0x8804, // 34820\n invalidDecart: 0x8805, // 34821\n invalidBoolean: 0x8806, // 34822\n invalidTypeOperation: 0x8807, // 34823\n invalidCard: 0x8808, // 34824\n invalidDebool: 0x8809, // 34825\n globalFuncWithoutArgs: 0x880b, // 34827\n invalidReduce: 0x8810, // 34832\n invalidProjectionTuple: 0x8811, // 34833\n invalidProjectionSet: 0x8812, // 34834\n invalidEnumeration: 0x8813, // 34835\n invalidCortegeDeclare: 0x8814, // 34836\n localOutOfScope: 0x8815, // 34837\n invalidElementPredicate: 0x8816, // 34838\n invalidEmptySetUsage: 0x8817, // 34839\n invalidArgsArity: 0x8818, // 34840\n invalidArgumentType: 0x8819, // 34841\n globalStructure: 0x881c, // 34844\n radicalUsage: 0x8821, // 34849\n invalidFilterArgumentType: 0x8822, // 34850\n invalidFilterArity: 0x8823, // 34851\n arithmeticNotSupported: 0x8824, // 34852\n typesNotCompatible: 0x8825, // 34853\n orderingNotSupported: 0x8826, // 34854\n expectedLogic: 0x8827, // 34855\n expectedSetexpr: 0x8828, // 34856\n invalidArgumentCortegeDeclare: 0x8829, // 34857\n\n globalNoValue: 0x8840, // 34880\n invalidPropertyUsage: 0x8841, // 34881\n\n // Value evaluation (runtime)\n calcUnknownError: 0x8100, // 35328\n setOverflow: 0x8101, // 35329\n booleanBaseLimit: 0x8102, // 35330\n calcGlobalMissing: 0x8103, // 35331\n iterationsLimit: 0x8104, // 35332\n calcInvalidDebool: 0x8105, // 35333\n iterateInfinity: 0x8106, // 35334\n calculationNotSupported: 0x8107, // 35335\n\n cstEmptyDerived: 0x8861, // 34913\n definitionNotAllowed: 0x8862 // 34914\n} as const;\nexport type RSErrorCode = (typeof RSErrorCode)[keyof typeof RSErrorCode];\n\nconst ERROR_EVALUATION_MASK = 0x0100;\nconst ERROR_LEXER_MASK = 0x0200;\nconst ERROR_PARSER_MASK = 0x0400;\nconst ERROR_SEMANTIC_MASK = 0x0800;\n\n/** Infers error class from error type (code). */\nfunction inferErrorClass(error: RSErrorCode): RSErrorClass {\n if ((error & ERROR_EVALUATION_MASK) !== 0) {\n return RSErrorClass.EVALUATION;\n } else if ((error & ERROR_LEXER_MASK) !== 0) {\n return RSErrorClass.LEXER;\n } else if ((error & ERROR_PARSER_MASK) !== 0) {\n return RSErrorClass.PARSER;\n } else if ((error & ERROR_SEMANTIC_MASK) !== 0) {\n return RSErrorClass.SEMANTIC;\n } else {\n return RSErrorClass.UNKNOWN;\n }\n}\n\n/** Generate ErrorID label. */\nexport function getRSErrorPrefix(code: RSErrorCode): string {\n const id = code.toString(16).toUpperCase();\n // prettier-ignore\n switch (inferErrorClass(code)) {\n case RSErrorClass.LEXER: return 'L' + id;\n case RSErrorClass.PARSER: return 'P' + id;\n case RSErrorClass.SEMANTIC: return 'S' + id;\n case RSErrorClass.EVALUATION: return 'E' + id;\n case RSErrorClass.UNKNOWN: return 'U' + id;\n }\n}\n\n/** Checks if error is critical. */\nexport function isCritical(code: RSErrorCode): boolean {\n return code !== RSErrorCode.localDoubleDeclare && code !== RSErrorCode.localNotUsed;\n}\n","// This file was generated by lezer-generator. You probably shouldn't edit it.\nexport const\n Expression = 1,\n Logic = 2,\n Logic_predicates = 3,\n Variable = 4,\n Local = 5,\n Tuple = 8,\n Expr_enum_min2 = 9,\n Logic_unary = 24,\n Predicate = 26,\n Logic_quantor = 29,\n Variable_pack = 31,\n Logic_binary = 33,\n Setexpr = 38,\n Integer = 39,\n EmptySet = 40,\n IntegerSet = 41,\n Global = 42,\n Radical = 43,\n Setexpr_binary = 44,\n Enumeration = 55,\n Boolean = 56,\n Filter_expression = 58,\n Filter = 59,\n Declarative = 60,\n PrefixD = 62,\n PrefixI = 63,\n Imperative = 64,\n Imp_blocks = 65,\n PrefixR = 67,\n Recursion = 68,\n Function = 69,\n BigPr = 70,\n SmallPr = 71,\n Card = 72,\n Bool = 73,\n Debool = 74,\n Red = 75,\n Function_decl = 76,\n Arguments = 77,\n Declaration = 78\n","import { TOKEN_ERROR } from '../../parsing';\n\n/** Represents RSLang token types. */\nexport const TokenID = {\n // Global, local IDs and literals\n ERROR: TOKEN_ERROR,\n\n ID_LOCAL: 258,\n ID_GLOBAL: 259,\n ID_FUNCTION: 260,\n ID_PREDICATE: 261,\n ID_RADICAL: 262,\n LIT_INTEGER: 263,\n LIT_WHOLE_NUMBERS: 264,\n LIT_EMPTYSET: 265,\n\n // Arithmetic\n PLUS: 266,\n MINUS: 267,\n MULTIPLY: 268,\n\n // Integer predicate symbols\n GREATER: 269,\n LESSER: 270,\n GREATER_OR_EQ: 271,\n LESSER_OR_EQ: 272,\n\n // Equality comparison\n EQUAL: 273,\n NOTEQUAL: 274,\n\n // Logic predicate symbols\n QUANTOR_UNIVERSAL: 275,\n QUANTOR_EXISTS: 276,\n LOGIC_NOT: 277,\n LOGIC_EQUIVALENT: 278,\n LOGIC_IMPLICATION: 279,\n LOGIC_OR: 280,\n LOGIC_AND: 281,\n\n // Set theory predicate symbols\n SET_IN: 282,\n SET_NOT_IN: 283,\n SUBSET: 284,\n SUBSET_OR_EQ: 285,\n NOT_SUBSET: 286,\n\n // Set theory operators\n DECART: 287,\n SET_UNION: 288,\n SET_INTERSECTION: 289,\n SET_MINUS: 290,\n SET_SYMMETRIC_MINUS: 291,\n BOOLEAN: 292,\n\n // Structure operations\n BIGPR: 293,\n SMALLPR: 294,\n FILTER: 295,\n CARD: 296,\n BOOL: 297,\n DEBOOL: 298,\n REDUCE: 299,\n\n // Term constructions prefixes\n DECLARATIVE: 300,\n RECURSIVE: 301,\n IMPERATIVE: 302,\n\n ITERATE: 303,\n ASSIGN: 304,\n\n // Punctuation\n PUNCTUATION_DEFINE: 305,\n PUNCTUATION_STRUCT: 306,\n PUNCTUATION_PL: 307,\n PUNCTUATION_PR: 308,\n PUNCTUATION_CL: 309,\n PUNCTUATION_CR: 310,\n PUNCTUATION_SL: 311,\n PUNCTUATION_SR: 312,\n PUNCTUATION_BAR: 313,\n PUNCTUATION_COMMA: 314,\n PUNCTUATION_SEMICOLON: 315,\n\n // ======= Non-terminal tokens =========\n NT_ENUM_DECL: 316,\n NT_TUPLE: 317,\n NT_ENUMERATION: 318,\n NT_TUPLE_DECL: 319,\n NT_ARG_DECL: 320,\n\n NT_FUNC_DEFINITION: 321,\n NT_ARGUMENTS: 322,\n NT_FUNC_CALL: 323,\n\n NT_DECLARATIVE_EXPR: 324,\n NT_IMPERATIVE_EXPR: 325,\n NT_RECURSIVE_FULL: 326,\n NT_RECURSIVE_SHORT: 327,\n\n // ======= Helper tokens ========\n INTERRUPT: 328,\n END: 329\n} as const;\nexport type TokenID = (typeof TokenID)[keyof typeof TokenID];\n","/**\n * Module: Syntactic errors reporting.\n */\n\nimport { type AstNode, visitAstDFS } from '../../parsing';\nimport { annotateError } from '../ast-annotations';\nimport { type ErrorReporter, RSErrorCode, type RSErrorDescription } from '../error';\n\nimport { Variable } from './parser.terms';\nimport { TokenID } from './token';\n\nexport function extractSyntaxErrors(\n ast: AstNode,\n expression: string,\n reporter: ErrorReporter,\n annotateErrors: boolean = false\n) {\n const bracketError = extractBracketErrors(expression);\n if (bracketError !== null) {\n reporter(bracketError);\n if (annotateErrors) {\n annotateError(ast, bracketError.code, bracketError.params);\n }\n }\n const hasBracketErrors = bracketError !== null;\n visitAstDFS(ast, node => extractInternal(node, reporter, annotateErrors, hasBracketErrors));\n}\n\n// ====== Internals =========\nfunction extractInternal(\n node: AstNode,\n reporter: ErrorReporter,\n annotateErrors: boolean,\n ignoreUnknownErrors: boolean\n) {\n if (node.typeID !== TokenID.ERROR) {\n return;\n }\n\n function emit(target: AstNode, code: RSErrorCode) {\n reporter({ code: code, from: target.from, to: target.to });\n if (annotateErrors) {\n annotateError(target, code);\n }\n }\n\n const parent = node.parent;\n if (parent === null) {\n if (!ignoreUnknownErrors) {\n return emit(node, RSErrorCode.unknownSyntax);\n }\n return;\n }\n\n if (parent.typeID === Variable) {\n return emit(parent, RSErrorCode.expectedLocal);\n }\n\n if (!ignoreUnknownErrors) {\n emit(node.from === node.to ? parent : node, RSErrorCode.unknownSyntax);\n }\n}\n\ntype OpenBracket = '(' | '[' | '{';\ntype CloseBracket = ')' | ']' | '}';\n\ninterface BracketFrame {\n bracket: OpenBracket;\n index: number;\n}\n\nfunction extractBracketErrors(expression: string): RSErrorDescription | null {\n const stack: BracketFrame[] = [];\n\n for (let pos = 0; pos < expression.length; pos++) {\n const symbol = expression[pos];\n if (isOpenBracket(symbol)) {\n if (isDoubleParenthesis(expression, pos)) {\n return {\n code: RSErrorCode.doubleParenthesis,\n from: pos,\n to: pos + 2\n };\n }\n stack.push({ bracket: symbol, index: pos });\n continue;\n }\n if (!isCloseBracket(symbol)) {\n continue;\n }\n\n const expectedOpen = closeToOpen(symbol);\n const top = stack[stack.length - 1];\n if (top === undefined) {\n return {\n code: RSErrorCode.missingOpenBracket,\n from: pos,\n to: pos + 1,\n params: [expectedOpen]\n };\n }\n\n if (top.bracket !== expectedOpen) {\n return {\n code: RSErrorCode.bracketMismatch,\n from: pos,\n to: pos + 1,\n params: [openToClose(top.bracket), symbol]\n };\n }\n\n stack.pop();\n }\n\n if (stack.length > 0) {\n const unclosed = stack[0];\n const code = missingBracketCode(unclosed.bracket);\n return {\n code,\n from: expression.length,\n to: expression.length\n };\n }\n\n return null;\n}\n\nfunction missingBracketCode(bracket: OpenBracket): RSErrorCode {\n switch (bracket) {\n case '(':\n return RSErrorCode.missingParenthesis;\n case '[':\n return RSErrorCode.missingSquareBracket;\n case '{':\n return RSErrorCode.missingCurlyBrace;\n }\n}\n\nfunction isOpenBracket(symbol: string): symbol is OpenBracket {\n return symbol === '(' || symbol === '[' || symbol === '{';\n}\n\nfunction isCloseBracket(symbol: string): symbol is CloseBracket {\n return symbol === ')' || symbol === ']' || symbol === '}';\n}\n\nfunction openToClose(symbol: OpenBracket): CloseBracket {\n switch (symbol) {\n case '(':\n return ')';\n case '[':\n return ']';\n case '{':\n return '}';\n }\n}\n\nfunction closeToOpen(symbol: CloseBracket): OpenBracket {\n switch (symbol) {\n case ')':\n return '(';\n case ']':\n return '[';\n case '}':\n return '{';\n }\n}\n\nfunction isDoubleParenthesis(expression: string, pos: number): boolean {\n const isOpenDoubleParenthesis = expression[pos] === '(' && expression[pos + 1] === '(';\n if (!isOpenDoubleParenthesis) {\n return false;\n }\n\n const outerClose = findMatchingCloseBracket(expression, pos);\n const innerClose = findMatchingCloseBracket(expression, pos + 1);\n if (outerClose < 0 || innerClose < 0) {\n return false;\n }\n\n return outerClose === innerClose + 1;\n}\n\nfunction findMatchingCloseBracket(expression: string, openPos: number): number {\n if (expression[openPos] !== '(') {\n return -1;\n }\n\n const stack: OpenBracket[] = [];\n for (let index = openPos; index < expression.length; index++) {\n const symbol = expression[index];\n if (isOpenBracket(symbol)) {\n stack.push(symbol);\n continue;\n }\n if (!isCloseBracket(symbol)) {\n continue;\n }\n const top = stack.pop();\n if (top === undefined || top !== closeToOpen(symbol)) {\n return -1;\n }\n if (stack.length === 0) {\n return index;\n }\n }\n\n return -1;\n}\n"],"mappings":";AAEO,IAAM,cAAc;AAgEpB,SAAS,YAAY,MAAe,UAAmC;AAC5E,aAAW,SAAS,KAAK,UAAU;AACjC,gBAAY,OAAO,QAAQ;AAAA,EAC7B;AACA,WAAS,IAAI;AACf;;;AChEA,IAAM,iBAAiB;AAoBhB,SAAS,cAAc,MAAe,MAAmB,QAAkC;AAChG,MACE,OAAO,KAAK,eAAe,YAC3B,KAAK,eAAe,QACpB,kBAAkB,KAAK,cACvB,kBAAkB,KAAK,WAAW,cAAc,CAAC,GACjD;AACA;AAAA,EACF;AACA,QAAM,QAAqB,WAAW,UAAa,OAAO,SAAS,IAAI,EAAE,MAAM,QAAQ,CAAC,GAAG,MAAM,EAAE,IAAI,EAAE,KAAK;AAC9G,OAAK,aAAa;AAAA,IAChB,GAAI,OAAO,KAAK,eAAe,YAAY,KAAK,eAAe,OAAO,KAAK,aAAa,CAAC;AAAA,IACzF,CAAC,cAAc,GAAG;AAAA,EACpB;AACF;AAYA,SAAS,kBAAkB,GAA8B;AACvD,MAAI,OAAO,MAAM,YAAY,MAAM,QAAQ,EAAE,UAAU,IAAI;AACzD,WAAO;AAAA,EACT;AACA,QAAM,OAAO,EAAE;AACf,MAAI,OAAO,SAAS,UAAU;AAC5B,WAAO;AAAA,EACT;AACA,MAAI,EAAE,YAAY,IAAI;AACpB,WAAO;AAAA,EACT;AACA,QAAM,IAAK,EAA0B;AACrC,MAAI,MAAM,QAAW;AACnB,WAAO;AAAA,EACT;AACA,SAAO,MAAM,QAAQ,CAAC,KAAK,EAAE,MAAM,UAAQ,OAAO,SAAS,QAAQ;AACrE;;;ACzCO,IAAM,cAAc;AAAA,EACzB,eAAe;AAAA;AAAA,EACf,oBAAoB;AAAA;AAAA,EACpB,mBAAmB;AAAA;AAAA,EACnB,sBAAsB;AAAA;AAAA,EACtB,iBAAiB;AAAA;AAAA,EACjB,mBAAmB;AAAA;AAAA,EACnB,oBAAoB;AAAA;AAAA,EACpB,eAAe;AAAA;AAAA,EACf,cAAc;AAAA;AAAA,EAEd,oBAAoB;AAAA;AAAA,EACpB,cAAc;AAAA;AAAA,EAEd,iBAAiB;AAAA;AAAA,EACjB,gBAAgB;AAAA;AAAA,EAEhB,eAAe;AAAA;AAAA,EACf,gBAAgB;AAAA;AAAA,EAChB,eAAe;AAAA;AAAA,EACf,gBAAgB;AAAA;AAAA,EAChB,sBAAsB;AAAA;AAAA,EACtB,aAAa;AAAA;AAAA,EACb,eAAe;AAAA;AAAA,EACf,uBAAuB;AAAA;AAAA,EACvB,eAAe;AAAA;AAAA,EACf,wBAAwB;AAAA;AAAA,EACxB,sBAAsB;AAAA;AAAA,EACtB,oBAAoB;AAAA;AAAA,EACpB,uBAAuB;AAAA;AAAA,EACvB,iBAAiB;AAAA;AAAA,EACjB,yBAAyB;AAAA;AAAA,EACzB,sBAAsB;AAAA;AAAA,EACtB,kBAAkB;AAAA;AAAA,EAClB,qBAAqB;AAAA;AAAA,EACrB,iBAAiB;AAAA;AAAA,EACjB,cAAc;AAAA;AAAA,EACd,2BAA2B;AAAA;AAAA,EAC3B,oBAAoB;AAAA;AAAA,EACpB,wBAAwB;AAAA;AAAA,EACxB,oBAAoB;AAAA;AAAA,EACpB,sBAAsB;AAAA;AAAA,EACtB,eAAe;AAAA;AAAA,EACf,iBAAiB;AAAA;AAAA,EACjB,+BAA+B;AAAA;AAAA,EAE/B,eAAe;AAAA;AAAA,EACf,sBAAsB;AAAA;AAAA;AAAA,EAGtB,kBAAkB;AAAA;AAAA,EAClB,aAAa;AAAA;AAAA,EACb,kBAAkB;AAAA;AAAA,EAClB,mBAAmB;AAAA;AAAA,EACnB,iBAAiB;AAAA;AAAA,EACjB,mBAAmB;AAAA;AAAA,EACnB,iBAAiB;AAAA;AAAA,EACjB,yBAAyB;AAAA;AAAA,EAEzB,iBAAiB;AAAA;AAAA,EACjB,sBAAsB;AAAA;AACxB;;;ACxFO,IAIL,WAAW;;;ACFN,IAAM,UAAU;AAAA;AAAA,EAErB,OAAO;AAAA,EAEP,UAAU;AAAA,EACV,WAAW;AAAA,EACX,aAAa;AAAA,EACb,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,mBAAmB;AAAA,EACnB,cAAc;AAAA;AAAA,EAGd,MAAM;AAAA,EACN,OAAO;AAAA,EACP,UAAU;AAAA;AAAA,EAGV,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,eAAe;AAAA,EACf,cAAc;AAAA;AAAA,EAGd,OAAO;AAAA,EACP,UAAU;AAAA;AAAA,EAGV,mBAAmB;AAAA,EACnB,gBAAgB;AAAA,EAChB,WAAW;AAAA,EACX,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,UAAU;AAAA,EACV,WAAW;AAAA;AAAA,EAGX,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,YAAY;AAAA;AAAA,EAGZ,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,kBAAkB;AAAA,EAClB,WAAW;AAAA,EACX,qBAAqB;AAAA,EACrB,SAAS;AAAA;AAAA,EAGT,OAAO;AAAA,EACP,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA;AAAA,EAGR,aAAa;AAAA,EACb,WAAW;AAAA,EACX,YAAY;AAAA,EAEZ,SAAS;AAAA,EACT,QAAQ;AAAA;AAAA,EAGR,oBAAoB;AAAA,EACpB,oBAAoB;AAAA,EACpB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,mBAAmB;AAAA,EACnB,uBAAuB;AAAA;AAAA,EAGvB,cAAc;AAAA,EACd,UAAU;AAAA,EACV,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,aAAa;AAAA,EAEb,oBAAoB;AAAA,EACpB,cAAc;AAAA,EACd,cAAc;AAAA,EAEd,qBAAqB;AAAA,EACrB,oBAAoB;AAAA,EACpB,mBAAmB;AAAA,EACnB,oBAAoB;AAAA;AAAA,EAGpB,WAAW;AAAA,EACX,KAAK;AACP;;;AC7FO,SAAS,oBACd,KACA,YACA,UACA,iBAA0B,OAC1B;AACA,QAAM,eAAe,qBAAqB,UAAU;AACpD,MAAI,iBAAiB,MAAM;AACzB,aAAS,YAAY;AACrB,QAAI,gBAAgB;AAClB,oBAAc,KAAK,aAAa,MAAM,aAAa,MAAM;AAAA,IAC3D;AAAA,EACF;AACA,QAAM,mBAAmB,iBAAiB;AAC1C,cAAY,KAAK,UAAQ,gBAAgB,MAAM,UAAU,gBAAgB,gBAAgB,CAAC;AAC5F;AAGA,SAAS,gBACP,MACA,UACA,gBACA,qBACA;AACA,MAAI,KAAK,WAAW,QAAQ,OAAO;AACjC;AAAA,EACF;AAEA,WAAS,KAAK,QAAiB,MAAmB;AAChD,aAAS,EAAE,MAAY,MAAM,OAAO,MAAM,IAAI,OAAO,GAAG,CAAC;AACzD,QAAI,gBAAgB;AAClB,oBAAc,QAAQ,IAAI;AAAA,IAC5B;AAAA,EACF;AAEA,QAAM,SAAS,KAAK;AACpB,MAAI,WAAW,MAAM;AACnB,QAAI,CAAC,qBAAqB;AACxB,aAAO,KAAK,MAAM,YAAY,aAAa;AAAA,IAC7C;AACA;AAAA,EACF;AAEA,MAAI,OAAO,WAAW,UAAU;AAC9B,WAAO,KAAK,QAAQ,YAAY,aAAa;AAAA,EAC/C;AAEA,MAAI,CAAC,qBAAqB;AACxB,SAAK,KAAK,SAAS,KAAK,KAAK,SAAS,MAAM,YAAY,aAAa;AAAA,EACvE;AACF;AAUA,SAAS,qBAAqB,YAA+C;AAC3E,QAAM,QAAwB,CAAC;AAE/B,WAAS,MAAM,GAAG,MAAM,WAAW,QAAQ,OAAO;AAChD,UAAM,SAAS,WAAW,GAAG;AAC7B,QAAI,cAAc,MAAM,GAAG;AACzB,UAAI,oBAAoB,YAAY,GAAG,GAAG;AACxC,eAAO;AAAA,UACL,MAAM,YAAY;AAAA,UAClB,MAAM;AAAA,UACN,IAAI,MAAM;AAAA,QACZ;AAAA,MACF;AACA,YAAM,KAAK,EAAE,SAAS,QAAQ,OAAO,IAAI,CAAC;AAC1C;AAAA,IACF;AACA,QAAI,CAAC,eAAe,MAAM,GAAG;AAC3B;AAAA,IACF;AAEA,UAAM,eAAe,YAAY,MAAM;AACvC,UAAM,MAAM,MAAM,MAAM,SAAS,CAAC;AAClC,QAAI,QAAQ,QAAW;AACrB,aAAO;AAAA,QACL,MAAM,YAAY;AAAA,QAClB,MAAM;AAAA,QACN,IAAI,MAAM;AAAA,QACV,QAAQ,CAAC,YAAY;AAAA,MACvB;AAAA,IACF;AAEA,QAAI,IAAI,YAAY,cAAc;AAChC,aAAO;AAAA,QACL,MAAM,YAAY;AAAA,QAClB,MAAM;AAAA,QACN,IAAI,MAAM;AAAA,QACV,QAAQ,CAAC,YAAY,IAAI,OAAO,GAAG,MAAM;AAAA,MAC3C;AAAA,IACF;AAEA,UAAM,IAAI;AAAA,EACZ;AAEA,MAAI,MAAM,SAAS,GAAG;AACpB,UAAM,WAAW,MAAM,CAAC;AACxB,UAAM,OAAO,mBAAmB,SAAS,OAAO;AAChD,WAAO;AAAA,MACL;AAAA,MACA,MAAM,WAAW;AAAA,MACjB,IAAI,WAAW;AAAA,IACjB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,mBAAmB,SAAmC;AAC7D,UAAQ,SAAS;AAAA,IACf,KAAK;AACH,aAAO,YAAY;AAAA,IACrB,KAAK;AACH,aAAO,YAAY;AAAA,IACrB,KAAK;AACH,aAAO,YAAY;AAAA,EACvB;AACF;AAEA,SAAS,cAAc,QAAuC;AAC5D,SAAO,WAAW,OAAO,WAAW,OAAO,WAAW;AACxD;AAEA,SAAS,eAAe,QAAwC;AAC9D,SAAO,WAAW,OAAO,WAAW,OAAO,WAAW;AACxD;AAEA,SAAS,YAAY,QAAmC;AACtD,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,EACX;AACF;AAEA,SAAS,YAAY,QAAmC;AACtD,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,EACX;AACF;AAEA,SAAS,oBAAoB,YAAoB,KAAsB;AACrE,QAAM,0BAA0B,WAAW,GAAG,MAAM,OAAO,WAAW,MAAM,CAAC,MAAM;AACnF,MAAI,CAAC,yBAAyB;AAC5B,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,yBAAyB,YAAY,GAAG;AAC3D,QAAM,aAAa,yBAAyB,YAAY,MAAM,CAAC;AAC/D,MAAI,aAAa,KAAK,aAAa,GAAG;AACpC,WAAO;AAAA,EACT;AAEA,SAAO,eAAe,aAAa;AACrC;AAEA,SAAS,yBAAyB,YAAoB,SAAyB;AAC7E,MAAI,WAAW,OAAO,MAAM,KAAK;AAC/B,WAAO;AAAA,EACT;AAEA,QAAM,QAAuB,CAAC;AAC9B,WAAS,QAAQ,SAAS,QAAQ,WAAW,QAAQ,SAAS;AAC5D,UAAM,SAAS,WAAW,KAAK;AAC/B,QAAI,cAAc,MAAM,GAAG;AACzB,YAAM,KAAK,MAAM;AACjB;AAAA,IACF;AACA,QAAI,CAAC,eAAe,MAAM,GAAG;AAC3B;AAAA,IACF;AACA,UAAM,MAAM,MAAM,IAAI;AACtB,QAAI,QAAQ,UAAa,QAAQ,YAAY,MAAM,GAAG;AACpD,aAAO;AAAA,IACT;AACA,QAAI,MAAM,WAAW,GAAG;AACtB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;","names":[]}
|
|
1
|
+
{"version":3,"file":"syntax-errors.js","names":[],"sources":["../../../src/rslang/parser/syntax-errors.ts"],"sourcesContent":["/**\n * Module: Syntactic errors reporting.\n */\n\nimport { type AstNode, visitAstDFS } from '../../parsing';\nimport { annotateError } from '../ast-annotations';\nimport { type ErrorReporter, RSErrorCode, type RSErrorDescription } from '../error';\n\nimport { Variable } from './parser.terms';\nimport { TokenID } from './token';\n\nexport function extractSyntaxErrors(\n ast: AstNode,\n expression: string,\n reporter: ErrorReporter,\n annotateErrors: boolean = false\n) {\n const bracketError = extractBracketErrors(expression);\n if (bracketError !== null) {\n reporter(bracketError);\n if (annotateErrors) {\n annotateError(ast, bracketError.code, bracketError.params);\n }\n }\n const hasBracketErrors = bracketError !== null;\n visitAstDFS(ast, node => extractInternal(node, reporter, annotateErrors, hasBracketErrors));\n}\n\n// ====== Internals =========\nfunction extractInternal(\n node: AstNode,\n reporter: ErrorReporter,\n annotateErrors: boolean,\n ignoreUnknownErrors: boolean\n) {\n if (node.typeID !== TokenID.ERROR) {\n return;\n }\n\n function emit(target: AstNode, code: RSErrorCode) {\n reporter({ code: code, from: target.from, to: target.to });\n if (annotateErrors) {\n annotateError(target, code);\n }\n }\n\n const parent = node.parent;\n if (parent === null) {\n if (!ignoreUnknownErrors) {\n return emit(node, RSErrorCode.unknownSyntax);\n }\n return;\n }\n\n if (parent.typeID === Variable) {\n return emit(parent, RSErrorCode.expectedLocal);\n }\n\n if (!ignoreUnknownErrors) {\n emit(node.from === node.to ? parent : node, RSErrorCode.unknownSyntax);\n }\n}\n\ntype OpenBracket = '(' | '[' | '{';\ntype CloseBracket = ')' | ']' | '}';\n\ninterface BracketFrame {\n bracket: OpenBracket;\n index: number;\n}\n\nfunction extractBracketErrors(expression: string): RSErrorDescription | null {\n const stack: BracketFrame[] = [];\n\n for (let pos = 0; pos < expression.length; pos++) {\n const symbol = expression[pos];\n if (isOpenBracket(symbol)) {\n if (isDoubleParenthesis(expression, pos)) {\n return {\n code: RSErrorCode.doubleParenthesis,\n from: pos,\n to: pos + 2\n };\n }\n stack.push({ bracket: symbol, index: pos });\n continue;\n }\n if (!isCloseBracket(symbol)) {\n continue;\n }\n\n const expectedOpen = closeToOpen(symbol);\n const top = stack[stack.length - 1];\n if (top === undefined) {\n return {\n code: RSErrorCode.missingOpenBracket,\n from: pos,\n to: pos + 1,\n params: [expectedOpen]\n };\n }\n\n if (top.bracket !== expectedOpen) {\n return {\n code: RSErrorCode.bracketMismatch,\n from: pos,\n to: pos + 1,\n params: [openToClose(top.bracket), symbol]\n };\n }\n\n stack.pop();\n }\n\n if (stack.length > 0) {\n const unclosed = stack[0];\n const code = missingBracketCode(unclosed.bracket);\n return {\n code,\n from: expression.length,\n to: expression.length\n };\n }\n\n return null;\n}\n\nfunction missingBracketCode(bracket: OpenBracket): RSErrorCode {\n switch (bracket) {\n case '(':\n return RSErrorCode.missingParenthesis;\n case '[':\n return RSErrorCode.missingSquareBracket;\n case '{':\n return RSErrorCode.missingCurlyBrace;\n }\n}\n\nfunction isOpenBracket(symbol: string): symbol is OpenBracket {\n return symbol === '(' || symbol === '[' || symbol === '{';\n}\n\nfunction isCloseBracket(symbol: string): symbol is CloseBracket {\n return symbol === ')' || symbol === ']' || symbol === '}';\n}\n\nfunction openToClose(symbol: OpenBracket): CloseBracket {\n switch (symbol) {\n case '(':\n return ')';\n case '[':\n return ']';\n case '{':\n return '}';\n }\n}\n\nfunction closeToOpen(symbol: CloseBracket): OpenBracket {\n switch (symbol) {\n case ')':\n return '(';\n case ']':\n return '[';\n case '}':\n return '{';\n }\n}\n\nfunction isDoubleParenthesis(expression: string, pos: number): boolean {\n const isOpenDoubleParenthesis = expression[pos] === '(' && expression[pos + 1] === '(';\n if (!isOpenDoubleParenthesis) {\n return false;\n }\n\n const outerClose = findMatchingCloseBracket(expression, pos);\n const innerClose = findMatchingCloseBracket(expression, pos + 1);\n if (outerClose < 0 || innerClose < 0) {\n return false;\n }\n\n return outerClose === innerClose + 1;\n}\n\nfunction findMatchingCloseBracket(expression: string, openPos: number): number {\n if (expression[openPos] !== '(') {\n return -1;\n }\n\n const stack: OpenBracket[] = [];\n for (let index = openPos; index < expression.length; index++) {\n const symbol = expression[index];\n if (isOpenBracket(symbol)) {\n stack.push(symbol);\n continue;\n }\n if (!isCloseBracket(symbol)) {\n continue;\n }\n const top = stack.pop();\n if (top === undefined || top !== closeToOpen(symbol)) {\n return -1;\n }\n if (stack.length === 0) {\n return index;\n }\n }\n\n return -1;\n}\n"],"mappings":"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"}
|
|
@@ -1,79 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
readonly ERROR: 0;
|
|
4
|
-
readonly ID_LOCAL: 258;
|
|
5
|
-
readonly ID_GLOBAL: 259;
|
|
6
|
-
readonly ID_FUNCTION: 260;
|
|
7
|
-
readonly ID_PREDICATE: 261;
|
|
8
|
-
readonly ID_RADICAL: 262;
|
|
9
|
-
readonly LIT_INTEGER: 263;
|
|
10
|
-
readonly LIT_WHOLE_NUMBERS: 264;
|
|
11
|
-
readonly LIT_EMPTYSET: 265;
|
|
12
|
-
readonly PLUS: 266;
|
|
13
|
-
readonly MINUS: 267;
|
|
14
|
-
readonly MULTIPLY: 268;
|
|
15
|
-
readonly GREATER: 269;
|
|
16
|
-
readonly LESSER: 270;
|
|
17
|
-
readonly GREATER_OR_EQ: 271;
|
|
18
|
-
readonly LESSER_OR_EQ: 272;
|
|
19
|
-
readonly EQUAL: 273;
|
|
20
|
-
readonly NOTEQUAL: 274;
|
|
21
|
-
readonly QUANTOR_UNIVERSAL: 275;
|
|
22
|
-
readonly QUANTOR_EXISTS: 276;
|
|
23
|
-
readonly LOGIC_NOT: 277;
|
|
24
|
-
readonly LOGIC_EQUIVALENT: 278;
|
|
25
|
-
readonly LOGIC_IMPLICATION: 279;
|
|
26
|
-
readonly LOGIC_OR: 280;
|
|
27
|
-
readonly LOGIC_AND: 281;
|
|
28
|
-
readonly SET_IN: 282;
|
|
29
|
-
readonly SET_NOT_IN: 283;
|
|
30
|
-
readonly SUBSET: 284;
|
|
31
|
-
readonly SUBSET_OR_EQ: 285;
|
|
32
|
-
readonly NOT_SUBSET: 286;
|
|
33
|
-
readonly DECART: 287;
|
|
34
|
-
readonly SET_UNION: 288;
|
|
35
|
-
readonly SET_INTERSECTION: 289;
|
|
36
|
-
readonly SET_MINUS: 290;
|
|
37
|
-
readonly SET_SYMMETRIC_MINUS: 291;
|
|
38
|
-
readonly BOOLEAN: 292;
|
|
39
|
-
readonly BIGPR: 293;
|
|
40
|
-
readonly SMALLPR: 294;
|
|
41
|
-
readonly FILTER: 295;
|
|
42
|
-
readonly CARD: 296;
|
|
43
|
-
readonly BOOL: 297;
|
|
44
|
-
readonly DEBOOL: 298;
|
|
45
|
-
readonly REDUCE: 299;
|
|
46
|
-
readonly DECLARATIVE: 300;
|
|
47
|
-
readonly RECURSIVE: 301;
|
|
48
|
-
readonly IMPERATIVE: 302;
|
|
49
|
-
readonly ITERATE: 303;
|
|
50
|
-
readonly ASSIGN: 304;
|
|
51
|
-
readonly PUNCTUATION_DEFINE: 305;
|
|
52
|
-
readonly PUNCTUATION_STRUCT: 306;
|
|
53
|
-
readonly PUNCTUATION_PL: 307;
|
|
54
|
-
readonly PUNCTUATION_PR: 308;
|
|
55
|
-
readonly PUNCTUATION_CL: 309;
|
|
56
|
-
readonly PUNCTUATION_CR: 310;
|
|
57
|
-
readonly PUNCTUATION_SL: 311;
|
|
58
|
-
readonly PUNCTUATION_SR: 312;
|
|
59
|
-
readonly PUNCTUATION_BAR: 313;
|
|
60
|
-
readonly PUNCTUATION_COMMA: 314;
|
|
61
|
-
readonly PUNCTUATION_SEMICOLON: 315;
|
|
62
|
-
readonly NT_ENUM_DECL: 316;
|
|
63
|
-
readonly NT_TUPLE: 317;
|
|
64
|
-
readonly NT_ENUMERATION: 318;
|
|
65
|
-
readonly NT_TUPLE_DECL: 319;
|
|
66
|
-
readonly NT_ARG_DECL: 320;
|
|
67
|
-
readonly NT_FUNC_DEFINITION: 321;
|
|
68
|
-
readonly NT_ARGUMENTS: 322;
|
|
69
|
-
readonly NT_FUNC_CALL: 323;
|
|
70
|
-
readonly NT_DECLARATIVE_EXPR: 324;
|
|
71
|
-
readonly NT_IMPERATIVE_EXPR: 325;
|
|
72
|
-
readonly NT_RECURSIVE_FULL: 326;
|
|
73
|
-
readonly NT_RECURSIVE_SHORT: 327;
|
|
74
|
-
readonly INTERRUPT: 328;
|
|
75
|
-
readonly END: 329;
|
|
76
|
-
};
|
|
77
|
-
type TokenID = (typeof TokenID)[keyof typeof TokenID];
|
|
78
|
-
|
|
79
|
-
export { TokenID };
|
|
1
|
+
import { t as TokenID } from "../../token-DeXAmzwr.js";
|
|
2
|
+
export { TokenID };
|