@malloydata/malloy-tag 0.0.237-dev250225144145

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 (42) hide show
  1. package/README.md +0 -0
  2. package/dist/index.d.ts +2 -0
  3. package/dist/index.js +38 -0
  4. package/dist/index.js.map +1 -0
  5. package/dist/lib/Malloy/MalloyTagLexer.d.ts +42 -0
  6. package/dist/lib/Malloy/MalloyTagLexer.js +385 -0
  7. package/dist/lib/Malloy/MalloyTagLexer.js.map +1 -0
  8. package/dist/lib/Malloy/MalloyTagParser.d.ts +180 -0
  9. package/dist/lib/Malloy/MalloyTagParser.js +1051 -0
  10. package/dist/lib/Malloy/MalloyTagParser.js.map +1 -0
  11. package/dist/lib/Malloy/MalloyTagVisitor.d.ts +120 -0
  12. package/dist/lib/Malloy/MalloyTagVisitor.js +4 -0
  13. package/dist/lib/Malloy/MalloyTagVisitor.js.map +1 -0
  14. package/dist/tags.d.ts +90 -0
  15. package/dist/tags.js +654 -0
  16. package/dist/tags.js.map +1 -0
  17. package/dist/tags.spec.d.ts +8 -0
  18. package/dist/tags.spec.js +318 -0
  19. package/dist/tags.spec.js.map +1 -0
  20. package/dist/util.d.ts +11 -0
  21. package/dist/util.js +84 -0
  22. package/dist/util.js.map +1 -0
  23. package/dist/util.spec.d.ts +1 -0
  24. package/dist/util.spec.js +43 -0
  25. package/dist/util.spec.js.map +1 -0
  26. package/package.json +30 -0
  27. package/scripts/build_parser.js +98 -0
  28. package/src/MalloyTag.g4 +102 -0
  29. package/src/index.ts +8 -0
  30. package/src/lib/Malloy/MalloyTag.interp +61 -0
  31. package/src/lib/Malloy/MalloyTag.tokens +32 -0
  32. package/src/lib/Malloy/MalloyTagLexer.interp +85 -0
  33. package/src/lib/Malloy/MalloyTagLexer.tokens +32 -0
  34. package/src/lib/Malloy/MalloyTagLexer.ts +386 -0
  35. package/src/lib/Malloy/MalloyTagParser.ts +1048 -0
  36. package/src/lib/Malloy/MalloyTagVisitor.ts +141 -0
  37. package/src/lib/Malloy/_BUILD_DIGEST_ +1 -0
  38. package/src/tags.spec.ts +331 -0
  39. package/src/tags.ts +761 -0
  40. package/src/util.spec.ts +43 -0
  41. package/src/util.ts +73 -0
  42. package/tsconfig.json +11 -0
