@stechquick/studio-cli 4.1.0-6 → 4.1.0-7

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 (25) hide show
  1. package/dist/common/agentic/quickHostCompiler/commands/GlobalManager.js +1 -1
  2. package/dist/common/agentic/quickHostCompiler/commands/GlobalManager.js.map +1 -1
  3. package/dist/common/agentic/quickHostCompiler/commands/compile.js +2 -2
  4. package/dist/common/agentic/quickHostCompiler/commands/compile.js.map +1 -1
  5. package/dist/common/agentic/studioCli/protocolVersion.js +1 -1
  6. package/dist/common/agentic/studioCli/protocolVersion.js.map +1 -1
  7. package/dist/quick/common/shrimp/helpers/QJsonHelper.js +153 -0
  8. package/dist/quick/common/shrimp/helpers/QJsonHelper.js.map +1 -0
  9. package/dist/quick/common/shrimp/helpers/qjsonParser/QJsonContentParser.js +21 -0
  10. package/dist/quick/common/shrimp/helpers/qjsonParser/QJsonContentParser.js.map +1 -0
  11. package/dist/quick/common/shrimp/helpers/typeHelper.js.map +1 -1
  12. package/dist/quick/common/shrimp/omniScriptCompiler/Compressor.js +83 -0
  13. package/dist/quick/common/shrimp/omniScriptCompiler/Compressor.js.map +1 -0
  14. package/dist/quick/common/shrimp/omniScriptCompiler/Lexer.js +348 -0
  15. package/dist/quick/common/shrimp/omniScriptCompiler/Lexer.js.map +1 -0
  16. package/dist/quick/common/shrimp/omniScriptCompiler/Node.js +35 -0
  17. package/dist/quick/common/shrimp/omniScriptCompiler/Node.js.map +1 -0
  18. package/dist/quick/common/shrimp/omniScriptCompiler/Parser.js +988 -0
  19. package/dist/quick/common/shrimp/omniScriptCompiler/Parser.js.map +1 -0
  20. package/dist/quick/common/shrimp/omniScriptCompiler/QSCError.js +19 -0
  21. package/dist/quick/common/shrimp/omniScriptCompiler/QSCError.js.map +1 -0
  22. package/dist/quick/common/shrimp/omniScriptCompiler/Token.js +32 -0
  23. package/dist/quick/common/shrimp/omniScriptCompiler/Token.js.map +1 -0
  24. package/dist/studio-cli/src/version.js +1 -1
  25. package/package.json +4 -2
