@scinorandex/sparse 0.0.8 → 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 +60 -0
  3. package/README.md +286 -30
  4. package/dist/cli.js +113 -24
  5. package/dist/cli.js.map +1 -1
  6. package/dist/generator.d.ts +9 -2
  7. package/dist/generator.js +179 -50
  8. package/dist/generator.js.map +1 -1
  9. package/dist/index.d.ts +17 -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 +51 -38
  17. package/dist/meta/selfhosted.js.map +1 -1
  18. package/dist/parser.d.ts +56 -33
  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 +42 -18
  39. package/example/LoLang/tablelalr.txt +381 -0
  40. package/example/kleene-test/example.ts +35 -17
  41. package/example/math/example.ts +12 -7
  42. package/example/selfhosted/example.ts +30 -24
  43. package/opencode.json +18 -0
  44. package/package.json +9 -3
  45. package/src/cli.ts +132 -23
  46. package/src/generator.ts +237 -67
  47. package/src/index.ts +56 -3
  48. package/src/meta/common.ts +116 -0
  49. package/src/meta/selfhosted.ts +42 -11
  50. package/src/parser.ts +259 -47
  51. package/src/table/selfhosted.ts +48 -12
  52. package/src/table/validate.ts +143 -0
  53. package/src/utils/Stack.ts +22 -2
  54. package/src/utils/errorWindowBuilder.ts +15 -13
  55. package/src/utils/loadFiles.ts +54 -0
  56. package/src/utils/reducers.ts +93 -0
  57. package/test/cli.test.ts +144 -0
  58. package/test/codegen.test.ts +75 -0
  59. package/test/grammar.test.ts +243 -0
  60. package/test/helpers.ts +59 -0
  61. package/test/lalr.test.ts +114 -0
  62. package/test/parser.test.ts +392 -0
  63. package/test/table.test.ts +144 -0
  64. package/tsconfig.json +1 -1
  65. package/example/complicated/grammar.txt +0 -37
package/dist/parser.js CHANGED
@@ -1,11 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.LR1ParserGraveError = exports.Sparse = exports.TableState = void 0;
3
+ exports.SparseGrammarError = exports.LR1ParserGraveError = exports.LR1Parser = exports.Sparse = exports.TableState = void 0;
4
4
  const generator_1 = require("./generator");
5
5
  const Stack_1 = require("./utils/Stack");
