parser-lr 0.4.0 → 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 (198) hide show
  1. package/README.md +35 -1
  2. package/bin/parser-lr.js +369 -9068
  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/grammar.json +1218 -4476
  13. package/dist/lib/grammar/index.d.ts +2 -0
  14. package/dist/lib/grammar/index.d.ts.map +1 -1
  15. package/dist/lib/grammar/index.js +1 -0
  16. package/dist/lib/grammar/index.js.map +1 -1
  17. package/dist/lib/grammar/meta-grammar-table.d.ts.map +1 -1
  18. package/dist/lib/grammar/meta-grammar-table.js +4 -2
  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 +211 -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 +19 -0
  58. package/dist/lib-cjs/grammar/index.js.map +1 -0
  59. package/dist/lib-cjs/grammar/meta-grammar-table.js +39 -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 +215 -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 +80 -0
  173. package/docs/parser-lr-enhancement-proposals.md +548 -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/pass-preserves-production/bare-terminal/bare-terminal.grammar +24 -0
  188. package/grammars/fixtures/pass-preserves-production/bare-terminal/input.txt +1 -0
  189. package/grammars/fixtures/pass-preserves-production/labeled-variant/input-end-if.txt +1 -0
  190. package/grammars/fixtures/pass-preserves-production/labeled-variant/input-end.txt +1 -0
  191. package/grammars/fixtures/pass-preserves-production/labeled-variant/labeled-variant.grammar +24 -0
  192. package/grammars/fixtures/pass-preserves-production/optional-absent/input.txt +1 -0
  193. package/grammars/fixtures/pass-preserves-production/optional-absent/optional-absent.grammar +24 -0
  194. package/grammars/fixtures/pass-preserves-production/optional-present/input.txt +1 -0
  195. package/grammars/fixtures/pass-preserves-production/optional-present/optional-present.grammar +24 -0
  196. package/grammars/grammar.grammar +428 -0
  197. package/grammars/lisp.grammar +95 -0
  198. package/package.json +10 -5
@@ -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,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,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) ;