parser-lr 0.4.1 → 0.6.0

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 (203) hide show
  1. package/README.md +39 -1
  2. package/bin/parser-lr.js +8373 -7960
  3. package/bin/parser-lr.js.map +1 -1
  4. package/dist/lib/grammar/grammar-json-path.d.ts +2 -0
  5. package/dist/lib/grammar/grammar-json-path.d.ts.map +1 -0
  6. package/dist/lib/grammar/grammar-json-path.esm.d.ts +5 -0
  7. package/dist/lib/grammar/grammar-json-path.esm.d.ts.map +1 -0
  8. package/dist/lib/grammar/grammar-json-path.esm.js +9 -0
  9. package/dist/lib/grammar/grammar-json-path.esm.js.map +1 -0
  10. package/dist/lib/grammar/grammar-json-path.js +2 -0
  11. package/dist/lib/grammar/grammar-json-path.js.map +1 -0
  12. package/dist/lib/grammar/index.d.ts +3 -0
  13. package/dist/lib/grammar/index.d.ts.map +1 -1
  14. package/dist/lib/grammar/index.js +2 -0
  15. package/dist/lib/grammar/index.js.map +1 -1
  16. package/dist/lib/grammar/meta-grammar-table.d.ts +12 -0
  17. package/dist/lib/grammar/meta-grammar-table.d.ts.map +1 -1
  18. package/dist/lib/grammar/meta-grammar-table.js +33 -3
  19. package/dist/lib/grammar/meta-grammar-table.js.map +1 -1
  20. package/dist/lib/grammar/table-validator.d.ts +26 -0
  21. package/dist/lib/grammar/table-validator.d.ts.map +1 -0
  22. package/dist/lib/grammar/table-validator.js +258 -0
  23. package/dist/lib/grammar/table-validator.js.map +1 -0
  24. package/dist/lib/index.d.ts +2 -0
  25. package/dist/lib/index.d.ts.map +1 -1
  26. package/dist/lib/index.js +1 -0
  27. package/dist/lib/index.js.map +1 -1
  28. package/dist/lib/transform/cst-transformer.d.ts +14 -0
  29. package/dist/lib/transform/cst-transformer.d.ts.map +1 -1
  30. package/dist/lib/transform/cst-transformer.js +82 -11
  31. package/dist/lib/transform/cst-transformer.js.map +1 -1
  32. package/dist/lib/transform/grammar-fixture.d.ts +56 -0
  33. package/dist/lib/transform/grammar-fixture.d.ts.map +1 -0
  34. package/dist/lib/transform/grammar-fixture.js +101 -0
  35. package/dist/lib/transform/grammar-fixture.js.map +1 -0
  36. package/dist/lib-cjs/ast/ast-node.js +70 -0
  37. package/dist/lib-cjs/ast/ast-node.js.map +1 -0
  38. package/dist/lib-cjs/errors/index.js +9 -0
  39. package/dist/lib-cjs/errors/index.js.map +1 -0
  40. package/dist/lib-cjs/errors/parser-lr-error.js +52 -0
  41. package/dist/lib-cjs/errors/parser-lr-error.js.map +1 -0
  42. package/dist/lib-cjs/grammar/ast-schema.js +43 -0
  43. package/dist/lib-cjs/grammar/ast-schema.js.map +1 -0
  44. package/dist/lib-cjs/grammar/ast-type.js +3 -0
  45. package/dist/lib-cjs/grammar/ast-type.js.map +1 -0
  46. package/dist/lib-cjs/grammar/expression.js +3 -0
  47. package/dist/lib-cjs/grammar/expression.js.map +1 -0
  48. package/dist/lib-cjs/grammar/grammar-from-cst.js +641 -0
  49. package/dist/lib-cjs/grammar/grammar-from-cst.js.map +1 -0
  50. package/dist/lib-cjs/grammar/grammar-json-path.js +13 -0
  51. package/dist/lib-cjs/grammar/grammar-json-path.js.map +1 -0
  52. package/dist/lib-cjs/grammar/grammar-literals.js +71 -0
  53. package/dist/lib-cjs/grammar/grammar-literals.js.map +1 -0
  54. package/dist/lib-cjs/grammar/grammar.js +64 -0
  55. package/dist/lib-cjs/grammar/grammar.js.map +1 -0
  56. package/dist/lib-cjs/grammar/grammar.json +5760 -0
  57. package/dist/lib-cjs/grammar/index.js +21 -0
  58. package/dist/lib-cjs/grammar/index.js.map +1 -0
  59. package/dist/lib-cjs/grammar/meta-grammar-table.js +68 -0
  60. package/dist/lib-cjs/grammar/meta-grammar-table.js.map +1 -0
  61. package/dist/lib-cjs/grammar/production.js +3 -0
  62. package/dist/lib-cjs/grammar/production.js.map +1 -0
  63. package/dist/lib-cjs/grammar/read-grammar-error.js +22 -0
  64. package/dist/lib-cjs/grammar/read-grammar-error.js.map +1 -0
  65. package/dist/lib-cjs/grammar/read-grammar.js +24 -0
  66. package/dist/lib-cjs/grammar/read-grammar.js.map +1 -0
  67. package/dist/lib-cjs/grammar/table-validator.js +262 -0
  68. package/dist/lib-cjs/grammar/table-validator.js.map +1 -0
  69. package/dist/lib-cjs/grammar/token-rule.js +3 -0
  70. package/dist/lib-cjs/grammar/token-rule.js.map +1 -0
  71. package/dist/lib-cjs/grammar/transform-expression.js +3 -0
  72. package/dist/lib-cjs/grammar/transform-expression.js.map +1 -0
  73. package/dist/lib-cjs/grammar/transform-rule.js +3 -0
  74. package/dist/lib-cjs/grammar/transform-rule.js.map +1 -0
  75. package/dist/lib-cjs/grammar/transform-schema.js +43 -0
  76. package/dist/lib-cjs/grammar/transform-schema.js.map +1 -0
  77. package/dist/lib-cjs/index.js +66 -0
  78. package/dist/lib-cjs/index.js.map +1 -0
  79. package/dist/lib-cjs/lexer/index.js +32 -0
  80. package/dist/lib-cjs/lexer/index.js.map +1 -0
  81. package/dist/lib-cjs/lexer/lexer-compile-error.js +22 -0
  82. package/dist/lib-cjs/lexer/lexer-compile-error.js.map +1 -0
  83. package/dist/lib-cjs/lexer/lexer-compile.js +201 -0
  84. package/dist/lib-cjs/lexer/lexer-compile.js.map +1 -0
  85. package/dist/lib-cjs/lexer/lexer-error.js +22 -0
  86. package/dist/lib-cjs/lexer/lexer-error.js.map +1 -0
  87. package/dist/lib-cjs/lexer/lexer-input-error.js +17 -0
  88. package/dist/lib-cjs/lexer/lexer-input-error.js.map +1 -0
  89. package/dist/lib-cjs/lexer/lexer-state-error.js +19 -0
  90. package/dist/lib-cjs/lexer/lexer-state-error.js.map +1 -0
  91. package/dist/lib-cjs/lexer/lexer.js +278 -0
  92. package/dist/lib-cjs/lexer/lexer.js.map +1 -0
  93. package/dist/lib-cjs/lexer/token.js +44 -0
  94. package/dist/lib-cjs/lexer/token.js.map +1 -0
  95. package/dist/lib-cjs/package.json +3 -0
  96. package/dist/lib-cjs/parse-context-error.js +19 -0
  97. package/dist/lib-cjs/parse-context-error.js.map +1 -0
  98. package/dist/lib-cjs/parse-context.js +137 -0
  99. package/dist/lib-cjs/parse-context.js.map +1 -0
  100. package/dist/lib-cjs/parse-output-error.js +19 -0
  101. package/dist/lib-cjs/parse-output-error.js.map +1 -0
  102. package/dist/lib-cjs/parse-output.js +18 -0
  103. package/dist/lib-cjs/parse-output.js.map +1 -0
  104. package/dist/lib-cjs/parse-table/analysis/first-follow.js +294 -0
  105. package/dist/lib-cjs/parse-table/analysis/first-follow.js.map +1 -0
  106. package/dist/lib-cjs/parse-table/analysis/index.js +9 -0
  107. package/dist/lib-cjs/parse-table/analysis/index.js.map +1 -0
  108. package/dist/lib-cjs/parse-table/bnf/bnf-grammar.js +140 -0
  109. package/dist/lib-cjs/parse-table/bnf/bnf-grammar.js.map +1 -0
  110. package/dist/lib-cjs/parse-table/bnf/bnf-production.js +3 -0
  111. package/dist/lib-cjs/parse-table/bnf/bnf-production.js.map +1 -0
  112. package/dist/lib-cjs/parse-table/bnf/bnf-symbol.js +39 -0
  113. package/dist/lib-cjs/parse-table/bnf/bnf-symbol.js.map +1 -0
  114. package/dist/lib-cjs/parse-table/bnf/desugar-ebnf.js +224 -0
  115. package/dist/lib-cjs/parse-table/bnf/desugar-ebnf.js.map +1 -0
  116. package/dist/lib-cjs/parse-table/bnf/index.js +13 -0
  117. package/dist/lib-cjs/parse-table/bnf/index.js.map +1 -0
  118. package/dist/lib-cjs/parse-table/build-lr-table.js +171 -0
  119. package/dist/lib-cjs/parse-table/build-lr-table.js.map +1 -0
  120. package/dist/lib-cjs/parse-table/index.js +49 -0
  121. package/dist/lib-cjs/parse-table/index.js.map +1 -0
  122. package/dist/lib-cjs/parse-table/lr-algorithm-error.js +19 -0
  123. package/dist/lib-cjs/parse-table/lr-algorithm-error.js.map +1 -0
  124. package/dist/lib-cjs/parse-table/lr-algorithm.js +31 -0
  125. package/dist/lib-cjs/parse-table/lr-algorithm.js.map +1 -0
  126. package/dist/lib-cjs/parse-table/lr0/index.js +14 -0
  127. package/dist/lib-cjs/parse-table/lr0/index.js.map +1 -0
  128. package/dist/lib-cjs/parse-table/lr0/lr0-item-set.js +286 -0
  129. package/dist/lib-cjs/parse-table/lr0/lr0-item-set.js.map +1 -0
  130. package/dist/lib-cjs/parse-table/lr1/index.js +18 -0
  131. package/dist/lib-cjs/parse-table/lr1/index.js.map +1 -0
  132. package/dist/lib-cjs/parse-table/lr1/lr1-item-set.js +432 -0
  133. package/dist/lib-cjs/parse-table/lr1/lr1-item-set.js.map +1 -0
  134. package/dist/lib-cjs/parse-table/parse-table-build-error.js +24 -0
  135. package/dist/lib-cjs/parse-table/parse-table-build-error.js.map +1 -0
  136. package/dist/lib-cjs/parse-table/parse-table-error.js +19 -0
  137. package/dist/lib-cjs/parse-table/parse-table-error.js.map +1 -0
  138. package/dist/lib-cjs/parse-table/parse-table-json.js +12 -0
  139. package/dist/lib-cjs/parse-table/parse-table-json.js.map +1 -0
  140. package/dist/lib-cjs/parse-table/parse-table.js +345 -0
  141. package/dist/lib-cjs/parse-table/parse-table.js.map +1 -0
  142. package/dist/lib-cjs/parse-table/slr/index.js +13 -0
  143. package/dist/lib-cjs/parse-table/slr/index.js.map +1 -0
  144. package/dist/lib-cjs/parse-table/slr/parse-action.js +8 -0
  145. package/dist/lib-cjs/parse-table/slr/parse-action.js.map +1 -0
  146. package/dist/lib-cjs/parse-table/slr/slr-table.js +18 -0
  147. package/dist/lib-cjs/parse-table/slr/slr-table.js.map +1 -0
  148. package/dist/lib-cjs/parse-table/table/index.js +21 -0
  149. package/dist/lib-cjs/parse-table/table/index.js.map +1 -0
  150. package/dist/lib-cjs/parse-table/table/lr-parse-table.js +192 -0
  151. package/dist/lib-cjs/parse-table/table/lr-parse-table.js.map +1 -0
  152. package/dist/lib-cjs/parse-table/table/parse-action.js +54 -0
  153. package/dist/lib-cjs/parse-table/table/parse-action.js.map +1 -0
  154. package/dist/lib-cjs/parse-table/table/table-builder-base.js +153 -0
  155. package/dist/lib-cjs/parse-table/table/table-builder-base.js.map +1 -0
  156. package/dist/lib-cjs/parse-table/token-inventory.js +18 -0
  157. package/dist/lib-cjs/parse-table/token-inventory.js.map +1 -0
  158. package/dist/lib-cjs/parser-lr.js +143 -0
  159. package/dist/lib-cjs/parser-lr.js.map +1 -0
  160. package/dist/lib-cjs/shift-reduce/index.js +11 -0
  161. package/dist/lib-cjs/shift-reduce/index.js.map +1 -0
  162. package/dist/lib-cjs/shift-reduce/shift-reduce-engine.js +224 -0
  163. package/dist/lib-cjs/shift-reduce/shift-reduce-engine.js.map +1 -0
  164. package/dist/lib-cjs/transform/binding-map.js +82 -0
  165. package/dist/lib-cjs/transform/binding-map.js.map +1 -0
  166. package/dist/lib-cjs/transform/cst-transformer.js +480 -0
  167. package/dist/lib-cjs/transform/cst-transformer.js.map +1 -0
  168. package/dist/lib-cjs/transform/grammar-fixture.js +109 -0
  169. package/dist/lib-cjs/transform/grammar-fixture.js.map +1 -0
  170. package/dist/lib-cjs/transform/index.js +12 -0
  171. package/dist/lib-cjs/transform/index.js.map +1 -0
  172. package/docs/grammar.md +113 -0
  173. package/docs/parser-lr-enhancement-proposals.md +337 -0
  174. package/grammars/6502.grammar +233 -0
  175. package/grammars/calc.grammar +30 -0
  176. package/grammars/ferrite.grammar +991 -0
  177. package/grammars/fixtures/build-optional/build-optional.grammar +32 -0
  178. package/grammars/fixtures/build-optional/input.txt +1 -0
  179. package/grammars/fixtures/comparison-op/comparison-op.grammar +28 -0
  180. package/grammars/fixtures/comparison-op/input.txt +1 -0
  181. package/grammars/fixtures/flatten-repeat/flatten-repeat.grammar +28 -0
  182. package/grammars/fixtures/flatten-repeat/input.txt +1 -0
  183. package/grammars/fixtures/help-topic/help-topic.grammar +28 -0
  184. package/grammars/fixtures/help-topic/input.txt +1 -0
  185. package/grammars/fixtures/let-target/input.txt +1 -0
  186. package/grammars/fixtures/let-target/let-target.grammar +33 -0
  187. package/grammars/fixtures/nested-production-repro/input.txt +1 -0
  188. package/grammars/fixtures/nested-production-repro/nested-production-repro.grammar +26 -0
  189. package/grammars/fixtures/pass-preserves-production/bare-terminal/bare-terminal.grammar +24 -0
  190. package/grammars/fixtures/pass-preserves-production/bare-terminal/input.txt +1 -0
  191. package/grammars/fixtures/pass-preserves-production/labeled-variant/input-end-if.txt +1 -0
  192. package/grammars/fixtures/pass-preserves-production/labeled-variant/input-end.txt +1 -0
  193. package/grammars/fixtures/pass-preserves-production/labeled-variant/labeled-variant.grammar +24 -0
  194. package/grammars/fixtures/pass-preserves-production/optional-absent/input.txt +1 -0
  195. package/grammars/fixtures/pass-preserves-production/optional-absent/optional-absent.grammar +24 -0
  196. package/grammars/fixtures/pass-preserves-production/optional-present/input.txt +1 -0
  197. package/grammars/fixtures/pass-preserves-production/optional-present/optional-present.grammar +24 -0
  198. package/grammars/fixtures/table-only-import/calc.table.json +190 -0
  199. package/grammars/fixtures/table-only-import/table-only-smoke.cjs +38 -0
  200. package/grammars/fixtures/table-only-import/table-only-smoke.mjs +18 -0
  201. package/grammars/grammar.grammar +428 -0
  202. package/grammars/lisp.grammar +95 -0
  203. package/package.json +10 -4
