@scinorandex/sparse 0.1.1 → 0.1.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.
Files changed (65) hide show
  1. package/.github/workflows/ci.yml +41 -0
  2. package/AGENTS.md +31 -11
  3. package/README.md +283 -29
  4. package/dist/cli.js +113 -24
  5. package/dist/cli.js.map +1 -1
  6. package/dist/generator.d.ts +3 -1
  7. package/dist/generator.js +29 -5
  8. package/dist/generator.js.map +1 -1
  9. package/dist/index.d.ts +16 -4
  10. package/dist/index.js +34 -1
  11. package/dist/index.js.map +1 -1
  12. package/dist/meta/common.d.ts +17 -0
  13. package/dist/meta/common.js +66 -1
  14. package/dist/meta/common.js.map +1 -1
  15. package/dist/meta/selfhosted.d.ts +4 -5
  16. package/dist/meta/selfhosted.js +49 -36
  17. package/dist/meta/selfhosted.js.map +1 -1
  18. package/dist/parser.d.ts +56 -35
  19. package/dist/parser.js +146 -18
  20. package/dist/parser.js.map +1 -1
  21. package/dist/table/selfhosted.d.ts +10 -1
  22. package/dist/table/selfhosted.js +32 -12
  23. package/dist/table/selfhosted.js.map +1 -1
  24. package/dist/table/validate.d.ts +17 -0
  25. package/dist/table/validate.js +84 -0
  26. package/dist/table/validate.js.map +1 -0
  27. package/dist/utils/Stack.d.ts +4 -0
  28. package/dist/utils/Stack.js +16 -1
  29. package/dist/utils/Stack.js.map +1 -1
  30. package/dist/utils/errorWindowBuilder.js +11 -11
  31. package/dist/utils/errorWindowBuilder.js.map +1 -1
  32. package/dist/utils/loadFiles.d.ts +8 -0
  33. package/dist/utils/loadFiles.js +47 -0
  34. package/dist/utils/loadFiles.js.map +1 -0
  35. package/dist/utils/reducers.d.ts +9 -0
  36. package/dist/utils/reducers.js +56 -0
  37. package/dist/utils/reducers.js.map +1 -0
  38. package/example/LoLang/example.ts +16 -15
  39. package/example/kleene-test/example.ts +35 -17
  40. package/example/math/example.ts +12 -7
  41. package/example/selfhosted/example.ts +30 -24
  42. package/opencode.json +1 -1
  43. package/package.json +2 -2
  44. package/src/cli.ts +132 -23
  45. package/src/generator.ts +49 -8
  46. package/src/index.ts +55 -3
  47. package/src/meta/common.ts +116 -0
  48. package/src/meta/selfhosted.ts +42 -11
  49. package/src/parser.ts +259 -49
  50. package/src/table/selfhosted.ts +48 -12
  51. package/src/table/validate.ts +143 -0
  52. package/src/utils/Stack.ts +22 -2
  53. package/src/utils/errorWindowBuilder.ts +15 -13
  54. package/src/utils/loadFiles.ts +54 -0
  55. package/src/utils/reducers.ts +93 -0
  56. package/test/cli.test.ts +144 -0
  57. package/test/codegen.test.ts +75 -0
  58. package/test/grammar.test.ts +243 -0
  59. package/test/helpers.ts +59 -0
  60. package/test/lalr.test.ts +114 -0
  61. package/test/parser.test.ts +392 -0
  62. package/test/table.test.ts +144 -0
  63. package/tsconfig.json +1 -1
  64. package/example/LoLang/table2.txt +0 -497
  65. package/example/complicated/grammar.txt +0 -37
