@noldova/context.parsers 0.0.0-stage → 0.0.2
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/LICENSE +21 -0
- package/README.md +94 -2
- package/api/index.d.ts +1378 -0
- package/api/index.js +30 -0
- package/api/index.js.map +1 -0
- package/exceptions/invalid-offset.exception.js +31 -0
- package/exceptions/invalid-offset.exception.js.map +1 -0
- package/exceptions/invalid-span.exception.js +33 -0
- package/exceptions/invalid-span.exception.js.map +1 -0
- package/exceptions/line-out-of-bounds.exception.js +23 -0
- package/exceptions/line-out-of-bounds.exception.js.map +1 -0
- package/exceptions/parser.exception.js +14 -0
- package/exceptions/parser.exception.js.map +1 -0
- package/models/diagnostic-collector.js +31 -0
- package/models/diagnostic-collector.js.map +1 -0
- package/models/nodes/comment.node.js +14 -0
- package/models/nodes/comment.node.js.map +1 -0
- package/models/nodes/composite.node.js +16 -0
- package/models/nodes/composite.node.js.map +1 -0
- package/models/nodes/end-of-file.node.js +19 -0
- package/models/nodes/end-of-file.node.js.map +1 -0
- package/models/nodes/literal.node.js +14 -0
- package/models/nodes/literal.node.js.map +1 -0
- package/models/nodes/node.js +18 -0
- package/models/nodes/node.js.map +1 -0
- package/models/nodes/value.node.js +16 -0
- package/models/nodes/value.node.js.map +1 -0
- package/models/nodes/whitespace.node.js +14 -0
- package/models/nodes/whitespace.node.js.map +1 -0
- package/models/parser-context.js +17 -0
- package/models/parser-context.js.map +1 -0
- package/models/parser-result.js +16 -0
- package/models/parser-result.js.map +1 -0
- package/models/sources/source-line-map.js +67 -0
- package/models/sources/source-line-map.js.map +1 -0
- package/models/sources/source-line.js +31 -0
- package/models/sources/source-line.js.map +1 -0
- package/models/sources/source-position.js +23 -0
- package/models/sources/source-position.js.map +1 -0
- package/models/sources/source-span.js +20 -0
- package/models/sources/source-span.js.map +1 -0
- package/models/sources/source.js +36 -0
- package/models/sources/source.js.map +1 -0
- package/package.json +26 -4
- package/resources.js +38 -0
- package/resources.js.map +1 -0
- package/services/lexer.js +38 -0
- package/services/lexer.js.map +1 -0
- package/services/parser.js +96 -0
- package/services/parser.js.map +1 -0
- package/services/source.reader.js +93 -0
- package/services/source.reader.js.map +1 -0
- package/types/node-type.js +9 -0
- package/types/node-type.js.map +1 -0
- package/types/value-node-type.js +9 -0
- package/types/value-node-type.js.map +1 -0
package/resources.js
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright (c) Noldova.
|
|
4
|
+
*
|
|
5
|
+
* This source code is licensed under the license found in the
|
|
6
|
+
* LICENSE file in the root directory of this source tree.
|
|
7
|
+
*/
|
|
8
|
+
export class Resources {
|
|
9
|
+
static characterIndexInvalid = "The character index must be a non-negative safe integer within the requested line.";
|
|
10
|
+
static currentNodeTypeInvalid = "The current node does not match the type required by the recognized grammar branch.";
|
|
11
|
+
static endOfInputCodePoint = 0;
|
|
12
|
+
static endOfInputCodeUnit = "\0";
|
|
13
|
+
static endOfFileSpanInvalid = "An end-of-file node must have an empty text span.";
|
|
14
|
+
static lexerEndOfFileInvalid = "An end-of-file node must identify the reader's current end position.";
|
|
15
|
+
static lexerEndOfFileRequired = "A stationary lexer at the end of its source region must produce EndOfFileNode.";
|
|
16
|
+
static lineEndInvalid = "The line end offset must be a safe integer greater than or equal to its start offset.";
|
|
17
|
+
static lineIndexInvalid = "The line index must be a non-negative safe integer.";
|
|
18
|
+
static lineStartInvalid = "The line start offset must be a non-negative safe integer.";
|
|
19
|
+
static maximumUtf16CodeUnit = 0xFFFF;
|
|
20
|
+
static parserAlreadyUsed = "The parser session has already been used.";
|
|
21
|
+
static parserInputRemains = "The parser cannot publish a result while input remains unconsumed.";
|
|
22
|
+
static parserLexerCollectorInvalid = "The lexer must report to the parser context's diagnostic collector.";
|
|
23
|
+
static utf16CodeUnitLength = 1;
|
|
24
|
+
static utf16SurrogatePairLength = 2;
|
|
25
|
+
static invalidOffset(offset, minimumOffset, maximumOffset) {
|
|
26
|
+
return `Offset ${offset} is outside the permitted range from ${minimumOffset} through ${maximumOffset}.`;
|
|
27
|
+
}
|
|
28
|
+
static invalidSpan(startOffset, length, sourceLength) {
|
|
29
|
+
return `Span [${startOffset}, ${startOffset + length}) is outside the source length ${sourceLength}.`;
|
|
30
|
+
}
|
|
31
|
+
static lexerDidNotAdvance(offset) {
|
|
32
|
+
return `The lexer did not advance from source offset ${offset}.`;
|
|
33
|
+
}
|
|
34
|
+
static lineOutOfBounds(lineIndex, lineCount) {
|
|
35
|
+
return `Line index ${lineIndex} is outside the source line count ${lineCount}.`;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=resources.js.map
|
package/resources.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resources.js","sourceRoot":"","sources":["../../../src/parsers/noldova.context.parsers/src/resources.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,OAAO,SAAS;IACb,MAAM,CAAU,qBAAqB,GAAW,oFAAoF,CAAC;IACrI,MAAM,CAAU,sBAAsB,GAAW,qFAAqF,CAAC;IACvI,MAAM,CAAU,mBAAmB,GAAW,CAAC,CAAC;IAChD,MAAM,CAAU,kBAAkB,GAAW,IAAI,CAAC;IAClD,MAAM,CAAU,oBAAoB,GAAW,mDAAmD,CAAC;IACnG,MAAM,CAAU,qBAAqB,GAAW,sEAAsE,CAAC;IACvH,MAAM,CAAU,sBAAsB,GAAW,gFAAgF,CAAC;IAClI,MAAM,CAAU,cAAc,GAAW,uFAAuF,CAAC;IACjI,MAAM,CAAU,gBAAgB,GAAW,qDAAqD,CAAC;IACjG,MAAM,CAAU,gBAAgB,GAAW,4DAA4D,CAAC;IACxG,MAAM,CAAU,oBAAoB,GAAW,MAAM,CAAC;IACtD,MAAM,CAAU,iBAAiB,GAAW,2CAA2C,CAAC;IACxF,MAAM,CAAU,kBAAkB,GAAW,oEAAoE,CAAC;IAClH,MAAM,CAAU,2BAA2B,GAAW,qEAAqE,CAAC;IAC5H,MAAM,CAAU,mBAAmB,GAAW,CAAC,CAAC;IAChD,MAAM,CAAU,wBAAwB,GAAW,CAAC,CAAC;IAErD,MAAM,CAAC,aAAa,CAAC,MAAc,EAAE,aAAqB,EAAE,aAAqB;QACtF,OAAO,UAAU,MAAM,wCAAwC,aAAa,YAAY,aAAa,GAAG,CAAC;IAC3G,CAAC;IAEM,MAAM,CAAC,WAAW,CAAC,WAAmB,EAAE,MAAc,EAAE,YAAoB;QACjF,OAAO,SAAS,WAAW,KAAK,WAAW,GAAG,MAAM,kCAAkC,YAAY,GAAG,CAAC;IACxG,CAAC;IAEM,MAAM,CAAC,kBAAkB,CAAC,MAAc;QAC7C,OAAO,gDAAgD,MAAM,GAAG,CAAC;IACnE,CAAC;IAEM,MAAM,CAAC,eAAe,CAAC,SAAiB,EAAE,SAAiB;QAChE,OAAO,cAAc,SAAS,qCAAqC,SAAS,GAAG,CAAC;IAClF,CAAC;CACF"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright (c) Noldova.
|
|
4
|
+
*
|
|
5
|
+
* This source code is licensed under the license found in the
|
|
6
|
+
* LICENSE file in the root directory of this source tree.
|
|
7
|
+
*/
|
|
8
|
+
import { ParserException } from "../exceptions/parser.exception.js";
|
|
9
|
+
import { EndOfFileNode } from "../models/nodes/end-of-file.node.js";
|
|
10
|
+
import { Resources } from "../resources.js";
|
|
11
|
+
import { SourceReader } from "./source.reader.js";
|
|
12
|
+
export class Lexer {
|
|
13
|
+
diagnosticCollector;
|
|
14
|
+
reader;
|
|
15
|
+
constructor(sourceOrReader, diagnosticCollector) {
|
|
16
|
+
this.reader = sourceOrReader instanceof SourceReader ? sourceOrReader : new SourceReader(sourceOrReader);
|
|
17
|
+
this.diagnosticCollector = diagnosticCollector;
|
|
18
|
+
}
|
|
19
|
+
lex() {
|
|
20
|
+
return this.lexWith(() => this.lexNode());
|
|
21
|
+
}
|
|
22
|
+
lexWith(action) {
|
|
23
|
+
const reader = this.reader;
|
|
24
|
+
const startOffset = reader.currentOffset;
|
|
25
|
+
const node = action();
|
|
26
|
+
if (node instanceof EndOfFileNode) {
|
|
27
|
+
if (!reader.isAtEnd || node.span.startOffset !== reader.currentOffset)
|
|
28
|
+
throw new ParserException(Resources.lexerEndOfFileInvalid);
|
|
29
|
+
}
|
|
30
|
+
else if (reader.currentOffset <= startOffset) {
|
|
31
|
+
if (!reader.isAtEnd)
|
|
32
|
+
throw new ParserException(Resources.lexerDidNotAdvance(startOffset));
|
|
33
|
+
throw new ParserException(Resources.lexerEndOfFileRequired);
|
|
34
|
+
}
|
|
35
|
+
return node;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=lexer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lexer.js","sourceRoot":"","sources":["../../../../src/parsers/noldova.context.parsers/src/services/lexer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AAGpE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,OAAgB,KAAK;IACT,mBAAmB,CAAsB;IACzC,MAAM,CAAe;IAErC,YAAsB,cAAqC,EAAE,mBAAwC;QACnG,IAAI,CAAC,MAAM,GAAG,cAAc,YAAY,YAAY,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC,cAAc,CAAC,CAAC;QACzG,IAAI,CAAC,mBAAmB,GAAG,mBAAmB,CAAC;IACjD,CAAC;IAEM,GAAG;QACR,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAC5C,CAAC;IAIS,OAAO,CAAC,MAAkB;QAClC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,MAAM,WAAW,GAAG,MAAM,CAAC,aAAa,CAAC;QACzC,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC;QAEtB,IAAI,IAAI,YAAY,aAAa,EAAE,CAAC;YAClC,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,KAAK,MAAM,CAAC,aAAa;gBACnE,MAAM,IAAI,eAAe,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;QAC/D,CAAC;aACI,IAAI,MAAM,CAAC,aAAa,IAAI,WAAW,EAAE,CAAC;YAC7C,IAAI,CAAC,MAAM,CAAC,OAAO;gBACjB,MAAM,IAAI,eAAe,CAAC,SAAS,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC,CAAC;YAEvE,MAAM,IAAI,eAAe,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QAC9D,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright (c) Noldova.
|
|
4
|
+
*
|
|
5
|
+
* This source code is licensed under the license found in the
|
|
6
|
+
* LICENSE file in the root directory of this source tree.
|
|
7
|
+
*/
|
|
8
|
+
import { ParserException } from "../exceptions/parser.exception.js";
|
|
9
|
+
import { EndOfFileNode } from "../models/nodes/end-of-file.node.js";
|
|
10
|
+
import { ParserResult } from "../models/parser-result.js";
|
|
11
|
+
import { Resources } from "../resources.js";
|
|
12
|
+
export class Parser {
|
|
13
|
+
lexer;
|
|
14
|
+
hasParsed = false;
|
|
15
|
+
lexedNode;
|
|
16
|
+
context;
|
|
17
|
+
constructor(context, lexer) {
|
|
18
|
+
if (lexer.diagnosticCollector !== context.diagnosticCollector)
|
|
19
|
+
throw new ParserException(Resources.parserLexerCollectorInvalid);
|
|
20
|
+
this.context = context;
|
|
21
|
+
this.lexer = lexer;
|
|
22
|
+
this.lexedNode = lexer.lex();
|
|
23
|
+
}
|
|
24
|
+
get currentNode() {
|
|
25
|
+
return this.lexedNode;
|
|
26
|
+
}
|
|
27
|
+
get isEndOfFile() {
|
|
28
|
+
return this.lexedNode instanceof EndOfFileNode;
|
|
29
|
+
}
|
|
30
|
+
parse() {
|
|
31
|
+
if (this.hasParsed)
|
|
32
|
+
throw new ParserException(Resources.parserAlreadyUsed);
|
|
33
|
+
this.hasParsed = true;
|
|
34
|
+
const rootNode = this.parseRootNode();
|
|
35
|
+
if (!this.isEndOfFile)
|
|
36
|
+
throw new ParserException(Resources.parserInputRemains);
|
|
37
|
+
return new ParserResult(rootNode, this.context.diagnosticCollector.diagnostics);
|
|
38
|
+
}
|
|
39
|
+
advance() {
|
|
40
|
+
if (this.isEndOfFile)
|
|
41
|
+
return;
|
|
42
|
+
this.lexedNode = this.lexer.lex();
|
|
43
|
+
}
|
|
44
|
+
tryConsume(type) {
|
|
45
|
+
const node = this.lexedNode;
|
|
46
|
+
if (!Parser.hasType(node, type))
|
|
47
|
+
return undefined;
|
|
48
|
+
this.advance();
|
|
49
|
+
return node;
|
|
50
|
+
}
|
|
51
|
+
requireCurrentNode(type) {
|
|
52
|
+
const node = this.lexedNode;
|
|
53
|
+
if (!Parser.hasType(node, type))
|
|
54
|
+
throw new ParserException(Resources.currentNodeTypeInvalid);
|
|
55
|
+
return node;
|
|
56
|
+
}
|
|
57
|
+
lookAhead(action) {
|
|
58
|
+
const node = this.lexedNode;
|
|
59
|
+
const diagnosticCount = this.context.diagnosticCollector.diagnostics.length;
|
|
60
|
+
const readerOffset = this.lexer.reader.currentOffset;
|
|
61
|
+
try {
|
|
62
|
+
return action();
|
|
63
|
+
}
|
|
64
|
+
finally {
|
|
65
|
+
this.rewindTo(node, diagnosticCount, readerOffset);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
tryParse(action) {
|
|
69
|
+
const node = this.lexedNode;
|
|
70
|
+
const diagnosticCount = this.context.diagnosticCollector.diagnostics.length;
|
|
71
|
+
const readerOffset = this.lexer.reader.currentOffset;
|
|
72
|
+
let accepted = false;
|
|
73
|
+
try {
|
|
74
|
+
const result = action();
|
|
75
|
+
accepted = !Object.isUndefined(result);
|
|
76
|
+
return result;
|
|
77
|
+
}
|
|
78
|
+
finally {
|
|
79
|
+
if (!accepted)
|
|
80
|
+
this.rewindTo(node, diagnosticCount, readerOffset);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
reLexCurrentNode(lex) {
|
|
84
|
+
this.lexer.reader.seek(this.lexedNode.span.startOffset);
|
|
85
|
+
this.lexedNode = lex();
|
|
86
|
+
}
|
|
87
|
+
rewindTo(node, diagnosticCount, readerOffset) {
|
|
88
|
+
this.lexedNode = node;
|
|
89
|
+
this.context.diagnosticCollector.truncate(diagnosticCount);
|
|
90
|
+
this.lexer.reader.seek(readerOffset);
|
|
91
|
+
}
|
|
92
|
+
static hasType(node, type) {
|
|
93
|
+
return type.prototype.isPrototypeOf(node);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../../../src/parsers/noldova.context.parsers/src/services/parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright (c) Noldova.
|
|
4
|
+
*
|
|
5
|
+
* This source code is licensed under the license found in the
|
|
6
|
+
* LICENSE file in the root directory of this source tree.
|
|
7
|
+
*/
|
|
8
|
+
import { ReadOnlyStringSpan } from "@noldova/context.text";
|
|
9
|
+
import { InvalidSpanException } from "../exceptions/invalid-span.exception.js";
|
|
10
|
+
import { SourceSpan } from "../models/sources/source-span.js";
|
|
11
|
+
import { Resources } from "../resources.js";
|
|
12
|
+
export class SourceReader {
|
|
13
|
+
offset;
|
|
14
|
+
endOffset;
|
|
15
|
+
source;
|
|
16
|
+
startOffset;
|
|
17
|
+
constructor(source, span) {
|
|
18
|
+
const startOffset = span?.startOffset ?? 0;
|
|
19
|
+
const length = span?.length ?? source.length;
|
|
20
|
+
InvalidSpanException.throwIfInvalid(startOffset, length, source.length);
|
|
21
|
+
this.source = source;
|
|
22
|
+
this.startOffset = startOffset;
|
|
23
|
+
this.endOffset = startOffset + length;
|
|
24
|
+
this.offset = startOffset;
|
|
25
|
+
}
|
|
26
|
+
get currentOffset() {
|
|
27
|
+
return this.offset;
|
|
28
|
+
}
|
|
29
|
+
get isAtEnd() {
|
|
30
|
+
return this.offset >= this.endOffset;
|
|
31
|
+
}
|
|
32
|
+
peekCodeUnit(relativeOffset = 0) {
|
|
33
|
+
const offset = this.offset + relativeOffset;
|
|
34
|
+
if (offset < this.startOffset || offset >= this.endOffset)
|
|
35
|
+
return Resources.endOfInputCodeUnit;
|
|
36
|
+
return this.source.content.charAt(offset);
|
|
37
|
+
}
|
|
38
|
+
peekCodePoint() {
|
|
39
|
+
if (this.isAtEnd)
|
|
40
|
+
return Resources.endOfInputCodePoint;
|
|
41
|
+
if (this.offset + Resources.utf16CodeUnitLength >= this.endOffset)
|
|
42
|
+
return this.source.content.charCodeAt(this.offset);
|
|
43
|
+
return this.source.content.codePointAt(this.offset);
|
|
44
|
+
}
|
|
45
|
+
readCodeUnit() {
|
|
46
|
+
if (this.isAtEnd)
|
|
47
|
+
return Resources.endOfInputCodeUnit;
|
|
48
|
+
const character = this.source.content.charAt(this.offset);
|
|
49
|
+
this.offset++;
|
|
50
|
+
return character;
|
|
51
|
+
}
|
|
52
|
+
readCodePoint() {
|
|
53
|
+
const codePoint = this.peekCodePoint();
|
|
54
|
+
if (!this.isAtEnd)
|
|
55
|
+
this.offset += codePoint > Resources.maximumUtf16CodeUnit ? Resources.utf16SurrogatePairLength : Resources.utf16CodeUnitLength;
|
|
56
|
+
return codePoint;
|
|
57
|
+
}
|
|
58
|
+
advance(count = 1) {
|
|
59
|
+
this.offset = Math.min(this.offset + count, this.endOffset);
|
|
60
|
+
}
|
|
61
|
+
seek(offset) {
|
|
62
|
+
this.offset = offset;
|
|
63
|
+
}
|
|
64
|
+
startsWith(text) {
|
|
65
|
+
if (this.offset + text.length > this.endOffset)
|
|
66
|
+
return false;
|
|
67
|
+
return this.source.content.startsWith(text, this.offset);
|
|
68
|
+
}
|
|
69
|
+
readWhile(predicate) {
|
|
70
|
+
const startOffset = this.offset;
|
|
71
|
+
while (!this.isAtEnd && predicate(this.source.content.charAt(this.offset)))
|
|
72
|
+
this.offset++;
|
|
73
|
+
return this.source.getSpan(startOffset, this.offset - startOffset);
|
|
74
|
+
}
|
|
75
|
+
readUntil(predicate) {
|
|
76
|
+
const startOffset = this.offset;
|
|
77
|
+
while (!this.isAtEnd && !predicate(this.source.content.charAt(this.offset)))
|
|
78
|
+
this.offset++;
|
|
79
|
+
return this.source.getSpan(startOffset, this.offset - startOffset);
|
|
80
|
+
}
|
|
81
|
+
peekWhile(predicate) {
|
|
82
|
+
let length = 0;
|
|
83
|
+
while (this.offset + length < this.endOffset && predicate(this.source.content.charAt(this.offset + length)))
|
|
84
|
+
length++;
|
|
85
|
+
return new ReadOnlyStringSpan(this.source.content, this.offset, length);
|
|
86
|
+
}
|
|
87
|
+
createSpan(startOrSpan, lengthOrSpan) {
|
|
88
|
+
const startOffset = Object.isNumber(startOrSpan) ? startOrSpan : startOrSpan.startOffset;
|
|
89
|
+
const length = Object.isNumber(lengthOrSpan) ? lengthOrSpan : lengthOrSpan.endOffset - startOffset;
|
|
90
|
+
return new SourceSpan(startOffset, length);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=source.reader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source.reader.js","sourceRoot":"","sources":["../../../../src/parsers/noldova.context.parsers/src/services/source.reader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-type.js","sourceRoot":"","sources":["../../../../src/parsers/noldova.context.parsers/src/types/node-type.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"value-node-type.js","sourceRoot":"","sources":["../../../../src/parsers/noldova.context.parsers/src/types/value-node-type.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|