6
+ const loadFiles_1 = require("./utils/loadFiles");
7
+ const validate_1 = require("./table/validate");
6
8
  class TableState {
7
- constructor(actions = new Map()) {
9
+ constructor(actions = new Map(), rawActions = new Map()) {
8
10
  this.actions = actions;
11
+ this.rawActions = rawActions;
9
12
  }
10
13
  getTerminalAction(terminal) {
11
14
  return this.actions.get(`[${terminal}]`);
@@ -13,20 +16,48 @@ class TableState {
13
16
  getVariableAction(variable) {
14
17
  return this.actions.get(variable);
15
18
  }
19
+ getTerminalKeys() {
20
+ return this.getKeys("[", "]");
21
+ }
22
+ getVariableKeys() {
23
+ return this.getKeys("<", ">");
24
+ }
25
+ getKeys(prefix, suffix) {
26
+ const keys = [];
27
+ for (const key of this.actions.keys())
28
+ if (key.startsWith(prefix) && key.endsWith(suffix))
29
+ keys.push(key.substring(prefix.length, key.length - suffix.length));
30
+ return keys.sort();
31
+ }
16
32
  toJSObject() {
17
33
  return Object.fromEntries(this.actions);
18
34
  }
19
35
  static fromJSObject(json) {
20
- return new TableState(new Map(Object.entries(json)));
36
+ const actions = new Map(Object.entries(json));
37
+ const rawActions = new Map([...actions].map(([key, action]) => [
38
+ key,
39
+ action.type === "goto" ? `${action.value}` : `${action.type === "shift" ? "s" : "r"}${action.value}`,
40
+ ]));
41
+ return new TableState(actions, rawActions);
21
42
  }
22
43
  }
23
44
  exports.TableState = TableState;
24
45
  class Sparse {
25
46
  constructor(options) {
26
47
  this.options = options;
48
+ if (options.validate === true) {
49
+ const result = (0, validate_1.validateTable)(options.productions, options.states, { source: options.source });
50
+ if (result.success === false)
51
+ throw new Error(`The parsing table does not match the grammar: ${result.reason}`);
52
+ }
27
53
  }
28
54
  static tryFromProductions(options) {
29
- const statesResult = (0, generator_1.generateStates)(options.productions);
55
+ const startedAt = Date.now();
56
+ const statesResult = (0, generator_1.generateStates)(options.productions, {
57
+ mode: options.mode,
58
+ onWarning: options.onWarning,
59
+ onProgress: options.onProgress,
60
+ });
30
61
  if (statesResult.success === false)
31
62
  return statesResult;
32
63
  const states = statesResult.value;
@@ -35,12 +66,47 @@ class Sparse {
35
66
  states: states.toStates(),
36
67
  toStringifiedTokenType: options.toStringifiedTokenType,
37
68
  });
69
+ if (options.quiet !== true) {
70
+ const elapsed = Date.now() - startedAt;
71
+ const label = options.mode === "lalr1" ? "LALR(1)" : "LR(1)";
72
+ console.error(`Sparse generated ${sparse.options.states.length} ${label} states in ${elapsed}ms`);
73
+ }
38
74
  return { success: true, value: sparse };
39
75
  }
40
76
  static fromProductions(options) {
41
77
  const result = Sparse.tryFromProductions(options);
42
78
  if (result.success === false)
43
- throw new Error(`Encountered error "${result.reason}" at ${result.token.line}:${result.token.column}`);
79
+ throw new SparseGrammarError(result.reason, result.token);
80
+ return result.value;
81
+ }
82
+ static async tryFromGrammarFile(options) {
83
+ const productionsResult = await (0, loadFiles_1.loadGrammar)(options.grammarPath, { onWarning: options.onWarning });
84
+ if (productionsResult.success === false)
85
+ return productionsResult;
86
+ const statesResult = await (0, loadFiles_1.loadTable)(options.tablePath, { productions: productionsResult.value });
87
+ if (statesResult.success === false)
88
+ return statesResult;
89
+ if (options.validate !== false) {
90
+ const tableResult = (0, validate_1.validateTable)(productionsResult.value, statesResult.value, {
91
+ source: options.tablePath,
92
+ });
93
+ if (tableResult.success === false)
94
+ return tableResult;
95
+ }
96
+ return {
97
+ success: true,
98
+ value: new Sparse({
99
+ productions: productionsResult.value,
100
+ states: statesResult.value,
101
+ toStringifiedTokenType: options.toStringifiedTokenType,
102
+ source: options.grammarPath,
103
+ }),
104
+ };
105
+ }
106
+ static async fromGrammarFile(options) {
107
+ const result = await Sparse.tryFromGrammarFile(options);
108
+ if (result.success === false)
109
+ throw new SparseGrammarError(result.reason, result.token);
44
110
  return result.value;
45
111
  }
46
112
  generate(lexer, options) {
@@ -59,16 +125,29 @@ class LR1Parser {
59
125
  this.symbolsStack = new Stack_1.Stack();
60
126
  this.exceptions = [];
61
127
  }
128
+ reset() {
129
+ this.statesStack = new Stack_1.Stack([0]);
130
+ this.symbolsStack = new Stack_1.Stack();
131
+ this.exceptions = [];
132
+ }
62
133
  parse() {
63
134
  var _a;
64
135
  const { productions, states, toStringifiedTokenType } = this.options;
136
+ if (states.length === 0)
137
+ throw new LR1ParserGraveError("The parsing table is empty, so no token can be parsed", null);
138
+ const currentStates = () => {
139
+ const state = states[this.statesStack.peek()];
140
+ if (state == null)
141
+ throw new LR1ParserGraveError(`The parsing table is out of sync with the grammar: state ${this.statesStack.peek()} does not exist (the table has ${states.length} states)`, null);
142
+ return state;
143
+ };
65
144
  while (true) {
66
- let currentState = this.statesStack.peek();
145
+ let currentState = currentStates();
67
146
  let token = this.lexer.peekNextToken();
68
- let action = states[currentState].getTerminalAction(toStringifiedTokenType(token.type));
147
+ let action = currentState.getTerminalAction(toStringifiedTokenType(token.type));
69
148
  if (action == null) {
70
149
  if (this.recover === null)
71
- throw new LR1ParserGraveError(`Invalid syntax. Expected ${[...states[currentState].actions.keys()].join(",")} but got ${toStringifiedTokenType(token.type)}`, token);
150
+ throw new LR1ParserGraveError(this.syntaxErrorMessage(currentState, token), token);
72
151
  const recoveryResult = this.recover({
73
152
  lexer: this.lexer,
74
153
  states,
@@ -77,24 +156,29 @@ class LR1Parser {
77
156
  addError: (reason) => this.exceptions.push({ message: reason, token: this.lexer.peekNextToken() }),
78
157
  crash: (reason) => ({ success: false, reason }),
79
158
  finish: (options) => ({ success: true, token: options === null || options === void 0 ? void 0 : options.newToken }),
80
- isSafe: () => states[this.statesStack.peek()].actions.has(`[${toStringifiedTokenType(this.lexer.peekNextToken().type)}]`),
159
+ insertToken: (newToken) => this.insertToken(newToken),
160
+ isSafe: () => currentStates().actions.has(`[${toStringifiedTokenType(this.lexer.peekNextToken().type)}]`),
81
161
  });
82
162
  if (recoveryResult.success === false)
83
163
  throw new LR1ParserGraveError(recoveryResult.reason, token);
84
164
  token = (_a = recoveryResult.token) !== null && _a !== void 0 ? _a : this.lexer.peekNextToken();
85
- currentState = this.statesStack.peek();
86
- action = states[currentState].getTerminalAction(toStringifiedTokenType(token.type));
165
+ currentState = currentStates();
166
+ action = currentState.getTerminalAction(toStringifiedTokenType(token.type));
167
+ if (action == null)
168
+ throw new LR1ParserGraveError(this.syntaxErrorMessage(currentState, token), token);
87
169
  }
88
170
  const fixedAction = action;
89
171
  if (fixedAction.type === "shift") {
90
172
  token = this.lexer.getNextToken();
91
- this.statesStack.push(fixedAction.value);
173
+ this.pushState(fixedAction.value);
92
174
  this.symbolsStack.push({ type: "token", token: token });
93
175
  }
94
176
  else if (fixedAction.type === "reduce") {
95
177
  if (fixedAction.value === 0)
96
178
  break;
97
179
  const production = productions[fixedAction.value];
180
+ if (production == null)
181
+ throw new LR1ParserGraveError(`The parsing table is out of sync with the grammar: it reduces by production ${fixedAction.value}, but the grammar only has ${productions.length} productions`, token);
98
182
  const popped = [];
99
183
  for (let i = 0; i < production.rhs.length; i++) {
100
184
  popped.unshift(this.symbolsStack.pop());
@@ -115,29 +199,73 @@ class LR1Parser {
115
199
  this.symbolsStack.push({ type: "node", node });
116
200
  }
117
201
  catch (err) {
118
- const input = JSON.stringify(popped, null, 2);
119
- console.log(err);
120
- throw new LR1ParserGraveError(`Error while performing reduction for production: ${productionIndex}. Reduction input: ${input}`, token);
202
+ const cause = err instanceof Error ? err.message : String(err);
203
+ const input = truncate(JSON.stringify(popped), 500);
204
+ throw new LR1ParserGraveError(`Error while performing the reduction for production ${productionIndex}${describeProduction(production)}: ${cause}\nReduction input: ${input}`, token, err instanceof Error ? err : undefined);
121
205
  }
122
206
  const topNode = this.statesStack.peek();
123
- const gotoAction = states[topNode].getVariableAction(production.identifier);
207
+ const gotoAction = currentStates().getVariableAction(production.identifier);
124
208
  if (gotoAction == undefined)
125
209
  throw new LR1ParserGraveError(`No GOTO action for for state: ${topNode} and production: ${production.identifier}. Actions: Reduce by production ${productionIndex}`, token);
126
210
  else if (gotoAction.type !== "goto")
127
211
  throw new LR1ParserGraveError(`Expected GOTO action for state: ${topNode} and production: ${production.identifier}. Actions: Reduce by production ${productionIndex}. Received: ${gotoAction.type}`, token);
128
- this.statesStack.push(gotoAction.value);
212
+ this.pushState(gotoAction.value);
129
213
  }
130
214
  }
215
+ if (this.symbolsStack.isEmpty)
216
+ return { result: null, errors: this.exceptions };
131
217
  const top = this.symbolsStack.peek();
132
218
  return { result: top.type === "node" ? top.node : null, errors: this.exceptions };
133
219
  }
220
+ pushState(state) {
221
+ if (state === undefined || this.options.states[state] == null)
222
+ throw new LR1ParserGraveError(`The parsing table is out of sync with the grammar: it points at state ${state}, but the table only has ${this.options.states.length} states`, null);
223
+ this.statesStack.push(state);
224
+ }
225
+ insertToken(token) {
226
+ var _a;
227
+ const state = this.options.states[this.statesStack.peek()];
228
+ const action = state === null || state === void 0 ? void 0 : state.getTerminalAction(this.options.toStringifiedTokenType(token.type));
229
+ if (action == null)
230
+ return {
231
+ success: false,
232
+ reason: `Cannot insert ${this.options.toStringifiedTokenType(token.type)} here: state ${this.statesStack.peek()} does not accept it. Expected ${(_a = state === null || state === void 0 ? void 0 : state.getTerminalKeys().join(", ")) !== null && _a !== void 0 ? _a : "nothing"}`,
233
+ };
234
+ if (action.type !== "shift")
235
+ return {
236
+ success: false,
237
+ reason: `Cannot insert ${this.options.toStringifiedTokenType(token.type)} here: state ${this.statesStack.peek()} reduces on it instead of shifting it`,
238
+ };
239
+ this.pushState(action.value);
240
+ this.symbolsStack.push({ type: "token", token });
241
+ return undefined;
242
+ }
243
+ syntaxErrorMessage(state, token) {
244
+ const expected = state.getTerminalKeys();
245
+ const got = this.options.toStringifiedTokenType(token.type);
246
+ const lexeme = token.lexeme === "" ? "" : ` ("${token.lexeme}")`;
247
+ return (`Invalid syntax at ${token.line}:${token.column}: got ${got}${lexeme}, but expected ${expected.length === 0 ? "the end of the input" : `one of [${expected.join("], [")}]`}`);
248
+ }
134
249
  }
250
+ exports.LR1Parser = LR1Parser;
135
251
  class LR1ParserGraveError extends Error {
136
252
  constructor(reason, currentToken, err) {
137
- super(reason);
253
+ super(reason, err === undefined ? undefined : { cause: err });
138
254
  this.reason = reason;
139
255
  this.currentToken = currentToken;
256
+ this.name = "LR1ParserGraveError";
140
257
  }
141
258
  }
142
259
  exports.LR1ParserGraveError = LR1ParserGraveError;
260
+ class SparseGrammarError extends Error {
261
+ constructor(reason, token) {
262
+ super(`Encountered error "${reason}" at ${token.line}:${token.column}`);
263
+ this.reason = reason;
264
+ this.token = token;
265
+ this.name = "SparseGrammarError";
266
+ }
267
+ }
268
+ exports.SparseGrammarError = SparseGrammarError;
269
+ const truncate = (value, max) => value.length <= max ? value : `${value.slice(0, max)}... (${value.length} characters)`;
270
+ const describeProduction = (production) => production.name == null ? ` (${production.identifier})` : ` ("${production.name}")`;
143
271
  //# sourceMappingURL=parser.js.map
@@ -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[]>>;