@@ -1 +1 @@
1
- {"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,11 @@
1
+ import { Production } from "../meta/common";
1
2
  import { TableState } from "../parser";
2
- export declare const buildStates: (grammar: string) => TableState[];
3
+ import { Result } from "../utils/Result";
4
+ import { TableFormatWarning } from "./validate";
5
+ export type BuildStatesOptions = {
6
+ productions?: Production[];
7
+ source?: string;
8
+ onWarning?: (warning: TableFormatWarning) => void;
9
+ };
10
+ export declare const tryBuildStates: (table: string, options?: BuildStatesOptions) => Result<TableState[]>;
11
+ export declare const buildStates: (table: string, options?: BuildStatesOptions) => TableState[];
@@ -1,9 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.buildStates = void 0;
3
+ exports.buildStates = exports.tryBuildStates = void 0;
4
+ const common_1 = require("../meta/common");
4
5
  const selfhosted_1 = require("../meta/selfhosted");
5
6
  const parser_1 = require("../parser");
6
7
  const states_1 = require("./states");
8
+ const validate_1 = require("./validate");
7
9
  class StateNode extends selfhosted_1.BaseNode {
8
10
  constructor(items) {
9
11
  super();
@@ -11,19 +13,21 @@ class StateNode extends selfhosted_1.BaseNode {
11
13
  }
12
14
  toTableState() {
13
15
  const state = new parser_1.TableState();
14
- for (const item of this.items.getItems()) {
16
+ for (const item of this.items.getItemsReversed()) {
15
17
  const key = item.type === "terminal" ? `[${item.name.lexeme}]` : `<${item.name.lexeme}>`;
16
18
  state.actions.set(key, item.action);
19
+ state.rawActions.set(key, item.rawAction);
17
20
  }
18
21
  return state;
19
22
  }
20
23
  }
21
24
  class ItemNode extends selfhosted_1.BaseNode {
22
- constructor(type, name, action) {
25
+ constructor(type, name, action, rawAction) {
23
26
  super();
24
27
  this.type = type;
25
28
  this.name = name;
26
29
  this.action = action;
30
+ this.rawAction = rawAction;
27
31
  }
28
32
  }
29
33
  const reducers = {
@@ -45,21 +49,37 @@ const reducers = {
45
49
  type: bag.action.lexeme.startsWith("s") ? "shift" : "reduce",
46
50
  value: parseInt(bag.action.lexeme.substring(1)),
47
51
  };
48
- return new ItemNode("terminal", bag.name, action);
52
+ return new ItemNode("terminal", bag.name, action, bag.action.lexeme);
49
53
  },
50
54
  variable: (bag) => {
51
55
  const action = { type: "goto", value: parseInt(bag.state.lexeme) };
52
- return new ItemNode("variable", bag.name, action);
56
+ return new ItemNode("variable", bag.name, action, bag.state.lexeme);
53
57
  },
54
58
  };
55
- const buildStates = (grammar) => {
56
- const lexer = selfhosted_1.grammarLexerGenerator.generate(grammar, () => ({}));
59
+ const tryBuildStates = (table, options = {}) => {
60
+ const lexer = selfhosted_1.grammarLexerGenerator.generate(table, () => ({}));
57
61
  const parserGenerator = (0, selfhosted_1.getSelfHostedParserGenerator)(states_1.selfhosted);
58
- const parser = parserGenerator.generate(lexer, {
59
- reducer: ({ bag, name }) => reducers[name !== null && name !== void 0 ? name : ""](bag),
60
- });
61
- const parsingResult = parser.parse().result.getItemsReversed();
62
- return parsingResult.map((state) => state.toTableState());
62
+ let states;
63
+ try {
64
+ const parser = parserGenerator.generate(lexer, {
65
+ reducer: ({ bag, name }) => reducers[name !== null && name !== void 0 ? name : ""](bag),
66
+ });
67
+ states = parser.parse().result;
68
+ }
69
+ catch (err) {
70
+ if (err instanceof parser_1.LR1ParserGraveError && err.currentToken != null)
71
+ return { success: false, reason: err.reason, token: err.currentToken };
72
+ return { success: false, reason: (0, common_1.describeThrowable)(err), token: (0, common_1.syntheticGrammarToken)() };
73
+ }
74
+ const tableStates = states.getItemsReversed().map((state) => state.toTableState());
75
+ return (0, validate_1.validateTableStates)(tableStates, options);
76
+ };
77
+ exports.tryBuildStates = tryBuildStates;
78
+ const buildStates = (table, options = {}) => {
79
+ const result = (0, exports.tryBuildStates)(table, options);
80
+ if (result.success === false)
81
+ throw new Error(`Encountered error "${result.reason}" while parsing the parsing table at ${result.token.line}:${result.token.column}`);
82
+ return result.value;
63
83
  };
64
84
  exports.buildStates = buildStates;
65
85
  //# sourceMappingURL=selfhosted.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"selfhosted.js","sourceRoot":"","sources":["../../src/table/selfhosted.ts"],"names":[],"mappings":"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StB"}
1
+ {"version":3,"file":"selfhosted.js","sourceRoot":"","sources":["../../src/table/selfhosted.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { Production } from "../meta/common";
2
+ import type { TableState } from "../parser";
3
+ import { Result } from "../utils/Result";
4
+ export type TableFormatWarning = {
5
+ reason: string;
6
+ stateIndex: number;
7
+ };
8
+ export type ValidateTableStatesOptions = {
9
+ productions?: Production[];
10
+ source?: string;
11
+ onWarning?: (warning: TableFormatWarning) => void;
12
+ };
13
+ export declare const validateTableStates: (states: TableState[], options?: ValidateTableStatesOptions) => Result<TableState[]>;
14
+ export type ValidateTableOptions = {
15
+ source?: string;
16
+ };
17
+ export declare const validateTable: (productions: Production[], states: TableState[], options?: ValidateTableOptions) => Result<TableState[]>;
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateTable = exports.validateTableStates = void 0;
4
+ const common_1 = require("../meta/common");
5
+ const SHIFT_REDUCE_RE = /^([sr])(\d+)$/;
6
+ const GOTO_RE = /^(\d+)$/;
7
+ const defaultRawAction = (action) => `${action.type === "goto" ? "" : action.type === "shift" ? "s" : "r"}${action.value}`;
8
+ ;
9
+ const STATE_NAME_PATTERN = /^(\[[^\]]+\]|<[^>]+>)$/;
10
+ const validateTableStates = (states, options = {}) => {
11
+ var _a, _b;
12
+ const { productions, source } = options;
13
+ const suffix = source == null ? "" : ` in ${source}`;
14
+ const stateCount = states.length;
15
+ const fail = (reason, stateIndex) => ({
16
+ success: false,
17
+ reason: `${reason}${suffix}`,
18
+ token: tokenFor(stateIndex, productions),
19
+ });
20
+ if (stateCount === 0)
21
+ return {
22
+ success: false,
23
+ reason: `The parsing table${suffix} does not contain any states`,
24
+ token: (0, common_1.syntheticGrammarToken)(),
25
+ };
26
+ for (let stateIndex = 0; stateIndex < stateCount; stateIndex++) {
27
+ const state = states[stateIndex];
28
+ if (state == null)
29
+ return fail(`State ${stateIndex} is missing`, stateIndex);
30
+ if (stateIndex === 0 && state.actions.size === 0)
31
+ return fail("State 0 has no actions, so the parser cannot read the first token", stateIndex);
32
+ for (const [key, action] of state.actions.entries()) {
33
+ const nameMatch = STATE_NAME_PATTERN.exec(key);
34
+ if (nameMatch == null)
35
+ return fail(`State ${stateIndex} has the entry "${key}", which is neither a terminal "[NAME]" nor a variable "<NAME>"`, stateIndex);
36
+ const isVariable = nameMatch[1].startsWith("<");
37
+ if (isVariable !== (action.type === "goto"))
38
+ return fail(`State ${stateIndex} maps the variable "${key}" to a "${action.type}" action, but variables can only be reached by a "goto" action`, stateIndex);
39
+ const raw = (_a = state.rawActions.get(key)) !== null && _a !== void 0 ? _a : defaultRawAction(action);
40
+ const expected = isVariable ? GOTO_RE : SHIFT_REDUCE_RE;
41
+ if (expected.test(raw) === false || Number.isInteger(action.value) === false)
42
+ return fail(`State ${stateIndex} has the action "${key}=${raw}" for ${isVariable ? "a variable" : "a terminal"}, but it should be ${isVariable ? "a state number" : '"sN" (shift) or "rN" (reduce)'}`, stateIndex);
43
+ if (isVariable || action.type === "shift") {
44
+ if (action.value >= stateCount)
45
+ return fail(`State ${stateIndex} sends "${key}" to state ${action.value}, but the table only has ${stateCount} states (0 to ${stateCount - 1})`, stateIndex);
46
+ }
47
+ else if (productions != null && action.value >= productions.length)
48
+ return fail(`State ${stateIndex} reduces "${key}" by production ${action.value}, but the grammar only has ${productions.length} productions (0 to ${productions.length - 1}). Is the table stale?`, stateIndex);
49
+ }
50
+ const shiftTargets = new Set();
51
+ for (const action of state.actions.values()) {
52
+ if (action.type !== "shift")
53
+ continue;
54
+ if (shiftTargets.has(action.value))
55
+ (_b = options.onWarning) === null || _b === void 0 ? void 0 : _b.call(options, {
56
+ reason: `State ${stateIndex} has two terminals that shift to state ${action.value}`,
57
+ stateIndex,
58
+ });
59
+ shiftTargets.add(action.value);
60
+ }
61
+ }
62
+ return { success: true, value: states };
63
+ };
64
+ exports.validateTableStates = validateTableStates;
65
+ const validateTable = (productions, states, options = {}) => {
66
+ const statesResult = (0, exports.validateTableStates)(states, Object.assign(Object.assign({}, options), { productions }));
67
+ if (statesResult.success === false)
68
+ return statesResult;
69
+ const suffix = options.source == null ? "" : ` in ${options.source}`;
70
+ if (productions.length === 0)
71
+ return {
72
+ success: false,
73
+ reason: `The grammar${suffix} does not contain any productions, so the table cannot belong to it`,
74
+ token: (0, common_1.syntheticGrammarToken)(),
75
+ };
76
+ return { success: true, value: states };
77
+ };
78
+ exports.validateTable = validateTable;
79
+ const tokenFor = (stateIndex, productions) => {
80
+ if (productions != null && productions.length > 0)
81
+ return productions[Math.min(stateIndex, productions.length - 1)].lhs;
82
+ return (0, common_1.syntheticGrammarToken)();
83
+ };
84
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/table/validate.ts"],"names":[],"mappings":"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"}
@@ -3,5 +3,9 @@ export declare class Stack<T> {
3
3
  push(item: T): void;
4
4
  pop(): T;
5
5
  peek(): T;
6
+ peekAt(depth: number): T;
7
+ get size(): number;
8
+ get isEmpty(): boolean;
9
+ toArray(): T[];
6
10
  constructor(items?: T[]);
7
11
  }
@@ -17,9 +17,24 @@ class Stack {
17
17
  throw new Error("Stack is empty");
18
18
  return ret;
19
19
  }
20
+ peekAt(depth) {
21
+ const ret = this.items[this.items.length - 1 - depth];
22
+ if (ret === undefined)
23
+ throw new Error(`Stack does not have an item at depth ${depth}`);
24
+ return ret;
25
+ }
26
+ get size() {
27
+ return this.items.length;
28
+ }
29
+ get isEmpty() {
30
+ return this.items.length === 0;
31
+ }
32
+ toArray() {
33
+ return [...this.items];
34
+ }
20
35
  constructor(items = []) {
21
36
  this.items = [];
22
- this.items = items;
37
+ this.items = [...items];
23
38
  }
24
39
  }
25
40
  exports.Stack = Stack;
@@ -1 +1 @@
1
- {"version":3,"file":"Stack.js","sourceRoot":"","sources":["../../src/utils/Stack.ts"],"names":[],"mappings":";;;AAAA,MAAa,KAAK;IAGT,IAAI,CAAC,IAAO;QACjB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IAEM,GAAG;QACR,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QAC9B,IAAI,IAAI,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAC1D,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,IAAI;QACT,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC9C,IAAI,GAAG,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACzD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,YAAY,QAAa,EAAE;QAlBnB,UAAK,GAAQ,EAAE,CAAC;QAmBtB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;CACF;AAtBD,sBAsBC"}
1
+ {"version":3,"file":"Stack.js","sourceRoot":"","sources":["../../src/utils/Stack.ts"],"names":[],"mappings":";;;AAAA,MAAa,KAAK;IAGT,IAAI,CAAC,IAAO;QACjB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IAEM,GAAG;QACR,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QAC9B,IAAI,IAAI,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAC1D,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,IAAI;QACT,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC9C,IAAI,GAAG,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACzD,OAAO,GAAG,CAAC;IACb,CAAC;IAGM,MAAM,CAAC,KAAa;QACzB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;QACtD,IAAI,GAAG,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,KAAK,EAAE,CAAC,CAAC;QACxF,OAAO,GAAG,CAAC;IACb,CAAC;IAED,IAAW,IAAI;QACb,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IAC3B,CAAC;IAED,IAAW,OAAO;QAChB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC;IACjC,CAAC;IAGM,OAAO;QACZ,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IAED,YAAY,QAAa,EAAE;QAtCnB,UAAK,GAAQ,EAAE,CAAC;QAuCtB,IAAI,CAAC,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;IAC1B,CAAC;CACF;AA1CD,sBA0CC"}
@@ -3,17 +3,17 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.buildErrorWindow = void 0;
4
4
  const buildErrorWindow = (file, token) => {
5
5
  const lines = file.split("\n");
6
- const length = Math.max(`${token.line}`.length, `${token.column}`.length);
7
- let second = "", third = "";
8
- for (let i = 0; i < token.column + length + 3; i++) {
9
- second += " ";
10
- third += "-";
11
- }
12
- second += "|";
13
- third += "┘";
14
- let window = `${token.line.toString().padStart(length)} | ${lines.length <= token.line - 1 ? "" : lines[token.line - 1]}\n${second}\n${third}\n`;
15
- if (token.line < lines.length)
16
- window += `${(token.line + 1).toString().padStart(length)} | ${lines[token.line]}\n`;
6
+ const lineNumberWidth = `${token.line}`.length;
7
+ const gutter = (line) => `${`${line}`.padStart(lineNumberWidth)} | `;
8
+ const sourceLine = lines[token.line - 1];
9
+ const nextLine = lines[token.line];
10
+ const pointerColumn = Math.max(0, Math.min(token.column, sourceLine === undefined ? 0 : sourceLine.length));
11
+ const pointerLength = Math.max(1, Math.min(token.lexeme === "" ? 1 : token.lexeme.length, sourceLine === undefined ? 1 : sourceLine.length - pointerColumn));
12
+ const pointer = `${" ".repeat(pointerColumn)}${"~".repeat(pointerLength)}`;
13
+ let window = `${gutter(token.line)}${sourceLine !== null && sourceLine !== void 0 ? sourceLine : "<end of file>"}\n`;
14
+ window += `${" ".repeat(lineNumberWidth)} | ${pointer}\n`;
15
+ if (nextLine !== undefined)
16
+ window += `${gutter(token.line + 1)}${nextLine}\n`;
17
17
  return window;
18
18
  };
19
19
  exports.buildErrorWindow = buildErrorWindow;
@@ -1 +1 @@
1
- {"version":3,"file":"errorWindowBuilder.js","sourceRoot":"","sources":["../../src/utils/errorWindowBuilder.ts"],"names":[],"mappings":";;;AAEO,MAAM,gBAAgB,GAAG,CAAC,IAAY,EAAE,KAAmB,EAAE,EAAE;IACpE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAE/B,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC;IAC1E,IAAI,MAAM,GAAG,EAAE,EACb,KAAK,GAAG,EAAE,CAAC;IAEb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACnD,MAAM,IAAI,GAAG,CAAC;QACd,KAAK,IAAI,GAAG,CAAC;IACf,CAAC;IACD,MAAM,IAAI,GAAG,CAAC;IACd,KAAK,IAAI,GAAG,CAAC;IAEb,IAAI,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,MACpD,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAC5D,KAAK,MAAM,KAAK,KAAK,IAAI,CAAC;IAE1B,IAAI,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,MAAM;QAAE,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;IACpH,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AApBW,QAAA,gBAAgB,oBAoB3B"}
1
+ {"version":3,"file":"errorWindowBuilder.js","sourceRoot":"","sources":["../../src/utils/errorWindowBuilder.ts"],"names":[],"mappings":";;;AAMO,MAAM,gBAAgB,GAAG,CAAC,IAAY,EAAE,KAAmB,EAAE,EAAE;IACpE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,eAAe,GAAG,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC;IAC/C,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC;IAE7E,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAEnC,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;IAC5G,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC;IAC7J,MAAM,OAAO,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;IAE3E,IAAI,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,UAAU,aAAV,UAAU,cAAV,UAAU,GAAI,eAAe,IAAI,CAAC;IACvE,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,eAAe,CAAC,MAAM,OAAO,IAAI,CAAC;IAE1D,IAAI,QAAQ,KAAK,SAAS;QAAE,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,QAAQ,IAAI,CAAC;IAE/E,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAlBW,QAAA,gBAAgB,oBAkB3B"}
@@ -0,0 +1,8 @@
1
+ import { Production, ValidateProductionsOptions } from "../meta/common";
2
+ import { Result } from "./Result";
3
+ import { BuildStatesOptions } from "../table/selfhosted";
4
+ import type { TableState } from "../parser";
5
+ export type LoadGrammarOptions = ValidateProductionsOptions;
6
+ export declare const loadGrammar: (grammarPath: string, options?: LoadGrammarOptions) => Promise<Result<Production[]>>;
7
+ export type LoadTableOptions = Omit<BuildStatesOptions, "source">;
8
+ export declare const loadTable: (tablePath: string, options?: LoadTableOptions) => Promise<Result<TableState[]>>;
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.loadTable = exports.loadGrammar = void 0;
7
+ const promises_1 = __importDefault(require("fs/promises"));
8
+ const common_1 = require("../meta/common");
9
+ const selfhosted_1 = require("../table/selfhosted");
10
+ const selfhosted_2 = require("../meta/selfhosted");
11
+ const loadGrammar = async (grammarPath, options = {}) => {
12
+ let source;
13
+ try {
14
+ source = await promises_1.default.readFile(grammarPath, "utf8");
15
+ }
16
+ catch (err) {
17
+ return {
18
+ success: false,
19
+ reason: `Could not read the grammar file: ${err instanceof Error ? err.message : String(err)}`,
20
+ token: (0, common_1.syntheticGrammarToken)(),
21
+ };
22
+ }
23
+ const result = (0, selfhosted_2.tryBuildProductions)(source, options);
24
+ if (result.success === false)
25
+ return Object.assign(Object.assign({}, result), { reason: `${result.reason} (in ${grammarPath})` });
26
+ return result;
27
+ };
28
+ exports.loadGrammar = loadGrammar;
29
+ const loadTable = async (tablePath, options = {}) => {
30
+ let source;
31
+ try {
32
+ source = await promises_1.default.readFile(tablePath, "utf8");
33
+ }
34
+ catch (err) {
35
+ return {
36
+ success: false,
37
+ reason: `Could not read the parsing table file: ${err instanceof Error ? err.message : String(err)}`,
38
+ token: (0, common_1.syntheticGrammarToken)(),
39
+ };
40
+ }
41
+ const result = (0, selfhosted_1.tryBuildStates)(source, Object.assign(Object.assign({}, options), { source: tablePath }));
42
+ if (result.success === false)
43
+ return Object.assign(Object.assign({}, result), { reason: `${result.reason} (in ${tablePath})` });
44
+ return result;
45
+ };
46
+ exports.loadTable = loadTable;
47
+ //# sourceMappingURL=loadFiles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadFiles.js","sourceRoot":"","sources":["../../src/utils/loadFiles.ts"],"names":[],"mappings":";;;;;;AAAA,2DAA6B;AAC7B,2CAA+F;AAE/F,oDAAyE;AACzE,mDAAyD;AAMlD,MAAM,WAAW,GAAG,KAAK,EAC9B,WAAmB,EACnB,UAA8B,EAAE,EACD,EAAE;IACjC,IAAI,MAAc,CAAC;IACnB,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAClD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,oCAAoC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;YAC9F,KAAK,EAAE,IAAA,8BAAqB,GAAE;SAC/B,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,IAAA,gCAAmB,EAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpD,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK;QAC1B,uCAAY,MAAM,KAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,QAAQ,WAAW,GAAG,IAAG;IACvE,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAnBW,QAAA,WAAW,eAmBtB;AAKK,MAAM,SAAS,GAAG,KAAK,EAC5B,SAAiB,EACjB,UAA4B,EAAE,EACC,EAAE;IACjC,IAAI,MAAc,CAAC;IACnB,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAChD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,0CAA0C,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;YACpG,KAAK,EAAE,IAAA,8BAAqB,GAAE;SAC/B,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,IAAA,2BAAc,EAAC,MAAM,kCAAO,OAAO,KAAE,MAAM,EAAE,SAAS,IAAG,CAAC;IACzE,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK;QAC1B,uCAAY,MAAM,KAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,QAAQ,SAAS,GAAG,IAAG;IACrE,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAnBW,QAAA,SAAS,aAmBpB"}
@@ -0,0 +1,9 @@
1
+ import { Production } from "../meta/common";
2
+ export declare const KLEENE_REDUCER_NAME = "autogenerated-kleene";
3
+ export declare const namedProductions: (productions: Production[]) => string[];
4
+ export declare const missingReducerNames: (productions: Production[], reducers: Record<string, unknown>) => string[];
5
+ export declare const missingReducerMessage: (productions: Production[], reducers: Record<string, unknown>) => string;
6
+ export type ReducerMap<Node> = Record<string, (newInput: any, oldInput: any) => Node>;
7
+ export declare const defineReducers: <Reducers extends Record<string, (...args: never[]) => unknown>>(reducers: Reducers) => (newInput: any, oldInput: any) => any;
8
+ export declare const assertReducersCoverGrammar: (productions: Production[], reducers: ReducerMap<unknown>) => void;
9
+ export declare const enumToString: <TokenType = unknown>(tokenTypes: object) => (tokenType: TokenType) => string;
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.enumToString = exports.assertReducersCoverGrammar = exports.defineReducers = exports.missingReducerMessage = exports.missingReducerNames = exports.namedProductions = exports.KLEENE_REDUCER_NAME = void 0;
4
+ exports.KLEENE_REDUCER_NAME = "autogenerated-kleene";
5
+ const namedProductions = (productions) => {
6
+ const names = new Set();
7
+ for (const production of productions)
8
+ if (production.name != null)
9
+ names.add(production.name);
10
+ return [...names].sort();
11
+ };
12
+ exports.namedProductions = namedProductions;
13
+ const missingReducerNames = (productions, reducers) => (0, exports.namedProductions)(productions).filter((name) => reducers[name] == null);
14
+ exports.missingReducerNames = missingReducerNames;
15
+ const describeKleene = (productions) => {
16
+ const needed = productions.filter((production) => production.name === exports.KLEENE_REDUCER_NAME ||
17
+ production.identifier.startsWith("<autogen-"));
18
+ if (needed.length === 0)
19
+ return "";
20
+ return `\nNote: this grammar uses "*" or "+", so it has ${needed.length} autogenerated list production(s) named "${exports.KLEENE_REDUCER_NAME}". That reducer has to flatten the list it is handed (see README, "Repetition with * and +").`;
21
+ };
22
+ const missingReducerMessage = (productions, reducers) => {
23
+ const missing = (0, exports.missingReducerNames)(productions, reducers);
24
+ if (missing.length === 0)
25
+ return "";
26
+ const has = (0, exports.namedProductions)(productions).filter((name) => reducers[name] != null);
27
+ const kleene = missing.includes(exports.KLEENE_REDUCER_NAME) ? describeKleene(productions) : "";
28
+ return (`No reducer for ${missing.length === 1 ? "production" : "productions"} ${missing
29
+ .map((name) => `"${name}"`)
30
+ .join(", ")}.` +
31
+ `\nReducers are keyed by the name given in the grammar, e.g. "<PROGRAM: program>" is reduced by reducers.program.` +
32
+ (has.length === 0 ? "\nYour reducer map is empty." : `\nYou have reducers for: ${has.join(", ")}.`) +
33
+ kleene);
34
+ };
35
+ exports.missingReducerMessage = missingReducerMessage;
36
+ const defineReducers = (reducers) => function sparseReducer(newInput, oldInput) {
37
+ const name = newInput === null || newInput === void 0 ? void 0 : newInput.name;
38
+ const lookup = reducers;
39
+ const reducer = name == null ? undefined : lookup[name];
40
+ if (reducer == null)
41
+ throw new Error(`No reducer for production "${name !== null && name !== void 0 ? name : ""}" (production ${oldInput === null || oldInput === void 0 ? void 0 : oldInput.index}). Reducers are keyed by the name given in the grammar.`);
42
+ return reducer(newInput, oldInput);
43
+ };
44
+ exports.defineReducers = defineReducers;
45
+ const assertReducersCoverGrammar = (productions, reducers) => {
46
+ const message = (0, exports.missingReducerMessage)(productions, reducers);
47
+ if (message !== "")
48
+ throw new Error(message);
49
+ };
50
+ exports.assertReducersCoverGrammar = assertReducersCoverGrammar;
51
+ const enumToString = (tokenTypes) => (tokenType) => {
52
+ const name = tokenTypes[tokenType];
53
+ return `${name !== null && name !== void 0 ? name : tokenType}`;
54
+ };
55
+ exports.enumToString = enumToString;
56
+ //# sourceMappingURL=reducers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reducers.js","sourceRoot":"","sources":["../../src/utils/reducers.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,9 @@
1
1
  import fs from "fs/promises";
2
- import { buildProductions, buildStates, LR1StackSymbol, Sparse } from "../../src/index";
2
+ import { LR1StackSymbol, Sparse, buildProductions, buildStates } from "../../src/index";
3
3
  import { ColumnAndRow, Slex, Token } from "@scinorandex/slex";
4
4
 
5
5
  // prettier-ignore
6
- enum LoLangTokenType {
6
+ export enum LoLangTokenType {
7
7
  EOF,
8
8
 
9
9
  IMPORT,
@@ -42,7 +42,7 @@ enum LoLangTokenType {
42
42
  SINGLE_LINE_COMMENT, MULTI_LINE_COMMENT
43
43
  }
44
44
 
45
- const lexerGenerator = new Slex<LoLangTokenType, {}>({
45
+ export const lexerGenerator = new Slex<LoLangTokenType, {}>({
46
46
  EOF_TYPE: LoLangTokenType.EOF,
47
47
  isHigherPrecedence: ({ current, next }) => current === LoLangTokenType.IDENTIFIER,
48
48
  // Specifies that SINGLE_LINE_COMMENT and MULTI_LINE_COMMENT tokens should be ignored.
@@ -176,7 +176,7 @@ async function parse(tablePath: string) {
176
176
 
177
177
  const parser = parserGenerator.generate(lexer, {
178
178
  reducer: (_, { input }) => new Node(input),
179
- recover({ lexer, statesStack, symbolsStack, isSafe, addError, crash, finish, states }) {
179
+ recover({ lexer, statesStack, symbolsStack, isSafe, addError, crash, finish, insertToken, states }) {
180
180
  let token = lexer.peekNextToken();
181
181
  const currentState = statesStack.peek();
182
182
 
@@ -189,25 +189,26 @@ async function parse(tablePath: string) {
189
189
  token = lexer.peekNextToken();
190
190
 
191
191
  // check for lacking semicolons
192
- if (states[currentState].actions.has("[SEMICOLON]")) {
193
- const action = states[currentState].getTerminalAction("SEMICOLON");
192
+ const semicolonAction = states[currentState].getTerminalAction("SEMICOLON");
193
+ if (semicolonAction != null) {
194
+ // A semicolon the author forgot. It gets the same position as the token we choked on.
194
195
  const newToken = new Token<LoLangTokenType, {}>(
195
196
  LoLangTokenType.SEMICOLON,
196
197
  ";",
197
- new ColumnAndRow(token.column, token.line),
198
+ new ColumnAndRow(token.line, token.column),
198
199
  token.metadata,
199
200
  );
200
201
 
201
- if (action) {
202
- if (action.type === "reduce") return finish({ newToken });
202
+ // If the parser only wanted a semicolon to reduce, hand it back as the next token.
203
+ if (semicolonAction.type === "reduce") return finish({ newToken });
203
204
 
204
- statesStack.push(action.value);
205
- symbolsStack.push({ type: "token", token: newToken });
206
- addError(
207
- `Expected SEMICOLON but received ${LoLangTokenType[token.type]}. SEMICOLON was automatically inserted.`,
208
- );
209
- }
205
+ // Otherwise shift the synthesized semicolon onto the stacks and carry on from there.
206
+ const inserted = insertToken(newToken);
207
+ if (inserted != null) return crash(inserted.reason);
210
208
 
209
+ addError(
210
+ `Expected SEMICOLON but received ${LoLangTokenType[token.type]}. SEMICOLON was automatically inserted.`,
211
+ );
211
212
  if (isSafe()) return finish();
212
213
  }
213
214