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.
- package/README.md +39 -1
- package/bin/parser-lr.js +8373 -7960
- package/bin/parser-lr.js.map +1 -1
- package/dist/lib/grammar/grammar-json-path.d.ts +2 -0
- package/dist/lib/grammar/grammar-json-path.d.ts.map +1 -0
- package/dist/lib/grammar/grammar-json-path.esm.d.ts +5 -0
- package/dist/lib/grammar/grammar-json-path.esm.d.ts.map +1 -0
- package/dist/lib/grammar/grammar-json-path.esm.js +9 -0
- package/dist/lib/grammar/grammar-json-path.esm.js.map +1 -0
- package/dist/lib/grammar/grammar-json-path.js +2 -0
- package/dist/lib/grammar/grammar-json-path.js.map +1 -0
- package/dist/lib/grammar/index.d.ts +3 -0
- package/dist/lib/grammar/index.d.ts.map +1 -1
- package/dist/lib/grammar/index.js +2 -0
- package/dist/lib/grammar/index.js.map +1 -1
- package/dist/lib/grammar/meta-grammar-table.d.ts +12 -0
- package/dist/lib/grammar/meta-grammar-table.d.ts.map +1 -1
- package/dist/lib/grammar/meta-grammar-table.js +33 -3
- package/dist/lib/grammar/meta-grammar-table.js.map +1 -1
- package/dist/lib/grammar/table-validator.d.ts +26 -0
- package/dist/lib/grammar/table-validator.d.ts.map +1 -0
- package/dist/lib/grammar/table-validator.js +258 -0
- package/dist/lib/grammar/table-validator.js.map +1 -0
- package/dist/lib/index.d.ts +2 -0
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +1 -0
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/transform/cst-transformer.d.ts +14 -0
- package/dist/lib/transform/cst-transformer.d.ts.map +1 -1
- package/dist/lib/transform/cst-transformer.js +82 -11
- package/dist/lib/transform/cst-transformer.js.map +1 -1
- package/dist/lib/transform/grammar-fixture.d.ts +56 -0
- package/dist/lib/transform/grammar-fixture.d.ts.map +1 -0
- package/dist/lib/transform/grammar-fixture.js +101 -0
- package/dist/lib/transform/grammar-fixture.js.map +1 -0
- package/dist/lib-cjs/ast/ast-node.js +70 -0
- package/dist/lib-cjs/ast/ast-node.js.map +1 -0
- package/dist/lib-cjs/errors/index.js +9 -0
- package/dist/lib-cjs/errors/index.js.map +1 -0
- package/dist/lib-cjs/errors/parser-lr-error.js +52 -0
- package/dist/lib-cjs/errors/parser-lr-error.js.map +1 -0
- package/dist/lib-cjs/grammar/ast-schema.js +43 -0
- package/dist/lib-cjs/grammar/ast-schema.js.map +1 -0
- package/dist/lib-cjs/grammar/ast-type.js +3 -0
- package/dist/lib-cjs/grammar/ast-type.js.map +1 -0
- package/dist/lib-cjs/grammar/expression.js +3 -0
- package/dist/lib-cjs/grammar/expression.js.map +1 -0
- package/dist/lib-cjs/grammar/grammar-from-cst.js +641 -0
- package/dist/lib-cjs/grammar/grammar-from-cst.js.map +1 -0
- package/dist/lib-cjs/grammar/grammar-json-path.js +13 -0
- package/dist/lib-cjs/grammar/grammar-json-path.js.map +1 -0
- package/dist/lib-cjs/grammar/grammar-literals.js +71 -0
- package/dist/lib-cjs/grammar/grammar-literals.js.map +1 -0
- package/dist/lib-cjs/grammar/grammar.js +64 -0
- package/dist/lib-cjs/grammar/grammar.js.map +1 -0
- package/dist/lib-cjs/grammar/grammar.json +5760 -0
- package/dist/lib-cjs/grammar/index.js +21 -0
- package/dist/lib-cjs/grammar/index.js.map +1 -0
- package/dist/lib-cjs/grammar/meta-grammar-table.js +68 -0
- package/dist/lib-cjs/grammar/meta-grammar-table.js.map +1 -0
- package/dist/lib-cjs/grammar/production.js +3 -0
- package/dist/lib-cjs/grammar/production.js.map +1 -0
- package/dist/lib-cjs/grammar/read-grammar-error.js +22 -0
- package/dist/lib-cjs/grammar/read-grammar-error.js.map +1 -0
- package/dist/lib-cjs/grammar/read-grammar.js +24 -0
- package/dist/lib-cjs/grammar/read-grammar.js.map +1 -0
- package/dist/lib-cjs/grammar/table-validator.js +262 -0
- package/dist/lib-cjs/grammar/table-validator.js.map +1 -0
- package/dist/lib-cjs/grammar/token-rule.js +3 -0
- package/dist/lib-cjs/grammar/token-rule.js.map +1 -0
- package/dist/lib-cjs/grammar/transform-expression.js +3 -0
- package/dist/lib-cjs/grammar/transform-expression.js.map +1 -0
- package/dist/lib-cjs/grammar/transform-rule.js +3 -0
- package/dist/lib-cjs/grammar/transform-rule.js.map +1 -0
- package/dist/lib-cjs/grammar/transform-schema.js +43 -0
- package/dist/lib-cjs/grammar/transform-schema.js.map +1 -0
- package/dist/lib-cjs/index.js +66 -0
- package/dist/lib-cjs/index.js.map +1 -0
- package/dist/lib-cjs/lexer/index.js +32 -0
- package/dist/lib-cjs/lexer/index.js.map +1 -0
- package/dist/lib-cjs/lexer/lexer-compile-error.js +22 -0
- package/dist/lib-cjs/lexer/lexer-compile-error.js.map +1 -0
- package/dist/lib-cjs/lexer/lexer-compile.js +201 -0
- package/dist/lib-cjs/lexer/lexer-compile.js.map +1 -0
- package/dist/lib-cjs/lexer/lexer-error.js +22 -0
- package/dist/lib-cjs/lexer/lexer-error.js.map +1 -0
- package/dist/lib-cjs/lexer/lexer-input-error.js +17 -0
- package/dist/lib-cjs/lexer/lexer-input-error.js.map +1 -0
- package/dist/lib-cjs/lexer/lexer-state-error.js +19 -0
- package/dist/lib-cjs/lexer/lexer-state-error.js.map +1 -0
- package/dist/lib-cjs/lexer/lexer.js +278 -0
- package/dist/lib-cjs/lexer/lexer.js.map +1 -0
- package/dist/lib-cjs/lexer/token.js +44 -0
- package/dist/lib-cjs/lexer/token.js.map +1 -0
- package/dist/lib-cjs/package.json +3 -0
- package/dist/lib-cjs/parse-context-error.js +19 -0
- package/dist/lib-cjs/parse-context-error.js.map +1 -0
- package/dist/lib-cjs/parse-context.js +137 -0
- package/dist/lib-cjs/parse-context.js.map +1 -0
- package/dist/lib-cjs/parse-output-error.js +19 -0
- package/dist/lib-cjs/parse-output-error.js.map +1 -0
- package/dist/lib-cjs/parse-output.js +18 -0
- package/dist/lib-cjs/parse-output.js.map +1 -0
- package/dist/lib-cjs/parse-table/analysis/first-follow.js +294 -0
- package/dist/lib-cjs/parse-table/analysis/first-follow.js.map +1 -0
- package/dist/lib-cjs/parse-table/analysis/index.js +9 -0
- package/dist/lib-cjs/parse-table/analysis/index.js.map +1 -0
- package/dist/lib-cjs/parse-table/bnf/bnf-grammar.js +140 -0
- package/dist/lib-cjs/parse-table/bnf/bnf-grammar.js.map +1 -0
- package/dist/lib-cjs/parse-table/bnf/bnf-production.js +3 -0
- package/dist/lib-cjs/parse-table/bnf/bnf-production.js.map +1 -0
- package/dist/lib-cjs/parse-table/bnf/bnf-symbol.js +39 -0
- package/dist/lib-cjs/parse-table/bnf/bnf-symbol.js.map +1 -0
- package/dist/lib-cjs/parse-table/bnf/desugar-ebnf.js +224 -0
- package/dist/lib-cjs/parse-table/bnf/desugar-ebnf.js.map +1 -0
- package/dist/lib-cjs/parse-table/bnf/index.js +13 -0
- package/dist/lib-cjs/parse-table/bnf/index.js.map +1 -0
- package/dist/lib-cjs/parse-table/build-lr-table.js +171 -0
- package/dist/lib-cjs/parse-table/build-lr-table.js.map +1 -0
- package/dist/lib-cjs/parse-table/index.js +49 -0
- package/dist/lib-cjs/parse-table/index.js.map +1 -0
- package/dist/lib-cjs/parse-table/lr-algorithm-error.js +19 -0
- package/dist/lib-cjs/parse-table/lr-algorithm-error.js.map +1 -0
- package/dist/lib-cjs/parse-table/lr-algorithm.js +31 -0
- package/dist/lib-cjs/parse-table/lr-algorithm.js.map +1 -0
- package/dist/lib-cjs/parse-table/lr0/index.js +14 -0
- package/dist/lib-cjs/parse-table/lr0/index.js.map +1 -0
- package/dist/lib-cjs/parse-table/lr0/lr0-item-set.js +286 -0
- package/dist/lib-cjs/parse-table/lr0/lr0-item-set.js.map +1 -0
- package/dist/lib-cjs/parse-table/lr1/index.js +18 -0
- package/dist/lib-cjs/parse-table/lr1/index.js.map +1 -0
- package/dist/lib-cjs/parse-table/lr1/lr1-item-set.js +432 -0
- package/dist/lib-cjs/parse-table/lr1/lr1-item-set.js.map +1 -0
- package/dist/lib-cjs/parse-table/parse-table-build-error.js +24 -0
- package/dist/lib-cjs/parse-table/parse-table-build-error.js.map +1 -0
- package/dist/lib-cjs/parse-table/parse-table-error.js +19 -0
- package/dist/lib-cjs/parse-table/parse-table-error.js.map +1 -0
- package/dist/lib-cjs/parse-table/parse-table-json.js +12 -0
- package/dist/lib-cjs/parse-table/parse-table-json.js.map +1 -0
- package/dist/lib-cjs/parse-table/parse-table.js +345 -0
- package/dist/lib-cjs/parse-table/parse-table.js.map +1 -0
- package/dist/lib-cjs/parse-table/slr/index.js +13 -0
- package/dist/lib-cjs/parse-table/slr/index.js.map +1 -0
- package/dist/lib-cjs/parse-table/slr/parse-action.js +8 -0
- package/dist/lib-cjs/parse-table/slr/parse-action.js.map +1 -0
- package/dist/lib-cjs/parse-table/slr/slr-table.js +18 -0
- package/dist/lib-cjs/parse-table/slr/slr-table.js.map +1 -0
- package/dist/lib-cjs/parse-table/table/index.js +21 -0
- package/dist/lib-cjs/parse-table/table/index.js.map +1 -0
- package/dist/lib-cjs/parse-table/table/lr-parse-table.js +192 -0
- package/dist/lib-cjs/parse-table/table/lr-parse-table.js.map +1 -0
- package/dist/lib-cjs/parse-table/table/parse-action.js +54 -0
- package/dist/lib-cjs/parse-table/table/parse-action.js.map +1 -0
- package/dist/lib-cjs/parse-table/table/table-builder-base.js +153 -0
- package/dist/lib-cjs/parse-table/table/table-builder-base.js.map +1 -0
- package/dist/lib-cjs/parse-table/token-inventory.js +18 -0
- package/dist/lib-cjs/parse-table/token-inventory.js.map +1 -0
- package/dist/lib-cjs/parser-lr.js +143 -0
- package/dist/lib-cjs/parser-lr.js.map +1 -0
- package/dist/lib-cjs/shift-reduce/index.js +11 -0
- package/dist/lib-cjs/shift-reduce/index.js.map +1 -0
- package/dist/lib-cjs/shift-reduce/shift-reduce-engine.js +224 -0
- package/dist/lib-cjs/shift-reduce/shift-reduce-engine.js.map +1 -0
- package/dist/lib-cjs/transform/binding-map.js +82 -0
- package/dist/lib-cjs/transform/binding-map.js.map +1 -0
- package/dist/lib-cjs/transform/cst-transformer.js +480 -0
- package/dist/lib-cjs/transform/cst-transformer.js.map +1 -0
- package/dist/lib-cjs/transform/grammar-fixture.js +109 -0
- package/dist/lib-cjs/transform/grammar-fixture.js.map +1 -0
- package/dist/lib-cjs/transform/index.js +12 -0
- package/dist/lib-cjs/transform/index.js.map +1 -0
- package/docs/grammar.md +113 -0
- package/docs/parser-lr-enhancement-proposals.md +337 -0
- package/grammars/6502.grammar +233 -0
- package/grammars/calc.grammar +30 -0
- package/grammars/ferrite.grammar +991 -0
- package/grammars/fixtures/build-optional/build-optional.grammar +32 -0
- package/grammars/fixtures/build-optional/input.txt +1 -0
- package/grammars/fixtures/comparison-op/comparison-op.grammar +28 -0
- package/grammars/fixtures/comparison-op/input.txt +1 -0
- package/grammars/fixtures/flatten-repeat/flatten-repeat.grammar +28 -0
- package/grammars/fixtures/flatten-repeat/input.txt +1 -0
- package/grammars/fixtures/help-topic/help-topic.grammar +28 -0
- package/grammars/fixtures/help-topic/input.txt +1 -0
- package/grammars/fixtures/let-target/input.txt +1 -0
- package/grammars/fixtures/let-target/let-target.grammar +33 -0
- package/grammars/fixtures/nested-production-repro/input.txt +1 -0
- package/grammars/fixtures/nested-production-repro/nested-production-repro.grammar +26 -0
- package/grammars/fixtures/pass-preserves-production/bare-terminal/bare-terminal.grammar +24 -0
- package/grammars/fixtures/pass-preserves-production/bare-terminal/input.txt +1 -0
- package/grammars/fixtures/pass-preserves-production/labeled-variant/input-end-if.txt +1 -0
- package/grammars/fixtures/pass-preserves-production/labeled-variant/input-end.txt +1 -0
- package/grammars/fixtures/pass-preserves-production/labeled-variant/labeled-variant.grammar +24 -0
- package/grammars/fixtures/pass-preserves-production/optional-absent/input.txt +1 -0
- package/grammars/fixtures/pass-preserves-production/optional-absent/optional-absent.grammar +24 -0
- package/grammars/fixtures/pass-preserves-production/optional-present/input.txt +1 -0
- package/grammars/fixtures/pass-preserves-production/optional-present/optional-present.grammar +24 -0
- package/grammars/fixtures/table-only-import/calc.table.json +190 -0
- package/grammars/fixtures/table-only-import/table-only-smoke.cjs +38 -0
- package/grammars/fixtures/table-only-import/table-only-smoke.mjs +18 -0
- package/grammars/grammar.grammar +428 -0
- package/grammars/lisp.grammar +95 -0
- package/package.json +10 -4
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.bnfSymbolKey = bnfSymbolKey;
|
|
4
|
+
exports.bnfParserSymbolKey = bnfParserSymbolKey;
|
|
5
|
+
/**
|
|
6
|
+
* Returns a stable string key for a BNF symbol, including binding metadata.
|
|
7
|
+
*
|
|
8
|
+
* @param symbol - Symbol to encode.
|
|
9
|
+
*/
|
|
10
|
+
function bnfSymbolKey(symbol) {
|
|
11
|
+
switch (symbol.kind) {
|
|
12
|
+
case 'terminal':
|
|
13
|
+
return `"${symbol.value}"`;
|
|
14
|
+
case 'nonTerminal':
|
|
15
|
+
return symbol.binding === null
|
|
16
|
+
? symbol.name
|
|
17
|
+
: `[${symbol.binding}]:${symbol.name}`;
|
|
18
|
+
case 'token':
|
|
19
|
+
return symbol.binding === null
|
|
20
|
+
? symbol.name
|
|
21
|
+
: `[${symbol.binding}]:${symbol.name}`;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Returns the parser symbol key used in ACTION and GOTO tables.
|
|
26
|
+
*
|
|
27
|
+
* @param symbol - Symbol to encode.
|
|
28
|
+
*/
|
|
29
|
+
function bnfParserSymbolKey(symbol) {
|
|
30
|
+
switch (symbol.kind) {
|
|
31
|
+
case 'terminal':
|
|
32
|
+
return `"${symbol.value}"`;
|
|
33
|
+
case 'nonTerminal':
|
|
34
|
+
return symbol.name;
|
|
35
|
+
case 'token':
|
|
36
|
+
return symbol.name;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=bnf-symbol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bnf-symbol.js","sourceRoot":"","sources":["../../../../src/lib/parse-table/bnf/bnf-symbol.ts"],"names":[],"mappings":";;AAuCA,oCAiBC;AAOD,gDAaC;AA1CD;;;;GAIG;AACH,SAAgB,YAAY,CAAC,MAAiB;IAE1C,QAAQ,MAAM,CAAC,IAAI,EACnB,CAAC;QACG,KAAK,UAAU;YACX,OAAO,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC;QAE/B,KAAK,aAAa;YACd,OAAO,MAAM,CAAC,OAAO,KAAK,IAAI;gBAC1B,CAAC,CAAC,MAAM,CAAC,IAAI;gBACb,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC;QAE/C,KAAK,OAAO;YACR,OAAO,MAAM,CAAC,OAAO,KAAK,IAAI;gBAC1B,CAAC,CAAC,MAAM,CAAC,IAAI;gBACb,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC;IACnD,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,SAAgB,kBAAkB,CAAC,MAAiB;IAEhD,QAAQ,MAAM,CAAC,IAAI,EACnB,CAAC;QACG,KAAK,UAAU;YACX,OAAO,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC;QAE/B,KAAK,aAAa;YACd,OAAO,MAAM,CAAC,IAAI,CAAC;QAEvB,KAAK,OAAO;YACR,OAAO,MAAM,CAAC,IAAI,CAAC;IAC3B,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EbnfDesugarer = void 0;
|
|
4
|
+
exports.desugarEbnf = desugarEbnf;
|
|
5
|
+
const bnf_grammar_js_1 = require("./bnf-grammar.js");
|
|
6
|
+
const token_inventory_js_1 = require("../token-inventory.js");
|
|
7
|
+
/**
|
|
8
|
+
* Expands EBNF productions into plain BNF suitable for LR analysis.
|
|
9
|
+
*/
|
|
10
|
+
class EbnfDesugarer {
|
|
11
|
+
grammar;
|
|
12
|
+
tokenNames;
|
|
13
|
+
productions = [];
|
|
14
|
+
nextProductionId = 0;
|
|
15
|
+
nextSyntheticId = 0;
|
|
16
|
+
/**
|
|
17
|
+
* Creates a desugarer for a parsed grammar model.
|
|
18
|
+
*
|
|
19
|
+
* @param grammar - Parsed `.grammar` file model.
|
|
20
|
+
*/
|
|
21
|
+
constructor(grammar) {
|
|
22
|
+
this.grammar = grammar;
|
|
23
|
+
this.tokenNames = (0, token_inventory_js_1.tokenInventory)(grammar);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Desugars all parser productions into a flat BNF grammar.
|
|
27
|
+
*
|
|
28
|
+
* @returns Plain BNF grammar with synthetic non-terminals for EBNF constructs.
|
|
29
|
+
*/
|
|
30
|
+
desugar() {
|
|
31
|
+
// Expand each declared production into one or more BNF productions.
|
|
32
|
+
for (const production of this.grammar.productions) {
|
|
33
|
+
this.desugarProduction(production);
|
|
34
|
+
}
|
|
35
|
+
return new bnf_grammar_js_1.BnfGrammar(this.grammar.startSymbol, this.productions, this.tokenNames);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Expands one named production into plain BNF alternatives.
|
|
39
|
+
*
|
|
40
|
+
* @param production - Source production from the grammar model.
|
|
41
|
+
*/
|
|
42
|
+
desugarProduction(production) {
|
|
43
|
+
const alternatives = this.expandExpression(production.name, production.expression, null);
|
|
44
|
+
// Record one BNF production per desugared alternative.
|
|
45
|
+
for (const alternative of alternatives) {
|
|
46
|
+
this.addProduction(production.name, alternative.symbols, alternative.variant, production.name);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Records one BNF production with the next stable id.
|
|
51
|
+
*
|
|
52
|
+
* @param name - Left-hand side non-terminal.
|
|
53
|
+
* @param rhs - Right-hand side symbol sequence; empty for epsilon.
|
|
54
|
+
* @param variant - Choice label preserved from the source grammar, if any.
|
|
55
|
+
* @param origin - Source production or synthetic construct name.
|
|
56
|
+
*/
|
|
57
|
+
addProduction(name, rhs, variant, origin) {
|
|
58
|
+
this.productions.push({
|
|
59
|
+
id: this.nextProductionId,
|
|
60
|
+
name,
|
|
61
|
+
rhs,
|
|
62
|
+
variant,
|
|
63
|
+
origin,
|
|
64
|
+
});
|
|
65
|
+
this.nextProductionId += 1;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Allocates a fresh synthetic non-terminal name scoped to a source production.
|
|
69
|
+
*
|
|
70
|
+
* @param ownerName - Production currently being expanded.
|
|
71
|
+
* @param suffix - Synthetic construct kind.
|
|
72
|
+
*/
|
|
73
|
+
freshName(ownerName, suffix) {
|
|
74
|
+
const syntheticName = `${ownerName}$${suffix}_${this.nextSyntheticId}`;
|
|
75
|
+
this.nextSyntheticId += 1;
|
|
76
|
+
return syntheticName;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Expands an EBNF expression into zero or more BNF right-hand sides.
|
|
80
|
+
*
|
|
81
|
+
* @param ownerName - Production providing scope for synthetic non-terminals.
|
|
82
|
+
* @param expression - EBNF expression subtree.
|
|
83
|
+
* @param variant - Choice label inherited from an outer alternative.
|
|
84
|
+
*/
|
|
85
|
+
expandExpression(ownerName, expression, variant) {
|
|
86
|
+
switch (expression.kind) {
|
|
87
|
+
case 'reference':
|
|
88
|
+
return [{
|
|
89
|
+
symbols: [this.resolveReference(null, expression.name)],
|
|
90
|
+
variant,
|
|
91
|
+
}];
|
|
92
|
+
case 'boundReference':
|
|
93
|
+
return [{
|
|
94
|
+
symbols: [this.resolveReference(expression.binding, expression.name)],
|
|
95
|
+
variant,
|
|
96
|
+
}];
|
|
97
|
+
case 'terminal':
|
|
98
|
+
return [{
|
|
99
|
+
symbols: [{ kind: 'terminal', value: expression.value }],
|
|
100
|
+
variant,
|
|
101
|
+
}];
|
|
102
|
+
case 'sequence':
|
|
103
|
+
return this.expandSequence(ownerName, expression.elements, variant);
|
|
104
|
+
case 'choice':
|
|
105
|
+
return expression.alternatives.flatMap((alternative) => this.expandExpression(ownerName, alternative.expression, alternative.label ?? variant));
|
|
106
|
+
case 'optional':
|
|
107
|
+
return this.expandOptional(ownerName, expression.element, variant);
|
|
108
|
+
case 'repeat':
|
|
109
|
+
return this.expandRepeat(ownerName, expression.element, variant);
|
|
110
|
+
case 'group':
|
|
111
|
+
return this.expandExpression(ownerName, expression.element, variant);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Expands a concatenated sequence by combining element alternatives.
|
|
116
|
+
*
|
|
117
|
+
* @param elements - Sequence members in source order.
|
|
118
|
+
* @param variant - Choice label inherited from an outer alternative.
|
|
119
|
+
*/
|
|
120
|
+
expandSequence(ownerName, elements, variant) {
|
|
121
|
+
let results = [{ symbols: [], variant }];
|
|
122
|
+
// Cartesian product: combine each prefix alternative with each next-element alternative.
|
|
123
|
+
for (const element of elements) {
|
|
124
|
+
const elementAlternatives = this.expandExpression(ownerName, element, variant);
|
|
125
|
+
const combined = [];
|
|
126
|
+
for (const left of results) {
|
|
127
|
+
for (const right of elementAlternatives) {
|
|
128
|
+
combined.push({
|
|
129
|
+
symbols: [...left.symbols, ...right.symbols],
|
|
130
|
+
variant: right.variant ?? left.variant,
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
results = combined;
|
|
135
|
+
}
|
|
136
|
+
return results;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Expands `[ element ]` into epsilon and the element expansion.
|
|
140
|
+
*
|
|
141
|
+
* @param element - Optional sub-expression.
|
|
142
|
+
* @param variant - Choice label inherited from an outer alternative.
|
|
143
|
+
*/
|
|
144
|
+
expandOptional(ownerName, element, variant) {
|
|
145
|
+
const inner = this.expandExpression(ownerName, element, variant);
|
|
146
|
+
return [
|
|
147
|
+
{ symbols: [], variant },
|
|
148
|
+
...inner,
|
|
149
|
+
];
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Expands `{ element }` using a fresh left-recursive list non-terminal.
|
|
153
|
+
*
|
|
154
|
+
* @param element - Repeated sub-expression.
|
|
155
|
+
* @param variant - Choice label inherited from an outer alternative.
|
|
156
|
+
*/
|
|
157
|
+
expandRepeat(ownerName, element, variant) {
|
|
158
|
+
const repeatName = this.freshName(ownerName, 'repeat');
|
|
159
|
+
const elementAlternatives = this.expandExpression(repeatName, element, null);
|
|
160
|
+
const repeatReference = this.nonTerminalSymbol(repeatName, null);
|
|
161
|
+
// Build `R → α R` for each expansion of the repeated element.
|
|
162
|
+
for (const alternative of elementAlternatives) {
|
|
163
|
+
this.addProduction(repeatName, [...alternative.symbols, repeatReference], alternative.variant, repeatName);
|
|
164
|
+
}
|
|
165
|
+
// Add the epsilon base case `R → ε`.
|
|
166
|
+
this.addProduction(repeatName, [], null, repeatName);
|
|
167
|
+
return [{
|
|
168
|
+
symbols: [repeatReference],
|
|
169
|
+
variant,
|
|
170
|
+
}];
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Builds a non-terminal symbol reference.
|
|
174
|
+
*
|
|
175
|
+
* @param name - Referenced production name.
|
|
176
|
+
* @param binding - Optional slot binding from the source grammar.
|
|
177
|
+
*/
|
|
178
|
+
nonTerminalSymbol(name, binding) {
|
|
179
|
+
return {
|
|
180
|
+
kind: 'nonTerminal',
|
|
181
|
+
name,
|
|
182
|
+
binding,
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Builds a token symbol reference.
|
|
187
|
+
*
|
|
188
|
+
* @param name - Referenced token rule name.
|
|
189
|
+
* @param binding - Optional slot binding from the source grammar.
|
|
190
|
+
*/
|
|
191
|
+
tokenSymbol(name, binding) {
|
|
192
|
+
return {
|
|
193
|
+
kind: 'token',
|
|
194
|
+
name,
|
|
195
|
+
binding,
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Resolves a bound or unbound reference to a token or non-terminal symbol.
|
|
200
|
+
*
|
|
201
|
+
* @param binding - Slot binding, or null for an unbound reference.
|
|
202
|
+
* @param name - Referenced symbol name.
|
|
203
|
+
*/
|
|
204
|
+
resolveReference(binding, name) {
|
|
205
|
+
if (this.grammar.hasProduction(name)) {
|
|
206
|
+
return this.nonTerminalSymbol(name, binding);
|
|
207
|
+
}
|
|
208
|
+
if (this.tokenNames.includes(name)) {
|
|
209
|
+
return this.tokenSymbol(name, binding);
|
|
210
|
+
}
|
|
211
|
+
return this.nonTerminalSymbol(name, binding);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
exports.EbnfDesugarer = EbnfDesugarer;
|
|
215
|
+
/**
|
|
216
|
+
* Desugars a parsed grammar into plain BNF for LR table construction.
|
|
217
|
+
*
|
|
218
|
+
* @param grammar - Parsed `.grammar` file model.
|
|
219
|
+
* @returns Flat BNF grammar with synthetic non-terminals for EBNF constructs.
|
|
220
|
+
*/
|
|
221
|
+
function desugarEbnf(grammar) {
|
|
222
|
+
return new EbnfDesugarer(grammar).desugar();
|
|
223
|
+
}
|
|
224
|
+
//# sourceMappingURL=desugar-ebnf.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"desugar-ebnf.js","sourceRoot":"","sources":["../../../../src/lib/parse-table/bnf/desugar-ebnf.ts"],"names":[],"mappings":";;;AAyUA,kCAGC;AAxUD,qDAA8C;AAG9C,8DAAuD;AAcvD;;GAEG;AACH,MAAa,aAAa;IAEL,OAAO,CAAU;IACjB,UAAU,CAAoB;IAC9B,WAAW,GAAoB,EAAE,CAAC;IAC3C,gBAAgB,GAAG,CAAC,CAAC;IACrB,eAAe,GAAG,CAAC,CAAC;IAE5B;;;;OAIG;IACH,YAAmB,OAAgB;QAE/B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,UAAU,GAAG,IAAA,mCAAc,EAAC,OAAO,CAAC,CAAC;IAC9C,CAAC;IAED;;;;OAIG;IACI,OAAO;QAEV,oEAAoE;QACpE,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,EACjD,CAAC;YACG,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;QACvC,CAAC;QAED,OAAO,IAAI,2BAAU,CACjB,IAAI,CAAC,OAAO,CAAC,WAAW,EACxB,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,UAAU,CAClB,CAAC;IACN,CAAC;IAED;;;;OAIG;IACK,iBAAiB,CAAC,UAAsB;QAE5C,MAAM,YAAY,GAAG,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAEzF,uDAAuD;QACvD,KAAK,MAAM,WAAW,IAAI,YAAY,EACtC,CAAC;YACG,IAAI,CAAC,aAAa,CACd,UAAU,CAAC,IAAI,EACf,WAAW,CAAC,OAAO,EACnB,WAAW,CAAC,OAAO,EACnB,UAAU,CAAC,IAAI,CAClB,CAAC;QACN,CAAC;IACL,CAAC;IAED;;;;;;;OAOG;IACK,aAAa,CACjB,IAAY,EACZ,GAAyB,EACzB,OAAsB,EACtB,MAAc;QAGd,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;YAClB,EAAE,EAAE,IAAI,CAAC,gBAAgB;YACzB,IAAI;YACJ,GAAG;YACH,OAAO;YACP,MAAM;SACT,CAAC,CAAC;QACH,IAAI,CAAC,gBAAgB,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED;;;;;OAKG;IACK,SAAS,CAAC,SAAiB,EAAE,MAAc;QAE/C,MAAM,aAAa,GAAG,GAAG,SAAS,IAAI,MAAM,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;QACvE,IAAI,CAAC,eAAe,IAAI,CAAC,CAAC;QAE1B,OAAO,aAAa,CAAC;IACzB,CAAC;IAED;;;;;;OAMG;IACK,gBAAgB,CACpB,SAAiB,EACjB,UAAsB,EACtB,OAAsB;QAGtB,QAAQ,UAAU,CAAC,IAAI,EACvB,CAAC;YACG,KAAK,WAAW;gBACZ,OAAO,CAAC;wBACJ,OAAO,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC;wBACvD,OAAO;qBACV,CAAC,CAAC;YAEP,KAAK,gBAAgB;gBACjB,OAAO,CAAC;wBACJ,OAAO,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC;wBACrE,OAAO;qBACV,CAAC,CAAC;YAEP,KAAK,UAAU;gBACX,OAAO,CAAC;wBACJ,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,CAAC;wBACxD,OAAO;qBACV,CAAC,CAAC;YAEP,KAAK,UAAU;gBACX,OAAO,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAExE,KAAK,QAAQ;gBACT,OAAO,UAAU,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE,CACnD,IAAI,CAAC,gBAAgB,CACjB,SAAS,EACT,WAAW,CAAC,UAAU,EACtB,WAAW,CAAC,KAAK,IAAI,OAAO,CAC/B,CAAC,CAAC;YAEX,KAAK,UAAU;gBACX,OAAO,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAEvE,KAAK,QAAQ;gBACT,OAAO,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAErE,KAAK,OAAO;gBACR,OAAO,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC7E,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACK,cAAc,CAClB,SAAiB,EACjB,QAA+B,EAC/B,OAAsB;QAGtB,IAAI,OAAO,GAAyB,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QAE/D,yFAAyF;QACzF,KAAK,MAAM,OAAO,IAAI,QAAQ,EAC9B,CAAC;YACG,MAAM,mBAAmB,GAAG,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YAC/E,MAAM,QAAQ,GAAyB,EAAE,CAAC;YAE1C,KAAK,MAAM,IAAI,IAAI,OAAO,EAC1B,CAAC;gBACG,KAAK,MAAM,KAAK,IAAI,mBAAmB,EACvC,CAAC;oBACG,QAAQ,CAAC,IAAI,CAAC;wBACV,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC;wBAC5C,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO;qBACzC,CAAC,CAAC;gBACP,CAAC;YACL,CAAC;YAED,OAAO,GAAG,QAAQ,CAAC;QACvB,CAAC;QAED,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;;;;OAKG;IACK,cAAc,CAClB,SAAiB,EACjB,OAAmB,EACnB,OAAsB;QAGtB,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAEjE,OAAO;YACH,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE;YACxB,GAAG,KAAK;SACX,CAAC;IACN,CAAC;IAED;;;;;OAKG;IACK,YAAY,CAChB,SAAiB,EACjB,OAAmB,EACnB,OAAsB;QAGtB,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QACvD,MAAM,mBAAmB,GAAG,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAC7E,MAAM,eAAe,GAAG,IAAI,CAAC,iBAAiB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAEjE,8DAA8D;QAC9D,KAAK,MAAM,WAAW,IAAI,mBAAmB,EAC7C,CAAC;YACG,IAAI,CAAC,aAAa,CACd,UAAU,EACV,CAAC,GAAG,WAAW,CAAC,OAAO,EAAE,eAAe,CAAC,EACzC,WAAW,CAAC,OAAO,EACnB,UAAU,CACb,CAAC;QACN,CAAC;QAED,qCAAqC;QACrC,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;QAErD,OAAO,CAAC;gBACJ,OAAO,EAAE,CAAC,eAAe,CAAC;gBAC1B,OAAO;aACV,CAAC,CAAC;IACP,CAAC;IAED;;;;;OAKG;IACK,iBAAiB,CAAC,IAAY,EAAE,OAAsB;QAE1D,OAAO;YACH,IAAI,EAAE,aAAa;YACnB,IAAI;YACJ,OAAO;SACV,CAAC;IACN,CAAC;IAED;;;;;OAKG;IACK,WAAW,CAAC,IAAY,EAAE,OAAsB;QAEpD,OAAO;YACH,IAAI,EAAE,OAAO;YACb,IAAI;YACJ,OAAO;SACV,CAAC;IACN,CAAC;IAED;;;;;OAKG;IACK,gBAAgB,CAAC,OAAsB,EAAE,IAAY;QAEzD,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,EACpC,CAAC;YACG,OAAO,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACjD,CAAC;QAED,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,EAClC,CAAC;YACG,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC3C,CAAC;QAED,OAAO,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACjD,CAAC;CACJ;AAzSD,sCAySC;AAED;;;;;GAKG;AACH,SAAgB,WAAW,CAAC,OAAgB;IAExC,OAAO,IAAI,aAAa,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC;AAChD,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EbnfDesugarer = exports.desugarEbnf = exports.BnfGrammar = exports.AUGMENTED_START_SYMBOL = exports.bnfSymbolKey = exports.bnfParserSymbolKey = void 0;
|
|
4
|
+
var bnf_symbol_js_1 = require("./bnf-symbol.js");
|
|
5
|
+
Object.defineProperty(exports, "bnfParserSymbolKey", { enumerable: true, get: function () { return bnf_symbol_js_1.bnfParserSymbolKey; } });
|
|
6
|
+
Object.defineProperty(exports, "bnfSymbolKey", { enumerable: true, get: function () { return bnf_symbol_js_1.bnfSymbolKey; } });
|
|
7
|
+
var bnf_grammar_js_1 = require("./bnf-grammar.js");
|
|
8
|
+
Object.defineProperty(exports, "AUGMENTED_START_SYMBOL", { enumerable: true, get: function () { return bnf_grammar_js_1.AUGMENTED_START_SYMBOL; } });
|
|
9
|
+
Object.defineProperty(exports, "BnfGrammar", { enumerable: true, get: function () { return bnf_grammar_js_1.BnfGrammar; } });
|
|
10
|
+
var desugar_ebnf_js_1 = require("./desugar-ebnf.js");
|
|
11
|
+
Object.defineProperty(exports, "desugarEbnf", { enumerable: true, get: function () { return desugar_ebnf_js_1.desugarEbnf; } });
|
|
12
|
+
Object.defineProperty(exports, "EbnfDesugarer", { enumerable: true, get: function () { return desugar_ebnf_js_1.EbnfDesugarer; } });
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/parse-table/bnf/index.ts"],"names":[],"mappings":";;;AAAA,iDAAmE;AAA1D,mHAAA,kBAAkB,OAAA;AAAE,6GAAA,YAAY,OAAA;AAQzC,mDAAsE;AAA7D,wHAAA,sBAAsB,OAAA;AAAE,4GAAA,UAAU,OAAA;AAC3C,qDAA+D;AAAtD,8GAAA,WAAW,OAAA;AAAE,gHAAA,aAAa,OAAA"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildLrTable = buildLrTable;
|
|
4
|
+
const token_js_1 = require("../lexer/token.js");
|
|
5
|
+
const first_follow_js_1 = require("./analysis/first-follow.js");
|
|
6
|
+
const bnf_grammar_js_1 = require("./bnf/bnf-grammar.js");
|
|
7
|
+
const lr0_item_set_js_1 = require("./lr0/lr0-item-set.js");
|
|
8
|
+
const lr1_item_set_js_1 = require("./lr1/lr1-item-set.js");
|
|
9
|
+
const lr_parse_table_js_1 = require("./table/lr-parse-table.js");
|
|
10
|
+
const table_builder_base_js_1 = require("./table/table-builder-base.js");
|
|
11
|
+
/**
|
|
12
|
+
* Builds an LR parse table for a plain BNF grammar.
|
|
13
|
+
*
|
|
14
|
+
* @param grammar - Plain BNF grammar to analyze.
|
|
15
|
+
* @param algorithm - LR table construction algorithm.
|
|
16
|
+
* @returns A populated LR parse table, possibly recording conflicts.
|
|
17
|
+
*/
|
|
18
|
+
function buildLrTable(grammar, algorithm) {
|
|
19
|
+
const augmented = grammar.augment();
|
|
20
|
+
const analysis = (0, first_follow_js_1.analyzeGrammar)(augmented);
|
|
21
|
+
switch (algorithm) {
|
|
22
|
+
case 'lr0':
|
|
23
|
+
return LrTableBuilder.buildLr0(augmented);
|
|
24
|
+
case 'slr':
|
|
25
|
+
return LrTableBuilder.buildSlr(augmented, analysis);
|
|
26
|
+
case 'lr1':
|
|
27
|
+
return LrTableBuilder.buildLr1(augmented, analysis);
|
|
28
|
+
case 'lalr':
|
|
29
|
+
return LrTableBuilder.buildLalr(augmented, analysis);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Builds LR parse tables for each supported algorithm.
|
|
34
|
+
*/
|
|
35
|
+
class LrTableBuilder {
|
|
36
|
+
/**
|
|
37
|
+
* Builds an LR(0) parse table.
|
|
38
|
+
*
|
|
39
|
+
* @param grammar - Augmented BNF grammar.
|
|
40
|
+
* @returns An LR(0) parse table using all terminals as reduce lookaheads.
|
|
41
|
+
*/
|
|
42
|
+
static buildLr0(grammar) {
|
|
43
|
+
const itemSets = (0, lr0_item_set_js_1.buildLr0ItemSets)(grammar);
|
|
44
|
+
const terminalKeys = grammar.terminalKeys().concat([token_js_1.EOF_TOKEN_NAME]);
|
|
45
|
+
return LrTableBuilder.buildFromLr0ItemSets('lr0', grammar, itemSets, (production) => {
|
|
46
|
+
if (production.name === bnf_grammar_js_1.AUGMENTED_START_SYMBOL) {
|
|
47
|
+
return [token_js_1.EOF_TOKEN_NAME];
|
|
48
|
+
}
|
|
49
|
+
return terminalKeys;
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Builds an SLR parse table.
|
|
54
|
+
*
|
|
55
|
+
* @param grammar - Augmented BNF grammar.
|
|
56
|
+
* @param analysis - Nullable, FIRST, and FOLLOW analysis for the grammar.
|
|
57
|
+
* @returns An SLR parse table using FOLLOW sets as reduce lookaheads.
|
|
58
|
+
*/
|
|
59
|
+
static buildSlr(grammar, analysis) {
|
|
60
|
+
const itemSets = (0, lr0_item_set_js_1.buildLr0ItemSets)(grammar);
|
|
61
|
+
return LrTableBuilder.buildFromLr0ItemSets('slr', grammar, itemSets, (production) => {
|
|
62
|
+
if (production.name === bnf_grammar_js_1.AUGMENTED_START_SYMBOL) {
|
|
63
|
+
return [token_js_1.EOF_TOKEN_NAME];
|
|
64
|
+
}
|
|
65
|
+
return [...analysis.followOfNonTerminal(production.name)];
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Builds an LR(1) parse table.
|
|
70
|
+
*
|
|
71
|
+
* @param grammar - Augmented BNF grammar.
|
|
72
|
+
* @param analysis - Nullable, FIRST, and FOLLOW analysis for the grammar.
|
|
73
|
+
* @returns An LR(1) parse table with per-item lookaheads.
|
|
74
|
+
*/
|
|
75
|
+
static buildLr1(grammar, analysis) {
|
|
76
|
+
const itemSets = (0, lr1_item_set_js_1.buildLr1ItemSets)(grammar, analysis, token_js_1.EOF_TOKEN_NAME);
|
|
77
|
+
return LrTableBuilder.buildFromLr1ItemSets('lr1', grammar, analysis, itemSets);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Builds an LALR parse table.
|
|
81
|
+
*
|
|
82
|
+
* @param grammar - Augmented BNF grammar.
|
|
83
|
+
* @param analysis - Nullable, FIRST, and FOLLOW analysis for the grammar.
|
|
84
|
+
* @returns An LALR parse table merged from the canonical LR(1) collection.
|
|
85
|
+
*/
|
|
86
|
+
static buildLalr(grammar, analysis) {
|
|
87
|
+
const lr1ItemSets = (0, lr1_item_set_js_1.buildLr1ItemSets)(grammar, analysis, token_js_1.EOF_TOKEN_NAME);
|
|
88
|
+
const lalrItemSets = (0, lr1_item_set_js_1.mergeLalrItemSets)(lr1ItemSets);
|
|
89
|
+
const lr1ToLalr = lr1_item_set_js_1.Lr1ItemSetBuilder.buildLr1ToLalrMap(lr1ItemSets, lalrItemSets);
|
|
90
|
+
const gotoTargets = (0, lr1_item_set_js_1.buildLalrGotoTargets)(grammar, analysis, lr1ItemSets, lr1ToLalr);
|
|
91
|
+
return LrTableBuilder.buildFromLr1ItemSets('lalr', grammar, analysis, lalrItemSets, gotoTargets);
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Builds a parse table from LR(0) item sets and a reduce-lookahead rule.
|
|
95
|
+
*
|
|
96
|
+
* @param algorithm - LR algorithm being constructed.
|
|
97
|
+
* @param grammar - Augmented BNF grammar.
|
|
98
|
+
* @param itemSets - Canonical LR(0) item set collection.
|
|
99
|
+
* @param reduceLookaheads - Returns terminal keys for one completed production.
|
|
100
|
+
* @returns A parse table with ACTION, GOTO, and any recorded conflicts.
|
|
101
|
+
*/
|
|
102
|
+
static buildFromLr0ItemSets(algorithm, grammar, itemSets, reduceLookaheads) {
|
|
103
|
+
const gotoTargets = table_builder_base_js_1.TableBuilderBase.buildGotoTargets(grammar, itemSets.itemSets, (items) => itemSets.indexOf(items), table_builder_base_js_1.TableBuilderBase.lr0GotoItems);
|
|
104
|
+
const actions = new Map();
|
|
105
|
+
const gotos = new Map();
|
|
106
|
+
const conflicts = [];
|
|
107
|
+
// Fill ACTION and GOTO rows for every LR(0) state.
|
|
108
|
+
for (let state = 0; state < itemSets.itemSets.length; state += 1) {
|
|
109
|
+
const itemSet = itemSets.itemSets[state] ?? [];
|
|
110
|
+
const stateActions = new Map();
|
|
111
|
+
const stateGotos = new Map();
|
|
112
|
+
actions.set(state, stateActions);
|
|
113
|
+
gotos.set(state, stateGotos);
|
|
114
|
+
table_builder_base_js_1.TableBuilderBase.fillShiftsAndGotos(grammar, state, itemSet, gotoTargets, stateActions, stateGotos, conflicts);
|
|
115
|
+
// Record reduce and accept actions for every completed item in the state.
|
|
116
|
+
for (const item of itemSet) {
|
|
117
|
+
const production = grammar.production(item.productionId);
|
|
118
|
+
if (production === null || item.dot !== production.rhs.length) {
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
table_builder_base_js_1.TableBuilderBase.setAcceptAction(state, production.name, stateActions, conflicts);
|
|
122
|
+
if (production.name === bnf_grammar_js_1.AUGMENTED_START_SYMBOL) {
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
for (const lookahead of reduceLookaheads(production)) {
|
|
126
|
+
table_builder_base_js_1.TableBuilderBase.setAction(stateActions, conflicts, state, lookahead, { kind: 'reduce', productionId: production.id });
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return new lr_parse_table_js_1.LrParseTable(algorithm, grammar, [...grammar.productions], itemSets.itemSets.length, actions, gotos, conflicts);
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Builds a parse table from LR(1) or merged LALR item sets.
|
|
134
|
+
*
|
|
135
|
+
* @param algorithm - LR algorithm being constructed.
|
|
136
|
+
* @param grammar - Augmented BNF grammar.
|
|
137
|
+
* @param itemSets - LR(1) or merged LALR item set collection used for ACTION/GOTO rows.
|
|
138
|
+
* @param lr1Collection - Canonical LR(1) collection used for LALR GOTO remapping.
|
|
139
|
+
* @param gotoTargetsOverride - Optional precomputed GOTO indices for LALR.
|
|
140
|
+
* @returns A parse table with ACTION, GOTO, and any recorded conflicts.
|
|
141
|
+
*/
|
|
142
|
+
static buildFromLr1ItemSets(algorithm, grammar, analysis, itemSets, gotoTargetsOverride) {
|
|
143
|
+
const gotoTargets = gotoTargetsOverride ?? table_builder_base_js_1.TableBuilderBase.buildGotoTargets(grammar, itemSets.itemSets, (items) => itemSets.indexOf(items), (grammarArg, items, symbolKey) => (0, lr1_item_set_js_1.lr1Goto)(grammarArg, analysis, items, symbolKey));
|
|
144
|
+
const actions = new Map();
|
|
145
|
+
const gotos = new Map();
|
|
146
|
+
const conflicts = [];
|
|
147
|
+
// Fill ACTION and GOTO rows for every LR(1) or merged LALR state.
|
|
148
|
+
for (let state = 0; state < itemSets.itemSets.length; state += 1) {
|
|
149
|
+
const itemSet = itemSets.itemSets[state] ?? [];
|
|
150
|
+
const stateActions = new Map();
|
|
151
|
+
const stateGotos = new Map();
|
|
152
|
+
actions.set(state, stateActions);
|
|
153
|
+
gotos.set(state, stateGotos);
|
|
154
|
+
table_builder_base_js_1.TableBuilderBase.fillShiftsAndGotos(grammar, state, itemSet, gotoTargets, stateActions, stateGotos, conflicts);
|
|
155
|
+
// Record reduce or accept for each completed item using its lookahead.
|
|
156
|
+
for (const item of itemSet) {
|
|
157
|
+
const production = grammar.production(item.productionId);
|
|
158
|
+
if (production === null || item.dot !== production.rhs.length) {
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
if (production.name === bnf_grammar_js_1.AUGMENTED_START_SYMBOL) {
|
|
162
|
+
table_builder_base_js_1.TableBuilderBase.setAction(stateActions, conflicts, state, item.lookahead, { kind: 'accept' });
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
table_builder_base_js_1.TableBuilderBase.setAction(stateActions, conflicts, state, item.lookahead, { kind: 'reduce', productionId: production.id });
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return new lr_parse_table_js_1.LrParseTable(algorithm, grammar, [...grammar.productions], itemSets.itemSets.length, actions, gotos, conflicts);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=build-lr-table.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-lr-table.js","sourceRoot":"","sources":["../../../src/lib/parse-table/build-lr-table.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ParseTable = exports.PARSE_TABLE_VERSION_FULL = exports.PARSE_TABLE_VERSION = exports.tokenInventory = exports.LrParseTable = exports.formatParseConflictWarning = exports.formatLrGotos = exports.formatLrConflicts = exports.formatLrConflictWarnings = exports.formatLrActions = exports.formatSlrConflicts = exports.formatSlrActions = exports.buildSlrTable = exports.isParseTableJsonV2 = exports.ParseTableError = exports.ParseTableBuildError = exports.LrAlgorithmError = exports.Lr1ItemSetCollection = exports.buildLr1ItemSets = exports.Lr0ItemSetCollection = exports.formatLr0ItemSet = exports.buildLr0ItemSets = exports.buildLrTable = exports.bnfSymbolKey = exports.BnfGrammar = exports.desugarEbnf = exports.GrammarAnalysis = exports.formatBnfProduction = exports.analyzeGrammar = exports.parseLrAlgorithm = exports.isLrAlgorithm = void 0;
|
|
4
|
+
var lr_algorithm_js_1 = require("./lr-algorithm.js");
|
|
5
|
+
Object.defineProperty(exports, "isLrAlgorithm", { enumerable: true, get: function () { return lr_algorithm_js_1.isLrAlgorithm; } });
|
|
6
|
+
Object.defineProperty(exports, "parseLrAlgorithm", { enumerable: true, get: function () { return lr_algorithm_js_1.parseLrAlgorithm; } });
|
|
7
|
+
var index_js_1 = require("./analysis/index.js");
|
|
8
|
+
Object.defineProperty(exports, "analyzeGrammar", { enumerable: true, get: function () { return index_js_1.analyzeGrammar; } });
|
|
9
|
+
Object.defineProperty(exports, "formatBnfProduction", { enumerable: true, get: function () { return index_js_1.formatBnfProduction; } });
|
|
10
|
+
Object.defineProperty(exports, "GrammarAnalysis", { enumerable: true, get: function () { return index_js_1.GrammarAnalysis; } });
|
|
11
|
+
var index_js_2 = require("./bnf/index.js");
|
|
12
|
+
Object.defineProperty(exports, "desugarEbnf", { enumerable: true, get: function () { return index_js_2.desugarEbnf; } });
|
|
13
|
+
Object.defineProperty(exports, "BnfGrammar", { enumerable: true, get: function () { return index_js_2.BnfGrammar; } });
|
|
14
|
+
Object.defineProperty(exports, "bnfSymbolKey", { enumerable: true, get: function () { return index_js_2.bnfSymbolKey; } });
|
|
15
|
+
var build_lr_table_js_1 = require("./build-lr-table.js");
|
|
16
|
+
Object.defineProperty(exports, "buildLrTable", { enumerable: true, get: function () { return build_lr_table_js_1.buildLrTable; } });
|
|
17
|
+
var index_js_3 = require("./lr0/index.js");
|
|
18
|
+
Object.defineProperty(exports, "buildLr0ItemSets", { enumerable: true, get: function () { return index_js_3.buildLr0ItemSets; } });
|
|
19
|
+
Object.defineProperty(exports, "formatLr0ItemSet", { enumerable: true, get: function () { return index_js_3.formatLr0ItemSet; } });
|
|
20
|
+
Object.defineProperty(exports, "Lr0ItemSetCollection", { enumerable: true, get: function () { return index_js_3.Lr0ItemSetCollection; } });
|
|
21
|
+
var index_js_4 = require("./lr1/index.js");
|
|
22
|
+
Object.defineProperty(exports, "buildLr1ItemSets", { enumerable: true, get: function () { return index_js_4.buildLr1ItemSets; } });
|
|
23
|
+
Object.defineProperty(exports, "Lr1ItemSetCollection", { enumerable: true, get: function () { return index_js_4.Lr1ItemSetCollection; } });
|
|
24
|
+
var lr_algorithm_error_js_1 = require("./lr-algorithm-error.js");
|
|
25
|
+
Object.defineProperty(exports, "LrAlgorithmError", { enumerable: true, get: function () { return lr_algorithm_error_js_1.LrAlgorithmError; } });
|
|
26
|
+
var parse_table_build_error_js_1 = require("./parse-table-build-error.js");
|
|
27
|
+
Object.defineProperty(exports, "ParseTableBuildError", { enumerable: true, get: function () { return parse_table_build_error_js_1.ParseTableBuildError; } });
|
|
28
|
+
var parse_table_error_js_1 = require("./parse-table-error.js");
|
|
29
|
+
Object.defineProperty(exports, "ParseTableError", { enumerable: true, get: function () { return parse_table_error_js_1.ParseTableError; } });
|
|
30
|
+
var parse_table_json_js_1 = require("./parse-table-json.js");
|
|
31
|
+
Object.defineProperty(exports, "isParseTableJsonV2", { enumerable: true, get: function () { return parse_table_json_js_1.isParseTableJsonV2; } });
|
|
32
|
+
var index_js_5 = require("./slr/index.js");
|
|
33
|
+
Object.defineProperty(exports, "buildSlrTable", { enumerable: true, get: function () { return index_js_5.buildSlrTable; } });
|
|
34
|
+
Object.defineProperty(exports, "formatSlrActions", { enumerable: true, get: function () { return index_js_5.formatSlrActions; } });
|
|
35
|
+
Object.defineProperty(exports, "formatSlrConflicts", { enumerable: true, get: function () { return index_js_5.formatSlrConflicts; } });
|
|
36
|
+
var index_js_6 = require("./table/index.js");
|
|
37
|
+
Object.defineProperty(exports, "formatLrActions", { enumerable: true, get: function () { return index_js_6.formatLrActions; } });
|
|
38
|
+
Object.defineProperty(exports, "formatLrConflictWarnings", { enumerable: true, get: function () { return index_js_6.formatLrConflictWarnings; } });
|
|
39
|
+
Object.defineProperty(exports, "formatLrConflicts", { enumerable: true, get: function () { return index_js_6.formatLrConflicts; } });
|
|
40
|
+
Object.defineProperty(exports, "formatLrGotos", { enumerable: true, get: function () { return index_js_6.formatLrGotos; } });
|
|
41
|
+
Object.defineProperty(exports, "formatParseConflictWarning", { enumerable: true, get: function () { return index_js_6.formatParseConflictWarning; } });
|
|
42
|
+
Object.defineProperty(exports, "LrParseTable", { enumerable: true, get: function () { return index_js_6.LrParseTable; } });
|
|
43
|
+
var token_inventory_js_1 = require("./token-inventory.js");
|
|
44
|
+
Object.defineProperty(exports, "tokenInventory", { enumerable: true, get: function () { return token_inventory_js_1.tokenInventory; } });
|
|
45
|
+
var parse_table_js_1 = require("./parse-table.js");
|
|
46
|
+
Object.defineProperty(exports, "PARSE_TABLE_VERSION", { enumerable: true, get: function () { return parse_table_js_1.PARSE_TABLE_VERSION; } });
|
|
47
|
+
Object.defineProperty(exports, "PARSE_TABLE_VERSION_FULL", { enumerable: true, get: function () { return parse_table_js_1.PARSE_TABLE_VERSION_FULL; } });
|
|
48
|
+
Object.defineProperty(exports, "ParseTable", { enumerable: true, get: function () { return parse_table_js_1.ParseTable; } });
|
|
49
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/parse-table/index.ts"],"names":[],"mappings":";;;AAAA,qDAAoE;AAA3D,gHAAA,aAAa,OAAA;AAAE,mHAAA,gBAAgB,OAAA;AAExC,gDAA2F;AAAlF,0GAAA,cAAc,OAAA;AAAE,+GAAA,mBAAmB,OAAA;AAAE,2GAAA,eAAe,OAAA;AAC7D,2CAAuE;AAA9D,uGAAA,WAAW,OAAA;AAAE,sGAAA,UAAU,OAAA;AAAE,wGAAA,YAAY,OAAA;AAE9C,yDAAmD;AAA1C,iHAAA,YAAY,OAAA;AACrB,2CAA0F;AAAjF,4GAAA,gBAAgB,OAAA;AAAE,4GAAA,gBAAgB,OAAA;AAAE,gHAAA,oBAAoB,OAAA;AAEjE,2CAAwE;AAA/D,4GAAA,gBAAgB,OAAA;AAAE,gHAAA,oBAAoB,OAAA;AAE/C,iEAA2D;AAAlD,yHAAA,gBAAgB,OAAA;AACzB,2EAAoE;AAA3D,kIAAA,oBAAoB,OAAA;AAC7B,+DAAyD;AAAhD,uHAAA,eAAe,OAAA;AACxB,6DAA2D;AAAlD,yHAAA,kBAAkB,OAAA;AAO3B,2CAA+F;AAAtF,yGAAA,aAAa,OAAA;AAAE,4GAAA,gBAAgB,OAAA;AAAE,8GAAA,kBAAkB,OAAA;AAC5D,6CAO0B;AANtB,2GAAA,eAAe,OAAA;AACf,oHAAA,wBAAwB,OAAA;AACxB,6GAAA,iBAAiB,OAAA;AACjB,yGAAA,aAAa,OAAA;AACb,sHAAA,0BAA0B,OAAA;AAC1B,wGAAA,YAAY,OAAA;AAGhB,2DAAsD;AAA7C,oHAAA,cAAc,OAAA;AACvB,mDAA6F;AAApF,qHAAA,mBAAmB,OAAA;AAAE,0HAAA,wBAAwB,OAAA;AAAE,4GAAA,UAAU,OAAA"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LrAlgorithmError = void 0;
|
|
4
|
+
const parser_lr_error_js_1 = require("../errors/parser-lr-error.js");
|
|
5
|
+
/**
|
|
6
|
+
* Thrown when an LR table algorithm name is not supported.
|
|
7
|
+
*/
|
|
8
|
+
class LrAlgorithmError extends parser_lr_error_js_1.ParserLrError {
|
|
9
|
+
/**
|
|
10
|
+
* Creates an unsupported LR algorithm error.
|
|
11
|
+
*
|
|
12
|
+
* @param algorithm - Requested algorithm name.
|
|
13
|
+
*/
|
|
14
|
+
constructor(algorithm) {
|
|
15
|
+
super(`Unsupported LR algorithm ${JSON.stringify(algorithm)}`);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
exports.LrAlgorithmError = LrAlgorithmError;
|
|
19
|
+
//# sourceMappingURL=lr-algorithm-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lr-algorithm-error.js","sourceRoot":"","sources":["../../../src/lib/parse-table/lr-algorithm-error.ts"],"names":[],"mappings":";;;AAAA,qEAA6D;AAE7D;;GAEG;AACH,MAAa,gBAAiB,SAAQ,kCAAa;IAE/C;;;;OAIG;IACH,YAAmB,SAAiB;QAEhC,KAAK,CAAC,4BAA4B,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IACnE,CAAC;CACJ;AAXD,4CAWC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isLrAlgorithm = isLrAlgorithm;
|
|
4
|
+
exports.parseLrAlgorithm = parseLrAlgorithm;
|
|
5
|
+
const lr_algorithm_error_js_1 = require("./lr-algorithm-error.js");
|
|
6
|
+
/**
|
|
7
|
+
* Returns whether a string names a supported LR algorithm.
|
|
8
|
+
*
|
|
9
|
+
* @param value - Candidate algorithm name.
|
|
10
|
+
*/
|
|
11
|
+
function isLrAlgorithm(value) {
|
|
12
|
+
return value === 'lr0'
|
|
13
|
+
|| value === 'slr'
|
|
14
|
+
|| value === 'lalr'
|
|
15
|
+
|| value === 'lr1';
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Parses and validates an LR algorithm name.
|
|
19
|
+
*
|
|
20
|
+
* @param value - Raw algorithm name, or undefined for the default.
|
|
21
|
+
* @param defaultAlgorithm - Algorithm used when `value` is undefined.
|
|
22
|
+
* @returns Supported algorithm name.
|
|
23
|
+
*/
|
|
24
|
+
function parseLrAlgorithm(value, defaultAlgorithm = 'lr1') {
|
|
25
|
+
const algorithm = value ?? defaultAlgorithm;
|
|
26
|
+
if (!isLrAlgorithm(algorithm)) {
|
|
27
|
+
throw new lr_algorithm_error_js_1.LrAlgorithmError(algorithm);
|
|
28
|
+
}
|
|
29
|
+
return algorithm;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=lr-algorithm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lr-algorithm.js","sourceRoot":"","sources":["../../../src/lib/parse-table/lr-algorithm.ts"],"names":[],"mappings":";;AAYA,sCAMC;AASD,4CAaC;AAxCD,mEAA2D;AAO3D;;;;GAIG;AACH,SAAgB,aAAa,CAAC,KAAa;IAEvC,OAAO,KAAK,KAAK,KAAK;WACf,KAAK,KAAK,KAAK;WACf,KAAK,KAAK,MAAM;WAChB,KAAK,KAAK,KAAK,CAAC;AAC3B,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,gBAAgB,CAC5B,KAAyB,EACzB,mBAAgC,KAAK;IAGrC,MAAM,SAAS,GAAG,KAAK,IAAI,gBAAgB,CAAC;IAE5C,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,EAC7B,CAAC;QACG,MAAM,IAAI,wCAAgB,CAAC,SAAS,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,SAAS,CAAC;AACrB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.sortLr0Items = exports.Lr0ItemSetCollection = exports.Lr0ItemSetBuilder = exports.lr0ItemsEqual = exports.lr0ItemKey = exports.lr0Goto = exports.lr0Closure = exports.formatLr0ItemSet = exports.buildLr0ItemSets = void 0;
|
|
4
|
+
var lr0_item_set_js_1 = require("./lr0-item-set.js");
|
|
5
|
+
Object.defineProperty(exports, "buildLr0ItemSets", { enumerable: true, get: function () { return lr0_item_set_js_1.buildLr0ItemSets; } });
|
|
6
|
+
Object.defineProperty(exports, "formatLr0ItemSet", { enumerable: true, get: function () { return lr0_item_set_js_1.formatLr0ItemSet; } });
|
|
7
|
+
Object.defineProperty(exports, "lr0Closure", { enumerable: true, get: function () { return lr0_item_set_js_1.lr0Closure; } });
|
|
8
|
+
Object.defineProperty(exports, "lr0Goto", { enumerable: true, get: function () { return lr0_item_set_js_1.lr0Goto; } });
|
|
9
|
+
Object.defineProperty(exports, "lr0ItemKey", { enumerable: true, get: function () { return lr0_item_set_js_1.lr0ItemKey; } });
|
|
10
|
+
Object.defineProperty(exports, "lr0ItemsEqual", { enumerable: true, get: function () { return lr0_item_set_js_1.lr0ItemsEqual; } });
|
|
11
|
+
Object.defineProperty(exports, "Lr0ItemSetBuilder", { enumerable: true, get: function () { return lr0_item_set_js_1.Lr0ItemSetBuilder; } });
|
|
12
|
+
Object.defineProperty(exports, "Lr0ItemSetCollection", { enumerable: true, get: function () { return lr0_item_set_js_1.Lr0ItemSetCollection; } });
|
|
13
|
+
Object.defineProperty(exports, "sortLr0Items", { enumerable: true, get: function () { return lr0_item_set_js_1.sortLr0Items; } });
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/parse-table/lr0/index.ts"],"names":[],"mappings":";;;AAAA,qDAU2B;AATvB,mHAAA,gBAAgB,OAAA;AAChB,mHAAA,gBAAgB,OAAA;AAChB,6GAAA,UAAU,OAAA;AACV,0GAAA,OAAO,OAAA;AACP,6GAAA,UAAU,OAAA;AACV,gHAAA,aAAa,OAAA;AACb,oHAAA,iBAAiB,OAAA;AACjB,uHAAA,oBAAoB,OAAA;AACpB,+GAAA,YAAY,OAAA"}
|