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,428 @@
1
+ // Meta-grammar for parser-lr grammar files (.grammar).
2
+ // Dogfood target: this file should parse itself once lexer, table build, and parse are wired.
3
+ //
4
+ // Calc example (parse + ast + transform):
5
+ //
6
+ // grammar
7
+ // expr = term { #add plus term | #sub minus term } ;
8
+ // term = factor { #mul star factor | #div slash factor } ;
9
+ // factor = #number number | #group lpar expr rpar ;
10
+ //
11
+ // ast
12
+ // expr = #binary [left]:expr [operator]:operator [right]:expr
13
+ // | #literal number
14
+ // | #grouped expr ;
15
+ // operator = #plus plus | #minus minus | #star star | #slash slash ;
16
+ //
17
+ // transform
18
+ // expr ->
19
+ // #add fold-left(expr.#binary, left, operator, right)
20
+ // | #sub fold-left(expr.#binary, left, operator, right)
21
+ // | #term pass(term) ;
22
+ // term ->
23
+ // #mul fold-left(expr.#binary, left, operator, right)
24
+ // | #div fold-left(expr.#binary, left, operator, right)
25
+ // | #factor pass(factor) ;
26
+ // factor ->
27
+ // #number expr.#literal(number)
28
+ // | #group pass(expr) ;
29
+
30
+ name "grammar" ;
31
+
32
+ tokens
33
+ name_kw = /name/ ;
34
+ tokens_kw = /tokens/ ;
35
+ skip_kw = /skip/ ;
36
+ states_kw = /states/ ;
37
+ start_kw = /start/ ;
38
+ grammar_kw = /grammar/ ;
39
+ ast_kw = /ast/ ;
40
+ transform_kw = /transform/ ;
41
+ pass_kw = /pass/ ;
42
+ drop_kw = /drop/ ;
43
+ fold_left_kw = /fold-left/ ;
44
+ fold_right_kw = /fold-right/ ;
45
+ flatten_kw = /flatten/ ;
46
+
47
+ identifier = /[A-Za-z_][A-Za-z0-9_$]*/ ;
48
+
49
+ equal = /=/ ;
50
+ semicolon = /;/ ;
51
+ comma = /,/ ;
52
+ bar = /\|/ ;
53
+ hash = /#/ ;
54
+ arrow = /->/ ;
55
+ colon = /:/ ;
56
+ dot = /\./ ;
57
+
58
+ lpar = /\(/ ;
59
+ rpar = /\)/ ;
60
+ lbracket = /\[/ ;
61
+ rbracket = /\]/ ;
62
+ lbrace = /\{/ ;
63
+ rbrace = /\}/ ;
64
+
65
+ // Lexer: / pattern / then zero or more flag letters from g i m s u y
66
+ regex_literal = /\/(\\.|[^\\\/])+\/[gimsuy]*/ ;
67
+ string_literal = /"(?:\\.|[^"\\])*"/ ;
68
+
69
+ skip
70
+ whitespace = /[ \t\r\n]+/ ;
71
+ comment = /\/\/[^\n\r]*/ ;
72
+
73
+ start grammar_file ;
74
+
75
+ grammar
76
+ grammar_file =
77
+ name_decl
78
+ { section }
79
+ start_decl
80
+ grammar_section
81
+ [ ast_section ]
82
+ [ transform_section ]
83
+ ;
84
+
85
+ name_decl =
86
+ name_kw grammar_name semicolon
87
+ ;
88
+
89
+ grammar_name =
90
+ identifier
91
+ | string_literal
92
+ ;
93
+
94
+ section =
95
+ token_section
96
+ | skip_section
97
+ | states_section
98
+ ;
99
+
100
+ token_section =
101
+ tokens_kw token_def { token_def }
102
+ ;
103
+
104
+ skip_section =
105
+ skip_kw token_def { token_def }
106
+ ;
107
+
108
+ states_section =
109
+ states_kw state_name { comma state_name } semicolon
110
+ ;
111
+
112
+ token_def =
113
+ identifier equal regex_literal semicolon
114
+ ;
115
+
116
+ state_name =
117
+ identifier
118
+ ;
119
+
120
+ start_decl =
121
+ start_kw identifier semicolon
122
+ ;
123
+
124
+ grammar_section =
125
+ grammar_kw production { production }
126
+ ;
127
+
128
+ ast_section =
129
+ ast_kw ast_type { ast_type }
130
+ ;
131
+
132
+ transform_section =
133
+ transform_kw transform_rule { transform_rule }
134
+ ;
135
+
136
+ production =
137
+ identifier equal expression semicolon
138
+ ;
139
+
140
+ ast_type =
141
+ identifier equal expression semicolon
142
+ ;
143
+
144
+ transform_rule =
145
+ identifier arrow labeled_transform { bar labeled_transform } semicolon
146
+ ;
147
+
148
+ labeled_transform =
149
+ hash identifier transform_expr
150
+ ;
151
+
152
+ transform_expr =
153
+ drop_kw
154
+ | pass_expr
155
+ | fold_left_expr
156
+ | fold_right_expr
157
+ | flatten_expr
158
+ | build_expr
159
+ ;
160
+
161
+ pass_expr =
162
+ pass_kw lpar reference rpar
163
+ ;
164
+
165
+ fold_left_expr =
166
+ fold_left_kw lpar build_target comma reference_list rpar
167
+ ;
168
+
169
+ fold_right_expr =
170
+ fold_right_kw lpar build_target comma reference_list rpar
171
+ ;
172
+
173
+ flatten_expr =
174
+ flatten_kw lpar build_target comma reference comma reference rpar
175
+ ;
176
+
177
+ build_expr =
178
+ build_target [ lpar reference_list rpar ]
179
+ ;
180
+
181
+ build_target =
182
+ identifier dot hash identifier
183
+ ;
184
+
185
+ reference_list =
186
+ reference { comma reference }
187
+ ;
188
+
189
+ reference =
190
+ identifier
191
+ ;
192
+
193
+ expression =
194
+ choice
195
+ ;
196
+
197
+ choice =
198
+ alternative { bar alternative }
199
+ ;
200
+
201
+ alternative =
202
+ labeled_alternative
203
+ ;
204
+
205
+ labeled_alternative =
206
+ [ hash identifier ] sequence
207
+ ;
208
+
209
+ sequence =
210
+ factor { factor }
211
+ ;
212
+
213
+ factor =
214
+ bracketed
215
+ | repeat
216
+ | group
217
+ | primary
218
+ ;
219
+
220
+ bracketed =
221
+ lbracket expression rbracket [ colon identifier ]
222
+ ;
223
+
224
+ repeat =
225
+ lbrace expression rbrace
226
+ ;
227
+
228
+ group =
229
+ lpar expression rpar
230
+ ;
231
+
232
+ primary =
233
+ string_literal
234
+ | identifier
235
+ ;
236
+
237
+ ast
238
+ grammar_file =
239
+ name_decl
240
+ { section }
241
+ start_decl
242
+ grammar_section
243
+ [ ast_section ]
244
+ [ transform_section ]
245
+ ;
246
+
247
+ name_decl =
248
+ name_kw grammar_name semicolon
249
+ ;
250
+
251
+ grammar_name =
252
+ identifier
253
+ | string_literal
254
+ ;
255
+
256
+ section =
257
+ token_section
258
+ | skip_section
259
+ | states_section
260
+ ;
261
+
262
+ token_section =
263
+ tokens_kw token_def { token_def }
264
+ ;
265
+
266
+ skip_section =
267
+ skip_kw token_def { token_def }
268
+ ;
269
+
270
+ states_section =
271
+ states_kw state_name { comma state_name } semicolon
272
+ ;
273
+
274
+ token_def =
275
+ identifier equal regex_literal semicolon
276
+ ;
277
+
278
+ state_name =
279
+ identifier
280
+ ;
281
+
282
+ start_decl =
283
+ start_kw identifier semicolon
284
+ ;
285
+
286
+ grammar_section =
287
+ grammar_kw production { production }
288
+ ;
289
+
290
+ ast_section =
291
+ ast_kw ast_type { ast_type }
292
+ ;
293
+
294
+ transform_section =
295
+ transform_kw transform_rule { transform_rule }
296
+ ;
297
+
298
+ production =
299
+ identifier equal expression semicolon
300
+ ;
301
+
302
+ ast_type =
303
+ identifier equal expression semicolon
304
+ ;
305
+
306
+ transform_rule =
307
+ identifier arrow labeled_transform { bar labeled_transform } semicolon
308
+ ;
309
+
310
+ labeled_transform =
311
+ hash identifier transform_expr
312
+ ;
313
+
314
+ transform_expr =
315
+ drop_kw
316
+ | pass_expr
317
+ | fold_left_expr
318
+ | fold_right_expr
319
+ | flatten_expr
320
+ | build_expr
321
+ ;
322
+
323
+ pass_expr =
324
+ pass_kw lpar reference rpar
325
+ ;
326
+
327
+ fold_left_expr =
328
+ fold_left_kw lpar build_target comma reference_list rpar
329
+ ;
330
+
331
+ fold_right_expr =
332
+ fold_right_kw lpar build_target comma reference_list rpar
333
+ ;
334
+
335
+ flatten_expr =
336
+ flatten_kw lpar build_target comma reference comma reference rpar
337
+ ;
338
+
339
+ build_expr =
340
+ build_target [ lpar reference_list rpar ]
341
+ ;
342
+
343
+ build_target =
344
+ identifier dot hash identifier
345
+ ;
346
+
347
+ reference_list =
348
+ reference { comma reference }
349
+ ;
350
+
351
+ reference =
352
+ identifier
353
+ ;
354
+
355
+ expression =
356
+ choice
357
+ ;
358
+
359
+ choice =
360
+ alternative { bar alternative }
361
+ ;
362
+
363
+ alternative =
364
+ labeled_alternative
365
+ ;
366
+
367
+ labeled_alternative =
368
+ [ hash identifier ] sequence
369
+ ;
370
+
371
+ sequence =
372
+ factor { factor }
373
+ ;
374
+
375
+ factor =
376
+ bracketed
377
+ | repeat
378
+ | group
379
+ | primary
380
+ ;
381
+
382
+ bracketed =
383
+ lbracket expression rbracket [ colon identifier ]
384
+ ;
385
+
386
+ repeat =
387
+ lbrace expression rbrace
388
+ ;
389
+
390
+ group =
391
+ lpar expression rpar
392
+ ;
393
+
394
+ primary =
395
+ string_literal
396
+ | identifier
397
+ ;
398
+
399
+ transform
400
+ grammar_file$repeat_0 ->
401
+ #main flatten(grammar_file.#sections, section, grammar_file$repeat_0) ;
402
+
403
+ token_section$repeat_1 ->
404
+ #main flatten(token_section.#definitions, token_def, token_section$repeat_1) ;
405
+
406
+ skip_section$repeat_2 ->
407
+ #main flatten(skip_section.#definitions, token_def, skip_section$repeat_2) ;
408
+
409
+ grammar_section$repeat_4 ->
410
+ #main flatten(grammar_section.#productions, production, grammar_section$repeat_4) ;
411
+
412
+ ast_section$repeat_5 ->
413
+ #main flatten(ast_section.#types, ast_type, ast_section$repeat_5) ;
414
+
415
+ transform_section$repeat_6 ->
416
+ #main flatten(transform_section.#rules, transform_rule, transform_section$repeat_6) ;
417
+
418
+ transform_rule$repeat_7 ->
419
+ #main flatten(transform_rule.#alternatives, labeled_transform, transform_rule$repeat_7) ;
420
+
421
+ reference_list$repeat_8 ->
422
+ #main flatten(reference_list.#references, reference, reference_list$repeat_8) ;
423
+
424
+ choice$repeat_9 ->
425
+ #main flatten(choice.#alternatives, alternative, choice$repeat_9) ;
426
+
427
+ sequence$repeat_10 ->
428
+ #main flatten(sequence.#factors, factor, sequence$repeat_10) ;
@@ -0,0 +1,95 @@
1
+ // Very simple Lisp: s-expressions with numbers, symbols, and strings.
2
+ //
3
+ // Example:
4
+ //
5
+ // ; factorial sketch
6
+ // (def factorial (n)
7
+ // (if (= n 0)
8
+ // 1
9
+ // (* n (factorial (- n 1)))))
10
+ //
11
+ // (quote hello)
12
+ // (+ 1 2 3)
13
+
14
+ name "lisp" ;
15
+
16
+ tokens
17
+ lpar = /\(/ ;
18
+ rpar = /\)/ ;
19
+
20
+ number = /[+-]?[0-9]+/ ;
21
+ symbol = /[a-zA-Z+*\-\/=<>?!_][a-zA-Z0-9+*\-\/=<>?!_]*/ ;
22
+ string = /"(?:\\.|[^"\\])*"/ ;
23
+
24
+ skip
25
+ whitespace = /[ \t\r\n]+/ ;
26
+ comment = /;[^\n\r]*/ ;
27
+
28
+ start program ;
29
+
30
+ grammar
31
+ program =
32
+ { [item]:form }
33
+ ;
34
+
35
+ form =
36
+ #list list
37
+ | #atom atom
38
+ ;
39
+
40
+ list =
41
+ [open]:lpar
42
+ { [element]:form }
43
+ [close]:rpar
44
+ ;
45
+
46
+ atom =
47
+ #number [value]:number
48
+ | #symbol [value]:symbol
49
+ | #string [value]:string
50
+ ;
51
+
52
+ ast
53
+ program =
54
+ { form }
55
+ ;
56
+
57
+ form =
58
+ #list list
59
+ | #atom atom
60
+ ;
61
+
62
+ list =
63
+ [open]:lpar
64
+ { [element]:form }
65
+ [close]:rpar
66
+ ;
67
+
68
+ atom =
69
+ #number [value]:number
70
+ | #symbol [value]:symbol
71
+ | #string [value]:string
72
+ ;
73
+
74
+ transform
75
+ program ->
76
+ #main pass(program$repeat_0) ;
77
+
78
+ program$repeat_0 ->
79
+ #main flatten(program.#program, item, program$repeat_0) ;
80
+
81
+ form ->
82
+ #list pass(list)
83
+ | #atom pass(atom) ;
84
+
85
+ list ->
86
+ #main list.#list(open, list$repeat_1, close) ;
87
+
88
+ list$repeat_1 ->
89
+ #main flatten(form.#elements, element, list$repeat_1) ;
90
+
91
+ atom ->
92
+ #number atom.#number(value)
93
+ | #symbol atom.#symbol(value)
94
+ | #string atom.#string(value)
95
+ ;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "parser-lr",
3
3
  "author": "Adam R Moss <adamrmoss@gmail.com>",
