@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.
Files changed (182) hide show
  1. package/LANGUAGE.md +56 -0
  2. package/LICENSE +202 -0
  3. package/NOTICE +4 -0
  4. package/README.md +33 -2
  5. package/SPEC.md +225 -0
  6. package/dist/ast.d.ts +114 -0
  7. package/dist/ast.d.ts.map +1 -0
  8. package/dist/ast.js +2 -0
  9. package/dist/ast.js.map +1 -0
  10. package/dist/compile/compile.d.ts +82 -0
  11. package/dist/compile/compile.d.ts.map +1 -0
  12. package/dist/compile/compile.js +249 -0
  13. package/dist/compile/compile.js.map +1 -0
  14. package/dist/compile/index.d.ts +6 -0
  15. package/dist/compile/index.d.ts.map +1 -0
  16. package/dist/compile/index.js +4 -0
  17. package/dist/compile/index.js.map +1 -0
  18. package/dist/compile/spellings.d.ts +7 -0
  19. package/dist/compile/spellings.d.ts.map +1 -0
  20. package/dist/compile/spellings.js +47 -0
  21. package/dist/compile/spellings.js.map +1 -0
  22. package/dist/compile/values.d.ts +32 -0
  23. package/dist/compile/values.d.ts.map +1 -0
  24. package/dist/compile/values.js +48 -0
  25. package/dist/compile/values.js.map +1 -0
  26. package/dist/diagnostics.d.ts +22 -0
  27. package/dist/diagnostics.d.ts.map +1 -0
  28. package/dist/diagnostics.js +71 -0
  29. package/dist/diagnostics.js.map +1 -0
  30. package/dist/editor/index.d.ts +49 -0
  31. package/dist/editor/index.d.ts.map +1 -0
  32. package/dist/editor/index.js +155 -0
  33. package/dist/editor/index.js.map +1 -0
  34. package/dist/fold.d.ts +8 -0
  35. package/dist/fold.d.ts.map +1 -0
  36. package/dist/fold.js +26 -0
  37. package/dist/fold.js.map +1 -0
  38. package/dist/formatter.d.ts +10 -0
  39. package/dist/formatter.d.ts.map +1 -0
  40. package/dist/formatter.js +108 -0
  41. package/dist/formatter.js.map +1 -0
  42. package/dist/identity.d.ts +31 -0
  43. package/dist/identity.d.ts.map +1 -0
  44. package/dist/identity.js +64 -0
  45. package/dist/identity.js.map +1 -0
  46. package/dist/index.d.ts +35 -0
  47. package/dist/index.d.ts.map +1 -0
  48. package/dist/index.js +22 -0
  49. package/dist/index.js.map +1 -0
  50. package/dist/kernel.generated.d.ts +99 -0
  51. package/dist/kernel.generated.d.ts.map +1 -0
  52. package/dist/kernel.generated.js +422 -0
  53. package/dist/kernel.generated.js.map +1 -0
  54. package/dist/parser/index.d.ts +5 -0
  55. package/dist/parser/index.d.ts.map +1 -0
  56. package/dist/parser/index.js +3 -0
  57. package/dist/parser/index.js.map +1 -0
  58. package/dist/parser/parser.d.ts +11 -0
  59. package/dist/parser/parser.d.ts.map +1 -0
  60. package/dist/parser/parser.js +297 -0
  61. package/dist/parser/parser.js.map +1 -0
  62. package/dist/parser/values.d.ts +24 -0
  63. package/dist/parser/values.d.ts.map +1 -0
  64. package/dist/parser/values.js +284 -0
  65. package/dist/parser/values.js.map +1 -0
  66. package/dist/paths.d.ts +6 -0
  67. package/dist/paths.d.ts.map +1 -0
  68. package/dist/paths.js +21 -0
  69. package/dist/paths.js.map +1 -0
  70. package/dist/references.d.ts +15 -0
  71. package/dist/references.d.ts.map +1 -0
  72. package/dist/references.js +40 -0
  73. package/dist/references.js.map +1 -0
  74. package/dist/registry/consent.d.ts +11 -0
  75. package/dist/registry/consent.d.ts.map +1 -0
  76. package/dist/registry/consent.js +31 -0
  77. package/dist/registry/consent.js.map +1 -0
  78. package/dist/registry/extract.d.ts +11 -0
  79. package/dist/registry/extract.d.ts.map +1 -0
  80. package/dist/registry/extract.js +275 -0
  81. package/dist/registry/extract.js.map +1 -0
  82. package/dist/registry/fields.d.ts +14 -0
  83. package/dist/registry/fields.d.ts.map +1 -0
  84. package/dist/registry/fields.js +30 -0
  85. package/dist/registry/fields.js.map +1 -0
  86. package/dist/registry/floor.d.ts +17 -0
  87. package/dist/registry/floor.d.ts.map +1 -0
  88. package/dist/registry/floor.js +42 -0
  89. package/dist/registry/floor.js.map +1 -0
  90. package/dist/registry/index.d.ts +19 -0
  91. package/dist/registry/index.d.ts.map +1 -0
  92. package/dist/registry/index.js +80 -0
  93. package/dist/registry/index.js.map +1 -0
  94. package/dist/registry/merge.d.ts +32 -0
  95. package/dist/registry/merge.d.ts.map +1 -0
  96. package/dist/registry/merge.js +84 -0
  97. package/dist/registry/merge.js.map +1 -0
  98. package/dist/registry/order.d.ts +12 -0
  99. package/dist/registry/order.d.ts.map +1 -0
  100. package/dist/registry/order.js +134 -0
  101. package/dist/registry/order.js.map +1 -0
  102. package/dist/registry/records.d.ts +14 -0
  103. package/dist/registry/records.d.ts.map +1 -0
  104. package/dist/registry/records.js +64 -0
  105. package/dist/registry/records.js.map +1 -0
  106. package/dist/registry/schemas.d.ts +20 -0
  107. package/dist/registry/schemas.d.ts.map +1 -0
  108. package/dist/registry/schemas.js +282 -0
  109. package/dist/registry/schemas.js.map +1 -0
  110. package/dist/registry/types.d.ts +130 -0
  111. package/dist/registry/types.d.ts.map +1 -0
  112. package/dist/registry/types.js +2 -0
  113. package/dist/registry/types.js.map +1 -0
  114. package/dist/scanner/index.d.ts +16 -0
  115. package/dist/scanner/index.d.ts.map +1 -0
  116. package/dist/scanner/index.js +78 -0
  117. package/dist/scanner/index.js.map +1 -0
  118. package/dist/scanner/lines.d.ts +46 -0
  119. package/dist/scanner/lines.d.ts.map +1 -0
  120. package/dist/scanner/lines.js +210 -0
  121. package/dist/scanner/lines.js.map +1 -0
  122. package/dist/scanner/tokenize.d.ts +9 -0
  123. package/dist/scanner/tokenize.d.ts.map +1 -0
  124. package/dist/scanner/tokenize.js +125 -0
  125. package/dist/scanner/tokenize.js.map +1 -0
  126. package/dist/scanner/tokens.d.ts +52 -0
  127. package/dist/scanner/tokens.d.ts.map +1 -0
  128. package/dist/scanner/tokens.js +2 -0
  129. package/dist/scanner/tokens.js.map +1 -0
  130. package/dist/semantic/cases.d.ts +12 -0
  131. package/dist/semantic/cases.d.ts.map +1 -0
  132. package/dist/semantic/cases.js +81 -0
  133. package/dist/semantic/cases.js.map +1 -0
  134. package/dist/semantic/cells.d.ts +9 -0
  135. package/dist/semantic/cells.d.ts.map +1 -0
  136. package/dist/semantic/cells.js +120 -0
  137. package/dist/semantic/cells.js.map +1 -0
  138. package/dist/semantic/conditions.d.ts +22 -0
  139. package/dist/semantic/conditions.d.ts.map +1 -0
  140. package/dist/semantic/conditions.js +54 -0
  141. package/dist/semantic/conditions.js.map +1 -0
  142. package/dist/semantic/contracts.d.ts +11 -0
  143. package/dist/semantic/contracts.d.ts.map +1 -0
  144. package/dist/semantic/contracts.js +75 -0
  145. package/dist/semantic/contracts.js.map +1 -0
  146. package/dist/semantic/edges.d.ts +19 -0
  147. package/dist/semantic/edges.d.ts.map +1 -0
  148. package/dist/semantic/edges.js +129 -0
  149. package/dist/semantic/edges.js.map +1 -0
  150. package/dist/semantic/placement.d.ts +6 -0
  151. package/dist/semantic/placement.d.ts.map +1 -0
  152. package/dist/semantic/placement.js +47 -0
  153. package/dist/semantic/placement.js.map +1 -0
  154. package/dist/semantic/requirements.d.ts +14 -0
  155. package/dist/semantic/requirements.d.ts.map +1 -0
  156. package/dist/semantic/requirements.js +32 -0
  157. package/dist/semantic/requirements.js.map +1 -0
  158. package/dist/semantic/resolve.d.ts +23 -0
  159. package/dist/semantic/resolve.d.ts.map +1 -0
  160. package/dist/semantic/resolve.js +62 -0
  161. package/dist/semantic/resolve.js.map +1 -0
  162. package/dist/semantic/selectors.d.ts +10 -0
  163. package/dist/semantic/selectors.d.ts.map +1 -0
  164. package/dist/semantic/selectors.js +33 -0
  165. package/dist/semantic/selectors.js.map +1 -0
  166. package/dist/semantic/types.d.ts +56 -0
  167. package/dist/semantic/types.d.ts.map +1 -0
  168. package/dist/semantic/types.js +11 -0
  169. package/dist/semantic/types.js.map +1 -0
  170. package/dist/semantic/variants.d.ts +10 -0
  171. package/dist/semantic/variants.d.ts.map +1 -0
  172. package/dist/semantic/variants.js +63 -0
  173. package/dist/semantic/variants.js.map +1 -0
  174. package/dist/semantic/vocabulary.d.ts +12 -0
  175. package/dist/semantic/vocabulary.d.ts.map +1 -0
  176. package/dist/semantic/vocabulary.js +33 -0
  177. package/dist/semantic/vocabulary.js.map +1 -0
  178. package/dist/taxonomy.d.ts +51 -0
  179. package/dist/taxonomy.d.ts.map +1 -0
  180. package/dist/taxonomy.js +42 -0
  181. package/dist/taxonomy.js.map +1 -0
  182. 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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"}