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
package/README.md CHANGED
@@ -1,2 +1,113 @@
1
1
  # parser-lr
2
- Parser LR is a shift-reduce parser library for EBNF grammars. Parser LR can produce a table and then use that table to produce an AST.
2
+
3
+ Shift-reduce parser for EBNF grammars. Write a `.grammar` file, build an LR parse table, then lex and parse source into a concrete syntax tree or AST.
4
+
5
+ Grammar file syntax is documented in [`docs/grammar.md`](docs/grammar.md).
6
+
7
+ ## Install
8
+
9
+ From npm:
10
+
11
+ ```bash
12
+ npm install parser-lr
13
+ ```
14
+
15
+ From a clone of this repository:
16
+
17
+ ```bash
18
+ npm install
19
+ npm run build
20
+ ```
21
+
22
+ ## CLI
23
+
24
+ The `parser-lr` command is published as the package `bin` entry. After a local build, link it globally:
25
+
26
+ ```bash
27
+ npm link
28
+ ```
29
+
30
+ You can then run `parser-lr` from any directory. Without linking, use `npx parser-lr` (published install) or `node node_modules/parser-lr/bin/parser-lr.js`.
31
+
32
+ ### Build a parse table
33
+
34
+ Generate a serialized LR table from a grammar file:
35
+
36
+ ```bash
37
+ parser-lr table generate -g mylang.grammar -o mylang.table.json
38
+ ```
39
+
40
+ Options:
41
+
42
+ | Option | Description |
43
+ |--------|-------------|
44
+ | `-g, --grammar <path>` | `.grammar` file (required) |
45
+ | `-o, --output <path>` | Output path (default: stdout) |
46
+ | `-a, --algorithm <name>` | `lr0`, `slr`, `lalr`, or `lr1` (default: `lr1`) |
47
+
48
+ The JSON table includes lexer token rules, skip rules, and the full ACTION/GOTO table. You can ship this file without the original grammar.
49
+
50
+ ### Parse a source file
51
+
52
+ Parse input using either the grammar (table built in memory) or a saved table:
53
+
54
+ ```bash
55
+ parser-lr parse -i program.txt -g mylang.grammar
56
+ parser-lr parse -i program.txt -t mylang.table.json
57
+ ```
58
+
59
+ Options:
60
+
61
+ | Option | Description |
62
+ |--------|-------------|
63
+ | `-i, --input <path>` | Source file to parse (required) |
64
+ | `-g, --grammar <path>` | `.grammar` file (one of grammar or table) |
65
+ | `-t, --table <path>` | Serialized table JSON from `table generate` |
66
+ | `-o, --output <path>` | Output path (default: stdout) |
67
+ | `--format <name>` | Output format (default: `json`) |
68
+
69
+ Output is a JSON object `{ "ast": … }`. On a syntax error, `ast` is `null`.
70
+
71
+ When the grammar defines `ast` and `transform` sections, the CLI applies CST-to-AST transforms and returns the abstract tree.
72
+
73
+ ## Library
74
+
75
+ Import from `parser-lr` in Node or bundler projects (ESM). The API is browser-safe; the CLI is Node-only.
76
+
77
+ ```typescript
78
+ import { readFile } from 'node:fs/promises';
79
+ import { ParseContext } from 'parser-lr';
80
+
81
+ const grammarSource = await readFile('mylang.grammar', 'utf8');
82
+ const context = ParseContext.fromGrammar(grammarSource, 'lr1');
83
+
84
+ const source = await readFile('program.txt', 'utf8');
85
+ const ast = context.parseSource(source);
86
+ ```
87
+
88
+ Load a pre-built table instead of a grammar file:
89
+
90
+ ```typescript
91
+ import { readFile } from 'node:fs/promises';
92
+ import { ParseContext } from 'parser-lr';
93
+
94
+ const tableJson = await readFile('mylang.table.json', 'utf8');
95
+ const context = ParseContext.fromTableJson(tableJson);
96
+
97
+ const source = await readFile('program.txt', 'utf8');
98
+ const ast = context.parse(context.lex(source));
99
+ ```
100
+
101
+ `ParseContext` exposes `lex`, `parse`, and `createLexer` for finer control. See [`src/lib/README.md`](src/lib/README.md) for the main types.
102
+
103
+ ## Example grammars
104
+
105
+ Sample `.grammar` files ship in [`grammars/`](grammars/) (`calc.grammar`, `lisp.grammar`, `6502.grammar`, and the meta-grammar `grammar.grammar`). Use them as templates when writing your own language.
106
+
107
+ ## Developing this package
108
+
109
+ Contributors who change the meta-grammar should regenerate the bootstrapped table:
110
+
111
+ ```bash
112
+ npm run bootstrap
113
+ ```