@profile-psl/psl-parser 0.1.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.
@@ -0,0 +1,739 @@
1
+ /* eslint-disable no-case-declarations */
2
+ /*
3
+ Notes from Mischa Reitsma on skipped rules:
4
+ - The no case declarations rule can be fixed by making sure the code in the cases go to dedicated
5
+ functions. It would make the code way more maintainable and readable.
6
+ */
7
+ import { getTokens, Token } from "./tokenizer";
8
+ export var SyntaxKind;
9
+ (function (SyntaxKind) {
10
+ SyntaxKind[SyntaxKind["ASSIGNMENT"] = 0] = "ASSIGNMENT";
11
+ SyntaxKind[SyntaxKind["BINARY_OPERATOR"] = 1] = "BINARY_OPERATOR";
12
+ SyntaxKind[SyntaxKind["CATCH_STATEMENT"] = 2] = "CATCH_STATEMENT";
13
+ SyntaxKind[SyntaxKind["DO_STATEMENT"] = 3] = "DO_STATEMENT";
14
+ SyntaxKind[SyntaxKind["FOR_STATEMENT"] = 4] = "FOR_STATEMENT";
15
+ SyntaxKind[SyntaxKind["IDENTIFIER"] = 5] = "IDENTIFIER";
16
+ SyntaxKind[SyntaxKind["IF_STATEMENT"] = 6] = "IF_STATEMENT";
17
+ SyntaxKind[SyntaxKind["NUMERIC_LITERAL"] = 7] = "NUMERIC_LITERAL";
18
+ SyntaxKind[SyntaxKind["POST_CONDITION"] = 8] = "POST_CONDITION";
19
+ SyntaxKind[SyntaxKind["QUIT_STATEMENT"] = 9] = "QUIT_STATEMENT";
20
+ SyntaxKind[SyntaxKind["RETURN_STATEMENT"] = 10] = "RETURN_STATEMENT";
21
+ SyntaxKind[SyntaxKind["SET_STATEMENT"] = 11] = "SET_STATEMENT";
22
+ SyntaxKind[SyntaxKind["MULTIPLE_VARIABLE_SET"] = 12] = "MULTIPLE_VARIABLE_SET";
23
+ SyntaxKind[SyntaxKind["STRING_LITERAL"] = 13] = "STRING_LITERAL";
24
+ SyntaxKind[SyntaxKind["WHILE_STATEMENT"] = 14] = "WHILE_STATEMENT";
25
+ SyntaxKind[SyntaxKind["TYPE_STATEMENT"] = 15] = "TYPE_STATEMENT";
26
+ SyntaxKind[SyntaxKind["VARIABLE_DECLARATION"] = 16] = "VARIABLE_DECLARATION";
27
+ SyntaxKind[SyntaxKind["TYPE_IDENTIFIER"] = 17] = "TYPE_IDENTIFIER";
28
+ })(SyntaxKind || (SyntaxKind = {}));
29
+ var OPERATOR_VALUE;
30
+ (function (OPERATOR_VALUE) {
31
+ OPERATOR_VALUE["AND_LITERAL"] = "and";
32
+ OPERATOR_VALUE["APOSTROPHE"] = "'";
33
+ OPERATOR_VALUE["AT"] = "@";
34
+ OPERATOR_VALUE["BACK_SLASH"] = "\\";
35
+ OPERATOR_VALUE["CARROT"] = "^";
36
+ OPERATOR_VALUE["COLON"] = ":";
37
+ OPERATOR_VALUE["DOLLAR"] = "$";
38
+ OPERATOR_VALUE["DOT"] = ".";
39
+ OPERATOR_VALUE["EQUAL"] = "=";
40
+ OPERATOR_VALUE["EXCLAMATION"] = "!";
41
+ OPERATOR_VALUE["GREATER_THAN"] = ">";
42
+ OPERATOR_VALUE["HASH"] = "#";
43
+ OPERATOR_VALUE["LEFT_BRACKET"] = "[";
44
+ OPERATOR_VALUE["LESS_THAN"] = "<";
45
+ OPERATOR_VALUE["MINUS"] = "-";
46
+ OPERATOR_VALUE["NOT_LITERAL"] = "not";
47
+ OPERATOR_VALUE["OR_LITERAL"] = "or";
48
+ OPERATOR_VALUE["PLUS"] = "+";
49
+ OPERATOR_VALUE["QUESTION_MARK"] = "?";
50
+ OPERATOR_VALUE["RIGHT_BRACKET"] = "]";
51
+ OPERATOR_VALUE["SLASH"] = "/";
52
+ OPERATOR_VALUE["STAR"] = "*";
53
+ OPERATOR_VALUE["UNDERSCORE"] = "_";
54
+ OPERATOR_VALUE["RET"] = "ret";
55
+ })(OPERATOR_VALUE || (OPERATOR_VALUE = {}));
56
+ var STORAGE_MODIFIERS;
57
+ (function (STORAGE_MODIFIERS) {
58
+ STORAGE_MODIFIERS["STATIC"] = "static";
59
+ STORAGE_MODIFIERS["NEW"] = "new";
60
+ STORAGE_MODIFIERS["LITERAL"] = "literal";
61
+ })(STORAGE_MODIFIERS || (STORAGE_MODIFIERS = {}));
62
+ var ACCESS_MODIFIERS;
63
+ (function (ACCESS_MODIFIERS) {
64
+ ACCESS_MODIFIERS["PUBLIC"] = "public";
65
+ ACCESS_MODIFIERS["PRIVATE"] = "private";
66
+ })(ACCESS_MODIFIERS || (ACCESS_MODIFIERS = {}));
67
+ var STATEMENT_KEYWORD;
68
+ (function (STATEMENT_KEYWORD) {
69
+ STATEMENT_KEYWORD["DO"] = "do";
70
+ STATEMENT_KEYWORD["SET"] = "set";
71
+ STATEMENT_KEYWORD["IF"] = "if";
72
+ STATEMENT_KEYWORD["CATCH"] = "catch";
73
+ STATEMENT_KEYWORD["FOR"] = "for";
74
+ STATEMENT_KEYWORD["QUIT"] = "quit";
75
+ STATEMENT_KEYWORD["RETURN"] = "return";
76
+ STATEMENT_KEYWORD["WHILE"] = "while";
77
+ STATEMENT_KEYWORD["TYPE"] = "type";
78
+ })(STATEMENT_KEYWORD || (STATEMENT_KEYWORD = {}));
79
+ const UNARY_OPERATORS = [
80
+ { value: OPERATOR_VALUE.APOSTROPHE },
81
+ { value: OPERATOR_VALUE.AT },
82
+ { value: OPERATOR_VALUE.CARROT },
83
+ { value: OPERATOR_VALUE.DOLLAR, appendable: true },
84
+ { value: OPERATOR_VALUE.DOT },
85
+ { value: OPERATOR_VALUE.MINUS },
86
+ { value: OPERATOR_VALUE.NOT_LITERAL },
87
+ { value: OPERATOR_VALUE.PLUS },
88
+ { value: OPERATOR_VALUE.RIGHT_BRACKET },
89
+ { value: OPERATOR_VALUE.RET },
90
+ ];
91
+ const BINARY_OPERATORS = [
92
+ { value: OPERATOR_VALUE.AND_LITERAL },
93
+ { value: OPERATOR_VALUE.APOSTROPHE, appendable: true },
94
+ { value: OPERATOR_VALUE.AT },
95
+ { value: OPERATOR_VALUE.BACK_SLASH },
96
+ { value: OPERATOR_VALUE.CARROT },
97
+ { value: OPERATOR_VALUE.DOT },
98
+ { value: OPERATOR_VALUE.EQUAL },
99
+ { value: OPERATOR_VALUE.EXCLAMATION },
100
+ { value: OPERATOR_VALUE.GREATER_THAN, appendable: true },
101
+ { value: OPERATOR_VALUE.HASH },
102
+ { value: OPERATOR_VALUE.LEFT_BRACKET },
103
+ { value: OPERATOR_VALUE.LESS_THAN, appendable: true },
104
+ { value: OPERATOR_VALUE.MINUS },
105
+ { value: OPERATOR_VALUE.NOT_LITERAL, appendable: true },
106
+ { value: OPERATOR_VALUE.OR_LITERAL },
107
+ { value: OPERATOR_VALUE.PLUS },
108
+ { value: OPERATOR_VALUE.QUESTION_MARK },
109
+ { value: OPERATOR_VALUE.SLASH },
110
+ { value: OPERATOR_VALUE.STAR },
111
+ { value: OPERATOR_VALUE.UNDERSCORE },
112
+ ];
113
+ export class StatementParser {
114
+ tokenizer;
115
+ tokens = [];
116
+ previousToken;
117
+ activeToken;
118
+ constructor(arg) {
119
+ if (typeof arg === "string") {
120
+ this.tokenizer = getTokens(arg);
121
+ }
122
+ else if (Array.isArray(arg)) {
123
+ this.tokenizer = arg[Symbol.iterator]();
124
+ }
125
+ else {
126
+ this.tokenizer = arg;
127
+ }
128
+ this.next(); // should I?
129
+ }
130
+ parseLine() {
131
+ if (!this.activeToken)
132
+ return [];
133
+ const statements = [];
134
+ do {
135
+ if (this.activeToken.isNewLine())
136
+ break;
137
+ if (this.activeToken.isAlphanumeric()) {
138
+ const statement = this.parseStatement();
139
+ if (!statement) {
140
+ this.next();
141
+ continue;
142
+ }
143
+ statements.push(statement);
144
+ }
145
+ else if (this.activeToken.isWhiteSpace())
146
+ this.next(true);
147
+ else
148
+ break;
149
+ } while (this.activeToken);
150
+ return statements;
151
+ }
152
+ parseStatement() {
153
+ if (!this.activeToken)
154
+ return null;
155
+ if (!this.activeToken.isAlphanumeric())
156
+ return null;
157
+ const action = this.activeToken;
158
+ let loadFunction;
159
+ let kind;
160
+ const loadSingleExpression = () => {
161
+ if (!this.next(true))
162
+ return { action, kind, expressions: [] };
163
+ const expression = loadFunction();
164
+ const expressions = expression ? [expression] : [];
165
+ return { kind, action, expressions };
166
+ };
167
+ const loadCommaSeparatedExpressions = () => {
168
+ if (!this.next(true))
169
+ return { action, kind, expressions: [] };
170
+ const expressions = this.loadCommaSeparated(loadFunction);
171
+ return { kind, action, expressions };
172
+ };
173
+ switch (action.value) {
174
+ case STATEMENT_KEYWORD.DO:
175
+ loadFunction = () => this.parseExpression();
176
+ kind = SyntaxKind.DO_STATEMENT;
177
+ return loadCommaSeparatedExpressions();
178
+ case STATEMENT_KEYWORD.SET:
179
+ loadFunction = () => this.parseSetExpression();
180
+ kind = SyntaxKind.SET_STATEMENT;
181
+ return loadCommaSeparatedExpressions();
182
+ case STATEMENT_KEYWORD.IF:
183
+ loadFunction = () => this.parseExpression();
184
+ kind = SyntaxKind.IF_STATEMENT;
185
+ return loadCommaSeparatedExpressions();
186
+ case STATEMENT_KEYWORD.CATCH:
187
+ loadFunction = () => this.parseExpression();
188
+ kind = SyntaxKind.CATCH_STATEMENT;
189
+ return loadCommaSeparatedExpressions();
190
+ case STATEMENT_KEYWORD.FOR:
191
+ return this.parseForStatement();
192
+ case STATEMENT_KEYWORD.QUIT:
193
+ loadFunction = () => this.parseExpression();
194
+ kind = SyntaxKind.QUIT_STATEMENT;
195
+ return loadCommaSeparatedExpressions();
196
+ case STATEMENT_KEYWORD.RETURN:
197
+ loadFunction = () => this.parseExpression();
198
+ kind = SyntaxKind.RETURN_STATEMENT;
199
+ return loadSingleExpression();
200
+ case STATEMENT_KEYWORD.WHILE:
201
+ loadFunction = () => this.parseExpression();
202
+ kind = SyntaxKind.WHILE_STATEMENT;
203
+ return loadSingleExpression();
204
+ case STATEMENT_KEYWORD.TYPE:
205
+ return this.parseTypeStatement();
206
+ default:
207
+ return null;
208
+ }
209
+ }
210
+ parseTypeStatement() {
211
+ const action = this.activeToken;
212
+ this.next(true);
213
+ let staticToken;
214
+ let newToken;
215
+ let publicToken;
216
+ let literalToken;
217
+ const getKeyWordToken = (token) => {
218
+ switch (token.value) {
219
+ case ACCESS_MODIFIERS.PUBLIC:
220
+ publicToken = token;
221
+ return true;
222
+ case STORAGE_MODIFIERS.LITERAL:
223
+ literalToken = token;
224
+ return true;
225
+ case STORAGE_MODIFIERS.NEW:
226
+ newToken = token;
227
+ return true;
228
+ case STORAGE_MODIFIERS.STATIC:
229
+ staticToken = token;
230
+ return true;
231
+ default:
232
+ return false;
233
+ }
234
+ };
235
+ const parseTypeAssignments = () => {
236
+ if (!this.activeToken || !this.activeToken.isAlphanumeric()) {
237
+ if (literalToken || newToken || publicToken || staticToken) {
238
+ const emptyDeclaration = {
239
+ id: undefined,
240
+ kind: SyntaxKind.VARIABLE_DECLARATION,
241
+ literalToken: undefined,
242
+ newToken,
243
+ publicToken,
244
+ staticToken,
245
+ type: undefined,
246
+ };
247
+ return [emptyDeclaration];
248
+ }
249
+ return [];
250
+ }
251
+ const type = {
252
+ id: this.activeToken,
253
+ kind: SyntaxKind.TYPE_IDENTIFIER
254
+ };
255
+ if (!this.next(true) || staticToken) {
256
+ const declaration = {
257
+ id: undefined,
258
+ kind: SyntaxKind.VARIABLE_DECLARATION,
259
+ literalToken,
260
+ newToken,
261
+ publicToken,
262
+ staticToken,
263
+ type,
264
+ };
265
+ return [declaration];
266
+ }
267
+ const assignments = this.loadCommaSeparated(() => {
268
+ return this.parseAssignment(() => {
269
+ // why not parseIdentifier
270
+ const variable = this.parseValue();
271
+ return {
272
+ args: variable.args,
273
+ id: variable.id,
274
+ kind: SyntaxKind.VARIABLE_DECLARATION,
275
+ literalToken,
276
+ newToken,
277
+ publicToken,
278
+ staticToken,
279
+ type,
280
+ };
281
+ });
282
+ });
283
+ assignments.forEach(expression => {
284
+ forEachChild(expression, node => {
285
+ if (!node)
286
+ return null;
287
+ if (node.kind === SyntaxKind.VARIABLE_DECLARATION) {
288
+ const declaration = node;
289
+ if (declaration.args) {
290
+ declaration.args = declaration.args
291
+ .map((arg) => {
292
+ if (!arg)
293
+ return null;
294
+ arg.kind =
295
+ SyntaxKind.TYPE_IDENTIFIER;
296
+ return arg;
297
+ });
298
+ }
299
+ }
300
+ return true;
301
+ });
302
+ });
303
+ return assignments;
304
+ };
305
+ while (this.activeToken && getKeyWordToken(this.activeToken)) {
306
+ if (!this.next(true))
307
+ break;
308
+ }
309
+ const expressions = parseTypeAssignments();
310
+ return {
311
+ action,
312
+ expressions,
313
+ kind: SyntaxKind.TYPE_STATEMENT,
314
+ };
315
+ }
316
+ parseAssignment(getLeft) {
317
+ const left = getLeft();
318
+ let rootNode = left;
319
+ if (this.activeToken && this.activeToken.isEqualSign()) {
320
+ const equalSign = this.activeToken;
321
+ this.next(true);
322
+ const expression = this.parseExpression();
323
+ rootNode = { operator: [equalSign], kind: SyntaxKind.ASSIGNMENT };
324
+ rootNode.left = left;
325
+ rootNode.right = expression;
326
+ }
327
+ return rootNode;
328
+ }
329
+ parseForStatement() {
330
+ if (!this.activeToken)
331
+ return null;
332
+ const action = this.activeToken;
333
+ const forStatement = {
334
+ action,
335
+ kind: SyntaxKind.FOR_STATEMENT,
336
+ expressions: []
337
+ };
338
+ if (!this.next())
339
+ return forStatement; // consume for
340
+ if (!this.next())
341
+ return forStatement; // consume first space
342
+ const spaceOrExpression = this.activeToken;
343
+ if (spaceOrExpression.isSpace()) {
344
+ this.next();
345
+ return forStatement; // argument less for
346
+ }
347
+ const expression = this.parseExpression();
348
+ if (expression)
349
+ forStatement.expressions.push(expression);
350
+ return forStatement;
351
+ }
352
+ parseSetExpression() {
353
+ if (!this.activeToken)
354
+ return null;
355
+ const postCondition = this.parsePostCondition();
356
+ const assignment = this.parseAssignment(() => {
357
+ const setVariables = this.parseSetVariables();
358
+ if (this.activeToken && this.activeToken.isWhiteSpace())
359
+ this.next(true);
360
+ if (postCondition && !setVariables) {
361
+ postCondition.expression = setVariables;
362
+ return postCondition;
363
+ }
364
+ return setVariables;
365
+ });
366
+ if (assignment && postCondition) {
367
+ postCondition.expression = assignment;
368
+ return postCondition;
369
+ }
370
+ return assignment;
371
+ }
372
+ parsePostCondition() {
373
+ if (!this.activeToken)
374
+ return null;
375
+ if (this.activeToken.isColon()) {
376
+ const colon = this.activeToken;
377
+ const postCondition = {
378
+ kind: SyntaxKind.POST_CONDITION,
379
+ colon
380
+ };
381
+ this.next(true);
382
+ const condition = this.parseExpression();
383
+ if (!condition)
384
+ return postCondition;
385
+ postCondition.condition = condition;
386
+ return postCondition;
387
+ }
388
+ return null;
389
+ }
390
+ parseSetVariables() {
391
+ if (!this.activeToken)
392
+ return null;
393
+ if (this.activeToken.isOpenParen()) {
394
+ this.next(true);
395
+ const variables = this.loadCommaSeparated(() => this.parseExpression());
396
+ if (this.activeToken && this.activeToken.isCloseParen())
397
+ this.next(true);
398
+ return { variables, kind: SyntaxKind.MULTIPLE_VARIABLE_SET };
399
+ }
400
+ else {
401
+ return this.parseExpression(true);
402
+ }
403
+ }
404
+ parseExpression(ignoreEquals, includeRet) {
405
+ const postCondition = this.parsePostCondition();
406
+ let rootNode = this.parseValue(undefined, includeRet);
407
+ if (!rootNode) {
408
+ if (postCondition)
409
+ return postCondition;
410
+ else
411
+ return null;
412
+ }
413
+ if (this.activeToken && this.activeToken.isEqualSign() && ignoreEquals) {
414
+ return rootNode;
415
+ }
416
+ rootNode = this.parseOperatorSeparatedValues(rootNode, ignoreEquals);
417
+ if (!rootNode)
418
+ return null;
419
+ rootNode = this.parseColonSeparatedValues(rootNode);
420
+ if (postCondition) {
421
+ postCondition.expression = rootNode;
422
+ rootNode = postCondition;
423
+ }
424
+ return rootNode;
425
+ }
426
+ parseColonSeparatedValues(rootNode) {
427
+ while (this.activeToken && this.activeToken.isColon()) {
428
+ const colonToken = this.activeToken;
429
+ this.next(true);
430
+ rootNode = {
431
+ kind: SyntaxKind.BINARY_OPERATOR,
432
+ left: rootNode,
433
+ operator: [colonToken],
434
+ right: this.parseValue(),
435
+ };
436
+ }
437
+ return rootNode;
438
+ }
439
+ parseOperatorSeparatedValues(rootNode, ignoreEquals) {
440
+ while (this.activeToken && getBinaryOperator(this.activeToken.value)) {
441
+ if (this.activeToken.isEqualSign() && ignoreEquals)
442
+ break;
443
+ const operator = this.parseBinaryOperator();
444
+ if (!operator)
445
+ return null;
446
+ operator.left = rootNode;
447
+ operator.right = this.parseValue();
448
+ rootNode = operator;
449
+ }
450
+ return rootNode;
451
+ }
452
+ parseBinaryOperator() {
453
+ if (!this.activeToken)
454
+ return null;
455
+ const binaryOperator = {
456
+ kind: SyntaxKind.BINARY_OPERATOR,
457
+ operator: [this.activeToken],
458
+ };
459
+ if (!this.next(true))
460
+ return binaryOperator;
461
+ let operator;
462
+ do {
463
+ operator = getBinaryOperator(this.activeToken.value);
464
+ if (!operator)
465
+ break;
466
+ if (operator) {
467
+ const not = operator.value === OPERATOR_VALUE.NOT_LITERAL
468
+ || operator.value === OPERATOR_VALUE.APOSTROPHE;
469
+ if (not && binaryOperator.operator.length)
470
+ break;
471
+ }
472
+ binaryOperator.operator.push(this.activeToken);
473
+ this.next(true);
474
+ } while (operator && operator.appendable);
475
+ return binaryOperator;
476
+ }
477
+ parseUnaryOperator(includeRet) {
478
+ if (!this.activeToken)
479
+ return [];
480
+ const leftOperator = [];
481
+ let unaryOperator = getUnaryOperator(this.activeToken.value, includeRet);
482
+ if (unaryOperator) {
483
+ leftOperator.push(this.activeToken);
484
+ this.next(true);
485
+ while (unaryOperator && unaryOperator.appendable) {
486
+ unaryOperator = getUnaryOperator(this.activeToken.value);
487
+ if (unaryOperator) {
488
+ leftOperator.push(this.activeToken);
489
+ this.next(true);
490
+ }
491
+ }
492
+ }
493
+ return leftOperator;
494
+ }
495
+ parseValue(tree, includeRet) {
496
+ let value;
497
+ if (!this.activeToken || this.activeToken.isWhiteSpace()) {
498
+ if (tree)
499
+ return tree;
500
+ else
501
+ return null;
502
+ }
503
+ const unaryOperator = this.parseUnaryOperator(includeRet);
504
+ if (!this.activeToken) {
505
+ return {
506
+ id: new Token(-1 /* Type.Undefined */, "", { character: 0, line: 0 }),
507
+ kind: SyntaxKind.IDENTIFIER,
508
+ unaryOperator,
509
+ };
510
+ }
511
+ if (this.activeToken.type === 1 /* Type.Alphanumeric */) {
512
+ value = this.parseIdentifier();
513
+ if (!value)
514
+ return null;
515
+ if (unaryOperator.length)
516
+ value.unaryOperator = unaryOperator;
517
+ }
518
+ else if (this.activeToken.type === 9 /* Type.DoubleQuotes */) {
519
+ value = this.parseStringLiteral();
520
+ if (!value)
521
+ return null;
522
+ if (unaryOperator.length)
523
+ value.unaryOperator = unaryOperator;
524
+ }
525
+ else if (this.activeToken.type === 2 /* Type.Numeric */) {
526
+ value = {
527
+ id: this.activeToken,
528
+ kind: SyntaxKind.NUMERIC_LITERAL
529
+ };
530
+ if (unaryOperator.length)
531
+ value.unaryOperator = unaryOperator;
532
+ this.next(true);
533
+ }
534
+ else if (this.activeToken.type === 40 /* Type.OpenParen */) {
535
+ this.next(true);
536
+ value = this.parseExpression();
537
+ this.next(true);
538
+ }
539
+ if (tree && value) {
540
+ tree.right = value;
541
+ value = tree;
542
+ }
543
+ if (this.activeToken && (this.activeToken.type === 46 /* Type.Period */ ||
544
+ this.activeToken.type === 94 /* Type.Caret */)) {
545
+ const operator = {
546
+ kind: SyntaxKind.BINARY_OPERATOR,
547
+ left: value,
548
+ operator: [this.activeToken],
549
+ };
550
+ this.next();
551
+ return this.parseValue(operator);
552
+ }
553
+ if (value && this.activeToken && this.activeToken.isWhiteSpace())
554
+ this.next(true);
555
+ return value;
556
+ }
557
+ parseIdentifier() {
558
+ if (!this.activeToken)
559
+ return null;
560
+ const id = this.activeToken;
561
+ if (this.next() && this.activeToken.isOpenParen()) {
562
+ const openParen = this.activeToken;
563
+ if (this.next(true)) {
564
+ const args = this.parseArgs();
565
+ if (this.activeToken.isCloseParen()) {
566
+ const closeParen = this.activeToken;
567
+ this.next();
568
+ return {
569
+ id,
570
+ kind: SyntaxKind.IDENTIFIER,
571
+ args,
572
+ openParen,
573
+ closeParen
574
+ };
575
+ }
576
+ }
577
+ }
578
+ return { id, kind: SyntaxKind.IDENTIFIER };
579
+ }
580
+ parseStringLiteral() {
581
+ if (!this.activeToken)
582
+ return null;
583
+ const openQuote = this.activeToken;
584
+ this.next();
585
+ const id = this.activeToken;
586
+ if (!id || !this.next())
587
+ return null;
588
+ if (this.activeToken.isDoubleQuotes()) {
589
+ const closeQuote = this.activeToken;
590
+ this.next(true);
591
+ return { id, kind: SyntaxKind.STRING_LITERAL, openQuote, closeQuote };
592
+ }
593
+ return null;
594
+ }
595
+ parseArgs() {
596
+ return this.loadCommaSeparated(() => this.parseExpression(false, true));
597
+ }
598
+ loadCommaSeparated(getArg) {
599
+ const args = [];
600
+ do {
601
+ if (!this.activeToken)
602
+ break;
603
+ if (this.activeToken.isWhiteSpace()) {
604
+ if (!this.next(true))
605
+ break;
606
+ }
607
+ if (this.activeToken.isComma()) {
608
+ args.push(undefined); // desired behavior?
609
+ continue;
610
+ }
611
+ const arg = getArg();
612
+ if (arg && !Array.isArray(arg))
613
+ args.push(arg);
614
+ else if (arg)
615
+ args.push(...arg);
616
+ else if (!arg && args.length > 0)
617
+ args.push(undefined);
618
+ else
619
+ break;
620
+ if (!this.activeToken)
621
+ break;
622
+ } while (this.activeToken.isComma() && this.next(true));
623
+ return args;
624
+ }
625
+ next(skipSpaceOrTab) {
626
+ if (this.activeToken)
627
+ this.previousToken = this.activeToken;
628
+ do {
629
+ this.activeToken = this.tokenizer.next().value;
630
+ if (this.activeToken)
631
+ this.tokens.push(this.activeToken);
632
+ } while (skipSpaceOrTab &&
633
+ this.activeToken &&
634
+ (this.activeToken.isSpace() || this.activeToken.isTab()));
635
+ return this.activeToken !== undefined;
636
+ }
637
+ }
638
+ function getBinaryOperator(tokenValue) {
639
+ return BINARY_OPERATORS.find(o => o.value === tokenValue) || null;
640
+ }
641
+ function getUnaryOperator(tokenValue, includeRet) {
642
+ const operator = UNARY_OPERATORS.find(o => o.value === tokenValue);
643
+ if (!operator)
644
+ return null;
645
+ if (operator.value === OPERATOR_VALUE.RET && !includeRet)
646
+ return null;
647
+ return operator;
648
+ }
649
+ export function forEachChild(node, f) {
650
+ let goDeeper = false;
651
+ if (!node)
652
+ return;
653
+ switch (node.kind) {
654
+ case SyntaxKind.DO_STATEMENT:
655
+ case SyntaxKind.IF_STATEMENT:
656
+ case SyntaxKind.QUIT_STATEMENT:
657
+ case SyntaxKind.RETURN_STATEMENT:
658
+ case SyntaxKind.SET_STATEMENT:
659
+ case SyntaxKind.WHILE_STATEMENT:
660
+ case SyntaxKind.FOR_STATEMENT:
661
+ case SyntaxKind.CATCH_STATEMENT:
662
+ case SyntaxKind.TYPE_STATEMENT:
663
+ goDeeper = f(node);
664
+ if (!goDeeper)
665
+ return;
666
+ const statement = node;
667
+ statement.expressions.forEach(expression => {
668
+ if (!expression)
669
+ return;
670
+ forEachChild(expression, f);
671
+ });
672
+ break;
673
+ case SyntaxKind.ASSIGNMENT:
674
+ case SyntaxKind.BINARY_OPERATOR:
675
+ goDeeper = f(node);
676
+ if (!goDeeper)
677
+ return;
678
+ const assignment = node;
679
+ const left = assignment.left;
680
+ if (left && left.kind === SyntaxKind.MULTIPLE_VARIABLE_SET) {
681
+ left.variables.forEach(n => {
682
+ forEachChild(n, f);
683
+ });
684
+ }
685
+ else if (left) {
686
+ forEachChild(left, f);
687
+ }
688
+ const right = assignment.right;
689
+ if (right) {
690
+ forEachChild(right, f);
691
+ }
692
+ break;
693
+ case SyntaxKind.POST_CONDITION:
694
+ goDeeper = f(node);
695
+ if (!goDeeper)
696
+ return;
697
+ const postCondition = node;
698
+ if (postCondition.condition)
699
+ forEachChild(postCondition.condition, f);
700
+ if (postCondition.expression) {
701
+ const expression = postCondition.expression;
702
+ if (Array.isArray(expression)) {
703
+ // TODO: (Mischa Reitsma) This should be fixed in the types. Seems like the MultiSet is part of the Expression union, which contains expressions, so this is either a bug or some code is ignoring the types or interfaces
704
+ expression.forEach(n => {
705
+ forEachChild(n, f);
706
+ });
707
+ }
708
+ else if (expression) {
709
+ forEachChild(expression, f);
710
+ }
711
+ }
712
+ break;
713
+ case SyntaxKind.IDENTIFIER:
714
+ case SyntaxKind.TYPE_IDENTIFIER:
715
+ goDeeper = f(node);
716
+ if (!goDeeper)
717
+ return;
718
+ const identifier = node;
719
+ if (identifier.args)
720
+ identifier.args.forEach(arg => forEachChild(arg, f));
721
+ break;
722
+ case SyntaxKind.VARIABLE_DECLARATION:
723
+ goDeeper = f(node);
724
+ if (!goDeeper)
725
+ return;
726
+ const declaration = node;
727
+ if (declaration.args)
728
+ declaration.args.forEach(arg => forEachChild(arg, f));
729
+ f(declaration.type);
730
+ break;
731
+ case SyntaxKind.NUMERIC_LITERAL:
732
+ case SyntaxKind.STRING_LITERAL:
733
+ f(node);
734
+ break;
735
+ default:
736
+ break;
737
+ }
738
+ }
739
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGVtZW50UGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3N0YXRlbWVudFBhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx5Q0FBeUM7QUFDekM7Ozs7RUFJRTtBQUNGLE9BQU8sRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFPLE1BQU0sYUFBYSxDQUFDO0FBRW5ELE1BQU0sQ0FBTixJQUFZLFVBbUJYO0FBbkJELFdBQVksVUFBVTtJQUNyQix1REFBVSxDQUFBO0lBQ1YsaUVBQWUsQ0FBQTtJQUNmLGlFQUFlLENBQUE7SUFDZiwyREFBWSxDQUFBO0lBQ1osNkRBQWEsQ0FBQTtJQUNiLHVEQUFVLENBQUE7SUFDViwyREFBWSxDQUFBO0lBQ1osaUVBQWUsQ0FBQTtJQUNmLCtEQUFjLENBQUE7SUFDZCwrREFBYyxDQUFBO0lBQ2Qsb0VBQWdCLENBQUE7SUFDaEIsOERBQWEsQ0FBQTtJQUNiLDhFQUFxQixDQUFBO0lBQ3JCLGdFQUFjLENBQUE7SUFDZCxrRUFBZSxDQUFBO0lBQ2YsZ0VBQWMsQ0FBQTtJQUNkLDRFQUFvQixDQUFBO0lBQ3BCLGtFQUFlLENBQUE7QUFDaEIsQ0FBQyxFQW5CVyxVQUFVLEtBQVYsVUFBVSxRQW1CckI7QUFFRCxJQUFLLGNBeUJKO0FBekJELFdBQUssY0FBYztJQUNsQixxQ0FBbUIsQ0FBQTtJQUNuQixrQ0FBZ0IsQ0FBQTtJQUNoQiwwQkFBUSxDQUFBO0lBQ1IsbUNBQWlCLENBQUE7SUFDakIsOEJBQVksQ0FBQTtJQUNaLDZCQUFXLENBQUE7SUFDWCw4QkFBWSxDQUFBO0lBQ1osMkJBQVMsQ0FBQTtJQUNULDZCQUFXLENBQUE7SUFDWCxtQ0FBaUIsQ0FBQTtJQUNqQixvQ0FBa0IsQ0FBQTtJQUNsQiw0QkFBVSxDQUFBO0lBQ1Ysb0NBQWtCLENBQUE7SUFDbEIsaUNBQWUsQ0FBQTtJQUNmLDZCQUFXLENBQUE7SUFDWCxxQ0FBbUIsQ0FBQTtJQUNuQixtQ0FBaUIsQ0FBQTtJQUNqQiw0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