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,270 @@
1
+ import { assertLexerState, compileLexerRules, findLongestMatch, hasLongerPossibleMatch, isPrefixOfPotentialMatch, rulesForState, } from './lexer-compile.js';
2
+ import { LexerError } from './lexer-error.js';
3
+ import { LexerInputError } from './lexer-input-error.js';
4
+ import { eofToken, token } from './token.js';
5
+ /**
6
+ * Stream-based lexer driven by a grammar's `tokens`, `skip`, and `states` sections.
7
+ *
8
+ * Push source chunks with {@link push}, signal end-of-input with {@link finish},
9
+ * then read tokens via {@link next} or iteration. The final token is always `$eof`.
10
+ */
11
+ export class Lexer {
12
+ compiled;
13
+ queue = [];
14
+ buffer = '';
15
+ offset = 0;
16
+ finished = false;
17
+ eofEmitted = false;
18
+ currentState;
19
+ /**
20
+ * Creates a lexer from a parsed grammar.
21
+ *
22
+ * @param grammar - Grammar supplying token and skip rule definitions.
23
+ */
24
+ constructor(grammar) {
25
+ this.compiled = compileLexerRules(grammar);
26
+ this.currentState = this.compiled.initialState;
27
+ }
28
+ /**
29
+ * Returns the active lexer state name.
30
+ */
31
+ get state() {
32
+ return this.currentState;
33
+ }
34
+ /**
35
+ * Enters a declared lexer state.
36
+ *
37
+ * @param stateName - Lexer state to activate.
38
+ */
39
+ enterState(stateName) {
40
+ assertLexerState(this.compiled, stateName);
41
+ this.currentState = stateName;
42
+ }
43
+ /**
44
+ * Appends the next chunk of source text to the scan buffer.
45
+ *
46
+ * @param chunk - Source text fragment.
47
+ */
48
+ push(chunk) {
49
+ if (this.finished) {
50
+ throw new LexerInputError();
51
+ }
52
+ this.buffer += chunk;
53
+ this.drain(false);
54
+ }
55
+ /**
56
+ * Signals that no further source chunks will arrive.
57
+ */
58
+ finish() {
59
+ this.finished = true;
60
+ this.drain(true);
61
+ }
62
+ /**
63
+ * Returns the next token, or null when waiting for more input.
64
+ *
65
+ * @returns The next token, null while blocked, or `$eof` after input ends.
66
+ */
67
+ next() {
68
+ if (this.eofEmitted) {
69
+ return null;
70
+ }
71
+ if (this.queue.length > 0) {
72
+ return this.queue.shift() ?? null;
73
+ }
74
+ if (!this.finished) {
75
+ return null;
76
+ }
77
+ if (this.buffer.length > 0) {
78
+ throw new LexerError(`Unexpected character ${JSON.stringify(this.buffer[0])} at offset ${this.offset}`, this.offset);
79
+ }
80
+ this.eofEmitted = true;
81
+ return eofToken(this.offset);
82
+ }
83
+ /**
84
+ * Lexes an entire source string, including a trailing `$eof` token.
85
+ *
86
+ * @param source - Input text to tokenize.
87
+ * @returns Matched tokens in source order.
88
+ */
89
+ lex(source) {
90
+ this.reset();
91
+ this.push(source);
92
+ this.finish();
93
+ const tokens = [];
94
+ let nextToken = this.next();
95
+ while (nextToken !== null) {
96
+ tokens.push(nextToken);
97
+ nextToken = this.next();
98
+ }
99
+ return tokens;
100
+ }
101
+ /**
102
+ * Iterates all tokens until `$eof` after {@link finish} has been called.
103
+ */
104
+ [Symbol.iterator]() {
105
+ return {
106
+ next: () => {
107
+ const value = this.next();
108
+ if (value === null) {
109
+ return {
110
+ done: true,
111
+ value: undefined,
112
+ };
113
+ }
114
+ return {
115
+ done: false,
116
+ value,
117
+ };
118
+ },
119
+ };
120
+ }
121
+ /**
122
+ * Scans the buffer and enqueues any tokens ready to emit.
123
+ *
124
+ * @param inputFinished - Whether the full input stream has ended.
125
+ * @param allowChunkBoundary - Whether to commit tokens at a chunk boundary.
126
+ */
127
+ drain(inputFinished) {
128
+ // Scan until the buffer needs more input or input ends with an error.
129
+ while (true) {
130
+ const match = this.matchAtBufferStart(inputFinished);
131
+ if (match === 'need-more') {
132
+ return;
133
+ }
134
+ if (match === null) {
135
+ if (inputFinished && this.buffer.length > 0) {
136
+ throw new LexerError(`Unexpected character ${JSON.stringify(this.buffer[0])} at offset ${this.offset}`, this.offset);
137
+ }
138
+ return;
139
+ }
140
+ this.buffer = this.buffer.slice(match.text.length);
141
+ this.offset += match.text.length;
142
+ if (!match.skip) {
143
+ this.queue.push(token(match.name, match.text, match.offset));
144
+ }
145
+ }
146
+ }
147
+ /**
148
+ * Finds the winning rule match at the start of the scan buffer.
149
+ *
150
+ * @param inputFinished - Whether the full input stream has ended.
151
+ * @param allowChunkBoundary - Whether to commit tokens at a chunk boundary.
152
+ */
153
+ matchAtBufferStart(inputFinished) {
154
+ if (this.buffer.length === 0) {
155
+ return null;
156
+ }
157
+ const activeRules = rulesForState(this.compiled, this.currentState);
158
+ const bestMatch = findLongestMatch(this.buffer, activeRules);
159
+ if (bestMatch === null) {
160
+ if (!inputFinished && isPrefixOfPotentialMatch(this.buffer, activeRules)) {
161
+ return 'need-more';
162
+ }
163
+ return null;
164
+ }
165
+ if (bestMatch.text.length === this.buffer.length && !inputFinished) {
166
+ if (hasLongerPossibleMatch(this.buffer, bestMatch.text, activeRules, false)) {
167
+ return 'need-more';
168
+ }
169
+ }
170
+ return {
171
+ name: bestMatch.name,
172
+ text: bestMatch.text,
173
+ offset: this.offset,
174
+ skip: bestMatch.skip,
175
+ };
176
+ }
177
+ /**
178
+ * Resets stream state for a fresh lex run.
179
+ */
180
+ reset() {
181
+ this.queue.length = 0;
182
+ this.buffer = '';
183
+ this.offset = 0;
184
+ this.finished = false;
185
+ this.eofEmitted = false;
186
+ }
187
+ }
188
+ /**
189
+ * Lexes synchronous source chunks into a token stream ending with `$eof`.
190
+ *
191
+ * @param grammar - Grammar supplying lexer rules.
192
+ * @param chunks - Source text fragments in order.
193
+ * @returns Token iterator including `$eof`.
194
+ */
195
+ export function lexChunks(grammar, chunks) {
196
+ const lexer = new Lexer(grammar);
197
+ return lexChunksFromLexer(lexer, chunks);
198
+ }
199
+ /**
200
+ * Lexes asynchronous source chunks into a token stream ending with `$eof`.
201
+ *
202
+ * @param grammar - Grammar supplying lexer rules.
203
+ * @param chunks - Source text fragments in order.
204
+ * @returns Async token iterator including `$eof`.
205
+ */
206
+ export async function* lexChunksAsync(grammar, chunks) {
207
+ const lexer = new Lexer(grammar);
208
+ for await (const chunk of chunks) {
209
+ lexer.push(chunk);
210
+ let nextToken = lexer.next();
211
+ while (nextToken !== null) {
212
+ yield nextToken;
213
+ nextToken = lexer.next();
214
+ }
215
+ }
216
+ lexer.finish();
217
+ let nextToken = lexer.next();
218
+ while (nextToken !== null) {
219
+ yield nextToken;
220
+ nextToken = lexer.next();
221
+ }
222
+ }
223
+ /**
224
+ * Drains tokens from a lexer fed by synchronous chunks.
225
+ *
226
+ * @param lexer - Configured lexer instance.
227
+ * @param chunks - Source text fragments in order.
228
+ * @returns Token iterator including `$eof`.
229
+ */
230
+ function* lexChunksFromLexer(lexer, chunks) {
231
+ for (const chunk of chunks) {
232
+ lexer.push(chunk);
233
+ let nextToken = lexer.next();
234
+ while (nextToken !== null) {
235
+ yield nextToken;
236
+ nextToken = lexer.next();
237
+ }
238
+ }
239
+ lexer.finish();
240
+ let nextToken = lexer.next();
241
+ while (nextToken !== null) {
242
+ yield nextToken;
243
+ nextToken = lexer.next();
244
+ }
245
+ }
246
+ /**
247
+ * Collects all tokens from a synchronous chunk stream.
248
+ *
249
+ * @param grammar - Grammar supplying lexer rules.
250
+ * @param chunks - Source text fragments in order.
251
+ * @returns Matched tokens including `$eof`.
252
+ */
253
+ export function lexChunkStream(grammar, chunks) {
254
+ return [...lexChunks(grammar, chunks)];
255
+ }
256
+ /**
257
+ * Collects all tokens from an asynchronous chunk stream.
258
+ *
259
+ * @param grammar - Grammar supplying lexer rules.
260
+ * @param chunks - Source text fragments in order.
261
+ * @returns Matched tokens including `$eof`.
262
+ */
263
+ export async function lexChunkStreamAsync(grammar, chunks) {
264
+ const tokens = [];
265
+ for await (const value of lexChunksAsync(grammar, chunks)) {
266
+ tokens.push(value);
267
+ }
268
+ return tokens;
269
+ }
270
+ //# sourceMappingURL=lexer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lexer.js","sourceRoot":"","sources":["../../../src/lib/lexer/lexer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import type { SourceLocation } from '../ast/ast-node.js';
2
+ /** Token name emitted once at end of input. */
3
+ export declare const EOF_TOKEN_NAME = "$eof";
4
+ /**
5
+ * Lexeme emitted by the lexer for one token rule match.
6
+ */
7
+ export interface Token {
8
+ readonly name: string;
9
+ readonly text: string;
10
+ readonly location: SourceLocation;
11
+ }
12
+ /**
13
+ * Builds a token value from a rule name, matched text, and source offset.
14
+ *
15
+ * @param name - Token rule name from the grammar `tokens` section.
16
+ * @param text - Matched lexeme text.
17
+ * @param offset - Start offset of the lexeme in the source.
18
+ * @returns A token record with a source span.
19
+ */
20
+ export declare function token(name: string, text: string, offset: number): Token;
21
+ /**
22
+ * Builds the end-of-input token at a source offset.
23
+ *
24
+ * @param offset - Source offset where input ended.
25
+ * @returns An empty `$eof` token.
26
+ */
27
+ export declare function eofToken(offset: number): Token;
28
+ /**
29
+ * Returns whether a token is the end-of-input marker.
30
+ *
31
+ * @param value - Token to test.
32
+ */
33
+ export declare function isEofToken(value: Token): boolean;
34
+ //# sourceMappingURL=token.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../../../src/lib/lexer/token.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD,+CAA+C;AAC/C,eAAO,MAAM,cAAc,SAAS,CAAC;AAErC;;GAEG;AACH,MAAM,WAAW,KAAK;IAElB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;CACrC;AAED;;;;;;;GAOG;AACH,wBAAgB,KAAK,CACjB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,GACf,KAAK,CAUP;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAG9C;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAGhD"}
@@ -0,0 +1,38 @@
1
+ /** Token name emitted once at end of input. */
2
+ export const EOF_TOKEN_NAME = '$eof';
3
+ /**
4
+ * Builds a token value from a rule name, matched text, and source offset.
5
+ *
6
+ * @param name - Token rule name from the grammar `tokens` section.
7
+ * @param text - Matched lexeme text.
8
+ * @param offset - Start offset of the lexeme in the source.
9
+ * @returns A token record with a source span.
10
+ */
11
+ export function token(name, text, offset) {
12
+ return {
13
+ name,
14
+ text,
15
+ location: {
16
+ offset,
17
+ length: text.length,
18
+ },
19
+ };
20
+ }
21
+ /**
22
+ * Builds the end-of-input token at a source offset.
23
+ *
24
+ * @param offset - Source offset where input ended.
25
+ * @returns An empty `$eof` token.
26
+ */
27
+ export function eofToken(offset) {
28
+ return token(EOF_TOKEN_NAME, '', offset);
29
+ }
30
+ /**
31
+ * Returns whether a token is the end-of-input marker.
32
+ *
33
+ * @param value - Token to test.
34
+ */
35
+ export function isEofToken(value) {
36
+ return value.name === EOF_TOKEN_NAME;
37
+ }
38
+ //# sourceMappingURL=token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.js","sourceRoot":"","sources":["../../../src/lib/lexer/token.ts"],"names":[],"mappings":"AAEA,+CAA+C;AAC/C,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC;AAYrC;;;;;;;GAOG;AACH,MAAM,UAAU,KAAK,CACjB,IAAY,EACZ,IAAY,EACZ,MAAc;IAGd,OAAO;QACH,IAAI;QACJ,IAAI;QACJ,QAAQ,EAAE;YACN,MAAM;YACN,MAAM,EAAE,IAAI,CAAC,MAAM;SACtB;KACJ,CAAC;AACN,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,QAAQ,CAAC,MAAc;IAEnC,OAAO,KAAK,CAAC,cAAc,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;AAC7C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,KAAY;IAEnC,OAAO,KAAK,CAAC,IAAI,KAAK,cAAc,CAAC;AACzC,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { ParserLrError } from './errors/parser-lr-error.js';
2
+ /**
3
+ * Thrown when a parse context cannot be constructed from supplied sources.
4
+ */
5
+ export declare class ParseContextError extends ParserLrError {
6
+ /**
7
+ * Creates a parse context configuration error.
8
+ *
9
+ * @param message - Human-readable failure description.
10
+ */
11
+ constructor(message: string);
12
+ }
13
+ //# sourceMappingURL=parse-context-error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-context-error.d.ts","sourceRoot":"","sources":["../../src/lib/parse-context-error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAE5D;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,aAAa;IAEhD;;;;OAIG;gBACgB,OAAO,EAAE,MAAM;CAIrC"}
@@ -0,0 +1,15 @@
1
+ import { ParserLrError } from './errors/parser-lr-error.js';
2
+ /**
3
+ * Thrown when a parse context cannot be constructed from supplied sources.
4
+ */
5
+ export class ParseContextError extends ParserLrError {
6
+ /**
7
+ * Creates a parse context configuration error.
8
+ *
9
+ * @param message - Human-readable failure description.
10
+ */
11
+ constructor(message) {
12
+ super(message);
13
+ }
14
+ }
15
+ //# sourceMappingURL=parse-context-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-context-error.js","sourceRoot":"","sources":["../../src/lib/parse-context-error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAE5D;;GAEG;AACH,MAAM,OAAO,iBAAkB,SAAQ,aAAa;IAEhD;;;;OAIG;IACH,YAAmB,OAAe;QAE9B,KAAK,CAAC,OAAO,CAAC,CAAC;IACnB,CAAC;CACJ"}
@@ -0,0 +1,106 @@
1
+ import type { AstNode } from './ast/ast-node.js';
2
+ import type { Lexer } from './lexer/lexer.js';
3
+ import type { Token } from './lexer/token.js';
4
+ import type { LrAlgorithm } from './parse-table/lr-algorithm.js';
5
+ import { ParseTable } from './parse-table/parse-table.js';
6
+ import { ParserLr } from './parser-lr.js';
7
+ /**
8
+ * Parser and parse table loaded from a grammar or serialized table.
9
+ */
10
+ export declare class ParseContext {
11
+ readonly parser: ParserLr;
12
+ readonly table: ParseTable;
13
+ /**
14
+ * Creates a parse context from a parser and its table.
15
+ *
16
+ * @param parser - Shift-reduce parser instance.
17
+ * @param table - Parse table backing the parser.
18
+ */
19
+ constructor(parser: ParserLr, table: ParseTable);
20
+ /**
21
+ * Builds a parse context from grammar file text.
22
+ *
23
+ * @param source - Full `.grammar` file contents.
24
+ * @param algorithm - LR algorithm used to build the table.
25
+ * @returns Parser and parse table ready for lexing or parsing.
26
+ */
27
+ static fromGrammar(source: string, algorithm?: LrAlgorithm): ParseContext;
28
+ /**
29
+ * Builds a parse context from serialized parse table JSON.
30
+ *
31
+ * @param json - Serialized parse table JSON.
32
+ * @returns Parser and parse table ready for lexing or parsing.
33
+ */
34
+ static fromTableJson(json: string): ParseContext;
35
+ /**
36
+ * Builds a parse context from a grammar or table source string.
37
+ *
38
+ * @param options - Grammar source, table JSON, and optional algorithm.
39
+ * @returns Parser and parse table ready for lexing or parsing.
40
+ */
41
+ static fromSources(options: ParseContextSources): ParseContext;
42
+ /**
43
+ * Creates a stream lexer for this context's grammar.
44
+ *
45
+ * @returns A fresh stream lexer instance.
46
+ */
47
+ createLexer(): Lexer;
48
+ /**
49
+ * Lexes source text using this context's parser.
50
+ *
51
+ * @param source - Input text to tokenize.
52
+ * @returns Matched tokens in source order, ending with `$eof`.
53
+ */
54
+ lex(source: string): readonly Token[];
55
+ /**
56
+ * Lexes synchronous source chunks into a token stream ending with `$eof`.
57
+ *
58
+ * @param chunks - Source text fragments in order.
59
+ * @returns Token iterator including `$eof`.
60
+ */
61
+ lexChunks(chunks: Iterable<string>): IterableIterator<Token>;
62
+ /**
63
+ * Lexes asynchronous source chunks into a token stream ending with `$eof`.
64
+ *
65
+ * @param chunks - Source text fragments in order.
66
+ * @returns Async token iterator including `$eof`.
67
+ */
68
+ lexChunksAsync(chunks: AsyncIterable<string>): AsyncIterableIterator<Token>;
69
+ /**
70
+ * Collects all tokens from a synchronous chunk stream.
71
+ *
72
+ * @param chunks - Source text fragments in order.
73
+ * @returns Matched tokens including `$eof`.
74
+ */
75
+ lexChunkStream(chunks: Iterable<string>): readonly Token[];
76
+ /**
77
+ * Collects all tokens from an asynchronous chunk stream.
78
+ *
79
+ * @param chunks - Source text fragments in order.
80
+ * @returns Matched tokens including `$eof`.
81
+ */
82
+ lexChunkStreamAsync(chunks: AsyncIterable<string>): Promise<readonly Token[]>;
83
+ /**
84
+ * Parses a token stream into a concrete syntax tree.
85
+ *
86
+ * @param tokens - Token stream ending with `$eof`.
87
+ * @returns Parse tree rooted at the grammar start symbol, or null on syntax error.
88
+ */
89
+ parse(tokens: readonly Token[]): AstNode | null;
90
+ /**
91
+ * Lexes and parses source text into a concrete syntax tree.
92
+ *
93
+ * @param source - Input text to parse.
94
+ * @returns Parse tree rooted at the grammar start symbol, or null on syntax error.
95
+ */
96
+ parseSource(source: string): AstNode | null;
97
+ }
98
+ /**
99
+ * In-memory sources for constructing a {@link ParseContext}.
100
+ */
101
+ export interface ParseContextSources {
102
+ readonly grammarSource?: string;
103
+ readonly tableJson?: string;
104
+ readonly algorithm?: string;
105
+ }
106
+ //# sourceMappingURL=parse-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-context.d.ts","sourceRoot":"","sources":["../../src/lib/parse-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAGjD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAEjE,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C;;GAEG;AACH,qBAAa,YAAY;aASD,MAAM,EAAE,QAAQ;aAChB,KAAK,EAAE,UAAU;IARrC;;;;;OAKG;gBAEiB,MAAM,EAAE,QAAQ,EAChB,KAAK,EAAE,UAAU;IAKrC;;;;;;OAMG;WACW,WAAW,CACrB,MAAM,EAAE,MAAM,EACd,SAAS,GAAE,WAAmB,GAC/B,YAAY;IASf;;;;;OAKG;WACW,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY;IAOvD;;;;;OAKG;WACW,WAAW,CAAC,OAAO,EAAE,mBAAmB,GAAG,YAAY;IAmBrE;;;;OAIG;IACI,WAAW,IAAI,KAAK;IAK3B;;;;;OAKG;IACI,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,KAAK,EAAE;IAK5C;;;;;OAKG;IACI,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,gBAAgB,CAAC,KAAK,CAAC;IAKnE;;;;;OAKG;IACI,cAAc,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,qBAAqB,CAAC,KAAK,CAAC;IAKlF;;;;;OAKG;IACI,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,SAAS,KAAK,EAAE;IAKjE;;;;;OAKG;IACU,mBAAmB,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,KAAK,EAAE,CAAC;IAK1F;;;;;OAKG;IACI,KAAK,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,GAAG,OAAO,GAAG,IAAI;IAKtD;;;;;OAKG;IACI,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI;CAIrD;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAEhC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC/B"}
@@ -0,0 +1,133 @@
1
+ import { ParseContextError } from './parse-context-error.js';
2
+ import { readGrammar } from './grammar/read-grammar.js';
3
+ import { parseLrAlgorithm } from './parse-table/lr-algorithm.js';
4
+ import { ParseTable } from './parse-table/parse-table.js';
5
+ import { ParserLr } from './parser-lr.js';
6
+ /**
7
+ * Parser and parse table loaded from a grammar or serialized table.
8
+ */
9
+ export class ParseContext {
10
+ parser;
11
+ table;
12
+ /**
13
+ * Creates a parse context from a parser and its table.
14
+ *
15
+ * @param parser - Shift-reduce parser instance.
16
+ * @param table - Parse table backing the parser.
17
+ */
18
+ constructor(parser, table) {
19
+ this.parser = parser;
20
+ this.table = table;
21
+ }
22
+ /**
23
+ * Builds a parse context from grammar file text.
24
+ *
25
+ * @param source - Full `.grammar` file contents.
26
+ * @param algorithm - LR algorithm used to build the table.
27
+ * @returns Parser and parse table ready for lexing or parsing.
28
+ */
29
+ static fromGrammar(source, algorithm = 'lr1') {
30
+ const grammar = readGrammar(source);
31
+ const table = ParseTable.fromGrammar(grammar, algorithm);
32
+ const parser = new ParserLr(grammar, table);
33
+ return new ParseContext(parser, table);
34
+ }
35
+ /**
36
+ * Builds a parse context from serialized parse table JSON.
37
+ *
38
+ * @param json - Serialized parse table JSON.
39
+ * @returns Parser and parse table ready for lexing or parsing.
40
+ */
41
+ static fromTableJson(json) {
42
+ const table = ParseTable.fromJsonString(json);
43
+ return new ParseContext(ParserLr.fromParseTable(table), table);
44
+ }
45
+ /**
46
+ * Builds a parse context from a grammar or table source string.
47
+ *
48
+ * @param options - Grammar source, table JSON, and optional algorithm.
49
+ * @returns Parser and parse table ready for lexing or parsing.
50
+ */
51
+ static fromSources(options) {
52
+ // Prefer grammar source over a saved table when both are supplied.
53
+ if (options.grammarSource !== undefined) {
54
+ return ParseContext.fromGrammar(options.grammarSource, parseLrAlgorithm(options.algorithm));
55
+ }
56
+ if (options.tableJson !== undefined) {
57
+ return ParseContext.fromTableJson(options.tableJson);
58
+ }
59
+ throw new ParseContextError('required: grammar source or table JSON');
60
+ }
61
+ /**
62
+ * Creates a stream lexer for this context's grammar.
63
+ *
64
+ * @returns A fresh stream lexer instance.
65
+ */
66
+ createLexer() {
67
+ return this.parser.createLexer();
68
+ }
69
+ /**
70
+ * Lexes source text using this context's parser.
71
+ *
72
+ * @param source - Input text to tokenize.
73
+ * @returns Matched tokens in source order, ending with `$eof`.
74
+ */
75
+ lex(source) {
76
+ return this.parser.lex(source);
77
+ }
78
+ /**
79
+ * Lexes synchronous source chunks into a token stream ending with `$eof`.
80
+ *
81
+ * @param chunks - Source text fragments in order.
82
+ * @returns Token iterator including `$eof`.
83
+ */
84
+ lexChunks(chunks) {
85
+ return this.parser.lexChunks(chunks);
86
+ }
87
+ /**
88
+ * Lexes asynchronous source chunks into a token stream ending with `$eof`.
89
+ *
90
+ * @param chunks - Source text fragments in order.
91
+ * @returns Async token iterator including `$eof`.
92
+ */
93
+ lexChunksAsync(chunks) {
94
+ return this.parser.lexChunksAsync(chunks);
95
+ }
96
+ /**
97
+ * Collects all tokens from a synchronous chunk stream.
98
+ *
99
+ * @param chunks - Source text fragments in order.
100
+ * @returns Matched tokens including `$eof`.
101
+ */
102
+ lexChunkStream(chunks) {
103
+ return this.parser.lexChunkStream(chunks);
104
+ }
105
+ /**
106
+ * Collects all tokens from an asynchronous chunk stream.
107
+ *
108
+ * @param chunks - Source text fragments in order.
109
+ * @returns Matched tokens including `$eof`.
110
+ */
111
+ async lexChunkStreamAsync(chunks) {
112
+ return this.parser.lexChunkStreamAsync(chunks);
113
+ }
114
+ /**
115
+ * Parses a token stream into a concrete syntax tree.
116
+ *
117
+ * @param tokens - Token stream ending with `$eof`.
118
+ * @returns Parse tree rooted at the grammar start symbol, or null on syntax error.
119
+ */
120
+ parse(tokens) {
121
+ return this.parser.parse(tokens);
122
+ }
123
+ /**
124
+ * Lexes and parses source text into a concrete syntax tree.
125
+ *
126
+ * @param source - Input text to parse.
127
+ * @returns Parse tree rooted at the grammar start symbol, or null on syntax error.
128
+ */
129
+ parseSource(source) {
130
+ return this.parser.parseSource(source);
131
+ }
132
+ }
133
+ //# sourceMappingURL=parse-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-context.js","sourceRoot":"","sources":["../../src/lib/parse-context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { ParserLrError } from './errors/parser-lr-error.js';
2
+ /**
3
+ * Thrown when parse output cannot be formatted for a requested interchange format.
4
+ */
5
+ export declare class ParseOutputError extends ParserLrError {
6
+ /**
7
+ * Creates a parse output formatting error.
8
+ *
9
+ * @param format - Requested output format name.
10
+ */
11
+ constructor(format: string);
12
+ }
13
+ //# sourceMappingURL=parse-output-error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-output-error.d.ts","sourceRoot":"","sources":["../../src/lib/parse-output-error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAE5D;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,aAAa;IAE/C;;;;OAIG;gBACgB,MAAM,EAAE,MAAM;CAIpC"}