4
- "version": "0.4.1",
4
+ "version": "0.6.0",
5
5
  "description": "Shift-reduce parser library for EBNF grammars",
6
6
  "license": "MIT",
7
7
  "repository": {
@@ -22,16 +22,21 @@
22
22
  "exports": {
23
23
  ".": {
24
24
  "types": "./dist/lib/index.d.ts",
25
- "import": "./dist/lib/index.js"
25
+ "import": "./dist/lib/index.js",
26
+ "require": "./dist/lib-cjs/index.js",
27
+ "default": "./dist/lib/index.js"
26
28
  }
27
29
  },
28
30
  "bin": {
29
31
  "parser-lr": "bin/parser-lr.js"
30
32
  },
31
33
  "files": [
34
+ "README.md",
35
+ "LICENSE",
32
36
  "bin",
33
37
  "dist",
34
- "docs"
38
+ "docs",
39
+ "grammars"
35
40
  ],
36
41
  "publishConfig": {
37
42
  "access": "public",
@@ -41,9 +46,10 @@
41
46
  "bootstrap": "npm link && parser-lr table generate -g grammars/grammar.grammar -o src/lib/grammar/grammar.json -a lalr",
42
47
  "build": "npm run build:clean && npm run build:lib && npm run build:cli",
43
48
  "build:clean": "rm -rf dist && rm -f bin/parser-lr.js bin/parser-lr.js.map",
44
- "build:lib": "tsc -p tsconfig.lib.json && cp src/lib/grammar/grammar.json dist/lib/grammar/",
49
+ "build:lib": "node scripts/build-lib.mjs",
45
50
  "build:cli": "rollup -c rollup.cli.config.js && chmod +x bin/parser-lr.js",
46
51
  "cloc": "cloc src --exclude-dir=node_modules,dist",
52
+ "acceptance": "node scripts/acceptance-tarball.mjs",
47
53
  "test": "jest",
48
54
  "test:coverage": "jest --coverage",
49
55
  "prepack": "npm run build"