parser-lr 0.0.0 → 0.2.1

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 (262) hide show
  1. package/README.md +112 -1
  2. package/bin/parser-lr.js +12502 -16
  3. package/bin/parser-lr.js.map +1 -1
  4. package/dist/lib/ast/ast-node.d.ts +59 -0
  5. package/dist/lib/ast/ast-node.d.ts.map +1 -0
  6. package/dist/lib/ast/ast-node.js +66 -0
  7. package/dist/lib/ast/ast-node.js.map +1 -0
  8. package/dist/lib/errors/index.d.ts +2 -0
  9. package/dist/lib/errors/index.d.ts.map +1 -0
  10. package/dist/lib/errors/index.js +2 -0
  11. package/dist/lib/errors/index.js.map +1 -0
  12. package/dist/lib/errors/parser-lr-error.d.ts +30 -0
  13. package/dist/lib/errors/parser-lr-error.d.ts.map +1 -0
  14. package/dist/lib/errors/parser-lr-error.js +45 -0
  15. package/dist/lib/errors/parser-lr-error.js.map +1 -0
  16. package/dist/lib/grammar/ast-schema.d.ts +28 -0
  17. package/dist/lib/grammar/ast-schema.d.ts.map +1 -0
  18. package/dist/lib/grammar/ast-schema.js +39 -0
  19. package/dist/lib/grammar/ast-schema.js.map +1 -0
  20. package/dist/lib/grammar/ast-type.d.ts +12 -0
  21. package/dist/lib/grammar/ast-type.d.ts.map +1 -0
  22. package/dist/lib/grammar/ast-type.js +2 -0
  23. package/dist/lib/grammar/ast-type.js.map +1 -0
  24. package/dist/lib/grammar/expression.d.ts +69 -0
  25. package/dist/lib/grammar/expression.d.ts.map +1 -0
  26. package/dist/lib/grammar/expression.js +2 -0
  27. package/dist/lib/grammar/expression.js.map +1 -0
  28. package/dist/lib/grammar/grammar-from-cst.d.ts +10 -0
  29. package/dist/lib/grammar/grammar-from-cst.d.ts.map +1 -0
  30. package/dist/lib/grammar/grammar-from-cst.js +638 -0
  31. package/dist/lib/grammar/grammar-from-cst.js.map +1 -0
  32. package/dist/lib/grammar/grammar-literals.d.ts +18 -0
  33. package/dist/lib/grammar/grammar-literals.d.ts.map +1 -0
  34. package/dist/lib/grammar/grammar-literals.js +67 -0
  35. package/dist/lib/grammar/grammar-literals.js.map +1 -0
  36. package/dist/lib/grammar/grammar.d.ts +45 -0
  37. package/dist/lib/grammar/grammar.d.ts.map +1 -0
  38. package/dist/lib/grammar/grammar.js +60 -0
  39. package/dist/lib/grammar/grammar.js.map +1 -0
  40. package/dist/lib/grammar/grammar.json +7950 -0
  41. package/dist/lib/grammar/index.d.ts +13 -0
  42. package/dist/lib/grammar/index.d.ts.map +1 -0
  43. package/dist/lib/grammar/index.js +7 -0
  44. package/dist/lib/grammar/index.js.map +1 -0
  45. package/dist/lib/grammar/meta-grammar-table.d.ts +19 -0
  46. package/dist/lib/grammar/meta-grammar-table.d.ts.map +1 -0
  47. package/dist/lib/grammar/meta-grammar-table.js +32 -0
  48. package/dist/lib/grammar/meta-grammar-table.js.map +1 -0
  49. package/dist/lib/grammar/production.d.ts +9 -0
  50. package/dist/lib/grammar/production.d.ts.map +1 -0
  51. package/dist/lib/grammar/production.js +2 -0
  52. package/dist/lib/grammar/production.js.map +1 -0
  53. package/dist/lib/grammar/read-grammar-error.d.ts +15 -0
  54. package/dist/lib/grammar/read-grammar-error.d.ts.map +1 -0
  55. package/dist/lib/grammar/read-grammar-error.js +18 -0
  56. package/dist/lib/grammar/read-grammar-error.js.map +1 -0
  57. package/dist/lib/grammar/read-grammar.d.ts +9 -0
  58. package/dist/lib/grammar/read-grammar.d.ts.map +1 -0
  59. package/dist/lib/grammar/read-grammar.js +21 -0
  60. package/dist/lib/grammar/read-grammar.js.map +1 -0
  61. package/dist/lib/grammar/token-rule.d.ts +11 -0
  62. package/dist/lib/grammar/token-rule.d.ts.map +1 -0
  63. package/dist/lib/grammar/token-rule.js +2 -0
  64. package/dist/lib/grammar/token-rule.js.map +1 -0
  65. package/dist/lib/grammar/transform-expression.d.ts +55 -0
  66. package/dist/lib/grammar/transform-expression.d.ts.map +1 -0
  67. package/dist/lib/grammar/transform-expression.js +2 -0
  68. package/dist/lib/grammar/transform-expression.js.map +1 -0
  69. package/dist/lib/grammar/transform-rule.d.ts +16 -0
  70. package/dist/lib/grammar/transform-rule.d.ts.map +1 -0
  71. package/dist/lib/grammar/transform-rule.js +2 -0
  72. package/dist/lib/grammar/transform-rule.js.map +1 -0
  73. package/dist/lib/grammar/transform-schema.d.ts +28 -0
  74. package/dist/lib/grammar/transform-schema.d.ts.map +1 -0
  75. package/dist/lib/grammar/transform-schema.js +39 -0
  76. package/dist/lib/grammar/transform-schema.js.map +1 -0
  77. package/dist/lib/index.d.ts +19 -0
  78. package/dist/lib/index.d.ts.map +1 -1
  79. package/dist/lib/index.js +13 -0
  80. package/dist/lib/index.js.map +1 -1
  81. package/dist/lib/lexer/index.d.ts +10 -0
  82. package/dist/lib/lexer/index.d.ts.map +1 -0
  83. package/dist/lib/lexer/index.js +8 -0
  84. package/dist/lib/lexer/index.js.map +1 -0
  85. package/dist/lib/lexer/lexer-compile-error.d.ts +15 -0
  86. package/dist/lib/lexer/lexer-compile-error.d.ts.map +1 -0
  87. package/dist/lib/lexer/lexer-compile-error.js +18 -0
  88. package/dist/lib/lexer/lexer-compile-error.js.map +1 -0
  89. package/dist/lib/lexer/lexer-compile.d.ts +94 -0
  90. package/dist/lib/lexer/lexer-compile.d.ts.map +1 -0
  91. package/dist/lib/lexer/lexer-compile.js +189 -0
  92. package/dist/lib/lexer/lexer-compile.js.map +1 -0
  93. package/dist/lib/lexer/lexer-error.d.ts +15 -0
  94. package/dist/lib/lexer/lexer-error.d.ts.map +1 -0
  95. package/dist/lib/lexer/lexer-error.js +18 -0
  96. package/dist/lib/lexer/lexer-error.js.map +1 -0
  97. package/dist/lib/lexer/lexer-input-error.d.ts +11 -0
  98. package/dist/lib/lexer/lexer-input-error.d.ts.map +1 -0
  99. package/dist/lib/lexer/lexer-input-error.js +13 -0
  100. package/dist/lib/lexer/lexer-input-error.js.map +1 -0
  101. package/dist/lib/lexer/lexer-state-error.d.ts +13 -0
  102. package/dist/lib/lexer/lexer-state-error.d.ts.map +1 -0
  103. package/dist/lib/lexer/lexer-state-error.js +15 -0
  104. package/dist/lib/lexer/lexer-state-error.js.map +1 -0
  105. package/dist/lib/lexer/lexer.d.ts +111 -0
  106. package/dist/lib/lexer/lexer.d.ts.map +1 -0
  107. package/dist/lib/lexer/lexer.js +270 -0
  108. package/dist/lib/lexer/lexer.js.map +1 -0
  109. package/dist/lib/lexer/token.d.ts +34 -0
  110. package/dist/lib/lexer/token.d.ts.map +1 -0
  111. package/dist/lib/lexer/token.js +38 -0
  112. package/dist/lib/lexer/token.js.map +1 -0
  113. package/dist/lib/parse-context-error.d.ts +13 -0
  114. package/dist/lib/parse-context-error.d.ts.map +1 -0
  115. package/dist/lib/parse-context-error.js +15 -0
  116. package/dist/lib/parse-context-error.js.map +1 -0
  117. package/dist/lib/parse-context.d.ts +106 -0
  118. package/dist/lib/parse-context.d.ts.map +1 -0
  119. package/dist/lib/parse-context.js +133 -0
  120. package/dist/lib/parse-context.js.map +1 -0
  121. package/dist/lib/parse-output-error.d.ts +13 -0
  122. package/dist/lib/parse-output-error.d.ts.map +1 -0
  123. package/dist/lib/parse-output-error.js +15 -0
  124. package/dist/lib/parse-output-error.js.map +1 -0
  125. package/dist/lib/parse-output.d.ts +10 -0
  126. package/dist/lib/parse-output.d.ts.map +1 -0
  127. package/dist/lib/parse-output.js +15 -0
  128. package/dist/lib/parse-output.js.map +1 -0
  129. package/dist/lib/parse-table/analysis/first-follow.d.ts +124 -0
  130. package/dist/lib/parse-table/analysis/first-follow.d.ts.map +1 -0
  131. package/dist/lib/parse-table/analysis/first-follow.js +274 -0
  132. package/dist/lib/parse-table/analysis/first-follow.js.map +1 -0
  133. package/dist/lib/parse-table/analysis/index.d.ts +2 -0
  134. package/dist/lib/parse-table/analysis/index.d.ts.map +1 -0
  135. package/dist/lib/parse-table/analysis/index.js +2 -0
  136. package/dist/lib/parse-table/analysis/index.js.map +1 -0
  137. package/dist/lib/parse-table/bnf/bnf-grammar.d.ts +65 -0
  138. package/dist/lib/parse-table/bnf/bnf-grammar.d.ts.map +1 -0
  139. package/dist/lib/parse-table/bnf/bnf-grammar.js +136 -0
  140. package/dist/lib/parse-table/bnf/bnf-grammar.js.map +1 -0
  141. package/dist/lib/parse-table/bnf/bnf-production.d.ts +12 -0
  142. package/dist/lib/parse-table/bnf/bnf-production.d.ts.map +1 -0
  143. package/dist/lib/parse-table/bnf/bnf-production.js +2 -0
  144. package/dist/lib/parse-table/bnf/bnf-production.js.map +1 -0
  145. package/dist/lib/parse-table/bnf/bnf-symbol.d.ts +40 -0
  146. package/dist/lib/parse-table/bnf/bnf-symbol.d.ts.map +1 -0
  147. package/dist/lib/parse-table/bnf/bnf-symbol.js +35 -0
  148. package/dist/lib/parse-table/bnf/bnf-symbol.js.map +1 -0
  149. package/dist/lib/parse-table/bnf/desugar-ebnf.d.ts +104 -0
  150. package/dist/lib/parse-table/bnf/desugar-ebnf.d.ts.map +1 -0
  151. package/dist/lib/parse-table/bnf/desugar-ebnf.js +217 -0
  152. package/dist/lib/parse-table/bnf/desugar-ebnf.js.map +1 -0
  153. package/dist/lib/parse-table/bnf/index.d.ts +6 -0
  154. package/dist/lib/parse-table/bnf/index.d.ts.map +1 -0
  155. package/dist/lib/parse-table/bnf/index.js +4 -0
  156. package/dist/lib/parse-table/bnf/index.js.map +1 -0
  157. package/dist/lib/parse-table/build-lr-table.d.ts +11 -0
  158. package/dist/lib/parse-table/build-lr-table.d.ts.map +1 -0
  159. package/dist/lib/parse-table/build-lr-table.js +158 -0
  160. package/dist/lib/parse-table/build-lr-table.js.map +1 -0
  161. package/dist/lib/parse-table/index.d.ts +22 -0
  162. package/dist/lib/parse-table/index.d.ts.map +1 -0
  163. package/dist/lib/parse-table/index.js +15 -0
  164. package/dist/lib/parse-table/index.js.map +1 -0
  165. package/dist/lib/parse-table/lr-algorithm-error.d.ts +13 -0
  166. package/dist/lib/parse-table/lr-algorithm-error.d.ts.map +1 -0
  167. package/dist/lib/parse-table/lr-algorithm-error.js +15 -0
  168. package/dist/lib/parse-table/lr-algorithm-error.js.map +1 -0
  169. package/dist/lib/parse-table/lr-algorithm.d.ts +19 -0
  170. package/dist/lib/parse-table/lr-algorithm.d.ts.map +1 -0
  171. package/dist/lib/parse-table/lr-algorithm.js +27 -0
  172. package/dist/lib/parse-table/lr-algorithm.js.map +1 -0
  173. package/dist/lib/parse-table/lr0/index.d.ts +3 -0
  174. package/dist/lib/parse-table/lr0/index.d.ts.map +1 -0
  175. package/dist/lib/parse-table/lr0/index.js +2 -0
  176. package/dist/lib/parse-table/lr0/index.js.map +1 -0
  177. package/dist/lib/parse-table/lr0/lr0-item-set.d.ts +106 -0
  178. package/dist/lib/parse-table/lr0/lr0-item-set.d.ts.map +1 -0
  179. package/dist/lib/parse-table/lr0/lr0-item-set.js +235 -0
  180. package/dist/lib/parse-table/lr0/lr0-item-set.js.map +1 -0
  181. package/dist/lib/parse-table/lr1/index.d.ts +3 -0
  182. package/dist/lib/parse-table/lr1/index.d.ts.map +1 -0
  183. package/dist/lib/parse-table/lr1/index.js +2 -0
  184. package/dist/lib/parse-table/lr1/index.js.map +1 -0
  185. package/dist/lib/parse-table/lr1/lr1-item-set.d.ts +157 -0
  186. package/dist/lib/parse-table/lr1/lr1-item-set.d.ts.map +1 -0
  187. package/dist/lib/parse-table/lr1/lr1-item-set.js +380 -0
  188. package/dist/lib/parse-table/lr1/lr1-item-set.js.map +1 -0
  189. package/dist/lib/parse-table/parse-table-build-error.d.ts +17 -0
  190. package/dist/lib/parse-table/parse-table-build-error.d.ts.map +1 -0
  191. package/dist/lib/parse-table/parse-table-build-error.js +20 -0
  192. package/dist/lib/parse-table/parse-table-build-error.js.map +1 -0
  193. package/dist/lib/parse-table/parse-table-error.d.ts +13 -0
  194. package/dist/lib/parse-table/parse-table-error.d.ts.map +1 -0
  195. package/dist/lib/parse-table/parse-table-error.js +15 -0
  196. package/dist/lib/parse-table/parse-table-error.js.map +1 -0
  197. package/dist/lib/parse-table/parse-table-json.d.ts +50 -0
  198. package/dist/lib/parse-table/parse-table-json.d.ts.map +1 -0
  199. package/dist/lib/parse-table/parse-table-json.js +9 -0
  200. package/dist/lib/parse-table/parse-table-json.js.map +1 -0
  201. package/dist/lib/parse-table/parse-table.d.ts +154 -0
  202. package/dist/lib/parse-table/parse-table.d.ts.map +1 -0
  203. package/dist/lib/parse-table/parse-table.js +314 -0
  204. package/dist/lib/parse-table/parse-table.js.map +1 -0
  205. package/dist/lib/parse-table/slr/index.d.ts +4 -0
  206. package/dist/lib/parse-table/slr/index.d.ts.map +1 -0
  207. package/dist/lib/parse-table/slr/index.js +3 -0
  208. package/dist/lib/parse-table/slr/index.js.map +1 -0
  209. package/dist/lib/parse-table/slr/parse-action.d.ts +3 -0
  210. package/dist/lib/parse-table/slr/parse-action.d.ts.map +1 -0
  211. package/dist/lib/parse-table/slr/parse-action.js +2 -0
  212. package/dist/lib/parse-table/slr/parse-action.js.map +1 -0
  213. package/dist/lib/parse-table/slr/slr-table.d.ts +14 -0
  214. package/dist/lib/parse-table/slr/slr-table.d.ts.map +1 -0
  215. package/dist/lib/parse-table/slr/slr-table.js +14 -0
  216. package/dist/lib/parse-table/slr/slr-table.js.map +1 -0
  217. package/dist/lib/parse-table/table/index.d.ts +5 -0
  218. package/dist/lib/parse-table/table/index.d.ts.map +1 -0
  219. package/dist/lib/parse-table/table/index.js +4 -0
  220. package/dist/lib/parse-table/table/index.js.map +1 -0
  221. package/dist/lib/parse-table/table/lr-parse-table.d.ts +92 -0
  222. package/dist/lib/parse-table/table/lr-parse-table.d.ts.map +1 -0
  223. package/dist/lib/parse-table/table/lr-parse-table.js +144 -0
  224. package/dist/lib/parse-table/table/lr-parse-table.js.map +1 -0
  225. package/dist/lib/parse-table/table/parse-action.d.ts +47 -0
  226. package/dist/lib/parse-table/table/parse-action.d.ts.map +1 -0
  227. package/dist/lib/parse-table/table/parse-action.js +49 -0
  228. package/dist/lib/parse-table/table/parse-action.js.map +1 -0
  229. package/dist/lib/parse-table/table/table-builder-base.d.ts +63 -0
  230. package/dist/lib/parse-table/table/table-builder-base.d.ts.map +1 -0
  231. package/dist/lib/parse-table/table/table-builder-base.js +129 -0
  232. package/dist/lib/parse-table/table/table-builder-base.js.map +1 -0
  233. package/dist/lib/parse-table/token-inventory.d.ts +9 -0
  234. package/dist/lib/parse-table/token-inventory.d.ts.map +1 -0
  235. package/dist/lib/parse-table/token-inventory.js +15 -0
  236. package/dist/lib/parse-table/token-inventory.js.map +1 -0
  237. package/dist/lib/parser-lr.d.ts +96 -2
  238. package/dist/lib/parser-lr.d.ts.map +1 -1
  239. package/dist/lib/parser-lr.js +130 -2
  240. package/dist/lib/parser-lr.js.map +1 -1
  241. package/dist/lib/shift-reduce/index.d.ts +3 -0
  242. package/dist/lib/shift-reduce/index.d.ts.map +1 -0
  243. package/dist/lib/shift-reduce/index.js +2 -0
  244. package/dist/lib/shift-reduce/index.js.map +1 -0
  245. package/dist/lib/shift-reduce/shift-reduce-engine.d.ts +82 -0
  246. package/dist/lib/shift-reduce/shift-reduce-engine.d.ts.map +1 -0
  247. package/dist/lib/shift-reduce/shift-reduce-engine.js +204 -0
  248. package/dist/lib/shift-reduce/shift-reduce-engine.js.map +1 -0
  249. package/dist/lib/transform/binding-map.d.ts +32 -0
  250. package/dist/lib/transform/binding-map.d.ts.map +1 -0
  251. package/dist/lib/transform/binding-map.js +59 -0
  252. package/dist/lib/transform/binding-map.js.map +1 -0
  253. package/dist/lib/transform/cst-transformer.d.ts +158 -0
  254. package/dist/lib/transform/cst-transformer.d.ts.map +1 -0
  255. package/dist/lib/transform/cst-transformer.js +381 -0
  256. package/dist/lib/transform/cst-transformer.js.map +1 -0
  257. package/dist/lib/transform/index.d.ts +4 -0
  258. package/dist/lib/transform/index.d.ts.map +1 -0
  259. package/dist/lib/transform/index.js +3 -0
  260. package/dist/lib/transform/index.js.map +1 -0
  261. package/docs/grammar.md +170 -0
  262. package/package.json +12 -4
