parser-lr 0.4.1 → 0.5.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 (197) hide show
  1. package/README.md +35 -1
  2. package/bin/parser-lr.js +340 -5802
  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 +2 -0
  13. package/dist/lib/grammar/index.d.ts.map +1 -1
  14. package/dist/lib/grammar/index.js +1 -0
  15. package/dist/lib/grammar/index.js.map +1 -1
  16. package/dist/lib/grammar/meta-grammar-table.d.ts.map +1 -1
  17. package/dist/lib/grammar/meta-grammar-table.js +4 -2
  18. package/dist/lib/grammar/meta-grammar-table.js.map +1 -1
  19. package/dist/lib/grammar/table-validator.d.ts +26 -0
  20. package/dist/lib/grammar/table-validator.d.ts.map +1 -0
  21. package/dist/lib/grammar/table-validator.js +211 -0
  22. package/dist/lib/grammar/table-validator.js.map +1 -0
  23. package/dist/lib/index.d.ts +2 -0
  24. package/dist/lib/index.d.ts.map +1 -1
  25. package/dist/lib/index.js +1 -0
  26. package/dist/lib/index.js.map +1 -1
  27. package/dist/lib/transform/cst-transformer.d.ts +14 -0
  28. package/dist/lib/transform/cst-transformer.d.ts.map +1 -1
  29. package/dist/lib/transform/cst-transformer.js +82 -11
  30. package/dist/lib/transform/cst-transformer.js.map +1 -1
  31. package/dist/lib/transform/grammar-fixture.d.ts +56 -0
  32. package/dist/lib/transform/grammar-fixture.d.ts.map +1 -0
  33. package/dist/lib/transform/grammar-fixture.js +101 -0
  34. package/dist/lib/transform/grammar-fixture.js.map +1 -0
  35. package/dist/lib-cjs/ast/ast-node.js +70 -0
  36. package/dist/lib-cjs/ast/ast-node.js.map +1 -0
  37. package/dist/lib-cjs/errors/index.js +9 -0
  38. package/dist/lib-cjs/errors/index.js.map +1 -0
  39. package/dist/lib-cjs/errors/parser-lr-error.js +52 -0
  40. package/dist/lib-cjs/errors/parser-lr-error.js.map +1 -0
  41. package/dist/lib-cjs/grammar/ast-schema.js +43 -0
  42. package/dist/lib-cjs/grammar/ast-schema.js.map +1 -0
  43. package/dist/lib-cjs/grammar/ast-type.js +3 -0
  44. package/dist/lib-cjs/grammar/ast-type.js.map +1 -0
  45. package/dist/lib-cjs/grammar/expression.js +3 -0
  46. package/dist/lib-cjs/grammar/expression.js.map +1 -0
  47. package/dist/lib-cjs/grammar/grammar-from-cst.js +641 -0
  48. package/dist/lib-cjs/grammar/grammar-from-cst.js.map +1 -0
  49. package/dist/lib-cjs/grammar/grammar-json-path.js +13 -0
  50. package/dist/lib-cjs/grammar/grammar-json-path.js.map +1 -0
  51. package/dist/lib-cjs/grammar/grammar-literals.js +71 -0
  52. package/dist/lib-cjs/grammar/grammar-literals.js.map +1 -0
  53. package/dist/lib-cjs/grammar/grammar.js +64 -0
  54. package/dist/lib-cjs/grammar/grammar.js.map +1 -0
  55. package/dist/lib-cjs/grammar/grammar.json +5760 -0
  56. package/dist/lib-cjs/grammar/index.js +19 -0
  57. package/dist/lib-cjs/grammar/index.js.map +1 -0
  58. package/dist/lib-cjs/grammar/meta-grammar-table.js +39 -0
  59. package/dist/lib-cjs/grammar/meta-grammar-table.js.map +1 -0
  60. package/dist/lib-cjs/grammar/production.js +3 -0
  61. package/dist/lib-cjs/grammar/production.js.map +1 -0
  62. package/dist/lib-cjs/grammar/read-grammar-error.js +22 -0
  63. package/dist/lib-cjs/grammar/read-grammar-error.js.map +1 -0
  64. package/dist/lib-cjs/grammar/read-grammar.js +24 -0
  65. package/dist/lib-cjs/grammar/read-grammar.js.map +1 -0
  66. package/dist/lib-cjs/grammar/table-validator.js +215 -0
  67. package/dist/lib-cjs/grammar/table-validator.js.map +1 -0
  68. package/dist/lib-cjs/grammar/token-rule.js +3 -0
  69. package/dist/lib-cjs/grammar/token-rule.js.map +1 -0
  70. package/dist/lib-cjs/grammar/transform-expression.js +3 -0
  71. package/dist/lib-cjs/grammar/transform-expression.js.map +1 -0
  72. package/dist/lib-cjs/grammar/transform-rule.js +3 -0
  73. package/dist/lib-cjs/grammar/transform-rule.js.map +1 -0
  74. package/dist/lib-cjs/grammar/transform-schema.js +43 -0
  75. package/dist/lib-cjs/grammar/transform-schema.js.map +1 -0
  76. package/dist/lib-cjs/index.js +66 -0
  77. package/dist/lib-cjs/index.js.map +1 -0
  78. package/dist/lib-cjs/lexer/index.js +32 -0
  79. package/dist/lib-cjs/lexer/index.js.map +1 -0
  80. package/dist/lib-cjs/lexer/lexer-compile-error.js +22 -0
  81. package/dist/lib-cjs/lexer/lexer-compile-error.js.map +1 -0
  82. package/dist/lib-cjs/lexer/lexer-compile.js +201 -0
  83. package/dist/lib-cjs/lexer/lexer-compile.js.map +1 -0
  84. package/dist/lib-cjs/lexer/lexer-error.js +22 -0
  85. package/dist/lib-cjs/lexer/lexer-error.js.map +1 -0
  86. package/dist/lib-cjs/lexer/lexer-input-error.js +17 -0
  87. package/dist/lib-cjs/lexer/lexer-input-error.js.map +1 -0
  88. package/dist/lib-cjs/lexer/lexer-state-error.js +19 -0
  89. package/dist/lib-cjs/lexer/lexer-state-error.js.map +1 -0
  90. package/dist/lib-cjs/lexer/lexer.js +278 -0
  91. package/dist/lib-cjs/lexer/lexer.js.map +1 -0
  92. package/dist/lib-cjs/lexer/token.js +44 -0
  93. package/dist/lib-cjs/lexer/token.js.map +1 -0
  94. package/dist/lib-cjs/package.json +3 -0
  95. package/dist/lib-cjs/parse-context-error.js +19 -0
  96. package/dist/lib-cjs/parse-context-error.js.map +1 -0
  97. package/dist/lib-cjs/parse-context.js +137 -0
  98. package/dist/lib-cjs/parse-context.js.map +1 -0
  99. package/dist/lib-cjs/parse-output-error.js +19 -0
  100. package/dist/lib-cjs/parse-output-error.js.map +1 -0
  101. package/dist/lib-cjs/parse-output.js +18 -0
  102. package/dist/lib-cjs/parse-output.js.map +1 -0
  103. package/dist/lib-cjs/parse-table/analysis/first-follow.js +294 -0
  104. package/dist/lib-cjs/parse-table/analysis/first-follow.js.map +1 -0
  105. package/dist/lib-cjs/parse-table/analysis/index.js +9 -0
  106. package/dist/lib-cjs/parse-table/analysis/index.js.map +1 -0
  107. package/dist/lib-cjs/parse-table/bnf/bnf-grammar.js +140 -0
  108. package/dist/lib-cjs/parse-table/bnf/bnf-grammar.js.map +1 -0
  109. package/dist/lib-cjs/parse-table/bnf/bnf-production.js +3 -0
  110. package/dist/lib-cjs/parse-table/bnf/bnf-production.js.map +1 -0
  111. package/dist/lib-cjs/parse-table/bnf/bnf-symbol.js +39 -0
  112. package/dist/lib-cjs/parse-table/bnf/bnf-symbol.js.map +1 -0
  113. package/dist/lib-cjs/parse-table/bnf/desugar-ebnf.js +224 -0
  114. package/dist/lib-cjs/parse-table/bnf/desugar-ebnf.js.map +1 -0
  115. package/dist/lib-cjs/parse-table/bnf/index.js +13 -0
  116. package/dist/lib-cjs/parse-table/bnf/index.js.map +1 -0
  117. package/dist/lib-cjs/parse-table/build-lr-table.js +171 -0
  118. package/dist/lib-cjs/parse-table/build-lr-table.js.map +1 -0
  119. package/dist/lib-cjs/parse-table/index.js +49 -0
  120. package/dist/lib-cjs/parse-table/index.js.map +1 -0
  121. package/dist/lib-cjs/parse-table/lr-algorithm-error.js +19 -0
  122. package/dist/lib-cjs/parse-table/lr-algorithm-error.js.map +1 -0
  123. package/dist/lib-cjs/parse-table/lr-algorithm.js +31 -0
  124. package/dist/lib-cjs/parse-table/lr-algorithm.js.map +1 -0
  125. package/dist/lib-cjs/parse-table/lr0/index.js +14 -0
  126. package/dist/lib-cjs/parse-table/lr0/index.js.map +1 -0
  127. package/dist/lib-cjs/parse-table/lr0/lr0-item-set.js +286 -0
  128. package/dist/lib-cjs/parse-table/lr0/lr0-item-set.js.map +1 -0
  129. package/dist/lib-cjs/parse-table/lr1/index.js +18 -0
  130. package/dist/lib-cjs/parse-table/lr1/index.js.map +1 -0
  131. package/dist/lib-cjs/parse-table/lr1/lr1-item-set.js +432 -0
  132. package/dist/lib-cjs/parse-table/lr1/lr1-item-set.js.map +1 -0
  133. package/dist/lib-cjs/parse-table/parse-table-build-error.js +24 -0
  134. package/dist/lib-cjs/parse-table/parse-table-build-error.js.map +1 -0
  135. package/dist/lib-cjs/parse-table/parse-table-error.js +19 -0
  136. package/dist/lib-cjs/parse-table/parse-table-error.js.map +1 -0
  137. package/dist/lib-cjs/parse-table/parse-table-json.js +12 -0
  138. package/dist/lib-cjs/parse-table/parse-table-json.js.map +1 -0
  139. package/dist/lib-cjs/parse-table/parse-table.js +345 -0
  140. package/dist/lib-cjs/parse-table/parse-table.js.map +1 -0
  141. package/dist/lib-cjs/parse-table/slr/index.js +13 -0
  142. package/dist/lib-cjs/parse-table/slr/index.js.map +1 -0
  143. package/dist/lib-cjs/parse-table/slr/parse-action.js +8 -0
  144. package/dist/lib-cjs/parse-table/slr/parse-action.js.map +1 -0
  145. package/dist/lib-cjs/parse-table/slr/slr-table.js +18 -0
  146. package/dist/lib-cjs/parse-table/slr/slr-table.js.map +1 -0
  147. package/dist/lib-cjs/parse-table/table/index.js +21 -0
  148. package/dist/lib-cjs/parse-table/table/index.js.map +1 -0
  149. package/dist/lib-cjs/parse-table/table/lr-parse-table.js +192 -0
  150. package/dist/lib-cjs/parse-table/table/lr-parse-table.js.map +1 -0
  151. package/dist/lib-cjs/parse-table/table/parse-action.js +54 -0
  152. package/dist/lib-cjs/parse-table/table/parse-action.js.map +1 -0
  153. package/dist/lib-cjs/parse-table/table/table-builder-base.js +153 -0
  154. package/dist/lib-cjs/parse-table/table/table-builder-base.js.map +1 -0
  155. package/dist/lib-cjs/parse-table/token-inventory.js +18 -0
  156. package/dist/lib-cjs/parse-table/token-inventory.js.map +1 -0
  157. package/dist/lib-cjs/parser-lr.js +143 -0
  158. package/dist/lib-cjs/parser-lr.js.map +1 -0
  159. package/dist/lib-cjs/shift-reduce/index.js +11 -0
  160. package/dist/lib-cjs/shift-reduce/index.js.map +1 -0
  161. package/dist/lib-cjs/shift-reduce/shift-reduce-engine.js +224 -0
  162. package/dist/lib-cjs/shift-reduce/shift-reduce-engine.js.map +1 -0
  163. package/dist/lib-cjs/transform/binding-map.js +82 -0
  164. package/dist/lib-cjs/transform/binding-map.js.map +1 -0
  165. package/dist/lib-cjs/transform/cst-transformer.js +480 -0
  166. package/dist/lib-cjs/transform/cst-transformer.js.map +1 -0
  167. package/dist/lib-cjs/transform/grammar-fixture.js +109 -0
  168. package/dist/lib-cjs/transform/grammar-fixture.js.map +1 -0
  169. package/dist/lib-cjs/transform/index.js +12 -0
  170. package/dist/lib-cjs/transform/index.js.map +1 -0
  171. package/docs/grammar.md +80 -0
  172. package/docs/parser-lr-enhancement-proposals.md +548 -0
  173. package/grammars/6502.grammar +233 -0
  174. package/grammars/calc.grammar +30 -0
  175. package/grammars/ferrite.grammar +991 -0
  176. package/grammars/fixtures/build-optional/build-optional.grammar +32 -0
  177. package/grammars/fixtures/build-optional/input.txt +1 -0
  178. package/grammars/fixtures/comparison-op/comparison-op.grammar +28 -0
  179. package/grammars/fixtures/comparison-op/input.txt +1 -0
  180. package/grammars/fixtures/flatten-repeat/flatten-repeat.grammar +28 -0
  181. package/grammars/fixtures/flatten-repeat/input.txt +1 -0
  182. package/grammars/fixtures/help-topic/help-topic.grammar +28 -0
  183. package/grammars/fixtures/help-topic/input.txt +1 -0
  184. package/grammars/fixtures/let-target/input.txt +1 -0
  185. package/grammars/fixtures/let-target/let-target.grammar +33 -0
  186. package/grammars/fixtures/pass-preserves-production/bare-terminal/bare-terminal.grammar +24 -0
  187. package/grammars/fixtures/pass-preserves-production/bare-terminal/input.txt +1 -0
  188. package/grammars/fixtures/pass-preserves-production/labeled-variant/input-end-if.txt +1 -0
  189. package/grammars/fixtures/pass-preserves-production/labeled-variant/input-end.txt +1 -0
  190. package/grammars/fixtures/pass-preserves-production/labeled-variant/labeled-variant.grammar +24 -0
  191. package/grammars/fixtures/pass-preserves-production/optional-absent/input.txt +1 -0
  192. package/grammars/fixtures/pass-preserves-production/optional-absent/optional-absent.grammar +24 -0
  193. package/grammars/fixtures/pass-preserves-production/optional-present/input.txt +1 -0
  194. package/grammars/fixtures/pass-preserves-production/optional-present/optional-present.grammar +24 -0
  195. package/grammars/grammar.grammar +428 -0
  196. package/grammars/lisp.grammar +95 -0
  197. package/package.json +9 -4
