parser-lr 0.6.1 → 0.7.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 (173) hide show
  1. package/README.md +14 -30
  2. package/bin/parser-lr.js +11388 -11409
  3. package/bin/parser-lr.js.map +1 -1
  4. package/dist/lib/grammar/index.d.ts +1 -1
  5. package/dist/lib/grammar/index.d.ts.map +1 -1
  6. package/dist/lib/grammar/index.js +1 -1
  7. package/dist/lib/grammar/index.js.map +1 -1
  8. package/dist/lib/grammar/meta-grammar-table.d.ts +0 -12
  9. package/dist/lib/grammar/meta-grammar-table.d.ts.map +1 -1
  10. package/dist/lib/grammar/meta-grammar-table.js +5 -22
  11. package/dist/lib/grammar/meta-grammar-table.js.map +1 -1
  12. package/dist/lib/grammar-entry.d.ts +42 -0
  13. package/dist/lib/grammar-entry.d.ts.map +1 -0
  14. package/dist/lib/grammar-entry.js +45 -0
  15. package/dist/lib/grammar-entry.js.map +1 -0
  16. package/dist/lib/index.d.ts +7 -5
  17. package/dist/lib/index.d.ts.map +1 -1
  18. package/dist/lib/index.js +0 -3
  19. package/dist/lib/index.js.map +1 -1
  20. package/dist/lib/parse-context.d.ts +4 -15
  21. package/dist/lib/parse-context.d.ts.map +1 -1
  22. package/dist/lib/parse-context.js +4 -23
  23. package/dist/lib/parse-context.js.map +1 -1
  24. package/dist/lib/transform/grammar-fixture.js +3 -3
  25. package/dist/lib/transform/grammar-fixture.js.map +1 -1
  26. package/docs/parser-lr-browser-lib-split.md +174 -0
  27. package/package.json +7 -2
  28. package/dist/lib/grammar/grammar-json-path.d.ts +0 -2
  29. package/dist/lib/grammar/grammar-json-path.d.ts.map +0 -1
  30. package/dist/lib/grammar/grammar-json-path.esm.d.ts +0 -5
  31. package/dist/lib/grammar/grammar-json-path.esm.d.ts.map +0 -1
  32. package/dist/lib/grammar/grammar-json-path.esm.js +0 -9
  33. package/dist/lib/grammar/grammar-json-path.esm.js.map +0 -1
  34. package/dist/lib/grammar/grammar-json-path.js +0 -2
  35. package/dist/lib/grammar/grammar-json-path.js.map +0 -1
  36. package/dist/lib-cjs/ast/ast-node.js +0 -70
  37. package/dist/lib-cjs/ast/ast-node.js.map +0 -1
  38. package/dist/lib-cjs/errors/index.js +0 -9
  39. package/dist/lib-cjs/errors/index.js.map +0 -1
  40. package/dist/lib-cjs/errors/parser-lr-error.js +0 -52
  41. package/dist/lib-cjs/errors/parser-lr-error.js.map +0 -1
  42. package/dist/lib-cjs/grammar/ast-schema.js +0 -43
  43. package/dist/lib-cjs/grammar/ast-schema.js.map +0 -1
  44. package/dist/lib-cjs/grammar/ast-type.js +0 -3
  45. package/dist/lib-cjs/grammar/ast-type.js.map +0 -1
  46. package/dist/lib-cjs/grammar/expression.js +0 -3
  47. package/dist/lib-cjs/grammar/expression.js.map +0 -1
  48. package/dist/lib-cjs/grammar/grammar-from-cst.js +0 -641
  49. package/dist/lib-cjs/grammar/grammar-from-cst.js.map +0 -1
  50. package/dist/lib-cjs/grammar/grammar-json-path.js +0 -13
  51. package/dist/lib-cjs/grammar/grammar-json-path.js.map +0 -1
  52. package/dist/lib-cjs/grammar/grammar-literals.js +0 -71
  53. package/dist/lib-cjs/grammar/grammar-literals.js.map +0 -1
  54. package/dist/lib-cjs/grammar/grammar.js +0 -64
  55. package/dist/lib-cjs/grammar/grammar.js.map +0 -1
  56. package/dist/lib-cjs/grammar/grammar.json +0 -5760
  57. package/dist/lib-cjs/grammar/index.js +0 -21
  58. package/dist/lib-cjs/grammar/index.js.map +0 -1
  59. package/dist/lib-cjs/grammar/meta-grammar-table.js +0 -68
  60. package/dist/lib-cjs/grammar/meta-grammar-table.js.map +0 -1
  61. package/dist/lib-cjs/grammar/production.js +0 -3
  62. package/dist/lib-cjs/grammar/production.js.map +0 -1
  63. package/dist/lib-cjs/grammar/read-grammar-error.js +0 -22
  64. package/dist/lib-cjs/grammar/read-grammar-error.js.map +0 -1
  65. package/dist/lib-cjs/grammar/read-grammar.js +0 -24
  66. package/dist/lib-cjs/grammar/read-grammar.js.map +0 -1
  67. package/dist/lib-cjs/grammar/table-validator.js +0 -262
  68. package/dist/lib-cjs/grammar/table-validator.js.map +0 -1
  69. package/dist/lib-cjs/grammar/token-rule.js +0 -3
  70. package/dist/lib-cjs/grammar/token-rule.js.map +0 -1
  71. package/dist/lib-cjs/grammar/transform-expression.js +0 -3
  72. package/dist/lib-cjs/grammar/transform-expression.js.map +0 -1
  73. package/dist/lib-cjs/grammar/transform-rule.js +0 -3
  74. package/dist/lib-cjs/grammar/transform-rule.js.map +0 -1
  75. package/dist/lib-cjs/grammar/transform-schema.js +0 -43
  76. package/dist/lib-cjs/grammar/transform-schema.js.map +0 -1
  77. package/dist/lib-cjs/index.js +0 -66
  78. package/dist/lib-cjs/index.js.map +0 -1
  79. package/dist/lib-cjs/lexer/index.js +0 -32
  80. package/dist/lib-cjs/lexer/index.js.map +0 -1
  81. package/dist/lib-cjs/lexer/lexer-compile-error.js +0 -22
  82. package/dist/lib-cjs/lexer/lexer-compile-error.js.map +0 -1
  83. package/dist/lib-cjs/lexer/lexer-compile.js +0 -201
  84. package/dist/lib-cjs/lexer/lexer-compile.js.map +0 -1
  85. package/dist/lib-cjs/lexer/lexer-error.js +0 -22
  86. package/dist/lib-cjs/lexer/lexer-error.js.map +0 -1
  87. package/dist/lib-cjs/lexer/lexer-input-error.js +0 -17
  88. package/dist/lib-cjs/lexer/lexer-input-error.js.map +0 -1
  89. package/dist/lib-cjs/lexer/lexer-state-error.js +0 -19
  90. package/dist/lib-cjs/lexer/lexer-state-error.js.map +0 -1
  91. package/dist/lib-cjs/lexer/lexer.js +0 -278
  92. package/dist/lib-cjs/lexer/lexer.js.map +0 -1
  93. package/dist/lib-cjs/lexer/token.js +0 -44
  94. package/dist/lib-cjs/lexer/token.js.map +0 -1
  95. package/dist/lib-cjs/package.json +0 -3
  96. package/dist/lib-cjs/parse-context-error.js +0 -19
  97. package/dist/lib-cjs/parse-context-error.js.map +0 -1
  98. package/dist/lib-cjs/parse-context.js +0 -137
  99. package/dist/lib-cjs/parse-context.js.map +0 -1
  100. package/dist/lib-cjs/parse-output-error.js +0 -19
  101. package/dist/lib-cjs/parse-output-error.js.map +0 -1
  102. package/dist/lib-cjs/parse-output.js +0 -18
  103. package/dist/lib-cjs/parse-output.js.map +0 -1
  104. package/dist/lib-cjs/parse-table/analysis/first-follow.js +0 -294
  105. package/dist/lib-cjs/parse-table/analysis/first-follow.js.map +0 -1
  106. package/dist/lib-cjs/parse-table/analysis/index.js +0 -9
  107. package/dist/lib-cjs/parse-table/analysis/index.js.map +0 -1
  108. package/dist/lib-cjs/parse-table/bnf/bnf-grammar.js +0 -140
  109. package/dist/lib-cjs/parse-table/bnf/bnf-grammar.js.map +0 -1
  110. package/dist/lib-cjs/parse-table/bnf/bnf-production.js +0 -3
  111. package/dist/lib-cjs/parse-table/bnf/bnf-production.js.map +0 -1
  112. package/dist/lib-cjs/parse-table/bnf/bnf-symbol.js +0 -39
  113. package/dist/lib-cjs/parse-table/bnf/bnf-symbol.js.map +0 -1
  114. package/dist/lib-cjs/parse-table/bnf/desugar-ebnf.js +0 -224
  115. package/dist/lib-cjs/parse-table/bnf/desugar-ebnf.js.map +0 -1
  116. package/dist/lib-cjs/parse-table/bnf/index.js +0 -13
  117. package/dist/lib-cjs/parse-table/bnf/index.js.map +0 -1
  118. package/dist/lib-cjs/parse-table/build-lr-table.js +0 -171
  119. package/dist/lib-cjs/parse-table/build-lr-table.js.map +0 -1
  120. package/dist/lib-cjs/parse-table/index.js +0 -49
  121. package/dist/lib-cjs/parse-table/index.js.map +0 -1
  122. package/dist/lib-cjs/parse-table/lr-algorithm-error.js +0 -19
  123. package/dist/lib-cjs/parse-table/lr-algorithm-error.js.map +0 -1
  124. package/dist/lib-cjs/parse-table/lr-algorithm.js +0 -31
  125. package/dist/lib-cjs/parse-table/lr-algorithm.js.map +0 -1
  126. package/dist/lib-cjs/parse-table/lr0/index.js +0 -14
  127. package/dist/lib-cjs/parse-table/lr0/index.js.map +0 -1
  128. package/dist/lib-cjs/parse-table/lr0/lr0-item-set.js +0 -286
  129. package/dist/lib-cjs/parse-table/lr0/lr0-item-set.js.map +0 -1
  130. package/dist/lib-cjs/parse-table/lr1/index.js +0 -18
  131. package/dist/lib-cjs/parse-table/lr1/index.js.map +0 -1
  132. package/dist/lib-cjs/parse-table/lr1/lr1-item-set.js +0 -432
  133. package/dist/lib-cjs/parse-table/lr1/lr1-item-set.js.map +0 -1
  134. package/dist/lib-cjs/parse-table/parse-table-build-error.js +0 -24
  135. package/dist/lib-cjs/parse-table/parse-table-build-error.js.map +0 -1
  136. package/dist/lib-cjs/parse-table/parse-table-error.js +0 -19
  137. package/dist/lib-cjs/parse-table/parse-table-error.js.map +0 -1
  138. package/dist/lib-cjs/parse-table/parse-table-json.js +0 -12
  139. package/dist/lib-cjs/parse-table/parse-table-json.js.map +0 -1
  140. package/dist/lib-cjs/parse-table/parse-table.js +0 -345
  141. package/dist/lib-cjs/parse-table/parse-table.js.map +0 -1
  142. package/dist/lib-cjs/parse-table/slr/index.js +0 -13
  143. package/dist/lib-cjs/parse-table/slr/index.js.map +0 -1
  144. package/dist/lib-cjs/parse-table/slr/parse-action.js +0 -8
  145. package/dist/lib-cjs/parse-table/slr/parse-action.js.map +0 -1
  146. package/dist/lib-cjs/parse-table/slr/slr-table.js +0 -18
  147. package/dist/lib-cjs/parse-table/slr/slr-table.js.map +0 -1
  148. package/dist/lib-cjs/parse-table/table/index.js +0 -21
  149. package/dist/lib-cjs/parse-table/table/index.js.map +0 -1
  150. package/dist/lib-cjs/parse-table/table/lr-parse-table.js +0 -192
  151. package/dist/lib-cjs/parse-table/table/lr-parse-table.js.map +0 -1
  152. package/dist/lib-cjs/parse-table/table/parse-action.js +0 -54
  153. package/dist/lib-cjs/parse-table/table/parse-action.js.map +0 -1
  154. package/dist/lib-cjs/parse-table/table/table-builder-base.js +0 -153
  155. package/dist/lib-cjs/parse-table/table/table-builder-base.js.map +0 -1
  156. package/dist/lib-cjs/parse-table/token-inventory.js +0 -18
  157. package/dist/lib-cjs/parse-table/token-inventory.js.map +0 -1
  158. package/dist/lib-cjs/parser-lr.js +0 -143
  159. package/dist/lib-cjs/parser-lr.js.map +0 -1
  160. package/dist/lib-cjs/shift-reduce/index.js +0 -11
  161. package/dist/lib-cjs/shift-reduce/index.js.map +0 -1
  162. package/dist/lib-cjs/shift-reduce/shift-reduce-engine.js +0 -224
  163. package/dist/lib-cjs/shift-reduce/shift-reduce-engine.js.map +0 -1
  164. package/dist/lib-cjs/transform/binding-map.js +0 -82
  165. package/dist/lib-cjs/transform/binding-map.js.map +0 -1
  166. package/dist/lib-cjs/transform/cst-transformer.js +0 -480
  167. package/dist/lib-cjs/transform/cst-transformer.js.map +0 -1
  168. package/dist/lib-cjs/transform/grammar-fixture.js +0 -109
  169. package/dist/lib-cjs/transform/grammar-fixture.js.map +0 -1
  170. package/dist/lib-cjs/transform/index.js +0 -12
  171. package/dist/lib-cjs/transform/index.js.map +0 -1
  172. package/docs/parser-lr-enhancement-proposals.md +0 -337
  173. package/grammars/fixtures/table-only-import/table-only-smoke.cjs +0 -38