@@ -0,0 +1,1048 @@
1
+ // Generated from MalloyTag.g4 by ANTLR 4.9.0-SNAPSHOT
2
+
3
+
4
+ import { ATN } from "antlr4ts/atn/ATN";
5
+ import { ATNDeserializer } from "antlr4ts/atn/ATNDeserializer";
6
+ import { FailedPredicateException } from "antlr4ts/FailedPredicateException";
7
+ import { NotNull } from "antlr4ts/Decorators";
8
+ import { NoViableAltException } from "antlr4ts/NoViableAltException";
9
+ import { Override } from "antlr4ts/Decorators";
10
+ import { Parser } from "antlr4ts/Parser";
11
+ import { ParserRuleContext } from "antlr4ts/ParserRuleContext";
12
+ import { ParserATNSimulator } from "antlr4ts/atn/ParserATNSimulator";
13
+ import { ParseTreeListener } from "antlr4ts/tree/ParseTreeListener";
14
+ import { ParseTreeVisitor } from "antlr4ts/tree/ParseTreeVisitor";
15
+ import { RecognitionException } from "antlr4ts/RecognitionException";
16
+ import { RuleContext } from "antlr4ts/RuleContext";
17
+ //import { RuleVersion } from "antlr4ts/RuleVersion";
18
+ import { TerminalNode } from "antlr4ts/tree/TerminalNode";
19
+ import { Token } from "antlr4ts/Token";
20
+ import { TokenStream } from "antlr4ts/TokenStream";
21
+ import { Vocabulary } from "antlr4ts/Vocabulary";
22
+ import { VocabularyImpl } from "antlr4ts/VocabularyImpl";
23
+
24
+ import * as Utils from "antlr4ts/misc/Utils";
25
+
26
+ import { MalloyTagVisitor } from "./MalloyTagVisitor";
27
+
28
+
29
+ export class MalloyTagParser extends Parser {
30
+ public static readonly MINUS_DOTTY = 1;
31
+ public static readonly DOTTY = 2;
32
+ public static readonly DOT = 3;
33
+ public static readonly MINUS = 4;
34
+ public static readonly EQ = 5;
35
+ public static readonly RF_BEG = 6;
36
+ public static readonly RF_END = 7;
37
+ public static readonly PR_BEG = 8;
38
+ public static readonly PR_END = 9;
39
+ public static readonly AR_BEG = 10;
40
+ public static readonly COMMA = 11;
41
+ public static readonly AR_END = 12;
42
+ public static readonly SQ_STRING = 13;
43
+ public static readonly DQ_STRING = 14;
44
+ public static readonly BQ_STRING = 15;
45
+ public static readonly NUMERIC_LITERAL = 16;
46
+ public static readonly BARE_STRING = 17;
47
+ public static readonly COMMENT = 18;
48
+ public static readonly WHITE_SPACE = 19;
49
+ public static readonly UNEXPECTED_CHAR = 20;
50
+ public static readonly RULE_tagLine = 0;
51
+ public static readonly RULE_tagSpec = 1;
52
+ public static readonly RULE_string = 2;
53
+ public static readonly RULE_identifier = 3;
54
+ public static readonly RULE_propName = 4;
55
+ public static readonly RULE_eqValue = 5;
56
+ public static readonly RULE_arrayElement = 6;
57
+ public static readonly RULE_reference = 7;
58
+ public static readonly RULE_arrayValue = 8;
59
+ public static readonly RULE_properties = 9;
60
+ // tslint:disable:no-trailing-whitespace
61
+ public static readonly ruleNames: string[] = [
62
+ "tagLine", "tagSpec", "string", "identifier", "propName", "eqValue", "arrayElement",
63
+ "reference", "arrayValue", "properties",
64
+ ];
65
+
66
+ private static readonly _LITERAL_NAMES: Array<string | undefined> = [
67
+ undefined, "'-...'", "'...'", "'.'", "'-'", "'='", "'$('", "')'", "'{'",
68
+ "'}'", "'['", "','", "']'",
69
+ ];
70
+ private static readonly _SYMBOLIC_NAMES: Array<string | undefined> = [
71
+ undefined, "MINUS_DOTTY", "DOTTY", "DOT", "MINUS", "EQ", "RF_BEG", "RF_END",
72
+ "PR_BEG", "PR_END", "AR_BEG", "COMMA", "AR_END", "SQ_STRING", "DQ_STRING",
73
+ "BQ_STRING", "NUMERIC_LITERAL", "BARE_STRING", "COMMENT", "WHITE_SPACE",
74
+ "UNEXPECTED_CHAR",
75
+ ];
76
+ public static readonly VOCABULARY: Vocabulary = new VocabularyImpl(MalloyTagParser._LITERAL_NAMES, MalloyTagParser._SYMBOLIC_NAMES, []);
77
+
78
+ // @Override
79
+ // @NotNull
80
+ public get vocabulary(): Vocabulary {
81
+ return MalloyTagParser.VOCABULARY;
82
+ }
83
+ // tslint:enable:no-trailing-whitespace
84
+
85
+ // @Override
86
+ public get grammarFileName(): string { return "MalloyTag.g4"; }
87
+
88
+ // @Override
89
+ public get ruleNames(): string[] { return MalloyTagParser.ruleNames; }
90
+
91
+ // @Override
92
+ public get serializedATN(): string { return MalloyTagParser._serializedATN; }
93
+
94
+ protected createFailedPredicateException(predicate?: string, message?: string): FailedPredicateException {
95
+ return new FailedPredicateException(this, predicate, message);
96
+ }
97
+
98
+ constructor(input: TokenStream) {
99
+ super(input);
100
+ this._interp = new ParserATNSimulator(MalloyTagParser._ATN, this);
101
+ }
102
+ // @RuleVersion(0)
103
+ public tagLine(): TagLineContext {
104
+ let _localctx: TagLineContext = new TagLineContext(this._ctx, this.state);
105
+ this.enterRule(_localctx, 0, MalloyTagParser.RULE_tagLine);
106
+ let _la: number;
107
+ try {
108
+ this.enterOuterAlt(_localctx, 1);
109
+ {
110
+ this.state = 23;
111
+ this._errHandler.sync(this);
112
+ _la = this._input.LA(1);
113
+ while ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << MalloyTagParser.MINUS_DOTTY) | (1 << MalloyTagParser.MINUS) | (1 << MalloyTagParser.BQ_STRING) | (1 << MalloyTagParser.BARE_STRING))) !== 0)) {
114
+ {
115
+ {
116
+ this.state = 20;
117
+ this.tagSpec();
118
+ }
119
+ }
120
+ this.state = 25;
121
+ this._errHandler.sync(this);
122
+ _la = this._input.LA(1);
123
+ }
124
+ this.state = 26;
125
+ this.match(MalloyTagParser.EOF);
126
+ }
127
+ }
128
+ catch (re) {
129
+ if (re instanceof RecognitionException) {
130
+ _localctx.exception = re;
131
+ this._errHandler.reportError(this, re);
132
+ this._errHandler.recover(this, re);
133
+ } else {
134
+ throw re;
135
+ }
136
+ }
137
+ finally {
138
+ this.exitRule();
139
+ }
140
+ return _localctx;
141
+ }
142
+ // @RuleVersion(0)
143
+ public tagSpec(): TagSpecContext {
144
+ let _localctx: TagSpecContext = new TagSpecContext(this._ctx, this.state);
145
+ this.enterRule(_localctx, 2, MalloyTagParser.RULE_tagSpec);
146
+ let _la: number;
147
+ try {
148
+ this.state = 49;
149
+ this._errHandler.sync(this);
150
+ switch ( this.interpreter.adaptivePredict(this._input, 4, this._ctx) ) {
151
+ case 1:
152
+ _localctx = new TagEqContext(_localctx);
153
+ this.enterOuterAlt(_localctx, 1);
154
+ {
155
+ this.state = 28;
156
+ this.propName();
157
+ this.state = 29;
158
+ this.match(MalloyTagParser.EQ);
159
+ this.state = 30;
160
+ this.eqValue();
161
+ this.state = 32;
162
+ this._errHandler.sync(this);
163
+ _la = this._input.LA(1);
164
+ if (_la === MalloyTagParser.PR_BEG) {
165
+ {
166
+ this.state = 31;
167
+ this.properties();
168
+ }
169
+ }
170
+
171
+ }
172
+ break;
173
+
174
+ case 2:
175
+ _localctx = new TagReplacePropertiesContext(_localctx);
176
+ this.enterOuterAlt(_localctx, 2);
177
+ {
178
+ this.state = 34;
179
+ this.propName();
180
+ this.state = 35;
181
+ this.match(MalloyTagParser.EQ);
182
+ this.state = 37;
183
+ this._errHandler.sync(this);
184
+ _la = this._input.LA(1);
185
+ if (_la === MalloyTagParser.DOTTY) {
186
+ {
187
+ this.state = 36;
188
+ this.match(MalloyTagParser.DOTTY);
189
+ }
190
+ }
191
+
192
+ this.state = 39;
193
+ this.properties();
194
+ }
195
+ break;
196
+
197
+ case 3:
198
+ _localctx = new TagUpdatePropertiesContext(_localctx);
199
+ this.enterOuterAlt(_localctx, 3);
200
+ {
201
+ this.state = 41;
202
+ this.propName();
203
+ this.state = 42;
204
+ this.properties();
205
+ }
206
+ break;
207
+
208
+ case 4:
209
+ _localctx = new TagDefContext(_localctx);
210
+ this.enterOuterAlt(_localctx, 4);
211
+ {
212
+ this.state = 45;
213
+ this._errHandler.sync(this);
214
+ _la = this._input.LA(1);
215
+ if (_la === MalloyTagParser.MINUS) {
216
+ {
217
+ this.state = 44;
218
+ this.match(MalloyTagParser.MINUS);
219
+ }
220
+ }
221
+
222
+ this.state = 47;
223
+ this.propName();
224
+ }
225
+ break;
226
+
227
+ case 5:
228
+ _localctx = new TagEmptyContext(_localctx);
229
+ this.enterOuterAlt(_localctx, 5);
230
+ {
231
+ this.state = 48;
232
+ this.match(MalloyTagParser.MINUS_DOTTY);
233
+ }
234
+ break;
235
+ }
236
+ }
237
+ catch (re) {
238
+ if (re instanceof RecognitionException) {
239
+ _localctx.exception = re;
240
+ this._errHandler.reportError(this, re);
241
+ this._errHandler.recover(this, re);
242
+ } else {
243
+ throw re;
244
+ }
245
+ }
246
+ finally {
247
+ this.exitRule();
248
+ }
249
+ return _localctx;
250
+ }
251
+ // @RuleVersion(0)
252
+ public string(): StringContext {
253
+ let _localctx: StringContext = new StringContext(this._ctx, this.state);
254
+ this.enterRule(_localctx, 4, MalloyTagParser.RULE_string);
255
+ let _la: number;
256
+ try {
257
+ this.enterOuterAlt(_localctx, 1);
258
+ {
259
+ this.state = 51;
260
+ _la = this._input.LA(1);
261
+ if (!((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << MalloyTagParser.SQ_STRING) | (1 << MalloyTagParser.DQ_STRING) | (1 << MalloyTagParser.NUMERIC_LITERAL) | (1 << MalloyTagParser.BARE_STRING))) !== 0))) {
262
+ this._errHandler.recoverInline(this);
263
+ } else {
264
+ if (this._input.LA(1) === Token.EOF) {
265
+ this.matchedEOF = true;
266
+ }
267
+
268
+ this._errHandler.reportMatch(this);
269
+ this.consume();
270
+ }
271
+ }
272
+ }
273
+ catch (re) {
274
+ if (re instanceof RecognitionException) {
275
+ _localctx.exception = re;
276
+ this._errHandler.reportError(this, re);
277
+ this._errHandler.recover(this, re);
278
+ } else {
279
+ throw re;
280
+ }
281
+ }
282
+ finally {
283
+ this.exitRule();
284
+ }
285
+ return _localctx;
286
+ }
287
+ // @RuleVersion(0)
288
+ public identifier(): IdentifierContext {
289
+ let _localctx: IdentifierContext = new IdentifierContext(this._ctx, this.state);
290
+ this.enterRule(_localctx, 6, MalloyTagParser.RULE_identifier);
291
+ let _la: number;
292
+ try {
293
+ this.enterOuterAlt(_localctx, 1);
294
+ {
295
+ this.state = 53;
296
+ _la = this._input.LA(1);
297
+ if (!(_la === MalloyTagParser.BQ_STRING || _la === MalloyTagParser.BARE_STRING)) {
298
+ this._errHandler.recoverInline(this);
299
+ } else {
300
+ if (this._input.LA(1) === Token.EOF) {
301
+ this.matchedEOF = true;
302
+ }
303
+
304
+ this._errHandler.reportMatch(this);
305
+ this.consume();
306
+ }
307
+ }
308
+ }
309
+ catch (re) {
310
+ if (re instanceof RecognitionException) {
311
+ _localctx.exception = re;
312
+ this._errHandler.reportError(this, re);
313
+ this._errHandler.recover(this, re);
314
+ } else {
315
+ throw re;
316
+ }
317
+ }
318
+ finally {
319
+ this.exitRule();
320
+ }
321
+ return _localctx;
322
+ }
323
+ // @RuleVersion(0)
324
+ public propName(): PropNameContext {
325
+ let _localctx: PropNameContext = new PropNameContext(this._ctx, this.state);
326
+ this.enterRule(_localctx, 8, MalloyTagParser.RULE_propName);
327
+ let _la: number;
328
+ try {
329
+ this.enterOuterAlt(_localctx, 1);
330
+ {
331
+ this.state = 55;
332
+ this.identifier();
333
+ this.state = 60;
334
+ this._errHandler.sync(this);
335
+ _la = this._input.LA(1);
336
+ while (_la === MalloyTagParser.DOT) {
337
+ {
338
+ {
339
+ this.state = 56;
340
+ this.match(MalloyTagParser.DOT);
341
+ this.state = 57;
342
+ this.identifier();
343
+ }
344
+ }
345
+ this.state = 62;
346
+ this._errHandler.sync(this);
347
+ _la = this._input.LA(1);
348
+ }
349
+ }
350
+ }
351
+ catch (re) {
352
+ if (re instanceof RecognitionException) {
353
+ _localctx.exception = re;
354
+ this._errHandler.reportError(this, re);
355
+ this._errHandler.recover(this, re);
356
+ } else {
357
+ throw re;
358
+ }
359
+ }
360
+ finally {
361
+ this.exitRule();
362
+ }
363
+ return _localctx;
364
+ }
365
+ // @RuleVersion(0)
366
+ public eqValue(): EqValueContext {
367
+ let _localctx: EqValueContext = new EqValueContext(this._ctx, this.state);
368
+ this.enterRule(_localctx, 10, MalloyTagParser.RULE_eqValue);
369
+ try {
370
+ this.state = 66;
371
+ this._errHandler.sync(this);
372
+ switch (this._input.LA(1)) {
373
+ case MalloyTagParser.SQ_STRING:
374
+ case MalloyTagParser.DQ_STRING:
375
+ case MalloyTagParser.NUMERIC_LITERAL:
376
+ case MalloyTagParser.BARE_STRING:
377
+ this.enterOuterAlt(_localctx, 1);
378
+ {
379
+ this.state = 63;
380
+ this.string();
381
+ }
382
+ break;
383
+ case MalloyTagParser.AR_BEG:
384
+ this.enterOuterAlt(_localctx, 2);
385
+ {
386
+ this.state = 64;
387
+ this.arrayValue();
388
+ }
389
+ break;
390
+ case MalloyTagParser.RF_BEG:
391
+ this.enterOuterAlt(_localctx, 3);
392
+ {
393
+ this.state = 65;
394
+ this.reference();
395
+ }
396
+ break;
397
+ default:
398
+ throw new NoViableAltException(this);
399
+ }
400
+ }
401
+ catch (re) {
402
+ if (re instanceof RecognitionException) {
403
+ _localctx.exception = re;
404
+ this._errHandler.reportError(this, re);
405
+ this._errHandler.recover(this, re);
406
+ } else {
407
+ throw re;
408
+ }
409
+ }
410
+ finally {
411
+ this.exitRule();
412
+ }
413
+ return _localctx;
414
+ }
415
+ // @RuleVersion(0)
416
+ public arrayElement(): ArrayElementContext {
417
+ let _localctx: ArrayElementContext = new ArrayElementContext(this._ctx, this.state);
418
+ this.enterRule(_localctx, 12, MalloyTagParser.RULE_arrayElement);
419
+ let _la: number;
420
+ try {
421
+ this.state = 75;
422
+ this._errHandler.sync(this);
423
+ switch (this._input.LA(1)) {
424
+ case MalloyTagParser.SQ_STRING:
425
+ case MalloyTagParser.DQ_STRING:
426
+ case MalloyTagParser.NUMERIC_LITERAL:
427
+ case MalloyTagParser.BARE_STRING:
428
+ this.enterOuterAlt(_localctx, 1);
429
+ {
430
+ this.state = 68;
431
+ this.string();
432
+ this.state = 70;
433
+ this._errHandler.sync(this);
434
+ _la = this._input.LA(1);
435
+ if (_la === MalloyTagParser.PR_BEG) {
436
+ {
437
+ this.state = 69;
438
+ this.properties();
439
+ }
440
+ }
441
+
442
+ }
443
+ break;
444
+ case MalloyTagParser.PR_BEG:
445
+ this.enterOuterAlt(_localctx, 2);
446
+ {
447
+ this.state = 72;
448
+ this.properties();
449
+ }
450
+ break;
451
+ case MalloyTagParser.AR_BEG:
452
+ this.enterOuterAlt(_localctx, 3);
453
+ {
454
+ this.state = 73;
455
+ this.arrayValue();
456
+ }
457
+ break;
458
+ case MalloyTagParser.RF_BEG:
459
+ this.enterOuterAlt(_localctx, 4);
460
+ {
461
+ this.state = 74;
462
+ this.reference();
463
+ }
464
+ break;
465
+ default:
466
+ throw new NoViableAltException(this);
467
+ }
468
+ }
469
+ catch (re) {
470
+ if (re instanceof RecognitionException) {
471
+ _localctx.exception = re;
472
+ this._errHandler.reportError(this, re);
473
+ this._errHandler.recover(this, re);
474
+ } else {
475
+ throw re;
476
+ }
477
+ }
478
+ finally {
479
+ this.exitRule();
480
+ }
481
+ return _localctx;
482
+ }
483
+ // @RuleVersion(0)
484
+ public reference(): ReferenceContext {
485
+ let _localctx: ReferenceContext = new ReferenceContext(this._ctx, this.state);
486
+ this.enterRule(_localctx, 14, MalloyTagParser.RULE_reference);
487
+ try {
488
+ this.enterOuterAlt(_localctx, 1);
489
+ {
490
+ this.state = 77;
491
+ this.match(MalloyTagParser.RF_BEG);
492
+ this.state = 78;
493
+ this.propName();
494
+ this.state = 79;
495
+ this.match(MalloyTagParser.RF_END);
496
+ }
497
+ }
498
+ catch (re) {
499
+ if (re instanceof RecognitionException) {
500
+ _localctx.exception = re;
501
+ this._errHandler.reportError(this, re);
502
+ this._errHandler.recover(this, re);
503
+ } else {
504
+ throw re;
505
+ }
506
+ }
507
+ finally {
508
+ this.exitRule();
509
+ }
510
+ return _localctx;
511
+ }
512
+ // @RuleVersion(0)
513
+ public arrayValue(): ArrayValueContext {
514
+ let _localctx: ArrayValueContext = new ArrayValueContext(this._ctx, this.state);
515
+ this.enterRule(_localctx, 16, MalloyTagParser.RULE_arrayValue);
516
+ let _la: number;
517
+ try {
518
+ let _alt: number;
519
+ this.enterOuterAlt(_localctx, 1);
520
+ {
521
+ this.state = 81;
522
+ this.match(MalloyTagParser.AR_BEG);
523
+ this.state = 82;
524
+ this.arrayElement();
525
+ this.state = 87;
526
+ this._errHandler.sync(this);
527
+ _alt = this.interpreter.adaptivePredict(this._input, 9, this._ctx);
528
+ while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) {
529
+ if (_alt === 1) {
530
+ {
531
+ {
532
+ this.state = 83;
533
+ this.match(MalloyTagParser.COMMA);
534
+ this.state = 84;
535
+ this.arrayElement();
536
+ }
537
+ }
538
+ }
539
+ this.state = 89;
540
+ this._errHandler.sync(this);
541
+ _alt = this.interpreter.adaptivePredict(this._input, 9, this._ctx);
542
+ }
543
+ this.state = 91;
544
+ this._errHandler.sync(this);
545
+ _la = this._input.LA(1);
546
+ if (_la === MalloyTagParser.COMMA) {
547
+ {
548
+ this.state = 90;
549
+ this.match(MalloyTagParser.COMMA);
550
+ }
551
+ }
552
+
553
+ this.state = 93;
554
+ this.match(MalloyTagParser.AR_END);
555
+ }
556
+ }
557
+ catch (re) {
558
+ if (re instanceof RecognitionException) {
559
+ _localctx.exception = re;
560
+ this._errHandler.reportError(this, re);
561
+ this._errHandler.recover(this, re);
562
+ } else {
563
+ throw re;
564
+ }
565
+ }
566
+ finally {
567
+ this.exitRule();
568
+ }
569
+ return _localctx;
570
+ }
571
+ // @RuleVersion(0)
572
+ public properties(): PropertiesContext {
573
+ let _localctx: PropertiesContext = new PropertiesContext(this._ctx, this.state);
574
+ this.enterRule(_localctx, 18, MalloyTagParser.RULE_properties);
575
+ let _la: number;
576
+ try {
577
+ this.enterOuterAlt(_localctx, 1);
578
+ {
579
+ this.state = 95;
580
+ this.match(MalloyTagParser.PR_BEG);
581
+ this.state = 103;
582
+ this._errHandler.sync(this);
583
+ switch (this._input.LA(1)) {
584
+ case MalloyTagParser.DOTTY:
585
+ {
586
+ this.state = 96;
587
+ this.match(MalloyTagParser.DOTTY);
588
+ }
589
+ break;
590
+ case MalloyTagParser.MINUS_DOTTY:
591
+ case MalloyTagParser.MINUS:
592
+ case MalloyTagParser.PR_END:
593
+ case MalloyTagParser.BQ_STRING:
594
+ case MalloyTagParser.BARE_STRING:
595
+ {
596
+ {
597
+ this.state = 100;
598
+ this._errHandler.sync(this);
599
+ _la = this._input.LA(1);
600
+ while ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << MalloyTagParser.MINUS_DOTTY) | (1 << MalloyTagParser.MINUS) | (1 << MalloyTagParser.BQ_STRING) | (1 << MalloyTagParser.BARE_STRING))) !== 0)) {
601
+ {
602
+ {
603
+ this.state = 97;
604
+ this.tagSpec();
605
+ }
606
+ }
607
+ this.state = 102;
608
+ this._errHandler.sync(this);
609
+ _la = this._input.LA(1);
610
+ }
611
+ }
612
+ }
613
+ break;
614
+ default:
615
+ throw new NoViableAltException(this);
616
+ }
617
+ this.state = 105;
618
+ this.match(MalloyTagParser.PR_END);
619
+ }
620
+ }
621
+ catch (re) {
622
+ if (re instanceof RecognitionException) {
623
+ _localctx.exception = re;
624
+ this._errHandler.reportError(this, re);
625
+ this._errHandler.recover(this, re);
626
+ } else {
627
+ throw re;
628
+ }
629
+ }
630
+ finally {
631
+ this.exitRule();
632
+ }
633
+ return _localctx;
634
+ }
635
+
636
+ public static readonly _serializedATN: string =
637
+ "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x03\x16n\x04\x02" +
638
+ "\t\x02\x04\x03\t\x03\x04\x04\t\x04\x04\x05\t\x05\x04\x06\t\x06\x04\x07" +
639
+ "\t\x07\x04\b\t\b\x04\t\t\t\x04\n\t\n\x04\v\t\v\x03\x02\x07\x02\x18\n\x02" +
640
+ "\f\x02\x0E\x02\x1B\v\x02\x03\x02\x03\x02\x03\x03\x03\x03\x03\x03\x03\x03" +
641
+ "\x05\x03#\n\x03\x03\x03\x03\x03\x03\x03\x05\x03(\n\x03\x03\x03\x03\x03" +
642
+ "\x03\x03\x03\x03\x03\x03\x03\x03\x05\x030\n\x03\x03\x03\x03\x03\x05\x03" +
643
+ "4\n\x03\x03\x04\x03\x04\x03\x05\x03\x05\x03\x06\x03\x06\x03\x06\x07\x06" +
644
+ "=\n\x06\f\x06\x0E\x06@\v\x06\x03\x07\x03\x07\x03\x07\x05\x07E\n\x07\x03" +
645
+ "\b\x03\b\x05\bI\n\b\x03\b\x03\b\x03\b\x05\bN\n\b\x03\t\x03\t\x03\t\x03" +
646
+ "\t\x03\n\x03\n\x03\n\x03\n\x07\nX\n\n\f\n\x0E\n[\v\n\x03\n\x05\n^\n\n" +
647
+ "\x03\n\x03\n\x03\v\x03\v\x03\v\x07\ve\n\v\f\v\x0E\vh\v\v\x05\vj\n\v\x03" +
648
+ "\v\x03\v\x03\v\x02\x02\x02\f\x02\x02\x04\x02\x06\x02\b\x02\n\x02\f\x02" +
649
+ "\x0E\x02\x10\x02\x12\x02\x14\x02\x02\x04\x04\x02\x0F\x10\x12\x13\x04\x02" +
650
+ "\x11\x11\x13\x13\x02v\x02\x19\x03\x02\x02\x02\x043\x03\x02\x02\x02\x06" +
651
+ "5\x03\x02\x02\x02\b7\x03\x02\x02\x02\n9\x03\x02\x02\x02\fD\x03\x02\x02" +
652
+ "\x02\x0EM\x03\x02\x02\x02\x10O\x03\x02\x02\x02\x12S\x03\x02\x02\x02\x14" +
653
+ "a\x03\x02\x02\x02\x16\x18\x05\x04\x03\x02\x17\x16\x03\x02\x02\x02\x18" +
654
+ "\x1B\x03\x02\x02\x02\x19\x17\x03\x02\x02\x02\x19\x1A\x03\x02\x02\x02\x1A" +
655
+ "\x1C\x03\x02\x02\x02\x1B\x19\x03\x02\x02\x02\x1C\x1D\x07\x02\x02\x03\x1D" +
656
+ "\x03\x03\x02\x02\x02\x1E\x1F\x05\n\x06\x02\x1F \x07\x07\x02\x02 \"\x05" +
657
+ "\f\x07\x02!#\x05\x14\v\x02\"!\x03\x02\x02\x02\"#\x03\x02\x02\x02#4\x03" +
658
+ "\x02\x02\x02$%\x05\n\x06\x02%\'\x07\x07\x02\x02&(\x07\x04\x02\x02\'&\x03" +
659
+ "\x02\x02\x02\'(\x03\x02\x02\x02()\x03\x02\x02\x02)*\x05\x14\v\x02*4\x03" +
660
+ "\x02\x02\x02+,\x05\n\x06\x02,-\x05\x14\v\x02-4\x03\x02\x02\x02.0\x07\x06" +
661
+ "\x02\x02/.\x03\x02\x02\x02/0\x03\x02\x02\x0201\x03\x02\x02\x0214\x05\n" +
662
+ "\x06\x0224\x07\x03\x02\x023\x1E\x03\x02\x02\x023$\x03\x02\x02\x023+\x03" +
663
+ "\x02\x02\x023/\x03\x02\x02\x0232\x03\x02\x02\x024\x05\x03\x02\x02\x02" +
664
+ "56\t\x02\x02\x026\x07\x03\x02\x02\x0278\t\x03\x02\x028\t\x03\x02\x02\x02" +
665
+ "9>\x05\b\x05\x02:;\x07\x05\x02\x02;=\x05\b\x05\x02<:\x03\x02\x02\x02=" +
666
+ "@\x03\x02\x02\x02><\x03\x02\x02\x02>?\x03\x02\x02\x02?\v\x03\x02\x02\x02" +
667
+ "@>\x03\x02\x02\x02AE\x05\x06\x04\x02BE\x05\x12\n\x02CE\x05\x10\t\x02D" +
668
+ "A\x03\x02\x02\x02DB\x03\x02\x02\x02DC\x03\x02\x02\x02E\r\x03\x02\x02\x02" +
669
+ "FH\x05\x06\x04\x02GI\x05\x14\v\x02HG\x03\x02\x02\x02HI\x03\x02\x02\x02" +
670
+ "IN\x03\x02\x02\x02JN\x05\x14\v\x02KN\x05\x12\n\x02LN\x05\x10\t\x02MF\x03" +
671
+ "\x02\x02\x02MJ\x03\x02\x02\x02MK\x03\x02\x02\x02ML\x03\x02\x02\x02N\x0F" +
672
+ "\x03\x02\x02\x02OP\x07\b\x02\x02PQ\x05\n\x06\x02QR\x07\t\x02\x02R\x11" +
673
+ "\x03\x02\x02\x02ST\x07\f\x02\x02TY\x05\x0E\b\x02UV\x07\r\x02\x02VX\x05" +
674
+ "\x0E\b\x02WU\x03\x02\x02\x02X[\x03\x02\x02\x02YW\x03\x02\x02\x02YZ\x03" +
675
+ "\x02\x02\x02Z]\x03\x02\x02\x02[Y\x03\x02\x02\x02\\^\x07\r\x02\x02]\\\x03" +
676
+ "\x02\x02\x02]^\x03\x02\x02\x02^_\x03\x02\x02\x02_`\x07\x0E\x02\x02`\x13" +
677
+ "\x03\x02\x02\x02ai\x07\n\x02\x02bj\x07\x04\x02\x02ce\x05\x04\x03\x02d" +
678
+ "c\x03\x02\x02\x02eh\x03\x02\x02\x02fd\x03\x02\x02\x02fg\x03\x02\x02\x02" +
679
+ "gj\x03\x02\x02\x02hf\x03\x02\x02\x02ib\x03\x02\x02\x02if\x03\x02\x02\x02" +
680
+ "jk\x03\x02\x02\x02kl\x07\v\x02\x02l\x15\x03\x02\x02\x02\x0F\x19\"\'/3" +
681
+ ">DHMY]fi";
682
+ public static __ATN: ATN;
683
+ public static get _ATN(): ATN {
684
+ if (!MalloyTagParser.__ATN) {
685
+ MalloyTagParser.__ATN = new ATNDeserializer().deserialize(Utils.toCharArray(MalloyTagParser._serializedATN));
686
+ }
687
+
688
+ return MalloyTagParser.__ATN;
689
+ }
690
+
691
+ }
692
+
693
+ export class TagLineContext extends ParserRuleContext {
694
+ public EOF(): TerminalNode { return this.getToken(MalloyTagParser.EOF, 0); }
695
+ public tagSpec(): TagSpecContext[];
696
+ public tagSpec(i: number): TagSpecContext;
697
+ public tagSpec(i?: number): TagSpecContext | TagSpecContext[] {
698
+ if (i === undefined) {
699
+ return this.getRuleContexts(TagSpecContext);
700
+ } else {
701
+ return this.getRuleContext(i, TagSpecContext);
702
+ }
703
+ }
704
+ constructor(parent: ParserRuleContext | undefined, invokingState: number) {
705
+ super(parent, invokingState);
706
+ }
707
+ // @Override
708
+ public get ruleIndex(): number { return MalloyTagParser.RULE_tagLine; }
709
+ // @Override
710
+ public accept<Result>(visitor: MalloyTagVisitor<Result>): Result {
711
+ if (visitor.visitTagLine) {
712
+ return visitor.visitTagLine(this);
713
+ } else {
714
+ return visitor.visitChildren(this);
715
+ }
716
+ }
717
+ }
718
+
719
+
720
+ export class TagSpecContext extends ParserRuleContext {
721
+ constructor(parent: ParserRuleContext | undefined, invokingState: number) {
722
+ super(parent, invokingState);
723
+ }
724
+ // @Override
725
+ public get ruleIndex(): number { return MalloyTagParser.RULE_tagSpec; }
726
+ public copyFrom(ctx: TagSpecContext): void {
727
+ super.copyFrom(ctx);
728
+ }
729
+ }
730
+ export class TagEqContext extends TagSpecContext {
731
+ public propName(): PropNameContext {
732
+ return this.getRuleContext(0, PropNameContext);
733
+ }
734
+ public EQ(): TerminalNode { return this.getToken(MalloyTagParser.EQ, 0); }
735
+ public eqValue(): EqValueContext {
736
+ return this.getRuleContext(0, EqValueContext);
737
+ }
738
+ public properties(): PropertiesContext | undefined {
739
+ return this.tryGetRuleContext(0, PropertiesContext);
740
+ }
741
+ constructor(ctx: TagSpecContext) {
742
+ super(ctx.parent, ctx.invokingState);
743
+ this.copyFrom(ctx);
744
+ }
745
+ // @Override
746
+ public accept<Result>(visitor: MalloyTagVisitor<Result>): Result {
747
+ if (visitor.visitTagEq) {
748
+ return visitor.visitTagEq(this);
749
+ } else {
750
+ return visitor.visitChildren(this);
751
+ }
752
+ }
753
+ }
754
+ export class TagReplacePropertiesContext extends TagSpecContext {
755
+ public propName(): PropNameContext {
756
+ return this.getRuleContext(0, PropNameContext);
757
+ }
758
+ public EQ(): TerminalNode { return this.getToken(MalloyTagParser.EQ, 0); }
759
+ public properties(): PropertiesContext {
760
+ return this.getRuleContext(0, PropertiesContext);
761
+ }
762
+ public DOTTY(): TerminalNode | undefined { return this.tryGetToken(MalloyTagParser.DOTTY, 0); }
763
+ constructor(ctx: TagSpecContext) {
764
+ super(ctx.parent, ctx.invokingState);
765
+ this.copyFrom(ctx);
766
+ }
767
+ // @Override
768
+ public accept<Result>(visitor: MalloyTagVisitor<Result>): Result {
769
+ if (visitor.visitTagReplaceProperties) {
770
+ return visitor.visitTagReplaceProperties(this);
771
+ } else {
772
+ return visitor.visitChildren(this);
773
+ }
774
+ }
775
+ }
776
+ export class TagUpdatePropertiesContext extends TagSpecContext {
777
+ public propName(): PropNameContext {
778
+ return this.getRuleContext(0, PropNameContext);
779
+ }
780
+ public properties(): PropertiesContext {
781
+ return this.getRuleContext(0, PropertiesContext);
782
+ }
783
+ constructor(ctx: TagSpecContext) {
784
+ super(ctx.parent, ctx.invokingState);
785
+ this.copyFrom(ctx);
786
+ }
787
+ // @Override
788
+ public accept<Result>(visitor: MalloyTagVisitor<Result>): Result {
789
+ if (visitor.visitTagUpdateProperties) {
790
+ return visitor.visitTagUpdateProperties(this);
791
+ } else {
792
+ return visitor.visitChildren(this);
793
+ }
794
+ }
795
+ }
796
+ export class TagDefContext extends TagSpecContext {
797
+ public propName(): PropNameContext {
798
+ return this.getRuleContext(0, PropNameContext);
799
+ }
800
+ public MINUS(): TerminalNode | undefined { return this.tryGetToken(MalloyTagParser.MINUS, 0); }
801
+ constructor(ctx: TagSpecContext) {
802
+ super(ctx.parent, ctx.invokingState);
803
+ this.copyFrom(ctx);
804
+ }
805
+ // @Override
806
+ public accept<Result>(visitor: MalloyTagVisitor<Result>): Result {
807
+ if (visitor.visitTagDef) {
808
+ return visitor.visitTagDef(this);
809
+ } else {
810
+ return visitor.visitChildren(this);
811
+ }
812
+ }
813
+ }
814
+ export class TagEmptyContext extends TagSpecContext {
815
+ public MINUS_DOTTY(): TerminalNode { return this.getToken(MalloyTagParser.MINUS_DOTTY, 0); }
816
+ constructor(ctx: TagSpecContext) {
817
+ super(ctx.parent, ctx.invokingState);
818
+ this.copyFrom(ctx);
819
+ }
820
+ // @Override
821
+ public accept<Result>(visitor: MalloyTagVisitor<Result>): Result {
822
+ if (visitor.visitTagEmpty) {
823
+ return visitor.visitTagEmpty(this);
824
+ } else {
825
+ return visitor.visitChildren(this);
826
+ }
827
+ }
828
+ }
829
+
830
+
831
+ export class StringContext extends ParserRuleContext {
832
+ public SQ_STRING(): TerminalNode | undefined { return this.tryGetToken(MalloyTagParser.SQ_STRING, 0); }
833
+ public DQ_STRING(): TerminalNode | undefined { return this.tryGetToken(MalloyTagParser.DQ_STRING, 0); }
834
+ public BARE_STRING(): TerminalNode | undefined { return this.tryGetToken(MalloyTagParser.BARE_STRING, 0); }
835
+ public NUMERIC_LITERAL(): TerminalNode | undefined { return this.tryGetToken(MalloyTagParser.NUMERIC_LITERAL, 0); }
836
+ constructor(parent: ParserRuleContext | undefined, invokingState: number) {
837
+ super(parent, invokingState);
838
+ }
839
+ // @Override
840
+ public get ruleIndex(): number { return MalloyTagParser.RULE_string; }
841
+ // @Override
842
+ public accept<Result>(visitor: MalloyTagVisitor<Result>): Result {
843
+ if (visitor.visitString) {
844
+ return visitor.visitString(this);
845
+ } else {
846
+ return visitor.visitChildren(this);
847
+ }
848
+ }
849
+ }
850
+
851
+
852
+ export class IdentifierContext extends ParserRuleContext {
853
+ public BQ_STRING(): TerminalNode | undefined { return this.tryGetToken(MalloyTagParser.BQ_STRING, 0); }
854
+ public BARE_STRING(): TerminalNode | undefined { return this.tryGetToken(MalloyTagParser.BARE_STRING, 0); }
855
+ constructor(parent: ParserRuleContext | undefined, invokingState: number) {
856
+ super(parent, invokingState);
857
+ }
858
+ // @Override
859
+ public get ruleIndex(): number { return MalloyTagParser.RULE_identifier; }
860
+ // @Override
861
+ public accept<Result>(visitor: MalloyTagVisitor<Result>): Result {
862
+ if (visitor.visitIdentifier) {
863
+ return visitor.visitIdentifier(this);
864
+ } else {
865
+ return visitor.visitChildren(this);
866
+ }
867
+ }
868
+ }
869
+
870
+
871
+ export class PropNameContext extends ParserRuleContext {
872
+ public identifier(): IdentifierContext[];
873
+ public identifier(i: number): IdentifierContext;
874
+ public identifier(i?: number): IdentifierContext | IdentifierContext[] {
875
+ if (i === undefined) {
876
+ return this.getRuleContexts(IdentifierContext);
877
+ } else {
878
+ return this.getRuleContext(i, IdentifierContext);
879
+ }
880
+ }
881
+ public DOT(): TerminalNode[];
882
+ public DOT(i: number): TerminalNode;
883
+ public DOT(i?: number): TerminalNode | TerminalNode[] {
884
+ if (i === undefined) {
885
+ return this.getTokens(MalloyTagParser.DOT);
886
+ } else {
887
+ return this.getToken(MalloyTagParser.DOT, i);
888
+ }
889
+ }
890
+ constructor(parent: ParserRuleContext | undefined, invokingState: number) {
891
+ super(parent, invokingState);
892
+ }
893
+ // @Override
894
+ public get ruleIndex(): number { return MalloyTagParser.RULE_propName; }
895
+ // @Override
896
+ public accept<Result>(visitor: MalloyTagVisitor<Result>): Result {
897
+ if (visitor.visitPropName) {
898
+ return visitor.visitPropName(this);
899
+ } else {
900
+ return visitor.visitChildren(this);
901
+ }
902
+ }
903
+ }
904
+
905
+
906
+ export class EqValueContext extends ParserRuleContext {
907
+ public string(): StringContext | undefined {
908
+ return this.tryGetRuleContext(0, StringContext);
909
+ }
910
+ public arrayValue(): ArrayValueContext | undefined {
911
+ return this.tryGetRuleContext(0, ArrayValueContext);
912
+ }
913
+ public reference(): ReferenceContext | undefined {
914
+ return this.tryGetRuleContext(0, ReferenceContext);
915
+ }
916
+ constructor(parent: ParserRuleContext | undefined, invokingState: number) {
917
+ super(parent, invokingState);
918
+ }
919
+ // @Override
920
+ public get ruleIndex(): number { return MalloyTagParser.RULE_eqValue; }
921
+ // @Override
922
+ public accept<Result>(visitor: MalloyTagVisitor<Result>): Result {
923
+ if (visitor.visitEqValue) {
924
+ return visitor.visitEqValue(this);
925
+ } else {
926
+ return visitor.visitChildren(this);
927
+ }
928
+ }
929
+ }
930
+
931
+
932
+ export class ArrayElementContext extends ParserRuleContext {
933
+ public string(): StringContext | undefined {
934
+ return this.tryGetRuleContext(0, StringContext);
935
+ }
936
+ public properties(): PropertiesContext | undefined {
937
+ return this.tryGetRuleContext(0, PropertiesContext);
938
+ }
939
+ public arrayValue(): ArrayValueContext | undefined {
940
+ return this.tryGetRuleContext(0, ArrayValueContext);
941
+ }
942
+ public reference(): ReferenceContext | undefined {
943
+ return this.tryGetRuleContext(0, ReferenceContext);
944
+ }
945
+ constructor(parent: ParserRuleContext | undefined, invokingState: number) {
946
+ super(parent, invokingState);
947
+ }
948
+ // @Override
949
+ public get ruleIndex(): number { return MalloyTagParser.RULE_arrayElement; }
950
+ // @Override
951
+ public accept<Result>(visitor: MalloyTagVisitor<Result>): Result {
952
+ if (visitor.visitArrayElement) {
953
+ return visitor.visitArrayElement(this);
954
+ } else {
955
+ return visitor.visitChildren(this);
956
+ }
957
+ }
958
+ }
959
+
960
+
961
+ export class ReferenceContext extends ParserRuleContext {
962
+ public RF_BEG(): TerminalNode { return this.getToken(MalloyTagParser.RF_BEG, 0); }
963
+ public propName(): PropNameContext {
964
+ return this.getRuleContext(0, PropNameContext);
965
+ }
966
+ public RF_END(): TerminalNode { return this.getToken(MalloyTagParser.RF_END, 0); }
967
+ constructor(parent: ParserRuleContext | undefined, invokingState: number) {
968
+ super(parent, invokingState);
969
+ }
970
+ // @Override
971
+ public get ruleIndex(): number { return MalloyTagParser.RULE_reference; }
972
+ // @Override
973
+ public accept<Result>(visitor: MalloyTagVisitor<Result>): Result {
974
+ if (visitor.visitReference) {
975
+ return visitor.visitReference(this);
976
+ } else {
977
+ return visitor.visitChildren(this);
978
+ }
979
+ }
980
+ }
981
+
982
+
983
+ export class ArrayValueContext extends ParserRuleContext {
984
+ public AR_BEG(): TerminalNode { return this.getToken(MalloyTagParser.AR_BEG, 0); }
985
+ public arrayElement(): ArrayElementContext[];
986
+ public arrayElement(i: number): ArrayElementContext;
987
+ public arrayElement(i?: number): ArrayElementContext | ArrayElementContext[] {
988
+ if (i === undefined) {
989
+ return this.getRuleContexts(ArrayElementContext);
990
+ } else {
991
+ return this.getRuleContext(i, ArrayElementContext);
992
+ }
993
+ }
994
+ public AR_END(): TerminalNode { return this.getToken(MalloyTagParser.AR_END, 0); }
995
+ public COMMA(): TerminalNode[];
996
+ public COMMA(i: number): TerminalNode;
997
+ public COMMA(i?: number): TerminalNode | TerminalNode[] {
998
+ if (i === undefined) {
999
+ return this.getTokens(MalloyTagParser.COMMA);
1000
+ } else {
1001
+ return this.getToken(MalloyTagParser.COMMA, i);
1002
+ }
1003
+ }
1004
+ constructor(parent: ParserRuleContext | undefined, invokingState: number) {
1005
+ super(parent, invokingState);
1006
+ }
1007
+ // @Override
1008
+ public get ruleIndex(): number { return MalloyTagParser.RULE_arrayValue; }
1009
+ // @Override
1010
+ public accept<Result>(visitor: MalloyTagVisitor<Result>): Result {
1011
+ if (visitor.visitArrayValue) {
1012
+ return visitor.visitArrayValue(this);
1013
+ } else {
1014
+ return visitor.visitChildren(this);
1015
+ }
1016
+ }
1017
+ }
1018
+
1019
+
1020
+ export class PropertiesContext extends ParserRuleContext {
1021
+ public PR_BEG(): TerminalNode { return this.getToken(MalloyTagParser.PR_BEG, 0); }
1022
+ public PR_END(): TerminalNode { return this.getToken(MalloyTagParser.PR_END, 0); }
1023
+ public DOTTY(): TerminalNode | undefined { return this.tryGetToken(MalloyTagParser.DOTTY, 0); }
1024
+ public tagSpec(): TagSpecContext[];
1025
+ public tagSpec(i: number): TagSpecContext;
1026
+ public tagSpec(i?: number): TagSpecContext | TagSpecContext[] {
1027
+ if (i === undefined) {
1028
+ return this.getRuleContexts(TagSpecContext);
1029
+ } else {
1030
+ return this.getRuleContext(i, TagSpecContext);
1031
+ }
1032
+ }
1033
+ constructor(parent: ParserRuleContext | undefined, invokingState: number) {
1034
+ super(parent, invokingState);
1035
+ }
1036
+ // @Override
1037
+ public get ruleIndex(): number { return MalloyTagParser.RULE_properties; }
1038
+ // @Override
1039
+ public accept<Result>(visitor: MalloyTagVisitor<Result>): Result {
1040
+ if (visitor.visitProperties) {
1041
+ return visitor.visitProperties(this);
1042
+ } else {
1043
+ return visitor.visitChildren(this);
1044
+ }
1045
+ }
1046
+ }
1047
+
1048
+