@@ -0,0 +1,233 @@
1
+ // Very simple 6502 assembler (ca65-inspired syntax).
2
+ //
3
+ // Example:
4
+ //
5
+ // .org $8000
6
+ // start:
7
+ // LDA #$01
8
+ // STA $0200
9
+ // LDX #$00
10
+ // loop:
11
+ // INX
12
+ // BNE loop
13
+ // BRK
14
+
15
+ name "6502" ;
16
+
17
+ tokens
18
+ dot = /\./ ;
19
+ colon = /:/ ;
20
+ comma = /,/ ;
21
+ hash = /#/ ;
22
+ lpar = /\(/ ;
23
+ rpar = /\)/ ;
24
+
25
+ implied_op = /INX|DEX|BRK|NOP/ ;
26
+ branch_op = /BNE|BEQ|BCS|BCC|JMP|JSR/ ;
27
+ memory_op = /LDA|STA|LDX|STX|LDY|STY|ADC|SBC|AND|ORA|EOR|CMP|CPX|CPY/ ;
28
+ identifier = /[A-Za-z_][A-Za-z0-9_]*/ ;
29
+ hex_number = /\$[0-9A-Fa-f]+/ ;
30
+ x_reg = /[Xx]/ ;
31
+ y_reg = /[Yy]/ ;
32
+
33
+ skip
34
+ whitespace = /[ \t\r\n]+/ ;
35
+ comment = /;[^\n\r]*/ ;
36
+
37
+ start program ;
38
+
39
+ grammar
40
+ program =
41
+ { [line]:line }
42
+ ;
43
+
44
+ line =
45
+ #directive directive
46
+ | #labeled [label]:label [colon]:colon [insn]:instruction
47
+ | #code [insn]:instruction
48
+ ;
49
+
50
+ directive =
51
+ [dotTok]:dot
52
+ [sym]:identifier
53
+ [value]:hex_number
54
+ ;
55
+
56
+ label =
57
+ [sym]:identifier
58
+ ;
59
+
60
+ instruction =
61
+ #implied implied
62
+ | #immediate immediate
63
+ | #absolute absolute
64
+ | #indexed_x indexed_x
65
+ | #indexed_y indexed_y
66
+ | #indirect_x indirect_x
67
+ | #relative relative
68
+ ;
69
+
70
+ implied =
71
+ [op]:implied_op
72
+ ;
73
+
74
+ immediate =
75
+ [op]:memory_op
76
+ [hash]:hash
77
+ [value]:hex_number
78
+ ;
79
+
80
+ absolute =
81
+ [op]:memory_op
82
+ [addr]:hex_number
83
+ ;
84
+
85
+ indexed_x =
86
+ [op]:memory_op
87
+ [addr]:hex_number
88
+ [comma]:comma
89
+ [index]:x_reg
90
+ ;
91
+
92
+ indexed_y =
93
+ [op]:memory_op
94
+ [addr]:hex_number
95
+ [comma]:comma
96
+ [index]:y_reg
97
+ ;
98
+
99
+ indirect_x =
100
+ [op]:memory_op
101
+ [open]:lpar
102
+ [addr]:hex_number
103
+ [comma]:comma
104
+ [index]:x_reg
105
+ [close]:rpar
106
+ ;
107
+
108
+ relative =
109
+ [op]:branch_op
110
+ [target]:identifier
111
+ ;
112
+
113
+ ast
114
+ program =
115
+ { line }
116
+ ;
117
+
118
+ line =
119
+ #directive directive
120
+ | #labeled [label]:label [colon]:colon [insn]:instruction
121
+ | #code [insn]:instruction
122
+ ;
123
+
124
+ directive =
125
+ [dotTok]:dot
126
+ [sym]:identifier
127
+ [value]:hex_number
128
+ ;
129
+
130
+ label =
131
+ [sym]:identifier
132
+ ;
133
+
134
+ instruction =
135
+ #implied implied
136
+ | #immediate immediate
137
+ | #absolute absolute
138
+ | #indexed_x indexed_x
139
+ | #indexed_y indexed_y
140
+ | #indirect_x indirect_x
141
+ | #relative relative
142
+ ;
143
+
144
+ implied =
145
+ [op]:implied_op
146
+ ;
147
+
148
+ immediate =
149
+ [op]:memory_op
150
+ [hash]:hash
151
+ [value]:hex_number
152
+ ;
153
+
154
+ absolute =
155
+ [op]:memory_op
156
+ [addr]:hex_number
157
+ ;
158
+
159
+ indexed_x =
160
+ [op]:memory_op
161
+ [addr]:hex_number
162
+ [comma]:comma
163
+ [index]:x_reg
164
+ ;
165
+
166
+ indexed_y =
167
+ [op]:memory_op
168
+ [addr]:hex_number
169
+ [comma]:comma
170
+ [index]:y_reg
171
+ ;
172
+
173
+ indirect_x =
174
+ [op]:memory_op
175
+ [open]:lpar
176
+ [addr]:hex_number
177
+ [comma]:comma
178
+ [index]:x_reg
179
+ [close]:rpar
180
+ ;
181
+
182
+ relative =
183
+ [op]:branch_op
184
+ [target]:identifier
185
+ ;
186
+
187
+ transform
188
+ program ->
189
+ #main pass(program$repeat_0) ;
190
+
191
+ program$repeat_0 ->
192
+ #main flatten(program.#program, line, program$repeat_0) ;
193
+
194
+ line ->
195
+ #directive line.#directive(directive)
196
+ | #labeled line.#labeled(label, colon, insn)
197
+ | #code line.#code(insn) ;
198
+
199
+ directive ->
200
+ #main directive.#directive(dotTok, sym, value) ;
201
+
202
+ label ->
203
+ #main pass(sym) ;
204
+
205
+ instruction ->
206
+ #implied pass(implied)
207
+ | #immediate pass(immediate)
208
+ | #absolute pass(absolute)
209
+ | #indexed_x pass(indexed_x)
210
+ | #indexed_y pass(indexed_y)
211
+ | #indirect_x pass(indirect_x)
212
+ | #relative pass(relative) ;
213
+
214
+ implied ->
215
+ #main instruction.#implied(op) ;
216
+
217
+ immediate ->
218
+ #main instruction.#immediate(op, hash, value) ;
219
+
220
+ absolute ->
221
+ #main instruction.#absolute(op, addr) ;
222
+
223
+ indexed_x ->
224
+ #main instruction.#indexed_x(op, addr, comma, index) ;
225
+
226
+ indexed_y ->
227
+ #main instruction.#indexed_y(op, addr, comma, index) ;
228
+
229
+ indirect_x ->
230
+ #main instruction.#indirect_x(op, open, addr, comma, index, close) ;
231
+
232
+ relative ->
233
+ #main instruction.#relative(op, target) ;
@@ -0,0 +1,30 @@
1
+ // Simple calculator: binary addition with AST transform.
2
+
3
+ name "calc" ;
4
+
5
+ tokens
6
+ number = /[0-9]+/ ;
7
+ plus = /\+/ ;
8
+
9
+ skip
10
+ whitespace = /[ \t\r\n]+/ ;
11
+
12
+ start expr ;
13
+
14
+ grammar
15
+ expr =
16
+ #binary [left]:expr [operator]:plus [right]:number
17
+ | #literal number
18
+ ;
19
+
20
+ ast
21
+ expr =
22
+ #binary [left]:expr [operator]:plus [right]:number
23
+ | #literal number
24
+ ;
25
+
26
+ transform
27
+ expr ->
28
+ #binary expr.#binary(left, operator, right)
29
+ | #literal expr.#literal(number)
30
+ ;