@@ -0,0 +1,988 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ParseObj = void 0;
4
+ const Node_1 = require("./Node");
5
+ const Token_1 = require("./Token");
6
+ const typeHelper_1 = require("../helpers/typeHelper");
7
+ const QSCError_1 = require("./QSCError");
8
+ function ParseContext(tokenInputs) {
9
+ this.tokenInputs = tokenInputs;
10
+ this.i = 0;
11
+ this.innerParseClosure = false;
12
+ this.innerParseClosureRetval = null;
13
+ this.innerParseEntryReasons = [];
14
+ }
15
+ ParseContext.prototype.getInnerParseEntryReason = function () {
16
+ var resLength = this.innerParseEntryReasons.length;
17
+ return resLength ? this.innerParseEntryReasons[resLength - 1] : null;
18
+ };
19
+ ParseContext.prototype.setInnerParseEntryReason = function (newReason) {
20
+ var oldEntryReason = this.getInnerParseEntryReason();
21
+ this.innerParseEntryReasons.push(newReason);
22
+ return oldEntryReason;
23
+ };
24
+ ParseContext.prototype.popInnerParseEntryReason = function () {
25
+ this.innerParseEntryReasons.pop();
26
+ };
27
+ ParseContext.prototype.searchInnerParseEntryReason = function (searchReason) {
28
+ for (var i = this.innerParseEntryReasons.length - 1; i >= 0; i--) {
29
+ if (this.innerParseEntryReasons[i] == searchReason) {
30
+ return true;
31
+ }
32
+ }
33
+ return false;
34
+ };
35
+ var Parse = function (tokenInputs, parseOptions) {
36
+ ///<param name="tokenInputs" type="[Token]" value="[new Token()]">Lexed tokens</param>
37
+ ///<param name="parseOptions" value="{lineBreakMode: ''}">lineBreakMode: return | multiline | discard</param>
38
+ var forest = [];
39
+ var tree = null;
40
+ var prevNode = null;
41
+ var curNode = null;
42
+ // var rootParse = Object.prototype.toString.call(this).constructor.name != ParseContext.name;
43
+ // var parseContext = !rootParse ? this : new ParseContext(tokenInputs);
44
+ var rootParse = this === undefined;
45
+ var parseContext = !rootParse ? this : new ParseContext(tokenInputs);
46
+ var tokens = parseContext.tokenInputs || [];
47
+ var options = parseOptions || {};
48
+ options.lineBreakMode = options.lineBreakMode || "multiline";
49
+ if (tokens.length == 0) {
50
+ return forest;
51
+ }
52
+ while (parseContext.i < tokens.length && !parseContext.innerParseClosure) {
53
+ curNode = new Node_1.Node(tokens[parseContext.i]);
54
+ if (options.lineBreakMode != "discard") {
55
+ if (prevNode != null && curNode.token.position.line != prevNode.token.position.line) {
56
+ if (options.lineBreakMode == "return") {
57
+ parseContext.innerParseClosure = true;
58
+ break;
59
+ }
60
+ else { // multiline
61
+ if (curNode.TokObject.closer === true && rootParse === false) {
62
+ //if this is a closer no line breaking, will be returning allready
63
+ prevNode = null;
64
+ }
65
+ else {
66
+ forest.push(tree);
67
+ tree = null;
68
+ prevNode = null;
69
+ }
70
+ }
71
+ }
72
+ }
73
+ if (tree == null) {
74
+ if (!curNode.TokObject.canBeFirst) {
75
+ throw createError("(Parser)Statement can not start with " + curNode.Summarize(), "Statement can not start with " + curNode.token.value, curNode, null);
76
+ }
77
+ switch (curNode.token.type) {
78
+ case Lex.tok.operator:
79
+ if (curNode.token.value == "(") {
80
+ curNode = Lex.operators["("].CanBeTaken.call(parseContext, null, curNode);
81
+ }
82
+ break;
83
+ case Lex.tok.keyword:
84
+ curNode = curNode.TokObject.CanBeTaken.call(parseContext, null, curNode);
85
+ break;
86
+ }
87
+ tree = curNode;
88
+ }
89
+ else {
90
+ var taken = null;
91
+ if (curNode.TokObject.CanBeTaken != null) {
92
+ taken = curNode.TokObject.CanBeTaken.call(parseContext, prevNode, curNode);
93
+ }
94
+ if (taken == false) {
95
+ throw createError(prevNode.ShortSummarize() + " can not be preceed by " + curNode.ShortSummarize(), prevNode.token.value + " can not be preceeded by " + curNode.token.value, curNode, null);
96
+ }
97
+ if (taken == null) {
98
+ var taken = prevNode.TokObject.CanTake.call(parseContext, curNode, prevNode);
99
+ if (taken == null || taken == false) {
100
+ throw createError(curNode.ShortSummarize() + " can not preceed " + prevNode.ShortSummarize(), curNode.token.value + " can not preceed " + prevNode.token.value, curNode, null);
101
+ }
102
+ }
103
+ if (parseContext.innerParseClosure == false && parseContext.innerParseClosureRetval != null) {
104
+ if (parseContext.innerParseClosureRetval.retTokenValue.indexOf(prevNode.token.value) != 0) {
105
+ throw createError("matching " + parseContext.innerParseClosureRetval.retTokenValue.substring(0, 1) + " can not be found for " + parseContext.innerParseClosureRetval.retTokenValue.substring(1, 1) + ".", null, parseContext.innerParseClosureRetval.retResponsible, null);
106
+ }
107
+ prevNode.token.endPosition = parseContext.innerParseClosureRetval.retEndPosition;
108
+ prevNode.token.value = parseContext.innerParseClosureRetval.retTokenValue;
109
+ prevNode.TokObject = parseContext.innerParseClosureRetval.retTokObject;
110
+ parseContext.innerParseClosureRetval = null;
111
+ }
112
+ if (taken !== true) {
113
+ curNode = taken;
114
+ }
115
+ }
116
+ while (tree.parent != null) {
117
+ tree = tree.parent;
118
+ }
119
+ prevNode = curNode;
120
+ parseContext.i++;
121
+ }
122
+ if (parseContext.innerParseClosure) {
123
+ parseContext.i--;
124
+ parseContext.innerParseClosure = false;
125
+ }
126
+ if (tree != null) {
127
+ forest.push(tree);
128
+ }
129
+ return forest;
130
+ };
131
+ var parse = Parse;
132
+ var CanTakeOperatorPlus = function (node, self) {
133
+ ///<param name="node" value="new Node()"></param>
134
+ ///<param name="self" value="new Node()"></param>
135
+ switch (node.token.type) {
136
+ case Lex.tok.string:
137
+ switch (self.token.value) {
138
+ case "+":
139
+ postfix(node, self);
140
+ return true;
141
+ }
142
+ case Lex.tok.identifier:
143
+ postfix(node, self);
144
+ return true;
145
+ case Lex.tok.number:
146
+ postfix(node, self);
147
+ return true;
148
+ case Lex.tok.operator:
149
+ switch (node.token.value) {
150
+ case "+":
151
+ case "*":
152
+ case "/":
153
+ case "-":
154
+ case "&&":
155
+ case "||":
156
+ if (!self.right) {
157
+ return false;
158
+ }
159
+ infix(node, self);
160
+ return true;
161
+ case "!":
162
+ postfix(node, self);
163
+ return true;
164
+ }
165
+ return false;
166
+ }
167
+ };
168
+ var peekNext = function () {
169
+ ///<summary></summary>
170
+ ///<returns type="Isbank.OmniScript.Token" value="new Isbank.OmniScript.Token()"></returns>
171
+ if (this.tokenInputs.length <= this.i + 1) {
172
+ return null;
173
+ }
174
+ return this.tokenInputs[this.i + 1];
175
+ };
176
+ var checkNext = function (expectedTokenValue) {
177
+ var retVal = null;
178
+ var nextToken = peekNext.call(this);
179
+ if (nextToken === null) {
180
+ return expectedTokenValue === null;
181
+ }
182
+ if (nextToken.value === expectedTokenValue && nextToken.type != "string") {
183
+ retVal = true;
184
+ }
185
+ else {
186
+ retVal = false;
187
+ }
188
+ return retVal;
189
+ };
190
+ var assertNext = function (expectedTokenValue) {
191
+ var checkRet = checkNext.call(this, expectedTokenValue);
192
+ if (checkRet === true) {
193
+ this.i++;
194
+ return;
195
+ }
196
+ else if (checkRet === false) {
197
+ unexpectedToken.call(this, expectedTokenValue);
198
+ }
199
+ };
200
+ var unexpectedToken = function (expectedTokenValue) {
201
+ var expected = expectedTokenValue;
202
+ if (new typeHelper_1.TypeHelper().isArray(expected)) {
203
+ expected = expected.join(",");
204
+ }
205
+ throw createError("(Parser)Unexpected token: " + this.tokenInputs[this.i].Summarize() + " Expected: " + expected, "Unexpected token: " + this.tokenInputs[this.i].value + " Expected: " + expected, null, this.tokenInputs[this.i]);
206
+ };
207
+ var assertRetResp = function (expectedTokenValue) {
208
+ var expecteds = expectedTokenValue;
209
+ if (!new typeHelper_1.TypeHelper().isArray(expecteds)) {
210
+ expecteds = [expecteds];
211
+ }
212
+ var found = false;
213
+ for (var i = 0; i < expecteds.length && !found; i++) {
214
+ if (this.innerParseClosureRetval.retResponsible.token.value == expecteds[i]) {
215
+ found = true;
216
+ }
217
+ }
218
+ if (!found) {
219
+ unexpectedToken.call(this, expectedTokenValue);
220
+ }
221
+ };
222
+ var assertEntryReasonExistInStack = function (reasonToSearch) {
223
+ if (!this.searchInnerParseEntryReason(reasonToSearch)) {
224
+ throw createError(this.tokenInputs[this.i].Summarize() + " can only be used inside " + reasonToSearch + " body", this.tokenInputs[this.i].value + " can only be used inside " + reasonToSearch + " body", null, this.tokenInputs[this.i].value);
225
+ }
226
+ };
227
+ var Lex = {
228
+ tok: {
229
+ operator: Token_1.Token.Types.operator,
230
+ string: Token_1.Token.Types.string,
231
+ number: Token_1.Token.Types.number,
232
+ identifier: Token_1.Token.Types.identifier,
233
+ keyword: Token_1.Token.Types.keyword
234
+ },
235
+ strings: {
236
+ main: {
237
+ canBeFirst: true,
238
+ CanTake: function (node, self) {
239
+ ///<param name="node" value="new Node()"></param>
240
+ ///<param name="self" value="new Node()"></param>
241
+ switch (node.token.type) {
242
+ case Lex.tok.operator:
243
+ if (node.token.value === "{") {
244
+ self.right = [];
245
+ var statementCounter = 0;
246
+ var next = null, loop = false;
247
+ do {
248
+ this.i++;
249
+ loop = false;
250
+ var parsedForest = parse.call(this, null, { lineBreakMode: "return" }); // string statements can not be multiline / 56041 for now... (*)
251
+ //(*) -> still using forest for future prevention of evaluator changes :)
252
+ assertRetResp.call(this, "}");
253
+ self.right.push(parsedForest);
254
+ self.token.value += ("{" + statementCounter++ + "}");
255
+ this.innerParseClosureRetval = null;
256
+ next = peekNext.call(this);
257
+ if (next !== null && next.type === Lex.tok.string) {
258
+ self.token.value += next.value;
259
+ this.i++;
260
+ next = peekNext.call(this);
261
+ if (next !== null && next.value === "{") {
262
+ loop = true;
263
+ this.i++;
264
+ }
265
+ }
266
+ } while (loop);
267
+ return self;
268
+ }
269
+ else {
270
+ infix(node, self);
271
+ }
272
+ return true;
273
+ }
274
+ }
275
+ }
276
+ },
277
+ numbers: {
278
+ main: {
279
+ canBeFirst: true,
280
+ CanTake: function (node, self) {
281
+ ///<param name="node" value="new Node()"></param>
282
+ ///<param name="self" value="new Node()"></param>
283
+ switch (node.token.type) {
284
+ case Lex.tok.operator:
285
+ infix(node, self);
286
+ return true;
287
+ }
288
+ }
289
+ }
290
+ },
291
+ identifiers: {
292
+ main: {
293
+ canBeFirst: true,
294
+ CanTake: function (node, self) {
295
+ ///<param name="node" value="new Node()"></param>
296
+ ///<param name="self" value="new Node()"></param>
297
+ switch (node.token.type) {
298
+ case Lex.tok.operator:
299
+ infix(node, self);
300
+ return true;
301
+ }
302
+ }
303
+ }
304
+ },
305
+ keywords: {
306
+ "if": {
307
+ canBeFirst: true,
308
+ CanBeTaken: function (node, self) {
309
+ ///<param name="self" value="new Node()"></param>
310
+ if (node != null) {
311
+ return false;
312
+ }
313
+ var myEntryReason = this.getInnerParseEntryReason();
314
+ var setInnerParseContext = function () {
315
+ if (myEntryReason === "elseif") {
316
+ this.innerParseClosure = true;
317
+ }
318
+ else {
319
+ this.innerParseClosureRetval = null;
320
+ }
321
+ };
322
+ assertNext.call(this, "(");
323
+ this.i++;
324
+ self.left = parse.call(this, null, { lineBreakMode: "discard" })[0];
325
+ assertRetResp.call(this, ")");
326
+ this.innerParseClosureRetval = null;
327
+ assertNext.call(this, "{");
328
+ this.i++;
329
+ this.setInnerParseEntryReason("if");
330
+ self.right = [parse.call(this, null, { lineBreakMode: "multiline" }), null];
331
+ this.popInnerParseEntryReason();
332
+ assertRetResp.call(this, "}");
333
+ if (checkNext.call(this, "else") === true) {
334
+ this.innerParseClosureRetval = null;
335
+ this.i++;
336
+ if (checkNext.call(this, "if") === true) { // else if {
337
+ this.i++;
338
+ this.setInnerParseEntryReason("elseif");
339
+ self.right[1] = parse.call(this, null, { lineBreakMode: "multiline" });
340
+ this.popInnerParseEntryReason();
341
+ // check } maybe ??
342
+ setInnerParseContext.call(this);
343
+ }
344
+ else { //else {
345
+ assertNext.call(this, "{");
346
+ this.i++;
347
+ this.setInnerParseEntryReason("else");
348
+ self.right[1] = parse.call(this, null, { lineBreakMode: "multiline" });
349
+ this.popInnerParseEntryReason();
350
+ assertRetResp.call(this, "}");
351
+ setInnerParseContext.call(this);
352
+ }
353
+ }
354
+ else {
355
+ setInnerParseContext.call(this);
356
+ }
357
+ return self;
358
+ }
359
+ },
360
+ "foreach": {
361
+ canBeFirst: true,
362
+ CanBeTaken: function (node, self) {
363
+ ///<param name="self" value="new Node()"></param>
364
+ if (node != null) {
365
+ return false;
366
+ }
367
+ var setInnerParseContext = function () {
368
+ this.innerParseClosureRetval = null;
369
+ };
370
+ assertNext.call(this, "(");
371
+ var identifier = peekNext.call(this);
372
+ if (identifier.type != Lex.tok.identifier) {
373
+ return false;
374
+ }
375
+ this.i++;
376
+ var inn = peekNext.call(this);
377
+ this.i++;
378
+ if (inn.type != Lex.tok.keyword || inn.value != "in") {
379
+ unexpectedToken.call(this, "in");
380
+ }
381
+ this.i++;
382
+ inn = new Node_1.Node(inn);
383
+ identifier = new Node_1.Node(identifier);
384
+ inn.right = parse.call(this, null, { lineBreakMode: "return" })[0];
385
+ inn.left = identifier;
386
+ self.left = inn;
387
+ assertRetResp.call(this, ")");
388
+ this.innerParseClosureRetval = null;
389
+ assertNext.call(this, "{");
390
+ this.i++;
391
+ this.setInnerParseEntryReason("foreach");
392
+ self.right = [parse.call(this, null, { lineBreakMode: "multiline" })];
393
+ this.popInnerParseEntryReason();
394
+ assertRetResp.call(this, "}");
395
+ setInnerParseContext.call(this);
396
+ return self;
397
+ }
398
+ },
399
+ "in": {
400
+ canBeFirst: false,
401
+ CanBeTaken: function () {
402
+ return false;
403
+ }
404
+ },
405
+ "break": {
406
+ canBeFirst: true,
407
+ CanBeTaken: function (node, self) {
408
+ if (node != null) {
409
+ return false;
410
+ }
411
+ assertEntryReasonExistInStack.call(this, "foreach");
412
+ return self;
413
+ }
414
+ },
415
+ "continue": {
416
+ canBeFirst: true,
417
+ CanBeTaken: function (node, self) {
418
+ if (node != null) {
419
+ return false;
420
+ }
421
+ assertEntryReasonExistInStack.call(this, "foreach");
422
+ return self;
423
+ }
424
+ }
425
+ },
426
+ operators: {
427
+ "()": {
428
+ wasOpenable: true,
429
+ concatable: true,
430
+ canBeFirst: false,
431
+ value: "()",
432
+ presedence: -1,
433
+ CanTake: function (node, self) {
434
+ ///<param name="node" value="new Node()"></param>
435
+ ///<param name="self" value="new Node()"></param>
436
+ infix(node, self);
437
+ return true;
438
+ }
439
+ },
440
+ "(": {
441
+ openable: true,
442
+ canBeFirst: true, presedence: -1,
443
+ CanTake: function (node, self) {
444
+ ///<param name="node" value="new Node()"></param>
445
+ ///<param name="self" value="new Node()"></param>
446
+ var parsed = [];
447
+ while (true) {
448
+ parsed.push(parse.call(this, null, { lineBreakMode: "return" })[0]);
449
+ if (this.innerParseClosureRetval.retResponsible.token.value == ",") {
450
+ this.innerParseClosureRetval = null;
451
+ this.i++;
452
+ }
453
+ else {
454
+ break;
455
+ }
456
+ }
457
+ postfix(parsed, self);
458
+ return self;
459
+ },
460
+ CanBeTaken: function (node, self) {
461
+ ///<param name="node" value="new Node()"></param>
462
+ ///<param name="self" value="new Node()"></param>
463
+ if (node == null) {
464
+ this.i++;
465
+ var parsed = parse.call(this, null, { lineBreakMode: "return" })[0];
466
+ this.innerParseClosureRetval = null;
467
+ return parsed;
468
+ }
469
+ switch (node.token.type) {
470
+ case Lex.tok.operator:
471
+ if (node.TokObject.wasOpenable === true) {
472
+ // calling an openable. no differecent than identifier
473
+ infix(self, node);
474
+ return true;
475
+ }
476
+ // self is presedence operator
477
+ this.i++;
478
+ var parsed = parse.call(this, null, { lineBreakMode: "return" })[0];
479
+ this.innerParseClosureRetval = null;
480
+ postfix(parsed, node);
481
+ return parsed;
482
+ case Lex.tok.number:
483
+ return false;
484
+ case Lex.tok.identifier:
485
+ infix(self, node);
486
+ return true;
487
+ }
488
+ }
489
+ },
490
+ ")": {
491
+ canBeFirst: false, presedence: 9,
492
+ closer: true,
493
+ CanBeTaken: function (node, self) {
494
+ ///<param name="node" value="new Node()"></param>
495
+ ///<param name="self" value="new Node()"></param>
496
+ if (node != null) {
497
+ switch (node.token.type) {
498
+ case Lex.tok.operator:
499
+ //if (node.TokObject.openable != true && node.TokObject.wasOpenable != true) {
500
+ // return false;
501
+ //} evaluator -> and2
502
+ if (node.token.value == "(") { // açılmanın üstüne kapama -> ()
503
+ node.token.value = Lex.operators["()"].value;
504
+ node.TokObject = Lex.operators["()"];
505
+ node.token.endPosition = self.token.position;
506
+ return node;
507
+ }
508
+ break;
509
+ }
510
+ }
511
+ this.innerParseClosure = true;
512
+ this.innerParseClosureRetval = {
513
+ retTokenValue: Lex.operators["()"].value,
514
+ retTokObject: Lex.operators["()"],
515
+ retEndPosition: self.token.position,
516
+ retResponsible: self
517
+ };
518
+ return true;
519
+ }
520
+ },
521
+ "{}": {
522
+ concatable: true,
523
+ canBeFirst: false,
524
+ value: "{}",
525
+ wasOpenable: true,
526
+ CanTake: function (node, self) {
527
+ ///<param name="node" value="new Node()"></param>
528
+ ///<param name="self" value="new Node()"></param>
529
+ switch (node.token.type) {
530
+ case Lex.tok.operator:
531
+ switch (node.token.value) {
532
+ case Lex.operators["!"]:
533
+ return false;
534
+ }
535
+ infix(node, self);
536
+ return true;
537
+ }
538
+ }
539
+ },
540
+ "{": {
541
+ openable: true,
542
+ canBeFirst: true, value: "{",
543
+ CanTake: function (node, self) {
544
+ ///<param name="node" value="new Node()"></param>
545
+ ///<param name="self" value="new Node()"></param>
546
+ var parsed = [];
547
+ var curParsed = null;
548
+ while (true) {
549
+ curParsed = parse.call(this, null, { lineBreakMode: "discard" })[0];
550
+ assertRetResp.call(this, ["}", ","]);
551
+ if (curParsed.token.value != "=") {
552
+ throw createError("(Parser)object creation scope <<{}>> must consist of assignments <<=>>, not expected: " + curParsed.Summarize(), "object creation scope <<{}>> must consist of assignments <<=>>, not expected: " + curParsed.token.value, curParsed, null);
553
+ }
554
+ parsed.push(curParsed);
555
+ if (this.innerParseClosureRetval.retResponsible.token.value == ",") {
556
+ this.innerParseClosureRetval = null;
557
+ this.i++;
558
+ }
559
+ else {
560
+ break;
561
+ }
562
+ }
563
+ postfix(parsed, self);
564
+ return self;
565
+ }
566
+ },
567
+ "}": {
568
+ value: "}",
569
+ canBeFirst: true,
570
+ closer: true,
571
+ CanBeTaken: function (node, self) {
572
+ ///<param name="node" value="new Node()"></param>
573
+ ///<param name="self" value="new Node()"></param>
574
+ if (node != null) {
575
+ switch (node.token.type) {
576
+ case Lex.tok.operator:
577
+ if (node.TokObject.openable != true && node.TokObject.wasOpenable != true) {
578
+ return false;
579
+ }
580
+ if (node.token.value == "{") { // açılmanın üstüne kapama -> {}
581
+ node.token.value = Lex.operators["{}"].value;
582
+ node.TokObject = Lex.operators["{}"];
583
+ node.token.endPosition = self.token.position;
584
+ return node;
585
+ }
586
+ break;
587
+ }
588
+ }
589
+ this.innerParseClosure = true;
590
+ this.innerParseClosureRetval = {
591
+ retTokenValue: Lex.operators["{}"].value,
592
+ retTokObject: Lex.operators["{}"],
593
+ retEndPosition: self.token.position,
594
+ retResponsible: self
595
+ };
596
+ return true;
597
+ }
598
+ },
599
+ "[]": {
600
+ wasOpenable: true,
601
+ concatable: true,
602
+ canBeFirst: false,
603
+ presedence: -1,
604
+ value: "[]",
605
+ CanTake: function (node, self) {
606
+ ///<param name="node" value="new Node()"></param>
607
+ ///<param name="self" value="new Node()"></param>
608
+ switch (node.token.type) {
609
+ case Lex.tok.operator:
610
+ switch (node.token.value) {
611
+ case Lex.operators["["]:
612
+ case Lex.operators["!"]:
613
+ return false;
614
+ }
615
+ infix(node, self);
616
+ return true;
617
+ }
618
+ }
619
+ },
620
+ "[": {
621
+ openable: true,
622
+ presedence: -1,
623
+ value: "[",
624
+ canBeFirst: true,
625
+ CanBeTaken: function (node, self) {
626
+ ///<param name="node" value="new Node()"></param>
627
+ ///<param name="self" value="new Node()"></param>
628
+ switch (node.token.type) {
629
+ case Lex.tok.operator:
630
+ if (node.TokObject.wasOpenable === true || node.TokObject.openable === true || node.token.value === "=") {
631
+ return null; // be handled with [].CanTake, ().CanTake || (.CanTake...
632
+ }
633
+ throw createError("(Parser)not implemented 16", "not implemented 16", node, null); //concat two arrays maybe ?? [2,3]+[4,5,6]
634
+ return true;
635
+ case Lex.tok.number:
636
+ return false;
637
+ case Lex.tok.identifier:
638
+ infix(self, node);
639
+ return true;
640
+ }
641
+ },
642
+ CanTake: function (node, self) {
643
+ ///<param name="node" value="new Node()"></param>
644
+ ///<param name="self" value="new Node()"></param>
645
+ var parsed = [];
646
+ while (true) {
647
+ parsed.push(parse.call(this, null, { lineBreakMode: "return" })[0]);
648
+ if (this.innerParseClosureRetval.retResponsible.token.value == ",") {
649
+ this.innerParseClosureRetval = null;
650
+ this.i++;
651
+ }
652
+ else {
653
+ break;
654
+ }
655
+ }
656
+ postfix(parsed, self);
657
+ return self;
658
+ }
659
+ },
660
+ "]": {
661
+ value: "]",
662
+ canBeFirst: false,
663
+ closer: true,
664
+ CanBeTaken: function (node, self) {
665
+ ///<param name="node" value="new Node()"></param>
666
+ ///<param name="self" value="new Node()"></param>
667
+ if (node != null) {
668
+ switch (node.token.type) {
669
+ case Lex.tok.operator:
670
+ if (node.token.value == "[") { // açılmanın üstüne kapama -> []
671
+ node.token.value = Lex.operators["[]"].value;
672
+ node.TokObject = Lex.operators["[]"];
673
+ node.token.endPosition = self.token.position;
674
+ return node;
675
+ }
676
+ if (node.TokObject.wasOpenable != true) {
677
+ return false;
678
+ }
679
+ }
680
+ }
681
+ this.innerParseClosure = true;
682
+ this.innerParseClosureRetval = {
683
+ retTokenValue: Lex.operators["[]"].value,
684
+ retTokObject: Lex.operators["[]"],
685
+ retEndPosition: self.token.position,
686
+ retResponsible: self
687
+ };
688
+ return true;
689
+ }
690
+ },
691
+ "+": {
692
+ concatable: false,
693
+ canBeFirst: false, presedence: 5,
694
+ CanTake: CanTakeOperatorPlus
695
+ },
696
+ "-": {
697
+ concatable: false,
698
+ canBeFirst: true, presedence: 5,
699
+ CanTake: CanTakeOperatorPlus
700
+ },
701
+ "*": {
702
+ concatable: false,
703
+ canBeFirst: false, presedence: 6,
704
+ CanTake: CanTakeOperatorPlus
705
+ },
706
+ "/": {
707
+ concatable: false,
708
+ canBeFirst: false, presedence: 6,
709
+ CanTake: CanTakeOperatorPlus
710
+ },
711
+ "&&": {
712
+ concatable: false,
713
+ canBeFirst: false, presedence: 2,
714
+ CanTake: CanTakeOperatorPlus
715
+ },
716
+ "||": {
717
+ concatable: false,
718
+ canBeFirst: false, presedence: 2,
719
+ CanTake: CanTakeOperatorPlus
720
+ },
721
+ "!": {
722
+ canBeFirst: true, concatable: false,
723
+ presedence: 7,
724
+ CanBeTaken: function (node, self) {
725
+ ///<param name="node" value="new Node()"></param>
726
+ ///<param name="self" value="new Node()"></param>
727
+ switch (node.token.type) {
728
+ case Lex.tok.number:
729
+ case Lex.tok.identifier:
730
+ case Lex.tok.string:
731
+ return false;
732
+ }
733
+ },
734
+ CanTake: function (node, self) {
735
+ ///<param name="node" value="new Node()"></param>
736
+ ///<param name="self" value="new Node()"></param>
737
+ switch (node.token.type) {
738
+ case Lex.tok.operator:
739
+ return false;
740
+ }
741
+ postfix(node, self);
742
+ return true;
743
+ }
744
+ },
745
+ "?": {
746
+ canBeFirst: false
747
+ },
748
+ ":": {
749
+ canBeFirst: false,
750
+ CanTake: function () {
751
+ //sadece dışarısı object creation'larda ({a=5}) = kullanılmalı hatasını versin diye. Başka bir amaç yok...
752
+ return true;
753
+ }
754
+ },
755
+ "%": {
756
+ canBeFirst: false
757
+ },
758
+ ".": {
759
+ concatable: true,
760
+ presedence: 8,
761
+ canBeFirst: false,
762
+ CanBeTaken: function (node, self) {
763
+ ///<param name="node" value="new Node()"></param>
764
+ ///<param name="self" value="new Node()"></param>
765
+ switch (node.token.type) {
766
+ case Lex.tok.identifier:
767
+ infix(self, node);
768
+ return true;
769
+ }
770
+ },
771
+ CanTake: function (node, self) {
772
+ ///<param name="node" value="new Node()"></param>
773
+ ///<param name="self" value="new Node()"></param>
774
+ switch (node.token.type) {
775
+ case Lex.tok.identifier:
776
+ postfix(node, self);
777
+ return true;
778
+ }
779
+ }
780
+ },
781
+ "&": {
782
+ canBeFirst: false
783
+ },
784
+ "|": {
785
+ canBeFirst: false
786
+ },
787
+ ">": {
788
+ concatable: false,
789
+ canBeFirst: false, presedence: 4,
790
+ CanTake: CanTakeOperatorPlus
791
+ },
792
+ "<": {
793
+ concatable: false,
794
+ canBeFirst: false, presedence: 4,
795
+ CanTake: CanTakeOperatorPlus
796
+ },
797
+ ">=": {
798
+ concatable: false,
799
+ canBeFirst: false, presedence: 4,
800
+ CanTake: CanTakeOperatorPlus
801
+ },
802
+ "<=": {
803
+ concatable: false,
804
+ canBeFirst: false, presedence: 4,
805
+ CanTake: CanTakeOperatorPlus
806
+ },
807
+ "==": {
808
+ concatable: false,
809
+ canBeFirst: false, presedence: 4,
810
+ CanTake: CanTakeOperatorPlus
811
+ },
812
+ "!=": {
813
+ concatable: false,
814
+ canBeFirst: false, presedence: 4,
815
+ CanTake: CanTakeOperatorPlus
816
+ },
817
+ "=": {
818
+ canBeFirst: false, presedence: -1,
819
+ CanBeTaken: function (node, self) {
820
+ ///<param name="node" value="new Node()"></param>
821
+ ///<param name="self" value="new Node()"></param>
822
+ var head = node;
823
+ while (head.parent != null) {
824
+ // burada scope'ı ayırmak lazım. SM.go(alper{a=5,b=6}
825
+ head = head.parent;
826
+ }
827
+ var permitted = {
828
+ "[]": 1, identifier: 1, ".": 1, string: 1
829
+ };
830
+ if (permitted[head.token.type] == null && permitted[head.token.value] == null) {
831
+ throw createError("(Parser)left hand side of = has errors: " + self.Summarize(), "left hand side of = has errors: " + self.token.value, self, null);
832
+ }
833
+ infix(self, node);
834
+ return true;
835
+ },
836
+ CanTake: function (node, self) {
837
+ ///<param name="node" value="new Node()"></param>
838
+ ///<param name="self" value="new Node()"></param>
839
+ var parsed = parse.call(this, null, { lineBreakMode: "return" })[0];
840
+ switch (node.token.type) {
841
+ case Lex.tok.operator:
842
+ if (node.token.value == "=") {
843
+ return false;
844
+ }
845
+ break;
846
+ }
847
+ postfix(parsed, self);
848
+ if (this.innerParseClosureRetval != null) {
849
+ var retRespTokVal = this.innerParseClosureRetval.retResponsible.token.value;
850
+ if (retRespTokVal == "," || retRespTokVal == "}" || retRespTokVal == ")") { // bitiş sona gelmesi değil de , dolayısı ile
851
+ this.innerParseClosure = true; // benim değil, üstten girenin
852
+ }
853
+ }
854
+ return parsed;
855
+ }
856
+ },
857
+ ",": {
858
+ canBeFirst: false, presedence: -1,
859
+ CanBeTaken: function (node, self) {
860
+ ///<param name="node" value="new Node()"></param>
861
+ ///<param name="self" value="new Node()"></param>
862
+ switch (node.token.type) {
863
+ case Lex.tok.operator:
864
+ if (node.TokObject.wasOpenable != true) {
865
+ //if (node.token.value != "()") {
866
+ return false;
867
+ }
868
+ break;
869
+ }
870
+ this.innerParseClosure = true;
871
+ this.innerParseClosureRetval = {
872
+ retTokenValue: null,
873
+ retTokObject: null,
874
+ retEndPosition: null,
875
+ retResponsible: self
876
+ };
877
+ return true;
878
+ }
879
+ }
880
+ }
881
+ };
882
+ Parse.Dict = Lex;
883
+ var postfix = function (newNode, self) {
884
+ ///<param name="newNode" value="new Node()"></param>
885
+ ///<param name="self" value="new Node()"></param>
886
+ if (!new typeHelper_1.TypeHelper().isArray(newNode)) {
887
+ newNode = [newNode];
888
+ }
889
+ for (var i = 0; i < newNode.length; i++) {
890
+ if (newNode[i].parent != null) {
891
+ throw createError("(Parser)unexpected postfix: newnodes parent is not null: " + newNode[i].Summarize(), "unexpected postfix: newnodes parent is not null:" + newNode[i].token.value, newNode[i], null);
892
+ }
893
+ newNode[i].parent = self;
894
+ }
895
+ if (self.right == null) {
896
+ self.right = newNode.length > 1 ? newNode : newNode[0];
897
+ }
898
+ else {
899
+ throw createError("(Parser)unexpected postfix: selfs right is not null" + self.Summarize(), "unexpected postfix: selfs right is not null" + self.token.value, self, null);
900
+ }
901
+ };
902
+ var putInPlace = function (destNode, sourceNode) {
903
+ ///<param name="destNode" value="new Node()"></param>
904
+ ///<param name="sourceNode" value="new Node()"></param>
905
+ if (destNode.parent == null) {
906
+ destNode.parent = sourceNode;
907
+ if (sourceNode.left == null) {
908
+ sourceNode.left = destNode;
909
+ }
910
+ else if (sourceNode.right == null) {
911
+ sourceNode.right = destNode;
912
+ }
913
+ else {
914
+ throw createError("(Parser)Can not put in place source has both left and right: " + sourceNode.Summarize(), "Can not put in place source has both left and right: " + sourceNode.token.value, sourceNode, null);
915
+ }
916
+ }
917
+ else {
918
+ destNode.parent.right = sourceNode;
919
+ sourceNode.parent = destNode.parent;
920
+ destNode.parent = sourceNode;
921
+ if (sourceNode.left == null) {
922
+ sourceNode.left = destNode;
923
+ }
924
+ else {
925
+ throw createError("(Parser)Can not put in place, incomming source nodes left is not null: " + sourceNode.Summarize(), "Can not put in place, incomming source nodes left is not null: " + sourceNode.token.value, sourceNode, null);
926
+ }
927
+ }
928
+ };
929
+ var infix = function (newNode, self) {
930
+ ///<param name="newNode" value="new Node()"></param>
931
+ ///<param name="self" value="new Node()"></param>
932
+ if (self.parent == null) {
933
+ self.parent = newNode;
934
+ if (newNode.left == null) {
935
+ newNode.left = self;
936
+ }
937
+ else {
938
+ throw createError("(Parser)unexpected infix: newNode left is not null " + newNode.Summarize(), "unexpected infix: newNode left is not null " + newNode.token.value, newNode, null);
939
+ }
940
+ }
941
+ else {
942
+ var target = self;
943
+ while (true) {
944
+ if (target.parent == null || target.parent.TokObject.presedence < newNode.TokObject.presedence) {
945
+ break;
946
+ }
947
+ if (newNode.TokObject.presedence == -1 && target.parent.TokObject.concatable != true) {
948
+ break;
949
+ }
950
+ target = target.parent;
951
+ }
952
+ putInPlace(target, newNode);
953
+ }
954
+ };
955
+ var parseExObj = function (message, responsibleNode) {
956
+ return {
957
+ message: "(Parser)" + message,
958
+ responsibleNode: responsibleNode
959
+ };
960
+ };
961
+ /**
962
+ *
963
+ * @param {string} consoleMsg
964
+ * @param {string | undefined} msg
965
+ * @param {Node | undefined} responsibleNode
966
+ * @param {Token | undefined} responsibleToken
967
+ */
968
+ var createError = function (consoleMsg, msg, responsibleNode, responsibleToken) {
969
+ var pos = { line: 0, column: 0 };
970
+ var endPos = { line: 0, column: 0 };
971
+ if (responsibleNode) {
972
+ pos = (responsibleNode.token && responsibleNode.token.position) || pos;
973
+ endPos = (responsibleNode.token && responsibleNode.token.endPosition) || endPos;
974
+ }
975
+ else if (responsibleToken) {
976
+ pos = responsibleToken.position || pos;
977
+ endPos = responsibleToken.endPosition || endPos;
978
+ }
979
+ return new QSCError_1.QSCError({
980
+ message: consoleMsg, intelliMsg: msg,
981
+ stLine: pos.line, stColumn: pos.line,
982
+ eLine: endPos.line, eColumn: endPos.column,
983
+ responsibleNode: responsibleNode
984
+ });
985
+ };
986
+ var ParseObj = { Parse: Parse };
987
+ exports.ParseObj = ParseObj;
988
+ //# sourceMappingURL=Parser.js.map