@inventarch/language 0.0.0-stage → 1.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.
- package/LANGUAGE.md +56 -0
- package/LICENSE +202 -0
- package/NOTICE +4 -0
- package/README.md +33 -2
- package/SPEC.md +225 -0
- package/dist/ast.d.ts +114 -0
- package/dist/ast.d.ts.map +1 -0
- package/dist/ast.js +2 -0
- package/dist/ast.js.map +1 -0
- package/dist/compile/compile.d.ts +82 -0
- package/dist/compile/compile.d.ts.map +1 -0
- package/dist/compile/compile.js +249 -0
- package/dist/compile/compile.js.map +1 -0
- package/dist/compile/index.d.ts +6 -0
- package/dist/compile/index.d.ts.map +1 -0
- package/dist/compile/index.js +4 -0
- package/dist/compile/index.js.map +1 -0
- package/dist/compile/spellings.d.ts +7 -0
- package/dist/compile/spellings.d.ts.map +1 -0
- package/dist/compile/spellings.js +47 -0
- package/dist/compile/spellings.js.map +1 -0
- package/dist/compile/values.d.ts +32 -0
- package/dist/compile/values.d.ts.map +1 -0
- package/dist/compile/values.js +48 -0
- package/dist/compile/values.js.map +1 -0
- package/dist/diagnostics.d.ts +22 -0
- package/dist/diagnostics.d.ts.map +1 -0
- package/dist/diagnostics.js +71 -0
- package/dist/diagnostics.js.map +1 -0
- package/dist/editor/index.d.ts +49 -0
- package/dist/editor/index.d.ts.map +1 -0
- package/dist/editor/index.js +155 -0
- package/dist/editor/index.js.map +1 -0
- package/dist/fold.d.ts +8 -0
- package/dist/fold.d.ts.map +1 -0
- package/dist/fold.js +26 -0
- package/dist/fold.js.map +1 -0
- package/dist/formatter.d.ts +10 -0
- package/dist/formatter.d.ts.map +1 -0
- package/dist/formatter.js +108 -0
- package/dist/formatter.js.map +1 -0
- package/dist/identity.d.ts +31 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/identity.js +64 -0
- package/dist/identity.js.map +1 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/kernel.generated.d.ts +99 -0
- package/dist/kernel.generated.d.ts.map +1 -0
- package/dist/kernel.generated.js +422 -0
- package/dist/kernel.generated.js.map +1 -0
- package/dist/parser/index.d.ts +5 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +3 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/parser.d.ts +11 -0
- package/dist/parser/parser.d.ts.map +1 -0
- package/dist/parser/parser.js +297 -0
- package/dist/parser/parser.js.map +1 -0
- package/dist/parser/values.d.ts +24 -0
- package/dist/parser/values.d.ts.map +1 -0
- package/dist/parser/values.js +284 -0
- package/dist/parser/values.js.map +1 -0
- package/dist/paths.d.ts +6 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +21 -0
- package/dist/paths.js.map +1 -0
- package/dist/references.d.ts +15 -0
- package/dist/references.d.ts.map +1 -0
- package/dist/references.js +40 -0
- package/dist/references.js.map +1 -0
- package/dist/registry/consent.d.ts +11 -0
- package/dist/registry/consent.d.ts.map +1 -0
- package/dist/registry/consent.js +31 -0
- package/dist/registry/consent.js.map +1 -0
- package/dist/registry/extract.d.ts +11 -0
- package/dist/registry/extract.d.ts.map +1 -0
- package/dist/registry/extract.js +275 -0
- package/dist/registry/extract.js.map +1 -0
- package/dist/registry/fields.d.ts +14 -0
- package/dist/registry/fields.d.ts.map +1 -0
- package/dist/registry/fields.js +30 -0
- package/dist/registry/fields.js.map +1 -0
- package/dist/registry/floor.d.ts +17 -0
- package/dist/registry/floor.d.ts.map +1 -0
- package/dist/registry/floor.js +42 -0
- package/dist/registry/floor.js.map +1 -0
- package/dist/registry/index.d.ts +19 -0
- package/dist/registry/index.d.ts.map +1 -0
- package/dist/registry/index.js +80 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/registry/merge.d.ts +32 -0
- package/dist/registry/merge.d.ts.map +1 -0
- package/dist/registry/merge.js +84 -0
- package/dist/registry/merge.js.map +1 -0
- package/dist/registry/order.d.ts +12 -0
- package/dist/registry/order.d.ts.map +1 -0
- package/dist/registry/order.js +134 -0
- package/dist/registry/order.js.map +1 -0
- package/dist/registry/records.d.ts +14 -0
- package/dist/registry/records.d.ts.map +1 -0
- package/dist/registry/records.js +64 -0
- package/dist/registry/records.js.map +1 -0
- package/dist/registry/schemas.d.ts +20 -0
- package/dist/registry/schemas.d.ts.map +1 -0
- package/dist/registry/schemas.js +282 -0
- package/dist/registry/schemas.js.map +1 -0
- package/dist/registry/types.d.ts +130 -0
- package/dist/registry/types.d.ts.map +1 -0
- package/dist/registry/types.js +2 -0
- package/dist/registry/types.js.map +1 -0
- package/dist/scanner/index.d.ts +16 -0
- package/dist/scanner/index.d.ts.map +1 -0
- package/dist/scanner/index.js +78 -0
- package/dist/scanner/index.js.map +1 -0
- package/dist/scanner/lines.d.ts +46 -0
- package/dist/scanner/lines.d.ts.map +1 -0
- package/dist/scanner/lines.js +210 -0
- package/dist/scanner/lines.js.map +1 -0
- package/dist/scanner/tokenize.d.ts +9 -0
- package/dist/scanner/tokenize.d.ts.map +1 -0
- package/dist/scanner/tokenize.js +125 -0
- package/dist/scanner/tokenize.js.map +1 -0
- package/dist/scanner/tokens.d.ts +52 -0
- package/dist/scanner/tokens.d.ts.map +1 -0
- package/dist/scanner/tokens.js +2 -0
- package/dist/scanner/tokens.js.map +1 -0
- package/dist/semantic/cases.d.ts +12 -0
- package/dist/semantic/cases.d.ts.map +1 -0
- package/dist/semantic/cases.js +81 -0
- package/dist/semantic/cases.js.map +1 -0
- package/dist/semantic/cells.d.ts +9 -0
- package/dist/semantic/cells.d.ts.map +1 -0
- package/dist/semantic/cells.js +120 -0
- package/dist/semantic/cells.js.map +1 -0
- package/dist/semantic/conditions.d.ts +22 -0
- package/dist/semantic/conditions.d.ts.map +1 -0
- package/dist/semantic/conditions.js +54 -0
- package/dist/semantic/conditions.js.map +1 -0
- package/dist/semantic/contracts.d.ts +11 -0
- package/dist/semantic/contracts.d.ts.map +1 -0
- package/dist/semantic/contracts.js +75 -0
- package/dist/semantic/contracts.js.map +1 -0
- package/dist/semantic/edges.d.ts +19 -0
- package/dist/semantic/edges.d.ts.map +1 -0
- package/dist/semantic/edges.js +129 -0
- package/dist/semantic/edges.js.map +1 -0
- package/dist/semantic/placement.d.ts +6 -0
- package/dist/semantic/placement.d.ts.map +1 -0
- package/dist/semantic/placement.js +47 -0
- package/dist/semantic/placement.js.map +1 -0
- package/dist/semantic/requirements.d.ts +14 -0
- package/dist/semantic/requirements.d.ts.map +1 -0
- package/dist/semantic/requirements.js +32 -0
- package/dist/semantic/requirements.js.map +1 -0
- package/dist/semantic/resolve.d.ts +23 -0
- package/dist/semantic/resolve.d.ts.map +1 -0
- package/dist/semantic/resolve.js +62 -0
- package/dist/semantic/resolve.js.map +1 -0
- package/dist/semantic/selectors.d.ts +10 -0
- package/dist/semantic/selectors.d.ts.map +1 -0
- package/dist/semantic/selectors.js +33 -0
- package/dist/semantic/selectors.js.map +1 -0
- package/dist/semantic/types.d.ts +56 -0
- package/dist/semantic/types.d.ts.map +1 -0
- package/dist/semantic/types.js +11 -0
- package/dist/semantic/types.js.map +1 -0
- package/dist/semantic/variants.d.ts +10 -0
- package/dist/semantic/variants.d.ts.map +1 -0
- package/dist/semantic/variants.js +63 -0
- package/dist/semantic/variants.js.map +1 -0
- package/dist/semantic/vocabulary.d.ts +12 -0
- package/dist/semantic/vocabulary.d.ts.map +1 -0
- package/dist/semantic/vocabulary.js +33 -0
- package/dist/semantic/vocabulary.js.map +1 -0
- package/dist/taxonomy.d.ts +51 -0
- package/dist/taxonomy.d.ts.map +1 -0
- package/dist/taxonomy.js +42 -0
- package/dist/taxonomy.js.map +1 -0
- package/package.json +221 -3
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
import { diag } from '../diagnostics.js';
|
|
2
|
+
import { scan } from '../scanner/index.js';
|
|
3
|
+
import { itemValue, spell, splitField } from './values.js';
|
|
4
|
+
export const LANGUAGE_VERSION = '1.0';
|
|
5
|
+
export const SUPPORTED_VERSIONS = [LANGUAGE_VERSION];
|
|
6
|
+
const DISCRIMINATOR_RE = /^[a-z][a-z0-9-]*$/;
|
|
7
|
+
const NAME_RE = /^[A-Za-z][A-Za-z0-9-]*$/;
|
|
8
|
+
function linesOf(tokens) {
|
|
9
|
+
const lines = [];
|
|
10
|
+
const trailing = [];
|
|
11
|
+
let current = [];
|
|
12
|
+
for (const t of tokens) {
|
|
13
|
+
switch (t.kind) {
|
|
14
|
+
case 'pragma':
|
|
15
|
+
case 'indent':
|
|
16
|
+
case 'dedent':
|
|
17
|
+
break;
|
|
18
|
+
case 'comment':
|
|
19
|
+
if (t.trailing)
|
|
20
|
+
trailing.push({ line: t.line, text: t.text });
|
|
21
|
+
break;
|
|
22
|
+
case 'newline':
|
|
23
|
+
lines.push({ tokens: current, line: t.line, endLine: t.endLine, depth: t.depth });
|
|
24
|
+
current = [];
|
|
25
|
+
break;
|
|
26
|
+
default:
|
|
27
|
+
current.push(t);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return { lines, trailing };
|
|
31
|
+
}
|
|
32
|
+
class Parser {
|
|
33
|
+
lines;
|
|
34
|
+
path;
|
|
35
|
+
fileEnd;
|
|
36
|
+
index = 0;
|
|
37
|
+
diagnostics = [];
|
|
38
|
+
recordSpans = [];
|
|
39
|
+
constructor(lines, path, fileEnd) {
|
|
40
|
+
this.lines = lines;
|
|
41
|
+
this.path = path;
|
|
42
|
+
this.fileEnd = fileEnd;
|
|
43
|
+
}
|
|
44
|
+
peek() {
|
|
45
|
+
return this.lines[this.index];
|
|
46
|
+
}
|
|
47
|
+
refuse(code, line, message) {
|
|
48
|
+
this.diagnostics.push(diag(code, this.path, line.line, `${this.path}:${line.line}: ${message}`));
|
|
49
|
+
}
|
|
50
|
+
/** Skip every line deeper than `depth`: the block beneath something already refused. */
|
|
51
|
+
skipDeeper(depth) {
|
|
52
|
+
while ((this.peek()?.depth ?? -1) > depth)
|
|
53
|
+
this.index++;
|
|
54
|
+
}
|
|
55
|
+
/** Parse a header line into discriminator and name, or refuse it naming what was found. */
|
|
56
|
+
header(line) {
|
|
57
|
+
const [first, second, third] = line.tokens;
|
|
58
|
+
if (first?.kind !== 'sigil') {
|
|
59
|
+
this.refuse('IA-LANG-HEADER-MALFORMED', line, `a header is '@<discriminator> <name>'; found '${first === undefined ? '' : spell(first)}'`);
|
|
60
|
+
return undefined;
|
|
61
|
+
}
|
|
62
|
+
const discriminator = first.value.slice(1);
|
|
63
|
+
if (!DISCRIMINATOR_RE.test(discriminator)) {
|
|
64
|
+
this.refuse('IA-LANG-HEADER-MALFORMED', line, `discriminator '${discriminator}' must match [a-z][a-z0-9-]*`);
|
|
65
|
+
return undefined;
|
|
66
|
+
}
|
|
67
|
+
if (second === undefined) {
|
|
68
|
+
this.refuse('IA-LANG-HEADER-MALFORMED', line, `'@${discriminator}' is missing its name`);
|
|
69
|
+
return undefined;
|
|
70
|
+
}
|
|
71
|
+
if (second.kind !== 'word' || !NAME_RE.test(second.value)) {
|
|
72
|
+
this.refuse('IA-LANG-HEADER-MALFORMED', line, `name '${spell(second)}' must match [A-Za-z][A-Za-z0-9-]* and carry no fragment`);
|
|
73
|
+
return undefined;
|
|
74
|
+
}
|
|
75
|
+
if (third !== undefined) {
|
|
76
|
+
this.refuse('IA-LANG-HEADER-MALFORMED', line, `unexpected '${spell(third)}' after the name`);
|
|
77
|
+
return undefined;
|
|
78
|
+
}
|
|
79
|
+
return { discriminator, name: second.value };
|
|
80
|
+
}
|
|
81
|
+
/** Parse children at `depth` until a shallower line. */
|
|
82
|
+
children(depth, nested) {
|
|
83
|
+
const out = [];
|
|
84
|
+
for (;;) {
|
|
85
|
+
const line = this.peek();
|
|
86
|
+
if (line === undefined || line.depth < depth)
|
|
87
|
+
return out;
|
|
88
|
+
if (line.depth > depth) {
|
|
89
|
+
// Deeper than any child here can be: indented under an item, or stepped in more than one level.
|
|
90
|
+
this.refuse('IA-LANG-INDENT-STEP', line, `depth ${line.depth} here; at most depth ${depth} can follow`);
|
|
91
|
+
this.index++;
|
|
92
|
+
this.skipDeeper(depth);
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
const first = line.tokens[0];
|
|
96
|
+
if (first?.kind === 'sigil') {
|
|
97
|
+
const record = this.record(line, depth);
|
|
98
|
+
if (record !== undefined) {
|
|
99
|
+
out.push(record);
|
|
100
|
+
nested.push(record);
|
|
101
|
+
}
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
if (first?.kind === 'word' && first.value === '-') {
|
|
105
|
+
this.index++;
|
|
106
|
+
const read = itemValue(line.tokens.slice(1), this.path, line.line);
|
|
107
|
+
this.diagnostics.push(...read.diagnostics);
|
|
108
|
+
const item = { kind: 'item', value: read.value, span: { line: line.line, endLine: line.endLine } };
|
|
109
|
+
out.push(item);
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
const field = this.field(line, depth, nested);
|
|
113
|
+
if (field !== undefined)
|
|
114
|
+
out.push(field);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/** Parse a field line and its block; `undefined` when the line was refused (its block is still consumed). */
|
|
118
|
+
field(line, depth, nested) {
|
|
119
|
+
this.index++;
|
|
120
|
+
const split = splitField(line.tokens, this.path, line.line);
|
|
121
|
+
this.diagnostics.push(...split.diagnostics);
|
|
122
|
+
// A value with no key is refused with its block, unjudged; nothing beneath it can leak into `nested`.
|
|
123
|
+
if (split.key === '') {
|
|
124
|
+
this.skipDeeper(depth);
|
|
125
|
+
return undefined;
|
|
126
|
+
}
|
|
127
|
+
const children = this.children(depth + 1, nested);
|
|
128
|
+
const endLine = children.length > 0 ? children[children.length - 1].span.endLine : line.endLine;
|
|
129
|
+
// A bare key with children is a block; a refused value stays `none` so the refusal is visible.
|
|
130
|
+
const value = split.value.kind === 'none' && children.length > 0 && split.diagnostics.length === 0
|
|
131
|
+
? { kind: 'block' }
|
|
132
|
+
: split.value;
|
|
133
|
+
return {
|
|
134
|
+
kind: 'field',
|
|
135
|
+
key: split.key,
|
|
136
|
+
words: split.words,
|
|
137
|
+
value,
|
|
138
|
+
...(split.when === undefined ? {} : { when: split.when }),
|
|
139
|
+
...(split.assertive === undefined ? {} : { assertive: split.assertive }),
|
|
140
|
+
span: { line: line.line, endLine },
|
|
141
|
+
children,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
record(line, depth) {
|
|
145
|
+
this.index++;
|
|
146
|
+
const header = this.header(line);
|
|
147
|
+
// A refused header takes its whole body with it, unjudged: one refusal, one diagnostic.
|
|
148
|
+
if (header === undefined) {
|
|
149
|
+
this.skipDeeper(depth);
|
|
150
|
+
this.recordSpans.push({ line: line.line, endLine: (this.peek()?.line ?? this.fileEnd + 1) - 1 });
|
|
151
|
+
return undefined;
|
|
152
|
+
}
|
|
153
|
+
const nested = [];
|
|
154
|
+
const head = [];
|
|
155
|
+
const sections = [];
|
|
156
|
+
let sawSection = false;
|
|
157
|
+
let endLine = line.endLine;
|
|
158
|
+
for (;;) {
|
|
159
|
+
const next = this.peek();
|
|
160
|
+
if (next === undefined || next.depth <= depth)
|
|
161
|
+
break;
|
|
162
|
+
if (next.depth > depth + 1) {
|
|
163
|
+
this.refuse('IA-LANG-INDENT-STEP', next, `depth ${next.depth} here; at most depth ${depth + 1} can follow a header`);
|
|
164
|
+
this.index++;
|
|
165
|
+
this.skipDeeper(depth + 1);
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
const first = next.tokens[0];
|
|
169
|
+
if (first?.kind === 'sigil') {
|
|
170
|
+
this.refuse('IA-LANG-HEADER-MALFORMED', next, 'a nested record must be inside a section or a field block, not directly under a header');
|
|
171
|
+
this.index++;
|
|
172
|
+
this.skipDeeper(depth + 1);
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
if (first?.kind === 'word' && first.value === '-') {
|
|
176
|
+
this.refuse('IA-LANG-LIST-MALFORMED', next, 'an item needs a field or a section above it');
|
|
177
|
+
this.index++;
|
|
178
|
+
this.skipDeeper(depth + 1);
|
|
179
|
+
continue;
|
|
180
|
+
}
|
|
181
|
+
const isBare = next.tokens.length === 1 && first?.kind === 'word';
|
|
182
|
+
if (isBare) {
|
|
183
|
+
this.index++;
|
|
184
|
+
const children = this.children(depth + 2, nested);
|
|
185
|
+
const sectionEnd = children.length > 0 ? children[children.length - 1].span.endLine : next.endLine;
|
|
186
|
+
sections.push({ kind: 'section', name: first.value, span: { line: next.line, endLine: sectionEnd }, children });
|
|
187
|
+
sawSection = true;
|
|
188
|
+
endLine = sectionEnd;
|
|
189
|
+
continue;
|
|
190
|
+
}
|
|
191
|
+
if (sawSection) {
|
|
192
|
+
// Refused before its block is read. A key-less line is refused for its missing key, not for its position.
|
|
193
|
+
const split = splitField(next.tokens, this.path, next.line);
|
|
194
|
+
if (split.key === '')
|
|
195
|
+
this.diagnostics.push(...split.diagnostics);
|
|
196
|
+
else
|
|
197
|
+
this.refuse('IA-LANG-HEAD-FIELD-AFTER-SECTION', next, `head field '${split.key}' must precede every section`);
|
|
198
|
+
this.index++;
|
|
199
|
+
this.skipDeeper(depth + 1);
|
|
200
|
+
continue;
|
|
201
|
+
}
|
|
202
|
+
const f = this.field(next, depth + 1, nested);
|
|
203
|
+
if (f === undefined)
|
|
204
|
+
continue;
|
|
205
|
+
endLine = f.span.endLine;
|
|
206
|
+
head.push(f);
|
|
207
|
+
}
|
|
208
|
+
this.recordSpans.push({ line: line.line, endLine: (this.peek()?.line ?? this.fileEnd + 1) - 1 });
|
|
209
|
+
return {
|
|
210
|
+
kind: 'record',
|
|
211
|
+
discriminator: header.discriminator,
|
|
212
|
+
name: header.name,
|
|
213
|
+
head,
|
|
214
|
+
sections,
|
|
215
|
+
nested,
|
|
216
|
+
span: { line: line.line, endLine },
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
file() {
|
|
220
|
+
const records = [];
|
|
221
|
+
while (this.index < this.lines.length) {
|
|
222
|
+
const line = this.lines[this.index];
|
|
223
|
+
const first = line.tokens[0];
|
|
224
|
+
if (line.depth > 0 || first === undefined || first.kind !== 'sigil') {
|
|
225
|
+
const found = first === undefined ? '' : spell(first);
|
|
226
|
+
this.refuse('IA-LANG-TOPLEVEL-UNEXPECTED', line, line.depth > 0
|
|
227
|
+
? 'indented line outside any record'
|
|
228
|
+
: `expected a header '@<discriminator> <name>' at depth 0; found '${found}'`);
|
|
229
|
+
this.index++;
|
|
230
|
+
// Only the block beneath the refused line is consumed; a stray sibling is its own mistake.
|
|
231
|
+
this.skipDeeper(line.depth);
|
|
232
|
+
continue;
|
|
233
|
+
}
|
|
234
|
+
const record = this.record(line, 0);
|
|
235
|
+
if (record !== undefined)
|
|
236
|
+
records.push(record);
|
|
237
|
+
}
|
|
238
|
+
return records;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
function attachTrivia(scanTrivia, trailing, records) {
|
|
242
|
+
// A record's endLine is never below its first line, so the first record whose end is at or
|
|
243
|
+
// past the trivia line is the one it precedes or lies within.
|
|
244
|
+
const ends = records.map((r) => r.span.endLine);
|
|
245
|
+
const owner = (line) => {
|
|
246
|
+
for (let i = 0; i < ends.length; i++)
|
|
247
|
+
if (line <= ends[i])
|
|
248
|
+
return i;
|
|
249
|
+
return 'file';
|
|
250
|
+
};
|
|
251
|
+
const out = [];
|
|
252
|
+
for (const t of scanTrivia) {
|
|
253
|
+
out.push(t.kind === 'comment'
|
|
254
|
+
? { kind: 'comment', line: t.line, text: t.text, attachedTo: owner(t.line), trailing: false }
|
|
255
|
+
: { kind: 'blank', line: t.line, attachedTo: owner(t.line), trailing: false });
|
|
256
|
+
}
|
|
257
|
+
for (const t of trailing)
|
|
258
|
+
out.push({ kind: 'comment', line: t.line, text: t.text, attachedTo: owner(t.line), trailing: true });
|
|
259
|
+
return out.sort((a, b) => a.line - b.line);
|
|
260
|
+
}
|
|
261
|
+
/** Parse one file. Spec sections 1, 2, 9 and 11. */
|
|
262
|
+
export function parse(source, path) {
|
|
263
|
+
const scanned = scan(source, path);
|
|
264
|
+
const empty = { kind: 'file', path, version: scanned.version ?? '', records: [], trivia: [] };
|
|
265
|
+
// A refused file reports only its refusal: nothing after line 1 is judged by this version's rules.
|
|
266
|
+
if (scanned.version === undefined) {
|
|
267
|
+
const diagnostics = scanned.diagnostics.filter((d) => d.code === 'IA-LANG-PRAGMA-MISSING');
|
|
268
|
+
return { ast: { ...empty, syntaxDiagnostics: diagnostics, syntaxRecordSpans: [] }, diagnostics };
|
|
269
|
+
}
|
|
270
|
+
if (!SUPPORTED_VERSIONS.includes(scanned.version)) {
|
|
271
|
+
const diagnostics = [
|
|
272
|
+
diag('IA-LANG-VERSION-UNSUPPORTED', path, 1, `${path}:1: version ${scanned.version} is not supported; supported: ${SUPPORTED_VERSIONS.join(', ')}`),
|
|
273
|
+
];
|
|
274
|
+
return { ast: { ...empty, syntaxDiagnostics: diagnostics, syntaxRecordSpans: [] }, diagnostics };
|
|
275
|
+
}
|
|
276
|
+
const diagnostics = [...scanned.diagnostics];
|
|
277
|
+
const { lines, trailing } = linesOf(scanned.tokens);
|
|
278
|
+
const fileEnd = Math.max(1, ...lines.map((line) => line.endLine), ...diagnostics.map((diagnostic) => diagnostic.endLine ?? diagnostic.line));
|
|
279
|
+
const parser = new Parser(lines, path, fileEnd);
|
|
280
|
+
const records = parser.file();
|
|
281
|
+
diagnostics.push(...parser.diagnostics);
|
|
282
|
+
const trivia = attachTrivia(scanned.trivia, trailing, records);
|
|
283
|
+
diagnostics.sort((a, b) => a.line - b.line);
|
|
284
|
+
const ast = {
|
|
285
|
+
kind: 'file',
|
|
286
|
+
path,
|
|
287
|
+
version: scanned.version,
|
|
288
|
+
records,
|
|
289
|
+
trivia,
|
|
290
|
+
...(diagnostics.length === 0
|
|
291
|
+
? {}
|
|
292
|
+
: { syntaxDiagnostics: diagnostics, syntaxRecordSpans: parser.recordSpans.sort((a, b) => a.line - b.line) }),
|
|
293
|
+
};
|
|
294
|
+
// Scanner and parser diagnostics interleave by source line, not by which stage found them.
|
|
295
|
+
return { ast, diagnostics };
|
|
296
|
+
}
|
|
297
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/parser/parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { ItemValue, Value } from '../ast.js';
|
|
2
|
+
import type { Diagnostic } from '../diagnostics.js';
|
|
3
|
+
import type { Token } from '../scanner/tokens.js';
|
|
4
|
+
export interface SplitField {
|
|
5
|
+
readonly key: string;
|
|
6
|
+
/** The line's words before any string, prose, list or reference, in order; on a scalar line that is every word, the value's included. */
|
|
7
|
+
readonly words: readonly string[];
|
|
8
|
+
readonly value: Value;
|
|
9
|
+
/** The `when` clause as words; a quoted string keeps its quotes so the condition reader can judge it. */
|
|
10
|
+
readonly when?: readonly string[];
|
|
11
|
+
/** Set when the whole line was words in the form `<key> is <value>`. */
|
|
12
|
+
readonly assertive?: boolean;
|
|
13
|
+
readonly diagnostics: readonly Diagnostic[];
|
|
14
|
+
}
|
|
15
|
+
/** How a diagnostic names a token. Shared with the parser. */
|
|
16
|
+
export declare function spell(t: Token): string;
|
|
17
|
+
/** Apply the key rule to a field line's tokens. */
|
|
18
|
+
export declare function splitField(tokens: readonly Token[], path: string, line: number): SplitField;
|
|
19
|
+
/** The value of a `- value` item line: `tokens` are the tokens after the dash. No key rule, no `is` form, no `when` clause; one list item only. */
|
|
20
|
+
export declare function itemValue(tokens: readonly Token[], path: string, line: number): {
|
|
21
|
+
readonly value: ItemValue;
|
|
22
|
+
readonly diagnostics: readonly Diagnostic[];
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=values.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"values.d.ts","sourceRoot":"","sources":["../../src/parser/values.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAY,KAAK,EAAE,MAAM,WAAW,CAAC;AAE5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAElD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,yIAAyI;IACzI,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,yGAAyG;IACzG,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,wEAAwE;IACxE,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,SAAS,UAAU,EAAE,CAAC;CAC7C;AAOD,8DAA8D;AAC9D,wBAAgB,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,MAAM,CAetC;AAoMD,mDAAmD;AACnD,wBAAgB,UAAU,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,CA+F3F;AAED,mJAAmJ;AACnJ,wBAAgB,SAAS,CACvB,MAAM,EAAE,SAAS,KAAK,EAAE,EACxB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GACX;IAAE,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,SAAS,UAAU,EAAE,CAAA;CAAE,CAuC5E"}
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
import { diag } from '../diagnostics.js';
|
|
2
|
+
const DISCRIMINATOR_RE = /^[a-z][a-z0-9-]*$/;
|
|
3
|
+
const NAME_RE = /^[A-Za-z][A-Za-z0-9-]*(#[A-Za-z0-9-]+(\/[A-Za-z0-9-]+)*)?$/;
|
|
4
|
+
/** How a diagnostic names a token. Shared with the parser. */
|
|
5
|
+
export function spell(t) {
|
|
6
|
+
switch (t.kind) {
|
|
7
|
+
case 'list-open':
|
|
8
|
+
return '[';
|
|
9
|
+
case 'list-close':
|
|
10
|
+
return ']';
|
|
11
|
+
case 'list-sep':
|
|
12
|
+
return ',';
|
|
13
|
+
case 'string':
|
|
14
|
+
case 'prose':
|
|
15
|
+
return t.raw;
|
|
16
|
+
case 'word':
|
|
17
|
+
case 'sigil':
|
|
18
|
+
return t.value;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
/** Read `@disc name[#fragment]` from a sigil token and the token after it; `undefined` after a refusal. */
|
|
22
|
+
function refFrom(sigil, nameToken, path, diagnostics) {
|
|
23
|
+
const spelled = sigil.kind === 'sigil' ? sigil.value : '';
|
|
24
|
+
const discriminator = spelled.slice(1);
|
|
25
|
+
if (!DISCRIMINATOR_RE.test(discriminator)) {
|
|
26
|
+
diagnostics.push(diag('IA-LANG-REF-MALFORMED', path, sigil.line, `${path}:${sigil.line}: '${spelled}' is not a discriminator; expected @[a-z][a-z0-9-]*`));
|
|
27
|
+
return undefined;
|
|
28
|
+
}
|
|
29
|
+
const name = nameToken?.kind === 'word' ? nameToken.value : undefined;
|
|
30
|
+
if (name === undefined || !NAME_RE.test(name)) {
|
|
31
|
+
diagnostics.push(diag('IA-LANG-REF-MALFORMED', path, sigil.line, `${path}:${sigil.line}: '@${discriminator}' must be followed by a name matching [A-Za-z][A-Za-z0-9-]* with an optional #fragment`));
|
|
32
|
+
return undefined;
|
|
33
|
+
}
|
|
34
|
+
const hash = name.indexOf('#');
|
|
35
|
+
const bare = hash >= 0 ? name.slice(0, hash) : name;
|
|
36
|
+
const fragment = hash >= 0 ? name.slice(hash + 1) : undefined;
|
|
37
|
+
return {
|
|
38
|
+
kind: 'ref',
|
|
39
|
+
discriminator,
|
|
40
|
+
name: bare,
|
|
41
|
+
...(fragment === undefined ? {} : { fragment }),
|
|
42
|
+
raw: `@${discriminator} ${name}`,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/** Read a list from `tokens[start]` (the `list-open`) to its `list-close`; returns the index after it. */
|
|
46
|
+
function listFrom(tokens, start, path, line, diagnostics) {
|
|
47
|
+
const items = [];
|
|
48
|
+
let pending = [];
|
|
49
|
+
let sawItemSinceSep = false;
|
|
50
|
+
let i = start + 1;
|
|
51
|
+
const flush = () => {
|
|
52
|
+
if (pending.length > 0) {
|
|
53
|
+
items.push({ kind: 'scalar', text: pending.join(' ') });
|
|
54
|
+
pending = [];
|
|
55
|
+
sawItemSinceSep = true;
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
const missingSeparator = (t) => {
|
|
59
|
+
if (sawItemSinceSep || pending.length > 0)
|
|
60
|
+
diagnostics.push(diag('IA-LANG-LIST-MALFORMED', path, t.line, `${path}:${t.line}: missing ',' between list items`));
|
|
61
|
+
};
|
|
62
|
+
while (i < tokens.length) {
|
|
63
|
+
const t = tokens[i];
|
|
64
|
+
switch (t.kind) {
|
|
65
|
+
case 'list-close':
|
|
66
|
+
flush();
|
|
67
|
+
return { value: { kind: 'list', items }, next: i + 1 };
|
|
68
|
+
case 'list-sep':
|
|
69
|
+
flush();
|
|
70
|
+
if (!sawItemSinceSep)
|
|
71
|
+
diagnostics.push(diag('IA-LANG-LIST-MALFORMED', path, t.line, `${path}:${t.line}: empty list item before ','`));
|
|
72
|
+
sawItemSinceSep = false;
|
|
73
|
+
i++;
|
|
74
|
+
continue;
|
|
75
|
+
case 'list-open': {
|
|
76
|
+
diagnostics.push(diag('IA-LANG-LIST-MALFORMED', path, t.line, `${path}:${t.line}: a list cannot contain a list`));
|
|
77
|
+
// Skip the nested list to its matching close, and count it as an item, so one mistake yields one diagnostic.
|
|
78
|
+
let nested = 1;
|
|
79
|
+
i++;
|
|
80
|
+
while (i < tokens.length && nested > 0) {
|
|
81
|
+
const k = tokens[i].kind;
|
|
82
|
+
if (k === 'list-open')
|
|
83
|
+
nested++;
|
|
84
|
+
else if (k === 'list-close')
|
|
85
|
+
nested--;
|
|
86
|
+
i++;
|
|
87
|
+
}
|
|
88
|
+
sawItemSinceSep = true;
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
case 'string':
|
|
92
|
+
missingSeparator(t);
|
|
93
|
+
flush();
|
|
94
|
+
items.push({ kind: 'string', text: t.value, raw: t.raw });
|
|
95
|
+
sawItemSinceSep = true;
|
|
96
|
+
i++;
|
|
97
|
+
continue;
|
|
98
|
+
case 'prose':
|
|
99
|
+
// The tokenizer refuses prose followed by `]` or `,`, so this is reachable only for a
|
|
100
|
+
// prose token that ends an unclosed list; refuse it the same way rather than drop it.
|
|
101
|
+
diagnostics.push(diag('IA-LANG-PROSE-TRAILING', path, t.line, `${path}:${t.line}: prose is not a list item`));
|
|
102
|
+
sawItemSinceSep = true;
|
|
103
|
+
i++;
|
|
104
|
+
continue;
|
|
105
|
+
case 'sigil': {
|
|
106
|
+
missingSeparator(t);
|
|
107
|
+
flush();
|
|
108
|
+
const ref = refFrom(t, tokens[i + 1], path, diagnostics);
|
|
109
|
+
// A refused ref still counts as the item, so a following ',' is not an empty item.
|
|
110
|
+
sawItemSinceSep = true;
|
|
111
|
+
if (ref !== undefined) {
|
|
112
|
+
items.push(ref);
|
|
113
|
+
i += 2;
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
// The rest of a refused item is not judged again: skip to the next separator or the close.
|
|
117
|
+
i++;
|
|
118
|
+
let nested = 0;
|
|
119
|
+
while (i < tokens.length) {
|
|
120
|
+
const k = tokens[i].kind;
|
|
121
|
+
if (k === 'list-open')
|
|
122
|
+
nested++;
|
|
123
|
+
else if (k === 'list-close') {
|
|
124
|
+
if (nested === 0)
|
|
125
|
+
break;
|
|
126
|
+
nested--;
|
|
127
|
+
}
|
|
128
|
+
else if (k === 'list-sep' && nested === 0)
|
|
129
|
+
break;
|
|
130
|
+
i++;
|
|
131
|
+
}
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
case 'word':
|
|
135
|
+
// A word after a string or sigil item, with no separator between, is a second item run together.
|
|
136
|
+
if (sawItemSinceSep && pending.length === 0)
|
|
137
|
+
diagnostics.push(diag('IA-LANG-LIST-MALFORMED', path, t.line, `${path}:${t.line}: missing ',' between list items`));
|
|
138
|
+
pending.push(t.value);
|
|
139
|
+
i++;
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
diagnostics.push(diag('IA-LANG-LIST-UNTERMINATED', path, line, `${path}:${line}: list has no closing ]`));
|
|
144
|
+
flush();
|
|
145
|
+
return { value: { kind: 'list', items }, next: i };
|
|
146
|
+
}
|
|
147
|
+
/** Read one value starting at `tokens[at]`; returns the value (or `none` after a refused ref) and the index after it. */
|
|
148
|
+
function valueAt(tokens, at, path, line, diagnostics) {
|
|
149
|
+
const t = tokens[at];
|
|
150
|
+
switch (t.kind) {
|
|
151
|
+
case 'string':
|
|
152
|
+
return { value: { kind: 'string', text: t.value, raw: t.raw }, end: at + 1 };
|
|
153
|
+
case 'prose':
|
|
154
|
+
return { value: { kind: 'prose', text: t.value, raw: t.raw }, end: at + 1 };
|
|
155
|
+
case 'list-open': {
|
|
156
|
+
const list = listFrom(tokens, at, path, line, diagnostics);
|
|
157
|
+
return { value: list.value, end: list.next };
|
|
158
|
+
}
|
|
159
|
+
case 'sigil': {
|
|
160
|
+
const ref = refFrom(t, tokens[at + 1], path, diagnostics);
|
|
161
|
+
// After a refused ref the rest of the line is not judged again: one mistake, one diagnostic.
|
|
162
|
+
return ref === undefined ? { value: { kind: 'none' }, end: tokens.length } : { value: ref, end: at + 2 };
|
|
163
|
+
}
|
|
164
|
+
case 'word':
|
|
165
|
+
case 'list-sep':
|
|
166
|
+
case 'list-close':
|
|
167
|
+
// A depth-0 `,` or `]` never reaches here from the tokenizer; treat it as trailing.
|
|
168
|
+
return { value: { kind: 'none' }, end: at };
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
function trailing(tokens, end, path, diagnostics) {
|
|
172
|
+
const extra = tokens[end];
|
|
173
|
+
if (extra !== undefined)
|
|
174
|
+
diagnostics.push(diag('IA-LANG-VALUE-TRAILING', path, extra.line, `${path}:${extra.line}: unexpected '${spell(extra)}' after the value`));
|
|
175
|
+
}
|
|
176
|
+
/** Apply the key rule to a field line's tokens. */
|
|
177
|
+
export function splitField(tokens, path, line) {
|
|
178
|
+
const diagnostics = [];
|
|
179
|
+
// `when` is a keyword only at list depth 0, and never as the name token right after a sigil.
|
|
180
|
+
let whenAt = -1;
|
|
181
|
+
let depth = 0;
|
|
182
|
+
for (let i = 1; i < tokens.length; i++) {
|
|
183
|
+
const t = tokens[i];
|
|
184
|
+
if (t.kind === 'list-open')
|
|
185
|
+
depth++;
|
|
186
|
+
else if (t.kind === 'list-close')
|
|
187
|
+
depth--;
|
|
188
|
+
else if (t.kind === 'sigil' && tokens[i + 1]?.kind === 'word')
|
|
189
|
+
i++;
|
|
190
|
+
else if (depth === 0 && t.kind === 'word' && t.value === 'when') {
|
|
191
|
+
whenAt = i;
|
|
192
|
+
break;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
const body = whenAt >= 0 ? tokens.slice(0, whenAt) : tokens;
|
|
196
|
+
const firstValue = body.findIndex((t) => t.kind !== 'word');
|
|
197
|
+
const words = (firstValue < 0 ? body : body.slice(0, firstValue)).flatMap((t) => t.kind === 'word' ? [t.value] : []);
|
|
198
|
+
let key = words.join(' ');
|
|
199
|
+
if (firstValue >= 0 && key === '') {
|
|
200
|
+
// A value with no key is refused unread, its when clause included: one mistake, one diagnostic.
|
|
201
|
+
const first = body[firstValue];
|
|
202
|
+
diagnostics.push(diag('IA-LANG-FIELD-KEY-MISSING', path, first.line, `${path}:${first.line}: a field needs a key before its value; found '${spell(first)}'`));
|
|
203
|
+
return { key, words, value: { kind: 'none' }, diagnostics };
|
|
204
|
+
}
|
|
205
|
+
let when;
|
|
206
|
+
if (whenAt >= 0) {
|
|
207
|
+
when = [];
|
|
208
|
+
const clause = tokens.slice(whenAt + 1);
|
|
209
|
+
if (clause.length === 0) {
|
|
210
|
+
diagnostics.push(diag('IA-LANG-VALUE-TRAILING', path, tokens[whenAt].line, `${path}:${tokens[whenAt].line}: 'when' has no condition after it`));
|
|
211
|
+
}
|
|
212
|
+
for (const t of clause) {
|
|
213
|
+
if (t.kind === 'word' || t.kind === 'sigil')
|
|
214
|
+
when.push(t.value);
|
|
215
|
+
else if (t.kind === 'string')
|
|
216
|
+
when.push(t.raw);
|
|
217
|
+
else {
|
|
218
|
+
diagnostics.push(diag('IA-LANG-VALUE-TRAILING', path, t.line, `${path}:${t.line}: unexpected '${spell(t)}' in a when clause; a condition is words, quoted strings and references only`));
|
|
219
|
+
break;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
let value = { kind: 'none' };
|
|
224
|
+
let assertive;
|
|
225
|
+
if (firstValue < 0) {
|
|
226
|
+
if (words.length >= 3 && words[1] === 'is') {
|
|
227
|
+
key = words[0] ?? '';
|
|
228
|
+
value = { kind: 'scalar', text: words.slice(2).join(' ') };
|
|
229
|
+
assertive = true;
|
|
230
|
+
}
|
|
231
|
+
else if (words.length >= 2) {
|
|
232
|
+
key = words[0] ?? '';
|
|
233
|
+
value = { kind: 'scalar', text: words.slice(1).join(' ') };
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
else {
|
|
237
|
+
const read = valueAt(body, firstValue, path, line, diagnostics);
|
|
238
|
+
value = read.value;
|
|
239
|
+
trailing(body, read.end, path, diagnostics);
|
|
240
|
+
}
|
|
241
|
+
return {
|
|
242
|
+
key,
|
|
243
|
+
words,
|
|
244
|
+
value,
|
|
245
|
+
...(when === undefined ? {} : { when }),
|
|
246
|
+
...(assertive === undefined ? {} : { assertive }),
|
|
247
|
+
diagnostics,
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
/** The value of a `- value` item line: `tokens` are the tokens after the dash. No key rule, no `is` form, no `when` clause; one list item only. */
|
|
251
|
+
export function itemValue(tokens, path, line) {
|
|
252
|
+
const diagnostics = [];
|
|
253
|
+
const first = tokens[0];
|
|
254
|
+
if (first === undefined) {
|
|
255
|
+
diagnostics.push(diag('IA-LANG-LIST-MALFORMED', path, line, `${path}:${line}: an item needs a value after '-'`));
|
|
256
|
+
return { value: { kind: 'none' }, diagnostics };
|
|
257
|
+
}
|
|
258
|
+
if (first.kind === 'word') {
|
|
259
|
+
const wordsEnd = tokens.findIndex((t) => t.kind !== 'word');
|
|
260
|
+
const end = wordsEnd < 0 ? tokens.length : wordsEnd;
|
|
261
|
+
const value = {
|
|
262
|
+
kind: 'scalar',
|
|
263
|
+
text: tokens
|
|
264
|
+
.slice(0, end)
|
|
265
|
+
.flatMap((t) => (t.kind === 'word' ? [t.value] : []))
|
|
266
|
+
.join(' '),
|
|
267
|
+
};
|
|
268
|
+
trailing(tokens, end, path, diagnostics);
|
|
269
|
+
return { value, diagnostics };
|
|
270
|
+
}
|
|
271
|
+
if (first.kind === 'prose' || first.kind === 'list-open') {
|
|
272
|
+
// An item line holds one list item; prose or a list there is refused unread (spec 2.1, 2.4).
|
|
273
|
+
diagnostics.push(diag('IA-LANG-LIST-MALFORMED', path, line, `${path}:${line}: an item is a scalar, a string or a reference, not ${first.kind === 'prose' ? 'prose' : 'a list'}`));
|
|
274
|
+
return { value: { kind: 'none' }, diagnostics };
|
|
275
|
+
}
|
|
276
|
+
const read = valueAt(tokens, 0, path, line, diagnostics);
|
|
277
|
+
const value = read.value;
|
|
278
|
+
// `valueAt` on a string or sigil token yields a string, a reference or `none`; the guard above keeps the rest out.
|
|
279
|
+
if (value.kind === 'prose' || value.kind === 'list' || value.kind === 'block')
|
|
280
|
+
return { value: { kind: 'none' }, diagnostics };
|
|
281
|
+
trailing(tokens, read.end, path, diagnostics);
|
|
282
|
+
return { value, diagnostics };
|
|
283
|
+
}
|
|
284
|
+
//# sourceMappingURL=values.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"values.js","sourceRoot":"","sources":["../../src/parser/values.ts"],"names":[],"mappings":"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"}
|