@@ -0,0 +1,92 @@
1
+ import type { LrAlgorithm } from '../lr-algorithm.js';
2
+ import type { BnfGrammar } from '../bnf/bnf-grammar.js';
3
+ import type { BnfProduction } from '../bnf/bnf-production.js';
4
+ import type { ParseAction, ParseConflict } from './parse-action.js';
5
+ /**
6
+ * LR parse table with ACTION and GOTO entries plus any detected conflicts.
7
+ */
8
+ export declare class LrParseTable {
9
+ readonly algorithm: LrAlgorithm;
10
+ readonly grammar: BnfGrammar;
11
+ readonly productions: readonly BnfProduction[];
12
+ readonly stateCount: number;
13
+ readonly actions: ReadonlyMap<number, ReadonlyMap<string, ParseAction>>;
14
+ readonly gotos: ReadonlyMap<number, ReadonlyMap<string, number>>;
15
+ readonly conflicts: readonly ParseConflict[];
16
+ /**
17
+ * Creates an LR parse table from precomputed table entries.
18
+ *
19
+ * @param algorithm - LR algorithm used to build the table.
20
+ * @param grammar - Augmented BNF grammar the table was built from.
21
+ * @param productions - Flat BNF productions referenced by reduce actions.
22
+ * @param stateCount - Number of parser states in the item set collection.
23
+ * @param actions - ACTION entries keyed by state and terminal symbol.
24
+ * @param gotos - GOTO entries keyed by state and non-terminal name.
25
+ * @param conflicts - Shift/reduce and reduce/reduce conflicts encountered while building.
26
+ */
27
+ constructor(algorithm: LrAlgorithm, grammar: BnfGrammar, productions: readonly BnfProduction[], stateCount: number, actions: ReadonlyMap<number, ReadonlyMap<string, ParseAction>>, gotos: ReadonlyMap<number, ReadonlyMap<string, number>>, conflicts: readonly ParseConflict[]);
28
+ /**
29
+ * Whether the table has no unresolved conflicts.
30
+ */
31
+ get isConflictFree(): boolean;
32
+ /**
33
+ * Returns the ACTION entry for a state and terminal symbol key.
34
+ *
35
+ * @param state - Parser state index.
36
+ * @param symbol - Encoded terminal or `$eof` key.
37
+ */
38
+ action(state: number, symbol: string): ParseAction | null;
39
+ /**
40
+ * Returns the GOTO state for a parser state and non-terminal name.
41
+ *
42
+ * @param state - Parser state index.
43
+ * @param nonTerminal - Non-terminal symbol name.
44
+ */
45
+ goto(state: number, nonTerminal: string): number | null;
46
+ }
47
+ /**
48
+ * Returns readable ACTION rows for a parser state.
49
+ *
50
+ * @param table - LR parse table to format.
51
+ * @param state - Parser state index.
52
+ */
53
+ export declare function formatLrActions(table: LrParseTable, state: number): readonly string[];
54
+ /**
55
+ * Returns readable GOTO rows for a parser state.
56
+ *
57
+ * @param table - LR parse table to format.
58
+ * @param state - Parser state index.
59
+ */
60
+ export declare function formatLrGotos(table: LrParseTable, state: number): readonly string[];
61
+ /**
62
+ * Returns readable conflict labels for tests and diagnostics.
63
+ *
64
+ * @param table - LR parse table to format.
65
+ */
66
+ export declare function formatLrConflicts(table: LrParseTable): readonly string[];
67
+ /**
68
+ * Returns encoded terminal keys used in ACTION rows, including `$eof`.
69
+ *
70
+ * @param table - LR parse table to inspect.
71
+ */
72
+ export declare function lrActionTerminalKeys(table: LrParseTable): readonly string[];
73
+ /**
74
+ * Returns non-terminal names used in GOTO rows.
75
+ *
76
+ * @param table - LR parse table to inspect.
77
+ */
78
+ export declare function lrGotoNonTerminalNames(table: LrParseTable): readonly string[];
79
+ /**
80
+ * Returns a production by its stable id.
81
+ *
82
+ * @param table - LR parse table to inspect.
83
+ * @param productionId - Production id referenced by reduce actions.
84
+ */
85
+ export declare function lrProduction(table: LrParseTable, productionId: number): BnfProduction | null;
86
+ /**
87
+ * Returns encoded right-hand side symbols for one production.
88
+ *
89
+ * @param production - BNF production to encode.
90
+ */
91
+ export declare function encodeProductionRhs(production: BnfProduction): readonly string[];
92
+ //# sourceMappingURL=lr-parse-table.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lr-parse-table.d.ts","sourceRoot":"","sources":["../../../../src/lib/parse-table/table/lr-parse-table.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAG9D,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGpE;;GAEG;AACH,qBAAa,YAAY;aAcD,SAAS,EAAE,WAAW;aACtB,OAAO,EAAE,UAAU;aACnB,WAAW,EAAE,SAAS,aAAa,EAAE;aACrC,UAAU,EAAE,MAAM;aAClB,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;aAC9D,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;aACvD,SAAS,EAAE,SAAS,aAAa,EAAE;IAlBvD;;;;;;;;;;OAUG;gBAEiB,SAAS,EAAE,WAAW,EACtB,OAAO,EAAE,UAAU,EACnB,WAAW,EAAE,SAAS,aAAa,EAAE,EACrC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,EAC9D,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EACvD,SAAS,EAAE,SAAS,aAAa,EAAE;IAKvD;;OAEG;IACH,IAAW,cAAc,IAAI,OAAO,CAGnC;IAED;;;;;OAKG;IACI,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAKhE;;;;;OAKG;IACI,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;CAIjE;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAYrF;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAYnF;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,YAAY,GAAG,SAAS,MAAM,EAAE,CAMxE;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,YAAY,GAAG,SAAS,MAAM,EAAE,CAa3E;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,YAAY,GAAG,SAAS,MAAM,EAAE,CAa7E;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAG5F;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,aAAa,GAAG,SAAS,MAAM,EAAE,CAGhF"}
@@ -0,0 +1,144 @@
1
+ import { bnfSymbolKey } from '../bnf/bnf-symbol.js';
2
+ import { formatParseAction } from './parse-action.js';
3
+ /**
4
+ * LR parse table with ACTION and GOTO entries plus any detected conflicts.
5
+ */
6
+ export class LrParseTable {
7
+ algorithm;
8
+ grammar;
9
+ productions;
10
+ stateCount;
11
+ actions;
12
+ gotos;
13
+ conflicts;
14
+ /**
15
+ * Creates an LR parse table from precomputed table entries.
16
+ *
17
+ * @param algorithm - LR algorithm used to build the table.
18
+ * @param grammar - Augmented BNF grammar the table was built from.
19
+ * @param productions - Flat BNF productions referenced by reduce actions.
20
+ * @param stateCount - Number of parser states in the item set collection.
21
+ * @param actions - ACTION entries keyed by state and terminal symbol.
22
+ * @param gotos - GOTO entries keyed by state and non-terminal name.
23
+ * @param conflicts - Shift/reduce and reduce/reduce conflicts encountered while building.
24
+ */
25
+ constructor(algorithm, grammar, productions, stateCount, actions, gotos, conflicts) {
26
+ this.algorithm = algorithm;
27
+ this.grammar = grammar;
28
+ this.productions = productions;
29
+ this.stateCount = stateCount;
30
+ this.actions = actions;
31
+ this.gotos = gotos;
32
+ this.conflicts = conflicts;
33
+ }
34
+ /**
35
+ * Whether the table has no unresolved conflicts.
36
+ */
37
+ get isConflictFree() {
38
+ return this.conflicts.length === 0;
39
+ }
40
+ /**
41
+ * Returns the ACTION entry for a state and terminal symbol key.
42
+ *
43
+ * @param state - Parser state index.
44
+ * @param symbol - Encoded terminal or `$eof` key.
45
+ */
46
+ action(state, symbol) {
47
+ return this.actions.get(state)?.get(symbol) ?? null;
48
+ }
49
+ /**
50
+ * Returns the GOTO state for a parser state and non-terminal name.
51
+ *
52
+ * @param state - Parser state index.
53
+ * @param nonTerminal - Non-terminal symbol name.
54
+ */
55
+ goto(state, nonTerminal) {
56
+ return this.gotos.get(state)?.get(nonTerminal) ?? null;
57
+ }
58
+ }
59
+ /**
60
+ * Returns readable ACTION rows for a parser state.
61
+ *
62
+ * @param table - LR parse table to format.
63
+ * @param state - Parser state index.
64
+ */
65
+ export function formatLrActions(table, state) {
66
+ const stateActions = table.actions.get(state);
67
+ if (stateActions === undefined) {
68
+ return [];
69
+ }
70
+ return [...stateActions.entries()]
71
+ .sort(([leftSymbol], [rightSymbol]) => leftSymbol.localeCompare(rightSymbol))
72
+ .map(([symbol, action]) => `${symbol}=${formatParseAction(action)}`);
73
+ }
74
+ /**
75
+ * Returns readable GOTO rows for a parser state.
76
+ *
77
+ * @param table - LR parse table to format.
78
+ * @param state - Parser state index.
79
+ */
80
+ export function formatLrGotos(table, state) {
81
+ const stateGotos = table.gotos.get(state);
82
+ if (stateGotos === undefined) {
83
+ return [];
84
+ }
85
+ return [...stateGotos.entries()]
86
+ .sort(([leftSymbol], [rightSymbol]) => leftSymbol.localeCompare(rightSymbol))
87
+ .map(([symbol, targetState]) => `${symbol}=${String(targetState)}`);
88
+ }
89
+ /**
90
+ * Returns readable conflict labels for tests and diagnostics.
91
+ *
92
+ * @param table - LR parse table to format.
93
+ */
94
+ export function formatLrConflicts(table) {
95
+ return table.conflicts.map((conflict) => `${String(conflict.state)}/${conflict.symbol} `
96
+ + `${formatParseAction(conflict.existing)} vs ${formatParseAction(conflict.incoming)} `
97
+ + `(${conflict.kind})`);
98
+ }
99
+ /**
100
+ * Returns encoded terminal keys used in ACTION rows, including `$eof`.
101
+ *
102
+ * @param table - LR parse table to inspect.
103
+ */
104
+ export function lrActionTerminalKeys(table) {
105
+ const keys = new Set();
106
+ for (const stateActions of table.actions.values()) {
107
+ for (const symbol of stateActions.keys()) {
108
+ keys.add(symbol);
109
+ }
110
+ }
111
+ return [...keys].sort();
112
+ }
113
+ /**
114
+ * Returns non-terminal names used in GOTO rows.
115
+ *
116
+ * @param table - LR parse table to inspect.
117
+ */
118
+ export function lrGotoNonTerminalNames(table) {
119
+ const names = new Set();
120
+ for (const stateGotos of table.gotos.values()) {
121
+ for (const name of stateGotos.keys()) {
122
+ names.add(name);
123
+ }
124
+ }
125
+ return [...names].sort();
126
+ }
127
+ /**
128
+ * Returns a production by its stable id.
129
+ *
130
+ * @param table - LR parse table to inspect.
131
+ * @param productionId - Production id referenced by reduce actions.
132
+ */
133
+ export function lrProduction(table, productionId) {
134
+ return table.productions.find((production) => production.id === productionId) ?? null;
135
+ }
136
+ /**
137
+ * Returns encoded right-hand side symbols for one production.
138
+ *
139
+ * @param production - BNF production to encode.
140
+ */
141
+ export function encodeProductionRhs(production) {
142
+ return production.rhs.map((symbol) => bnfSymbolKey(symbol));
143
+ }
144
+ //# sourceMappingURL=lr-parse-table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lr-parse-table.js","sourceRoot":"","sources":["../../../../src/lib/parse-table/table/lr-parse-table.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAGpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD;;GAEG;AACH,MAAM,OAAO,YAAY;IAcD;IACA;IACA;IACA;IACA;IACA;IACA;IAlBpB;;;;;;;;;;OAUG;IACH,YACoB,SAAsB,EACtB,OAAmB,EACnB,WAAqC,EACrC,UAAkB,EAClB,OAA8D,EAC9D,KAAuD,EACvD,SAAmC;QANnC,cAAS,GAAT,SAAS,CAAa;QACtB,YAAO,GAAP,OAAO,CAAY;QACnB,gBAAW,GAAX,WAAW,CAA0B;QACrC,eAAU,GAAV,UAAU,CAAQ;QAClB,YAAO,GAAP,OAAO,CAAuD;QAC9D,UAAK,GAAL,KAAK,CAAkD;QACvD,cAAS,GAAT,SAAS,CAA0B;IAGvD,CAAC;IAED;;OAEG;IACH,IAAW,cAAc;QAErB,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,CAAC;IACvC,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,KAAa,EAAE,MAAc;QAEvC,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC;IACxD,CAAC;IAED;;;;;OAKG;IACI,IAAI,CAAC,KAAa,EAAE,WAAmB;QAE1C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC;IAC3D,CAAC;CACJ;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,KAAmB,EAAE,KAAa;IAE9D,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAE9C,IAAI,YAAY,KAAK,SAAS,EAC9B,CAAC;QACG,OAAO,EAAE,CAAC;IACd,CAAC;IAED,OAAO,CAAC,GAAG,YAAY,CAAC,OAAO,EAAE,CAAC;SAC7B,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;SAC5E,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,GAAG,MAAM,IAAI,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAC7E,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,KAAmB,EAAE,KAAa;IAE5D,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAE1C,IAAI,UAAU,KAAK,SAAS,EAC5B,CAAC;QACG,OAAO,EAAE,CAAC;IACd,CAAC;IAED,OAAO,CAAC,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC;SAC3B,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;SAC5E,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,EAAE,CAAC,GAAG,MAAM,IAAI,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;AAC5E,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAmB;IAEjD,OAAO,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CACpC,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,MAAM,GAAG;UAC7C,GAAG,iBAAiB,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,iBAAiB,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG;UACrF,IAAI,QAAQ,CAAC,IAAI,GAAG,CAAC,CAAC;AAChC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAmB;IAEpD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAE/B,KAAK,MAAM,YAAY,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EACjD,CAAC;QACG,KAAK,MAAM,MAAM,IAAI,YAAY,CAAC,IAAI,EAAE,EACxC,CAAC;YACG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACrB,CAAC;IACL,CAAC;IAED,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;AAC5B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,KAAmB;IAEtD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAEhC,KAAK,MAAM,UAAU,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,EAC7C,CAAC;QACG,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,IAAI,EAAE,EACpC,CAAC;YACG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;IACL,CAAC;IAED,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;AAC7B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,KAAmB,EAAE,YAAoB;IAElE,OAAO,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,KAAK,YAAY,CAAC,IAAI,IAAI,CAAC;AAC1F,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,UAAyB;IAEzD,OAAO,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;AAChE,CAAC"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * One shift, reduce, or accept entry in an LR parse table.
3
+ */
4
+ export type ParseAction = {
5
+ readonly kind: 'shift';
6
+ readonly state: number;
7
+ } | {
8
+ readonly kind: 'reduce';
9
+ readonly productionId: number;
10
+ } | {
11
+ readonly kind: 'accept';
12
+ };
13
+ /**
14
+ * Kind of LR parse table conflict.
15
+ */
16
+ export type ParseConflictKind = 'shift-reduce' | 'reduce-reduce';
17
+ /**
18
+ * Records an unresolved shift/reduce or reduce/reduce conflict.
19
+ */
20
+ export interface ParseConflict {
21
+ readonly kind: ParseConflictKind;
22
+ readonly state: number;
23
+ readonly symbol: string;
24
+ readonly existing: ParseAction;
25
+ readonly incoming: ParseAction;
26
+ }
27
+ /**
28
+ * Returns whether two parse actions are identical.
29
+ *
30
+ * @param left - First action.
31
+ * @param right - Second action.
32
+ */
33
+ export declare function parseActionsEqual(left: ParseAction, right: ParseAction): boolean;
34
+ /**
35
+ * Returns a readable parse action label for tests and diagnostics.
36
+ *
37
+ * @param action - Parse action to format.
38
+ */
39
+ export declare function formatParseAction(action: ParseAction): string;
40
+ /**
41
+ * Classifies a conflict between two distinct parse actions.
42
+ *
43
+ * @param existing - Action already recorded for the table slot.
44
+ * @param incoming - New action competing for the same slot.
45
+ */
46
+ export declare function classifyParseConflict(existing: ParseAction, incoming: ParseAction): ParseConflictKind;
47
+ //# sourceMappingURL=parse-action.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-action.d.ts","sourceRoot":"","sources":["../../../../src/lib/parse-table/table/parse-action.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,WAAW,GACjB;IACE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CAC1B,GACC;IACE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CACjC,GACC;IACE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;CAC3B,CAAC;AAEN;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,cAAc,GAAG,eAAe,CAAC;AAEjE;;GAEG;AACH,MAAM,WAAW,aAAa;IAE1B,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;CAClC;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAkBhF;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAa7D;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACjC,QAAQ,EAAE,WAAW,EACrB,QAAQ,EAAE,WAAW,GACtB,iBAAiB,CAWnB"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Returns whether two parse actions are identical.
3
+ *
4
+ * @param left - First action.
5
+ * @param right - Second action.
6
+ */
7
+ export function parseActionsEqual(left, right) {
8
+ if (left.kind !== right.kind) {
9
+ return false;
10
+ }
11
+ switch (left.kind) {
12
+ case 'shift':
13
+ return right.kind === 'shift' && left.state === right.state;
14
+ case 'reduce':
15
+ return right.kind === 'reduce' && left.productionId === right.productionId;
16
+ case 'accept':
17
+ return true;
18
+ }
19
+ }
20
+ /**
21
+ * Returns a readable parse action label for tests and diagnostics.
22
+ *
23
+ * @param action - Parse action to format.
24
+ */
25
+ export function formatParseAction(action) {
26
+ switch (action.kind) {
27
+ case 'shift':
28
+ return `s${String(action.state)}`;
29
+ case 'reduce':
30
+ return `r${String(action.productionId)}`;
31
+ case 'accept':
32
+ return 'acc';
33
+ }
34
+ }
35
+ /**
36
+ * Classifies a conflict between two distinct parse actions.
37
+ *
38
+ * @param existing - Action already recorded for the table slot.
39
+ * @param incoming - New action competing for the same slot.
40
+ */
41
+ export function classifyParseConflict(existing, incoming) {
42
+ const existingIsShift = existing.kind === 'shift';
43
+ const incomingIsShift = incoming.kind === 'shift';
44
+ if (existingIsShift !== incomingIsShift) {
45
+ return 'shift-reduce';
46
+ }
47
+ return 'reduce-reduce';
48
+ }
49
+ //# sourceMappingURL=parse-action.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-action.js","sourceRoot":"","sources":["../../../../src/lib/parse-table/table/parse-action.ts"],"names":[],"mappings":"AAiCA;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAiB,EAAE,KAAkB;IAEnE,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,EAC5B,CAAC;QACG,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,QAAQ,IAAI,CAAC,IAAI,EACjB,CAAC;QACG,KAAK,OAAO;YACR,OAAO,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,CAAC;QAEhE,KAAK,QAAQ;YACT,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,YAAY,KAAK,KAAK,CAAC,YAAY,CAAC;QAE/E,KAAK,QAAQ;YACT,OAAO,IAAI,CAAC;IACpB,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAmB;IAEjD,QAAQ,MAAM,CAAC,IAAI,EACnB,CAAC;QACG,KAAK,OAAO;YACR,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAEtC,KAAK,QAAQ;YACT,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;QAE7C,KAAK,QAAQ;YACT,OAAO,KAAK,CAAC;IACrB,CAAC;AACL,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CACjC,QAAqB,EACrB,QAAqB;IAGrB,MAAM,eAAe,GAAG,QAAQ,CAAC,IAAI,KAAK,OAAO,CAAC;IAClD,MAAM,eAAe,GAAG,QAAQ,CAAC,IAAI,KAAK,OAAO,CAAC;IAElD,IAAI,eAAe,KAAK,eAAe,EACvC,CAAC;QACG,OAAO,cAAc,CAAC;IAC1B,CAAC;IAED,OAAO,eAAe,CAAC;AAC3B,CAAC"}
@@ -0,0 +1,63 @@
1
+ import { type BnfGrammar } from '../bnf/bnf-grammar.js';
2
+ import { type Lr0Item } from '../lr0/lr0-item-set.js';
3
+ import { type ParseAction, type ParseConflict } from './parse-action.js';
4
+ /**
5
+ * Shared helpers for constructing LR parse tables from item sets.
6
+ */
7
+ export declare class TableBuilderBase {
8
+ /**
9
+ * Precomputes GOTO target state indices for every state and grammar symbol.
10
+ *
11
+ * @param grammar - Augmented BNF grammar.
12
+ * @param itemSets - Canonical item set collection.
13
+ * @param gotoItems - Computes the GOTO item set for one state and symbol.
14
+ */
15
+ static buildGotoTargets(grammar: BnfGrammar, itemSets: readonly (readonly Lr0Item[])[], indexOf: (items: readonly Lr0Item[]) => number | null, gotoItems: (grammar: BnfGrammar, items: readonly Lr0Item[], symbolKey: string) => readonly Lr0Item[]): ReadonlyMap<string, number>;
16
+ /**
17
+ * Fills shift and GOTO entries from incomplete items in one parser state.
18
+ *
19
+ * @param grammar - Augmented BNF grammar.
20
+ * @param state - Parser state index.
21
+ * @param itemSet - Closed item set for the state.
22
+ * @param gotoTargets - Precomputed GOTO target indices.
23
+ * @param stateActions - ACTION map for the state.
24
+ * @param stateGotos - GOTO map for the state.
25
+ * @param conflicts - Conflict list to append to when actions disagree.
26
+ */
27
+ static fillShiftsAndGotos(grammar: BnfGrammar, state: number, itemSet: readonly Lr0Item[], gotoTargets: ReadonlyMap<string, number>, stateActions: Map<string, ParseAction>, stateGotos: Map<string, number>, conflicts: ParseConflict[]): void;
28
+ /**
29
+ * Records an accept action for the augmented start production.
30
+ *
31
+ * @param state - Parser state index.
32
+ * @param productionName - Left-hand side of the completed production.
33
+ * @param stateActions - ACTION map for the state.
34
+ * @param conflicts - Conflict list to append to when actions disagree.
35
+ */
36
+ static setAcceptAction(state: number, productionName: string, stateActions: Map<string, ParseAction>, conflicts: ParseConflict[]): void;
37
+ /**
38
+ * Returns a stable map key for a GOTO lookup.
39
+ *
40
+ * @param state - Parser state index.
41
+ * @param symbolKey - Encoded terminal or non-terminal symbol.
42
+ */
43
+ static gotoKey(state: number, symbolKey: string): string;
44
+ /**
45
+ * Inserts one ACTION entry, recording a conflict when the slot is already occupied.
46
+ *
47
+ * @param stateActions - ACTION map for the current state.
48
+ * @param conflicts - Conflict list to append to when actions disagree.
49
+ * @param state - Parser state index.
50
+ * @param symbol - Encoded terminal or `$eof` key.
51
+ * @param incoming - Candidate parse action.
52
+ */
53
+ static setAction(stateActions: Map<string, ParseAction>, conflicts: ParseConflict[], state: number, symbol: string, incoming: ParseAction): void;
54
+ /**
55
+ * Default GOTO implementation for LR(0) item sets.
56
+ *
57
+ * @param grammar - Augmented BNF grammar.
58
+ * @param items - Closed item set.
59
+ * @param symbolKey - Encoded terminal or non-terminal symbol.
60
+ */
61
+ static lr0GotoItems(grammar: BnfGrammar, items: readonly Lr0Item[], symbolKey: string): readonly Lr0Item[];
62
+ }
63
+ //# sourceMappingURL=table-builder-base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table-builder-base.d.ts","sourceRoot":"","sources":["../../../../src/lib/parse-table/table/table-builder-base.ts"],"names":[],"mappings":"AAEA,OAAO,EAA0B,KAAK,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEhF,OAAO,EAA8B,KAAK,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAElF,OAAO,EAGH,KAAK,WAAW,EAChB,KAAK,aAAa,EACrB,MAAM,mBAAmB,CAAC;AAE3B;;GAEG;AACH,qBAAa,gBAAgB;IAEzB;;;;;;OAMG;WACW,gBAAgB,CAC1B,OAAO,EAAE,UAAU,EACnB,QAAQ,EAAE,SAAS,CAAC,SAAS,OAAO,EAAE,CAAC,EAAE,EACzC,OAAO,EAAE,CAAC,KAAK,EAAE,SAAS,OAAO,EAAE,KAAK,MAAM,GAAG,IAAI,EACrD,SAAS,EAAE,CACP,OAAO,EAAE,UAAU,EACnB,KAAK,EAAE,SAAS,OAAO,EAAE,EACzB,SAAS,EAAE,MAAM,KAChB,SAAS,OAAO,EAAE,GACxB,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC;IAgC9B;;;;;;;;;;OAUG;WACW,kBAAkB,CAC5B,OAAO,EAAE,UAAU,EACnB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,SAAS,OAAO,EAAE,EAC3B,WAAW,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,EACxC,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,EACtC,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,SAAS,EAAE,aAAa,EAAE,GAC3B,IAAI;IA0CP;;;;;;;OAOG;WACW,eAAe,CACzB,KAAK,EAAE,MAAM,EACb,cAAc,EAAE,MAAM,EACtB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,EACtC,SAAS,EAAE,aAAa,EAAE,GAC3B,IAAI;IAgBP;;;;;OAKG;WACW,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM;IAK/D;;;;;;;;OAQG;WACW,SAAS,CACnB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,EACtC,SAAS,EAAE,aAAa,EAAE,EAC1B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,WAAW,GACtB,IAAI;IAwBP;;;;;;OAMG;WACW,YAAY,CACtB,OAAO,EAAE,UAAU,EACnB,KAAK,EAAE,SAAS,OAAO,EAAE,EACzB,SAAS,EAAE,MAAM,GAClB,SAAS,OAAO,EAAE;CAIxB"}
@@ -0,0 +1,129 @@
1
+ import { EOF_TOKEN_NAME } from '../../lexer/token.js';
2
+ import { AUGMENTED_START_SYMBOL } from '../bnf/bnf-grammar.js';
3
+ import { bnfParserSymbolKey } from '../bnf/bnf-symbol.js';
4
+ import { lr0Goto, Lr0ItemSetBuilder } from '../lr0/lr0-item-set.js';
5
+ import { classifyParseConflict, parseActionsEqual, } from './parse-action.js';
6
+ /**
7
+ * Shared helpers for constructing LR parse tables from item sets.
8
+ */
9
+ export class TableBuilderBase {
10
+ /**
11
+ * Precomputes GOTO target state indices for every state and grammar symbol.
12
+ *
13
+ * @param grammar - Augmented BNF grammar.
14
+ * @param itemSets - Canonical item set collection.
15
+ * @param gotoItems - Computes the GOTO item set for one state and symbol.
16
+ */
17
+ static buildGotoTargets(grammar, itemSets, indexOf, gotoItems) {
18
+ const targets = new Map();
19
+ const symbols = Lr0ItemSetBuilder.grammarSymbolKeys(grammar);
20
+ for (let state = 0; state < itemSets.length; state += 1) {
21
+ const itemSet = itemSets[state] ?? [];
22
+ for (const symbolKey of symbols) {
23
+ const gotoSet = gotoItems(grammar, itemSet, symbolKey);
24
+ if (gotoSet.length === 0) {
25
+ continue;
26
+ }
27
+ const targetState = indexOf(gotoSet);
28
+ if (targetState === null) {
29
+ continue;
30
+ }
31
+ targets.set(TableBuilderBase.gotoKey(state, symbolKey), targetState);
32
+ }
33
+ }
34
+ return targets;
35
+ }
36
+ /**
37
+ * Fills shift and GOTO entries from incomplete items in one parser state.
38
+ *
39
+ * @param grammar - Augmented BNF grammar.
40
+ * @param state - Parser state index.
41
+ * @param itemSet - Closed item set for the state.
42
+ * @param gotoTargets - Precomputed GOTO target indices.
43
+ * @param stateActions - ACTION map for the state.
44
+ * @param stateGotos - GOTO map for the state.
45
+ * @param conflicts - Conflict list to append to when actions disagree.
46
+ */
47
+ static fillShiftsAndGotos(grammar, state, itemSet, gotoTargets, stateActions, stateGotos, conflicts) {
48
+ for (const item of itemSet) {
49
+ const production = grammar.production(item.productionId);
50
+ if (production === null) {
51
+ continue;
52
+ }
53
+ const nextSymbol = production.rhs[item.dot];
54
+ if (nextSymbol === undefined) {
55
+ continue;
56
+ }
57
+ const symbolKey = bnfParserSymbolKey(nextSymbol);
58
+ const targetState = gotoTargets.get(TableBuilderBase.gotoKey(state, symbolKey));
59
+ if (targetState === undefined) {
60
+ continue;
61
+ }
62
+ if (nextSymbol.kind === 'nonTerminal') {
63
+ stateGotos.set(nextSymbol.name, targetState);
64
+ continue;
65
+ }
66
+ TableBuilderBase.setAction(stateActions, conflicts, state, symbolKey, { kind: 'shift', state: targetState });
67
+ }
68
+ }
69
+ /**
70
+ * Records an accept action for the augmented start production.
71
+ *
72
+ * @param state - Parser state index.
73
+ * @param productionName - Left-hand side of the completed production.
74
+ * @param stateActions - ACTION map for the state.
75
+ * @param conflicts - Conflict list to append to when actions disagree.
76
+ */
77
+ static setAcceptAction(state, productionName, stateActions, conflicts) {
78
+ if (productionName !== AUGMENTED_START_SYMBOL) {
79
+ return;
80
+ }
81
+ TableBuilderBase.setAction(stateActions, conflicts, state, EOF_TOKEN_NAME, { kind: 'accept' });
82
+ }
83
+ /**
84
+ * Returns a stable map key for a GOTO lookup.
85
+ *
86
+ * @param state - Parser state index.
87
+ * @param symbolKey - Encoded terminal or non-terminal symbol.
88
+ */
89
+ static gotoKey(state, symbolKey) {
90
+ return `${String(state)}:${symbolKey}`;
91
+ }
92
+ /**
93
+ * Inserts one ACTION entry, recording a conflict when the slot is already occupied.
94
+ *
95
+ * @param stateActions - ACTION map for the current state.
96
+ * @param conflicts - Conflict list to append to when actions disagree.
97
+ * @param state - Parser state index.
98
+ * @param symbol - Encoded terminal or `$eof` key.
99
+ * @param incoming - Candidate parse action.
100
+ */
101
+ static setAction(stateActions, conflicts, state, symbol, incoming) {
102
+ const existing = stateActions.get(symbol);
103
+ if (existing === undefined) {
104
+ stateActions.set(symbol, incoming);
105
+ return;
106
+ }
107
+ if (parseActionsEqual(existing, incoming)) {
108
+ return;
109
+ }
110
+ conflicts.push({
111
+ kind: classifyParseConflict(existing, incoming),
112
+ state,
113
+ symbol,
114
+ existing,
115
+ incoming,
116
+ });
117
+ }
118
+ /**
119
+ * Default GOTO implementation for LR(0) item sets.
120
+ *
121
+ * @param grammar - Augmented BNF grammar.
122
+ * @param items - Closed item set.
123
+ * @param symbolKey - Encoded terminal or non-terminal symbol.
124
+ */
125
+ static lr0GotoItems(grammar, items, symbolKey) {
126
+ return lr0Goto(grammar, items, symbolKey);
127
+ }
128
+ }
129
+ //# sourceMappingURL=table-builder-base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table-builder-base.js","sourceRoot":"","sources":["../../../../src/lib/parse-table/table/table-builder-base.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { Grammar } from '../grammar/grammar.js';
2
+ /**
3
+ * Returns the ordered token rule names declared in a grammar.
4
+ *
5
+ * @param grammar - Parsed `.grammar` file model.
6
+ * @returns Token names in declaration order, including `$eof`.
7
+ */
8
+ export declare function tokenInventory(grammar: Grammar): readonly string[];
9
+ //# sourceMappingURL=token-inventory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-inventory.d.ts","sourceRoot":"","sources":["../../../src/lib/parse-table/token-inventory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAGrD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,SAAS,MAAM,EAAE,CAUlE"}
@@ -0,0 +1,15 @@
1
+ import { EOF_TOKEN_NAME } from '../lexer/token.js';
2
+ /**
3
+ * Returns the ordered token rule names declared in a grammar.
4
+ *
5
+ * @param grammar - Parsed `.grammar` file model.
6
+ * @returns Token names in declaration order, including `$eof`.
7
+ */
8
+ export function tokenInventory(grammar) {
9
+ const names = grammar.tokenRules.map((rule) => rule.name);
10
+ if (names.includes(EOF_TOKEN_NAME)) {
11
+ return names;
12
+ }
13
+ return [...names, EOF_TOKEN_NAME];
14
+ }
15
+ //# sourceMappingURL=token-inventory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-inventory.js","sourceRoot":"","sources":["../../../src/lib/parse-table/token-inventory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,OAAgB;IAE3C,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE1D,IAAI,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,EAClC,CAAC;QACG,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,OAAO,CAAC,GAAG,KAAK,EAAE,cAAc,CAAC,CAAC;AACtC,CAAC"}