@@ -0,0 +1,32 @@
1
+ name "build-optional-repro" ;
2
+
3
+ tokens
4
+ kw_cls = /CLS/i ;
5
+ kw_with = /WITH/i ;
6
+ ident = /[a-z]+/ ;
7
+
8
+ skip
9
+ whitespace = /[ \t\r\n]+/ ;
10
+
11
+ start program_line ;
12
+
13
+ grammar
14
+ program_line =
15
+ #statement [stmt]:cls_stmt
16
+ ;
17
+
18
+ cls_stmt =
19
+ kw_cls [ kw_with ident ]
20
+ ;
21
+
22
+ ast
23
+ cls_stmt =
24
+ #main kw_cls [withKw]:kw_with [target]:ident
25
+ ;
26
+
27
+ transform
28
+ cls_stmt ->
29
+ #main cls_stmt.#main(kw_cls, withKw, target) ;
30
+
31
+ program_line ->
32
+ #statement pass(stmt) ;
@@ -0,0 +1,28 @@
1
+ name "comparison-op-repro" ;
2
+
3
+ tokens
4
+ kw_case = /CASE/i ;
5
+ kw_is = /IS/i ;
6
+ less = /</ ;
7
+ greater = />/ ;
8
+ number = /[0-9]+/ ;
9
+
10
+ skip
11
+ whitespace = /[ \t\r\n]+/ ;
12
+
13
+ start case_selector ;
14
+
15
+ grammar
16
+ case_selector =
17
+ #relational kw_case kw_is comparison_op postfix_expr
18
+ | #value postfix_expr
19
+ ;
20
+
21
+ comparison_op =
22
+ #less less
23
+ | #greater greater
24
+ ;
25
+
26
+ postfix_expr =
27
+ number
28
+ ;
@@ -0,0 +1 @@
1
+ CASE IS < 0
@@ -0,0 +1,28 @@
1
+ name "flatten-repeat-repro" ;
2
+
3
+ tokens
4
+ ident = /[a-z]+/ ;
5
+ comma = /,/ ;
6
+
7
+ skip
8
+ whitespace = /[ \t\r\n]+/ ;
9
+
10
+ start list ;
11
+
12
+ grammar
13
+ list =
14
+ #list [first]:item { comma [rest]:item }
15
+ ;
16
+
17
+ item =
18
+ ident
19
+ ;
20
+
21
+ ast
22
+ list =
23
+ #list [first]:item { [rest]:item }
24
+ ;
25
+
26
+ transform
27
+ list ->
28
+ #list flatten(list.#list, first, list$repeat_0) ;
@@ -0,0 +1 @@
1
+ a,b,c
@@ -0,0 +1,28 @@
1
+ name "help-topic-repro" ;
2
+
3
+ tokens
4
+ kw_help = /HELP/i ;
5
+ kw_print = /PRINT/i ;
6
+
7
+ skip
8
+ whitespace = /[ \t\r\n]+/ ;
9
+
10
+ start program_line ;
11
+
12
+ grammar
13
+ program_line =
14
+ #statement [stmt]:help_stmt
15
+ ;
16
+
17
+ help_stmt =
18
+ kw_help help_topic
19
+ ;
20
+
21
+ help_topic =
22
+ #keyword kw_print
23
+ | #punct kw_print
24
+ ;
25
+
26
+ transform
27
+ program_line ->
28
+ #statement pass(stmt) ;
@@ -0,0 +1 @@
1
+ HELP PRINT
@@ -0,0 +1 @@
1
+ LET x% = 1
@@ -0,0 +1,33 @@
1
+ name "let-target-repro" ;
2
+
3
+ tokens
4
+ kw_let = /LET/i ;
5
+ identifier = /[a-z][a-z0-9%]*/i ;
6
+ equal = /=/ ;
7
+ number = /[0-9]+/ ;
8
+
9
+ skip
10
+ whitespace = /[ \t\r\n]+/ ;
11
+
12
+ start program_line ;
13
+
14
+ grammar
15
+ program_line =
16
+ #statement [stmt]:let_stmt
17
+ ;
18
+
19
+ let_stmt =
20
+ kw_let let_target equal expr
21
+ ;
22
+
23
+ let_target =
24
+ identifier
25
+ ;
26
+
27
+ expr =
28
+ number
29
+ ;
30
+
31
+ transform
32
+ program_line ->
33
+ #statement pass(stmt) ;
@@ -0,0 +1 @@
1
+ CASE IS < 0
@@ -0,0 +1,26 @@
1
+ name "nested-production-repro" ;
2
+
3
+ tokens
4
+ kw_is = /IS/i ;
5
+ kw_case = /CASE/i ;
6
+ less = /</ ;
7
+ integer = /[0-9]+/ ;
8
+
9
+ skip
10
+ whitespace = /[ \t\r\n]+/ ;
11
+
12
+ start line ;
13
+
14
+ grammar
15
+ line = kw_case case_selector ;
16
+ case_selector = #relational kw_is comparison_op integer ;
17
+ comparison_op = #less [tok]:less ;
18
+
19
+ ast
20
+ comparison_op =
21
+ #less [tok]:less
22
+ ;
23
+
24
+ transform
25
+ comparison_op ->
26
+ #less comparison_op.#less(tok) ;
@@ -0,0 +1,24 @@
1
+ name "pass-collapse-repro" ;
2
+
3
+ tokens
4
+ kw_cls = /CLS/i ;
5
+ kw_with = /WITH/i ;
6
+ ident = /[a-z]+/ ;
7
+
8
+ skip
9
+ whitespace = /[ \t\r\n]+/ ;
10
+
11
+ start program_line ;
12
+
13
+ grammar
14
+ program_line =
15
+ #statement [stmt]:cls_stmt
16
+ ;
17
+
18
+ cls_stmt =
19
+ kw_cls [ kw_with ident ]
20
+ ;
21
+
22
+ transform
23
+ program_line ->
24
+ #statement pass(stmt) ;
@@ -0,0 +1,24 @@
1
+ name "labeled-variant-repro" ;
2
+
3
+ tokens
4
+ kw_end = /END/i ;
5
+ kw_if = /IF/i ;
6
+
7
+ skip
8
+ whitespace = /[ \t\r\n]+/ ;
9
+
10
+ start program_line ;
11
+
12
+ grammar
13
+ program_line =
14
+ #statement [stmt]:end_stmt
15
+ ;
16
+
17
+ end_stmt =
18
+ #program kw_end
19
+ | #if kw_end kw_if
20
+ ;
21
+
22
+ transform
23
+ program_line ->
24
+ #statement pass(stmt) ;
@@ -0,0 +1,24 @@
1
+ name "optional-absent-repro" ;
2
+
3
+ tokens
4
+ kw_cls = /CLS/i ;
5
+ kw_with = /WITH/i ;
6
+ ident = /[a-z]+/ ;
7
+
8
+ skip
9
+ whitespace = /[ \t\r\n]+/ ;
10
+
11
+ start program_line ;
12
+
13
+ grammar
14
+ program_line =
15
+ #statement [stmt]:cls_stmt
16
+ ;
17
+
18
+ cls_stmt =
19
+ kw_cls [ kw_with ident ]
20
+ ;
21
+
22
+ transform
23
+ program_line ->
24
+ #statement pass(stmt) ;
@@ -0,0 +1,24 @@
1
+ name "optional-present-repro" ;
2
+
3
+ tokens
4
+ kw_cls = /CLS/i ;
5
+ kw_with = /WITH/i ;
6
+ ident = /[a-z]+/ ;
7
+
8
+ skip
9
+ whitespace = /[ \t\r\n]+/ ;
10
+
11
+ start program_line ;
12
+
13
+ grammar
14
+ program_line =
15
+ #statement [stmt]:cls_stmt
16
+ ;
17
+
18
+ cls_stmt =
19
+ kw_cls [ kw_with ident ]
20
+ ;
21
+
22
+ transform
23
+ program_line ->
24
+ #statement pass(stmt) ;
@@ -0,0 +1,190 @@
1
+ {
2
+ "version": 2,
3
+ "algorithm": "lalr",
4
+ "grammarName": "calc",
5
+ "startSymbol": "expr",
6
+ "tokens": [
7
+ "number",
8
+ "plus",
9
+ "$eof"
10
+ ],
11
+ "tokenRules": [
12
+ {
13
+ "name": "number",
14
+ "pattern": "[0-9]+",
15
+ "flags": ""
16
+ },
17
+ {
18
+ "name": "plus",
19
+ "pattern": "\\+",
20
+ "flags": ""
21
+ }
22
+ ],
23
+ "skipRules": [
24
+ {
25
+ "name": "whitespace",
26
+ "pattern": "[ \\t\\r\\n]+",
27
+ "flags": ""
28
+ }
29
+ ],
30
+ "states": [],
31
+ "parserStateCount": 5,
32
+ "productions": [
33
+ {
34
+ "id": 0,
35
+ "name": "expr",
36
+ "rhs": [
37
+ "[left]:expr",
38
+ "[operator]:plus",
39
+ "[right]:number"
40
+ ],
41
+ "variant": "binary",
42
+ "origin": "expr"
43
+ },
44
+ {
45
+ "id": 1,
46
+ "name": "expr",
47
+ "rhs": [
48
+ "number"
49
+ ],
50
+ "variant": "literal",
51
+ "origin": "expr"
52
+ },
53
+ {
54
+ "id": 2,
55
+ "name": "$accept",
56
+ "rhs": [
57
+ "expr"
58
+ ],
59
+ "variant": null,
60
+ "origin": "$accept"
61
+ }
62
+ ],
63
+ "actions": [
64
+ {
65
+ "state": 0,
66
+ "symbol": "number",
67
+ "kind": "shift",
68
+ "target": 2
69
+ },
70
+ {
71
+ "state": 1,
72
+ "symbol": "$eof",
73
+ "kind": "accept"
74
+ },
75
+ {
76
+ "state": 1,
77
+ "symbol": "plus",
78
+ "kind": "shift",
79
+ "target": 3
80
+ },
81
+ {
82
+ "state": 2,
83
+ "symbol": "$eof",
84
+ "kind": "reduce",
85
+ "productionId": 1
86
+ },
87
+ {
88
+ "state": 2,
89
+ "symbol": "plus",
90
+ "kind": "reduce",
91
+ "productionId": 1
92
+ },
93
+ {
94
+ "state": 3,
95
+ "symbol": "number",
96
+ "kind": "shift",
97
+ "target": 4
98
+ },
99
+ {
100
+ "state": 4,
101
+ "symbol": "$eof",
102
+ "kind": "reduce",
103
+ "productionId": 0
104
+ },
105
+ {
106
+ "state": 4,
107
+ "symbol": "plus",
108
+ "kind": "reduce",
109
+ "productionId": 0
110
+ }
111
+ ],
112
+ "gotos": [
113
+ {
114
+ "state": 0,
115
+ "symbol": "expr",
116
+ "target": 1
117
+ }
118
+ ],
119
+ "ast": [
120
+ {
121
+ "name": "expr",
122
+ "expression": {
123
+ "kind": "choice",
124
+ "alternatives": [
125
+ {
126
+ "label": "binary",
127
+ "expression": {
128
+ "kind": "sequence",
129
+ "elements": [
130
+ {
131
+ "kind": "boundReference",
132
+ "binding": "left",
133
+ "name": "expr"
134
+ },
135
+ {
136
+ "kind": "boundReference",
137
+ "binding": "operator",
138
+ "name": "plus"
139
+ },
140
+ {
141
+ "kind": "boundReference",
142
+ "binding": "right",
143
+ "name": "number"
144
+ }
145
+ ]
146
+ }
147
+ },
148
+ {
149
+ "label": "literal",
150
+ "expression": {
151
+ "kind": "reference",
152
+ "name": "number"
153
+ }
154
+ }
155
+ ]
156
+ }
157
+ }
158
+ ],
159
+ "transform": [
160
+ {
161
+ "production": "expr",
162
+ "alternatives": [
163
+ {
164
+ "label": "binary",
165
+ "expression": {
166
+ "kind": "build",
167
+ "typeName": "expr",
168
+ "variant": "binary",
169
+ "arguments": [
170
+ "left",
171
+ "operator",
172
+ "right"
173
+ ]
174
+ }
175
+ },
176
+ {
177
+ "label": "literal",
178
+ "expression": {
179
+ "kind": "build",
180
+ "typeName": "expr",
181
+ "variant": "literal",
182
+ "arguments": [
183
+ "number"
184
+ ]
185
+ }
186
+ }
187
+ ]
188
+ }
189
+ ]
190
+ }
@@ -0,0 +1,38 @@
1
+ const { readFileSync } = require('node:fs');
2
+ const { join } = require('node:path');
3
+
4
+ const fs = require('node:fs');
5
+ const originalReadFileSync = fs.readFileSync;
6
+ let readMetaGrammar = false;
7
+
8
+ fs.readFileSync = function patchedReadFileSync(path, ...rest)
9
+ {
10
+ if (String(path).endsWith('grammar.json'))
11
+ {
12
+ readMetaGrammar = true;
13
+ }
14
+
15
+ return originalReadFileSync.call(this, path, ...rest);
16
+ };
17
+
18
+ const { ParseContext } = require('parser-lr');
19
+
20
+ const tableJson = readFileSync(
21
+ join(__dirname, 'calc.table.json'),
22
+ 'utf8',
23
+ );
24
+
25
+ const context = ParseContext.fromTableJson(tableJson);
26
+ const ast = context.parseSource('1 + 2');
27
+
28
+ if (ast === null)
29
+ {
30
+ throw new Error('table-only smoke (cjs): expected a non-null AST');
31
+ }
32
+
33
+ if (readMetaGrammar)
34
+ {
35
+ throw new Error('table-only smoke (cjs): unexpected grammar.json read');
36
+ }
37
+
38
+ process.stdout.write(`cjs ${ast.symbol}\n`);
@@ -0,0 +1,18 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { dirname, join } from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+
5
+ import { ParseContext } from 'parser-lr';
6
+
7
+ const here = dirname(fileURLToPath(import.meta.url));
8
+ const tableJson = readFileSync(join(here, 'calc.table.json'), 'utf8');
9
+
10
+ const context = ParseContext.fromTableJson(tableJson);
11
+ const ast = context.parseSource('1 + 2');
12
+
13
+ if (ast === null)
14
+ {
15
+ throw new Error('table-only smoke (mjs): expected a non-null AST');
16
+ }
17
+
18
+ process.stdout.write(`mjs ${ast.symbol}\n`);