@@ -1,137 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ParseContext = void 0;
4
- const parse_context_error_js_1 = require("./parse-context-error.js");
5
- const read_grammar_js_1 = require("./grammar/read-grammar.js");
6
- const lr_algorithm_js_1 = require("./parse-table/lr-algorithm.js");
7
- const parse_table_js_1 = require("./parse-table/parse-table.js");
8
- const parser_lr_js_1 = require("./parser-lr.js");
9
- /**
10
- * Parser and parse table loaded from a grammar or serialized table.
11
- */
12
- class ParseContext {
13
- parser;
14
- table;
15
- /**
16
- * Creates a parse context from a parser and its table.
17
- *
18
- * @param parser - Shift-reduce parser instance.
19
- * @param table - Parse table backing the parser.
20
- */
21
- constructor(parser, table) {
22
- this.parser = parser;
23
- this.table = table;
24
- }
25
- /**
26
- * Builds a parse context from grammar file text.
27
- *
28
- * @param source - Full `.grammar` file contents.
29
- * @param algorithm - LR algorithm used to build the table.
30
- * @returns Parser and parse table ready for lexing or parsing.
31
- */
32
- static fromGrammar(source, algorithm = 'lr1') {
33
- const grammar = (0, read_grammar_js_1.readGrammar)(source);
34
- const table = parse_table_js_1.ParseTable.fromGrammar(grammar, algorithm);
35
- const parser = new parser_lr_js_1.ParserLr(grammar, table);
36
- return new ParseContext(parser, table);
37
- }
38
- /**
39
- * Builds a parse context from serialized parse table JSON.
40
- *
41
- * @param json - Serialized parse table JSON including `ast` and `transform` when present.
42
- * @returns Parser and parse table ready for lexing and full AST parsing.
43
- */
44
- static fromTableJson(json) {
45
- const table = parse_table_js_1.ParseTable.fromJsonString(json);
46
- return new ParseContext(parser_lr_js_1.ParserLr.fromParseTable(table), table);
47
- }
48
- /**
49
- * Builds a parse context from a grammar or table source string.
50
- *
51
- * @param options - Grammar source, table JSON, and optional algorithm.
52
- * @returns Parser and parse table ready for lexing or parsing.
53
- */
54
- static fromSources(options) {
55
- // Prefer grammar source over a saved table when both are supplied.
56
- if (options.grammarSource !== undefined) {
57
- return ParseContext.fromGrammar(options.grammarSource, (0, lr_algorithm_js_1.parseLrAlgorithm)(options.algorithm));
58
- }
59
- if (options.tableJson !== undefined) {
60
- return ParseContext.fromTableJson(options.tableJson);
61
- }
62
- throw new parse_context_error_js_1.ParseContextError('required: grammar source or table JSON');
63
- }
64
- /**
65
- * Creates a stream lexer for this context's grammar.
66
- *
67
- * @returns A fresh stream lexer instance.
68
- */
69
- createLexer() {
70
- return this.parser.createLexer();
71
- }
72
- /**
73
- * Lexes source text using this context's parser.
74
- *
75
- * @param source - Input text to tokenize.
76
- * @returns Matched tokens in source order, ending with `$eof`.
77
- */
78
- lex(source) {
79
- return this.parser.lex(source);
80
- }
81
- /**
82
- * Lexes synchronous source chunks into a token stream ending with `$eof`.
83
- *
84
- * @param chunks - Source text fragments in order.
85
- * @returns Token iterator including `$eof`.
86
- */
87
- lexChunks(chunks) {
88
- return this.parser.lexChunks(chunks);
89
- }
90
- /**
91
- * Lexes asynchronous source chunks into a token stream ending with `$eof`.
92
- *
93
- * @param chunks - Source text fragments in order.
94
- * @returns Async token iterator including `$eof`.
95
- */
96
- lexChunksAsync(chunks) {
97
- return this.parser.lexChunksAsync(chunks);
98
- }
99
- /**
100
- * Collects all tokens from a synchronous chunk stream.
101
- *
102
- * @param chunks - Source text fragments in order.
103
- * @returns Matched tokens including `$eof`.
104
- */
105
- lexChunkStream(chunks) {
106
- return this.parser.lexChunkStream(chunks);
107
- }
108
- /**
109
- * Collects all tokens from an asynchronous chunk stream.
110
- *
111
- * @param chunks - Source text fragments in order.
112
- * @returns Matched tokens including `$eof`.
113
- */
114
- async lexChunkStreamAsync(chunks) {
115
- return this.parser.lexChunkStreamAsync(chunks);
116
- }
117
- /**
118
- * Parses a token stream into an AST, applying transforms from the grammar or table when present.
119
- *
120
- * @param tokens - Token stream ending with `$eof`.
121
- * @returns Transformed AST, CST when no transform rules exist, or null on syntax error.
122
- */
123
- parse(tokens) {
124
- return this.parser.parse(tokens);
125
- }
126
- /**
127
- * Lexes and parses source text into an AST, applying transforms when present.
128
- *
129
- * @param source - Input text to parse.
130
- * @returns Transformed AST, CST when no transform rules exist, or null on syntax error.
131
- */
132
- parseSource(source) {
133
- return this.parser.parseSource(source);
134
- }
135
- }
136
- exports.ParseContext = ParseContext;
137
- //# sourceMappingURL=parse-context.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"parse-context.js","sourceRoot":"","sources":["../../src/lib/parse-context.ts"],"names":[],"mappings":";;;AACA,qEAA6D;AAC7D,+DAAwD;AAIxD,mEAAiE;AACjE,iEAA0D;AAC1D,iDAA0C;AAE1C;;GAEG;AACH,MAAa,YAAY;IASD;IACA;IARpB;;;;;OAKG;IACH,YACoB,MAAgB,EAChB,KAAiB;QADjB,WAAM,GAAN,MAAM,CAAU;QAChB,UAAK,GAAL,KAAK,CAAY;IAGrC,CAAC;IAED;;;;;;OAMG;IACI,MAAM,CAAC,WAAW,CACrB,MAAc,EACd,YAAyB,KAAK;QAG9B,MAAM,OAAO,GAAG,IAAA,6BAAW,EAAC,MAAM,CAAC,CAAC;QACpC,MAAM,KAAK,GAAG,2BAAU,CAAC,WAAW,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACzD,MAAM,MAAM,GAAG,IAAI,uBAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAE5C,OAAO,IAAI,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC3C,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,aAAa,CAAC,IAAY;QAEpC,MAAM,KAAK,GAAG,2BAAU,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAE9C,OAAO,IAAI,YAAY,CAAC,uBAAQ,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;IACnE,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,WAAW,CAAC,OAA4B;QAElD,mEAAmE;QACnE,IAAI,OAAO,CAAC,aAAa,KAAK,SAAS,EACvC,CAAC;YACG,OAAO,YAAY,CAAC,WAAW,CAC3B,OAAO,CAAC,aAAa,EACrB,IAAA,kCAAgB,EAAC,OAAO,CAAC,SAAS,CAAC,CACtC,CAAC;QACN,CAAC;QAED,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,EACnC,CAAC;YACG,OAAO,YAAY,CAAC,aAAa,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACzD,CAAC;QAED,MAAM,IAAI,0CAAiB,CAAC,wCAAwC,CAAC,CAAC;IAC1E,CAAC;IAED;;;;OAIG;IACI,WAAW;QAEd,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;IACrC,CAAC;IAED;;;;;OAKG;IACI,GAAG,CAAC,MAAc;QAErB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;IAED;;;;;OAKG;IACI,SAAS,CAAC,MAAwB;QAErC,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACzC,CAAC;IAED;;;;;OAKG;IACI,cAAc,CAAC,MAA6B;QAE/C,OAAO,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IAC9C,CAAC;IAED;;;;;OAKG;IACI,cAAc,CAAC,MAAwB;QAE1C,OAAO,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IAC9C,CAAC;IAED;;;;;OAKG;IACI,KAAK,CAAC,mBAAmB,CAAC,MAA6B;QAE1D,OAAO,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;IACnD,CAAC;IAED;;;;;OAKG;IACI,KAAK,CAAC,MAAwB;QAEjC,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC;IAED;;;;;OAKG;IACI,WAAW,CAAC,MAAc;QAE7B,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAC3C,CAAC;CACJ;AA9JD,oCA8JC"}
@@ -1,19 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ParseOutputError = void 0;
4
- const parser_lr_error_js_1 = require("./errors/parser-lr-error.js");
5
- /**
6
- * Thrown when parse output cannot be formatted for a requested interchange format.
7
- */
8
- class ParseOutputError extends parser_lr_error_js_1.ParserLrError {
9
- /**
10
- * Creates a parse output formatting error.
11
- *
12
- * @param format - Requested output format name.
13
- */
14
- constructor(format) {
15
- super(`Unsupported output format ${JSON.stringify(format)}`);
16
- }
17
- }
18
- exports.ParseOutputError = ParseOutputError;
19
- //# sourceMappingURL=parse-output-error.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"parse-output-error.js","sourceRoot":"","sources":["../../src/lib/parse-output-error.ts"],"names":[],"mappings":";;;AAAA,oEAA4D;AAE5D;;GAEG;AACH,MAAa,gBAAiB,SAAQ,kCAAa;IAE/C;;;;OAIG;IACH,YAAmB,MAAc;QAE7B,KAAK,CAAC,6BAA6B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACjE,CAAC;CACJ;AAXD,4CAWC"}
@@ -1,18 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.formatParseOutput = formatParseOutput;
4
- const parse_output_error_js_1 = require("./parse-output-error.js");
5
- /**
6
- * Formats parse output for a named interchange format.
7
- *
8
- * @param tree - Parsed concrete syntax tree, or null on syntax error.
9
- * @param format - Output format name.
10
- * @returns Formatted output text.
11
- */
12
- function formatParseOutput(tree, format) {
13
- if (format !== 'json') {
14
- throw new parse_output_error_js_1.ParseOutputError(format);
15
- }
16
- return JSON.stringify({ ast: tree }, null, 4);
17
- }
18
- //# sourceMappingURL=parse-output.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"parse-output.js","sourceRoot":"","sources":["../../src/lib/parse-output.ts"],"names":[],"mappings":";;AAUA,8CAQC;AAjBD,mEAA2D;AAE3D;;;;;;GAMG;AACH,SAAgB,iBAAiB,CAAC,IAAoB,EAAE,MAAc;IAElE,IAAI,MAAM,KAAK,MAAM,EACrB,CAAC;QACG,MAAM,IAAI,wCAAgB,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;IAED,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAClD,CAAC"}
@@ -1,294 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.GrammarAnalysis = void 0;
4
- exports.analyzeGrammar = analyzeGrammar;
5
- exports.formatBnfProduction = formatBnfProduction;
6
- exports.isAugmentedGrammar = isAugmentedGrammar;
7
- const token_js_1 = require("../../lexer/token.js");
8
- const bnf_grammar_js_1 = require("../bnf/bnf-grammar.js");
9
- const bnf_symbol_js_1 = require("../bnf/bnf-symbol.js");
10
- /**
11
- * Nullable non-terminals and FIRST/FOLLOW sets for a BNF grammar.
12
- */
13
- class GrammarAnalysis {
14
- nullable;
15
- firstByNonTerminal;
16
- followByNonTerminal;
17
- /**
18
- * Computes nullable, FIRST, and FOLLOW sets for a BNF grammar.
19
- *
20
- * @param grammar - Plain BNF grammar to analyze.
21
- */
22
- constructor(grammar) {
23
- this.nullable = GrammarAnalysis.computeNullable(grammar);
24
- this.firstByNonTerminal = GrammarAnalysis.computeFirst(grammar, this.nullable);
25
- this.followByNonTerminal = GrammarAnalysis.computeFollow(grammar, this.firstByNonTerminal, this.nullable);
26
- }
27
- /**
28
- * Returns whether a non-terminal can derive the empty string.
29
- *
30
- * @param name - Non-terminal name to test.
31
- * @returns True when the non-terminal can derive ε.
32
- */
33
- isNullable(name) {
34
- return this.nullable.has(name);
35
- }
36
- /**
37
- * Returns FIRST symbols for a non-terminal as encoded terminal keys.
38
- *
39
- * @param name - Non-terminal name to look up.
40
- */
41
- firstOfNonTerminal(name) {
42
- return this.firstByNonTerminal.get(name) ?? new Set();
43
- }
44
- /**
45
- * Returns FOLLOW symbols for a non-terminal as encoded terminal keys.
46
- *
47
- * @param name - Non-terminal name to look up.
48
- */
49
- followOfNonTerminal(name) {
50
- return this.followByNonTerminal.get(name) ?? new Set();
51
- }
52
- /**
53
- * Returns FIRST symbols for a symbol sequence.
54
- *
55
- * @param symbols - Right-hand side prefix or full sequence.
56
- * @returns Encoded terminal keys in FIRST of the sequence.
57
- */
58
- firstOfSequence(symbols) {
59
- const result = new Set();
60
- let allNullable = true;
61
- // Accumulate FIRST of each prefix symbol until a non-nullable symbol stops propagation.
62
- for (const symbol of symbols) {
63
- const symbolFirst = this.firstOfSymbol(symbol);
64
- GrammarAnalysis.addAll(result, symbolFirst);
65
- if (!this.isSymbolNullable(symbol)) {
66
- allNullable = false;
67
- break;
68
- }
69
- }
70
- // Every symbol is nullable, so end-of-input is in FIRST.
71
- if (allNullable) {
72
- result.add(token_js_1.EOF_TOKEN_NAME);
73
- }
74
- return result;
75
- }
76
- /**
77
- * Returns FIRST symbols for one grammar symbol.
78
- *
79
- * @param symbol - Terminal, token, or non-terminal symbol.
80
- */
81
- firstOfSymbol(symbol) {
82
- if (symbol.kind === 'nonTerminal') {
83
- return this.firstOfNonTerminal(symbol.name);
84
- }
85
- return new Set([(0, bnf_symbol_js_1.bnfParserSymbolKey)(symbol)]);
86
- }
87
- /**
88
- * Returns whether a symbol can begin with the empty string.
89
- *
90
- * @param symbol - Terminal, token, or non-terminal symbol.
91
- */
92
- isSymbolNullable(symbol) {
93
- if (symbol.kind === 'nonTerminal') {
94
- return this.isNullable(symbol.name);
95
- }
96
- return false;
97
- }
98
- /**
99
- * Computes nullable non-terminals by fixed-point iteration.
100
- *
101
- * @param grammar - Plain BNF grammar to analyze.
102
- * @returns The set of non-terminal names that derive ε.
103
- */
104
- static computeNullable(grammar) {
105
- const nullable = new Set();
106
- let changed = true;
107
- // Fixed-point: mark A nullable when every production A → α has nullable α.
108
- while (changed) {
109
- changed = false;
110
- for (const production of grammar.productions) {
111
- if (production.rhs.length === 0 && !nullable.has(production.name)) {
112
- nullable.add(production.name);
113
- changed = true;
114
- continue;
115
- }
116
- if (production.rhs.every((symbol) => symbol.kind === 'nonTerminal' && nullable.has(symbol.name))) {
117
- if (!nullable.has(production.name)) {
118
- nullable.add(production.name);
119
- changed = true;
120
- }
121
- }
122
- }
123
- }
124
- return nullable;
125
- }
126
- /**
127
- * Computes FIRST sets for every non-terminal.
128
- *
129
- * @param grammar - Plain BNF grammar to analyze.
130
- * @param nullable - Nullable non-terminal names.
131
- * @returns FIRST set for every non-terminal name.
132
- */
133
- static computeFirst(grammar, nullable) {
134
- const firstByNonTerminal = new Map();
135
- for (const name of grammar.nonTerminalNames()) {
136
- firstByNonTerminal.set(name, new Set());
137
- }
138
- let changed = true;
139
- // Fixed-point: add FIRST(α) into FIRST(A) for each production A → α.
140
- while (changed) {
141
- changed = false;
142
- for (const production of grammar.productions) {
143
- const first = firstByNonTerminal.get(production.name) ?? new Set();
144
- const before = first.size;
145
- GrammarAnalysis.addFirstOfSequence(first, production.rhs, firstByNonTerminal, nullable);
146
- if (first.size !== before) {
147
- changed = true;
148
- }
149
- firstByNonTerminal.set(production.name, first);
150
- }
151
- }
152
- return firstByNonTerminal;
153
- }
154
- /**
155
- * Computes FOLLOW sets for every non-terminal.
156
- *
157
- * @param grammar - Plain BNF grammar to analyze.
158
- * @param firstByNonTerminal - Precomputed FIRST sets.
159
- * @param nullable - Nullable non-terminal names.
160
- * @returns FOLLOW set for every non-terminal name.
161
- */
162
- static computeFollow(grammar, firstByNonTerminal, nullable) {
163
- const followByNonTerminal = new Map();
164
- for (const name of grammar.nonTerminalNames()) {
165
- followByNonTerminal.set(name, new Set());
166
- }
167
- // Seed FOLLOW of the start symbol with end-of-input.
168
- const startFollow = followByNonTerminal.get(grammar.startSymbol) ?? new Set();
169
- startFollow.add(token_js_1.EOF_TOKEN_NAME);
170
- followByNonTerminal.set(grammar.startSymbol, startFollow);
171
- let changed = true;
172
- // Fixed-point: propagate FOLLOW through every production A → α B β.
173
- while (changed) {
174
- changed = false;
175
- for (const production of grammar.productions) {
176
- for (let index = 0; index < production.rhs.length; index += 1) {
177
- const symbol = production.rhs[index];
178
- if (symbol.kind !== 'nonTerminal') {
179
- continue;
180
- }
181
- const follow = followByNonTerminal.get(symbol.name) ?? new Set();
182
- const before = follow.size;
183
- const beta = production.rhs.slice(index + 1);
184
- const betaFirst = GrammarAnalysis.firstOfSequenceStatic(beta, firstByNonTerminal, nullable);
185
- GrammarAnalysis.addAll(follow, betaFirst);
186
- // When β is empty or nullable, inherit FOLLOW of the production lhs.
187
- if (beta.length === 0 || GrammarAnalysis.isSequenceNullableStatic(beta, nullable)) {
188
- const lhsFollow = followByNonTerminal.get(production.name) ?? new Set();
189
- GrammarAnalysis.addAll(follow, lhsFollow);
190
- }
191
- if (follow.size !== before) {
192
- changed = true;
193
- }
194
- followByNonTerminal.set(symbol.name, follow);
195
- }
196
- }
197
- }
198
- return followByNonTerminal;
199
- }
200
- /**
201
- * Adds FIRST symbols for a symbol sequence into a working set.
202
- *
203
- * @param target - FIRST set being accumulated.
204
- * @param symbols - Right-hand side sequence.
205
- * @param firstByNonTerminal - Precomputed FIRST sets.
206
- * @param nullable - Nullable non-terminal names.
207
- */
208
- static addFirstOfSequence(target, symbols, firstByNonTerminal, nullable) {
209
- GrammarAnalysis.addAll(target, GrammarAnalysis.firstOfSequenceStatic(symbols, firstByNonTerminal, nullable));
210
- }
211
- /**
212
- * Returns FIRST symbols for a symbol sequence using precomputed maps.
213
- *
214
- * @param symbols - Right-hand side sequence.
215
- * @param firstByNonTerminal - Precomputed FIRST sets.
216
- * @param nullable - Nullable non-terminal names.
217
- */
218
- static firstOfSequenceStatic(symbols, firstByNonTerminal, nullable) {
219
- const result = new Set();
220
- let allNullable = true;
221
- for (const symbol of symbols) {
222
- if (symbol.kind === 'nonTerminal') {
223
- GrammarAnalysis.addAll(result, firstByNonTerminal.get(symbol.name) ?? new Set());
224
- if (!nullable.has(symbol.name)) {
225
- allNullable = false;
226
- break;
227
- }
228
- }
229
- else {
230
- result.add((0, bnf_symbol_js_1.bnfParserSymbolKey)(symbol));
231
- allNullable = false;
232
- break;
233
- }
234
- }
235
- if (allNullable) {
236
- result.add(token_js_1.EOF_TOKEN_NAME);
237
- }
238
- return result;
239
- }
240
- /**
241
- * Returns whether every symbol in a sequence is nullable.
242
- *
243
- * @param symbols - Right-hand side sequence.
244
- * @param nullable - Nullable non-terminal names.
245
- */
246
- static isSequenceNullableStatic(symbols, nullable) {
247
- if (symbols.length === 0) {
248
- return true;
249
- }
250
- return symbols.every((symbol) => symbol.kind === 'nonTerminal' && nullable.has(symbol.name));
251
- }
252
- /**
253
- * Adds all members of `source` into `target`.
254
- *
255
- * @param target - Destination set.
256
- * @param source - Source set.
257
- */
258
- static addAll(target, source) {
259
- for (const value of source) {
260
- target.add(value);
261
- }
262
- }
263
- }
264
- exports.GrammarAnalysis = GrammarAnalysis;
265
- /**
266
- * Computes nullable, FIRST, and FOLLOW sets for a BNF grammar.
267
- *
268
- * @param grammar - Plain BNF grammar to analyze.
269
- * @returns Nullable, FIRST, and FOLLOW analysis for the grammar.
270
- */
271
- function analyzeGrammar(grammar) {
272
- return new GrammarAnalysis(grammar);
273
- }
274
- /**
275
- * Returns a readable production label for diagnostics and tests.
276
- *
277
- * @param production - Production to format.
278
- */
279
- function formatBnfProduction(production) {
280
- if (production.rhs.length === 0) {
281
- return `${production.name} → ε`;
282
- }
283
- const rhs = production.rhs.map((symbol) => (0, bnf_symbol_js_1.bnfSymbolKey)(symbol)).join(' ');
284
- return `${production.name} → ${rhs}`;
285
- }
286
- /**
287
- * Returns whether a grammar uses the augmented `$accept` start production.
288
- *
289
- * @param grammar - Grammar to inspect.
290
- */
291
- function isAugmentedGrammar(grammar) {
292
- return grammar.startSymbol === bnf_grammar_js_1.AUGMENTED_START_SYMBOL;
293
- }
294
- //# sourceMappingURL=first-follow.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"first-follow.js","sourceRoot":"","sources":["../../../../src/lib/parse-table/analysis/first-follow.ts"],"names":[],"mappings":"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"}
@@ -1,9 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.isAugmentedGrammar = exports.GrammarAnalysis = exports.formatBnfProduction = exports.analyzeGrammar = void 0;
4
- var first_follow_js_1 = require("./first-follow.js");
5
- Object.defineProperty(exports, "analyzeGrammar", { enumerable: true, get: function () { return first_follow_js_1.analyzeGrammar; } });
6
- Object.defineProperty(exports, "formatBnfProduction", { enumerable: true, get: function () { return first_follow_js_1.formatBnfProduction; } });
7
- Object.defineProperty(exports, "GrammarAnalysis", { enumerable: true, get: function () { return first_follow_js_1.GrammarAnalysis; } });
8
- Object.defineProperty(exports, "isAugmentedGrammar", { enumerable: true, get: function () { return first_follow_js_1.isAugmentedGrammar; } });
9
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/parse-table/analysis/index.ts"],"names":[],"mappings":";;;AAAA,qDAA6G;AAApG,iHAAA,cAAc,OAAA;AAAE,sHAAA,mBAAmB,OAAA;AAAE,kHAAA,eAAe,OAAA;AAAE,qHAAA,kBAAkB,OAAA"}
@@ -1,140 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.BnfGrammar = exports.AUGMENTED_START_SYMBOL = void 0;
4
- const bnf_symbol_js_1 = require("./bnf-symbol.js");
5
- /** Sentinel non-terminal introducing the augmented start production. */
6
- exports.AUGMENTED_START_SYMBOL = '$accept';
7
- /**
8
- * Plain BNF grammar used for LR table construction.
9
- */
10
- class BnfGrammar {
11
- startSymbol;
12
- productions;
13
- tokenNames;
14
- productionsByName;
15
- productionById;
16
- /**
17
- * Creates a BNF grammar from its productions and token inventory.
18
- *
19
- * @param startSymbol - Entry non-terminal from the source grammar.
20
- * @param productions - Flat BNF productions with stable ids.
21
- * @param tokenNames - Token rule names treated as terminals.
22
- */
23
- constructor(startSymbol, productions, tokenNames) {
24
- this.startSymbol = startSymbol;
25
- this.productions = productions;
26
- this.tokenNames = tokenNames;
27
- // Index productions by left-hand side name.
28
- const productionsByName = new Map();
29
- const productionById = new Map();
30
- for (const production of productions) {
31
- const existing = productionsByName.get(production.name) ?? [];
32
- existing.push(production);
33
- productionsByName.set(production.name, existing);
34
- productionById.set(production.id, production);
35
- }
36
- this.productionsByName = productionsByName;
37
- this.productionById = productionById;
38
- }
39
- /**
40
- * Returns productions with a given left-hand side non-terminal.
41
- *
42
- * @param name - Non-terminal name to look up.
43
- */
44
- productionsFor(name) {
45
- return this.productionsByName.get(name) ?? [];
46
- }
47
- /**
48
- * Returns a production by its stable id.
49
- *
50
- * @param id - Production id assigned during desugaring.
51
- */
52
- production(id) {
53
- return this.productionById.get(id) ?? null;
54
- }
55
- /**
56
- * Whether a name is a declared token rule.
57
- *
58
- * @param name - Candidate token name.
59
- */
60
- isToken(name) {
61
- return this.tokenNames.includes(name);
62
- }
63
- /**
64
- * Returns every non-terminal name appearing in the grammar.
65
- */
66
- nonTerminalNames() {
67
- const names = new Set();
68
- for (const production of this.productions) {
69
- names.add(production.name);
70
- for (const symbol of production.rhs) {
71
- if (symbol.kind === 'nonTerminal') {
72
- names.add(symbol.name);
73
- }
74
- }
75
- }
76
- return [...names].sort();
77
- }
78
- /**
79
- * Returns every terminal key appearing on a production right-hand side.
80
- */
81
- terminalKeys() {
82
- const keys = new Set();
83
- for (const production of this.productions) {
84
- for (const symbol of production.rhs) {
85
- if (symbol.kind === 'terminal' || symbol.kind === 'token') {
86
- keys.add((0, bnf_symbol_js_1.bnfParserSymbolKey)(symbol));
87
- }
88
- }
89
- }
90
- return [...keys].sort();
91
- }
92
- /**
93
- * Builds an augmented grammar with `$accept → startSymbol`.
94
- */
95
- augment() {
96
- const acceptProduction = {
97
- id: this.productions.length,
98
- name: exports.AUGMENTED_START_SYMBOL,
99
- rhs: [
100
- {
101
- kind: 'nonTerminal',
102
- name: this.startSymbol,
103
- binding: null,
104
- },
105
- ],
106
- variant: null,
107
- origin: exports.AUGMENTED_START_SYMBOL,
108
- };
109
- return new BnfGrammar(exports.AUGMENTED_START_SYMBOL, [...this.productions, acceptProduction], this.tokenNames);
110
- }
111
- /**
112
- * Returns whether a symbol key is a shift symbol (terminal or token).
113
- *
114
- * @param key - Encoded symbol from {@link bnfSymbolKey}.
115
- */
116
- isTerminalKey(key) {
117
- if (key.startsWith('"') && key.endsWith('"')) {
118
- return true;
119
- }
120
- const bareName = key.includes(':') ? key.slice(key.indexOf(':') + 1) : key;
121
- return this.tokenNames.includes(bareName);
122
- }
123
- /**
124
- * Finds the BNF symbol matching an encoded terminal key on some production rhs.
125
- *
126
- * @param key - Encoded terminal key.
127
- */
128
- terminalSymbolForKey(key) {
129
- for (const production of this.productions) {
130
- for (const symbol of production.rhs) {
131
- if (symbol.kind !== 'nonTerminal' && (0, bnf_symbol_js_1.bnfParserSymbolKey)(symbol) === key) {
132
- return symbol;
133
- }
134
- }
135
- }
136
- return null;
137
- }
138
- }
139
- exports.BnfGrammar = BnfGrammar;
140
- //# sourceMappingURL=bnf-grammar.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bnf-grammar.js","sourceRoot":"","sources":["../../../../src/lib/parse-table/bnf/bnf-grammar.ts"],"names":[],"mappings":";;;AACA,mDAAmF;AAEnF,wEAAwE;AAC3D,QAAA,sBAAsB,GAAG,SAAS,CAAC;AAEhD;;GAEG;AACH,MAAa,UAAU;IAaC;IACA;IACA;IAbH,iBAAiB,CAAgD;IACjE,cAAc,CAAqC;IAEpE;;;;;;OAMG;IACH,YACoB,WAAmB,EACnB,WAAqC,EACrC,UAA6B;QAF7B,gBAAW,GAAX,WAAW,CAAQ;QACnB,gBAAW,GAAX,WAAW,CAA0B;QACrC,eAAU,GAAV,UAAU,CAAmB;QAG7C,4CAA4C;QAC5C,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAA2B,CAAC;QAC7D,MAAM,cAAc,GAAG,IAAI,GAAG,EAAyB,CAAC;QAExD,KAAK,MAAM,UAAU,IAAI,WAAW,EACpC,CAAC;YACG,MAAM,QAAQ,GAAG,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAC9D,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC1B,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YACjD,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;QAClD,CAAC;QAED,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;QAC3C,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;IACzC,CAAC;IAED;;;;OAIG;IACI,cAAc,CAAC,IAAY;QAE9B,OAAO,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAClD,CAAC;IAED;;;;OAIG;IACI,UAAU,CAAC,EAAU;QAExB,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC;IAC/C,CAAC;IAED;;;;OAIG;IACI,OAAO,CAAC,IAAY;QAEvB,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;IAED;;OAEG;IACI,gBAAgB;QAEnB,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;QAEhC,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,WAAW,EACzC,CAAC;YACG,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAE3B,KAAK,MAAM,MAAM,IAAI,UAAU,CAAC,GAAG,EACnC,CAAC;gBACG,IAAI,MAAM,CAAC,IAAI,KAAK,aAAa,EACjC,CAAC;oBACG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBAC3B,CAAC;YACL,CAAC;QACL,CAAC;QAED,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7B,CAAC;IAED;;OAEG;IACI,YAAY;QAEf,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAE/B,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,WAAW,EACzC,CAAC;YACG,KAAK,MAAM,MAAM,IAAI,UAAU,CAAC,GAAG,EACnC,CAAC;gBACG,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EACzD,CAAC;oBACG,IAAI,CAAC,GAAG,CAAC,IAAA,kCAAkB,EAAC,MAAM,CAAC,CAAC,CAAC;gBACzC,CAAC;YACL,CAAC;QACL,CAAC;QAED,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5B,CAAC;IAED;;OAEG;IACI,OAAO;QAEV,MAAM,gBAAgB,GAAkB;YACpC,EAAE,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM;YAC3B,IAAI,EAAE,8BAAsB;YAC5B,GAAG,EAAE;gBACD;oBACI,IAAI,EAAE,aAAa;oBACnB,IAAI,EAAE,IAAI,CAAC,WAAW;oBACtB,OAAO,EAAE,IAAI;iBAChB;aACJ;YACD,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,8BAAsB;SACjC,CAAC;QAEF,OAAO,IAAI,UAAU,CACjB,8BAAsB,EACtB,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,gBAAgB,CAAC,EACvC,IAAI,CAAC,UAAU,CAClB,CAAC;IACN,CAAC;IAED;;;;OAIG;IACI,aAAa,CAAC,GAAW;QAE5B,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAC5C,CAAC;YACG,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QAE3E,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAED;;;;OAIG;IACI,oBAAoB,CAAC,GAAW;QAEnC,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,WAAW,EACzC,CAAC;YACG,KAAK,MAAM,MAAM,IAAI,UAAU,CAAC,GAAG,EACnC,CAAC;gBACG,IAAI,MAAM,CAAC,IAAI,KAAK,aAAa,IAAI,IAAA,kCAAkB,EAAC,MAAM,CAAC,KAAK,GAAG,EACvE,CAAC;oBACG,OAAO,MAAM,CAAC;gBAClB,CAAC;YACL,CAAC;QACL,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ;AA3KD,gCA2KC"}
@@ -1,3 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=bnf-production.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bnf-production.js","sourceRoot":"","sources":["../../../../src/lib/parse-table/bnf/bnf-production.ts"],"names":[],"mappings":""}