@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.
- package/dist/common/agentic/quickHostCompiler/commands/GlobalManager.js +1 -1
- package/dist/common/agentic/quickHostCompiler/commands/GlobalManager.js.map +1 -1
- package/dist/common/agentic/quickHostCompiler/commands/compile.js +2 -2
- package/dist/common/agentic/quickHostCompiler/commands/compile.js.map +1 -1
- package/dist/common/agentic/studioCli/protocolVersion.js +1 -1
- package/dist/common/agentic/studioCli/protocolVersion.js.map +1 -1
- package/dist/quick/common/shrimp/helpers/QJsonHelper.js +153 -0
- package/dist/quick/common/shrimp/helpers/QJsonHelper.js.map +1 -0
- package/dist/quick/common/shrimp/helpers/qjsonParser/QJsonContentParser.js +21 -0
- package/dist/quick/common/shrimp/helpers/qjsonParser/QJsonContentParser.js.map +1 -0
- package/dist/quick/common/shrimp/helpers/typeHelper.js.map +1 -1
- package/dist/quick/common/shrimp/omniScriptCompiler/Compressor.js +83 -0
- package/dist/quick/common/shrimp/omniScriptCompiler/Compressor.js.map +1 -0
- package/dist/quick/common/shrimp/omniScriptCompiler/Lexer.js +348 -0
- package/dist/quick/common/shrimp/omniScriptCompiler/Lexer.js.map +1 -0
- package/dist/quick/common/shrimp/omniScriptCompiler/Node.js +35 -0
- package/dist/quick/common/shrimp/omniScriptCompiler/Node.js.map +1 -0
- package/dist/quick/common/shrimp/omniScriptCompiler/Parser.js +988 -0
- package/dist/quick/common/shrimp/omniScriptCompiler/Parser.js.map +1 -0
- package/dist/quick/common/shrimp/omniScriptCompiler/QSCError.js +19 -0
- package/dist/quick/common/shrimp/omniScriptCompiler/QSCError.js.map +1 -0
- package/dist/quick/common/shrimp/omniScriptCompiler/Token.js +32 -0
- package/dist/quick/common/shrimp/omniScriptCompiler/Token.js.map +1 -0
- package/dist/studio-cli/src/version.js +1 -1
- 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
|