parser-lr 0.0.0 → 0.2.1
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 +112 -1
- package/bin/parser-lr.js +12502 -16
- package/bin/parser-lr.js.map +1 -1
- package/dist/lib/ast/ast-node.d.ts +59 -0
- package/dist/lib/ast/ast-node.d.ts.map +1 -0
- package/dist/lib/ast/ast-node.js +66 -0
- package/dist/lib/ast/ast-node.js.map +1 -0
- package/dist/lib/errors/index.d.ts +2 -0
- package/dist/lib/errors/index.d.ts.map +1 -0
- package/dist/lib/errors/index.js +2 -0
- package/dist/lib/errors/index.js.map +1 -0
- package/dist/lib/errors/parser-lr-error.d.ts +30 -0
- package/dist/lib/errors/parser-lr-error.d.ts.map +1 -0
- package/dist/lib/errors/parser-lr-error.js +45 -0
- package/dist/lib/errors/parser-lr-error.js.map +1 -0
- package/dist/lib/grammar/ast-schema.d.ts +28 -0
- package/dist/lib/grammar/ast-schema.d.ts.map +1 -0
- package/dist/lib/grammar/ast-schema.js +39 -0
- package/dist/lib/grammar/ast-schema.js.map +1 -0
- package/dist/lib/grammar/ast-type.d.ts +12 -0
- package/dist/lib/grammar/ast-type.d.ts.map +1 -0
- package/dist/lib/grammar/ast-type.js +2 -0
- package/dist/lib/grammar/ast-type.js.map +1 -0
- package/dist/lib/grammar/expression.d.ts +69 -0
- package/dist/lib/grammar/expression.d.ts.map +1 -0
- package/dist/lib/grammar/expression.js +2 -0
- package/dist/lib/grammar/expression.js.map +1 -0
- package/dist/lib/grammar/grammar-from-cst.d.ts +10 -0
- package/dist/lib/grammar/grammar-from-cst.d.ts.map +1 -0
- package/dist/lib/grammar/grammar-from-cst.js +638 -0
- package/dist/lib/grammar/grammar-from-cst.js.map +1 -0
- package/dist/lib/grammar/grammar-literals.d.ts +18 -0
- package/dist/lib/grammar/grammar-literals.d.ts.map +1 -0
- package/dist/lib/grammar/grammar-literals.js +67 -0
- package/dist/lib/grammar/grammar-literals.js.map +1 -0
- package/dist/lib/grammar/grammar.d.ts +45 -0
- package/dist/lib/grammar/grammar.d.ts.map +1 -0
- package/dist/lib/grammar/grammar.js +60 -0
- package/dist/lib/grammar/grammar.js.map +1 -0
- package/dist/lib/grammar/grammar.json +7950 -0
- package/dist/lib/grammar/index.d.ts +13 -0
- package/dist/lib/grammar/index.d.ts.map +1 -0
- package/dist/lib/grammar/index.js +7 -0
- package/dist/lib/grammar/index.js.map +1 -0
- package/dist/lib/grammar/meta-grammar-table.d.ts +19 -0
- package/dist/lib/grammar/meta-grammar-table.d.ts.map +1 -0
- package/dist/lib/grammar/meta-grammar-table.js +32 -0
- package/dist/lib/grammar/meta-grammar-table.js.map +1 -0
- package/dist/lib/grammar/production.d.ts +9 -0
- package/dist/lib/grammar/production.d.ts.map +1 -0
- package/dist/lib/grammar/production.js +2 -0
- package/dist/lib/grammar/production.js.map +1 -0
- package/dist/lib/grammar/read-grammar-error.d.ts +15 -0
- package/dist/lib/grammar/read-grammar-error.d.ts.map +1 -0
- package/dist/lib/grammar/read-grammar-error.js +18 -0
- package/dist/lib/grammar/read-grammar-error.js.map +1 -0
- package/dist/lib/grammar/read-grammar.d.ts +9 -0
- package/dist/lib/grammar/read-grammar.d.ts.map +1 -0
- package/dist/lib/grammar/read-grammar.js +21 -0
- package/dist/lib/grammar/read-grammar.js.map +1 -0
- package/dist/lib/grammar/token-rule.d.ts +11 -0
- package/dist/lib/grammar/token-rule.d.ts.map +1 -0
- package/dist/lib/grammar/token-rule.js +2 -0
- package/dist/lib/grammar/token-rule.js.map +1 -0
- package/dist/lib/grammar/transform-expression.d.ts +55 -0
- package/dist/lib/grammar/transform-expression.d.ts.map +1 -0
- package/dist/lib/grammar/transform-expression.js +2 -0
- package/dist/lib/grammar/transform-expression.js.map +1 -0
- package/dist/lib/grammar/transform-rule.d.ts +16 -0
- package/dist/lib/grammar/transform-rule.d.ts.map +1 -0
- package/dist/lib/grammar/transform-rule.js +2 -0
- package/dist/lib/grammar/transform-rule.js.map +1 -0
- package/dist/lib/grammar/transform-schema.d.ts +28 -0
- package/dist/lib/grammar/transform-schema.d.ts.map +1 -0
- package/dist/lib/grammar/transform-schema.js +39 -0
- package/dist/lib/grammar/transform-schema.js.map +1 -0
- package/dist/lib/index.d.ts +19 -0
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +13 -0
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/lexer/index.d.ts +10 -0
- package/dist/lib/lexer/index.d.ts.map +1 -0
- package/dist/lib/lexer/index.js +8 -0
- package/dist/lib/lexer/index.js.map +1 -0
- package/dist/lib/lexer/lexer-compile-error.d.ts +15 -0
- package/dist/lib/lexer/lexer-compile-error.d.ts.map +1 -0
- package/dist/lib/lexer/lexer-compile-error.js +18 -0
- package/dist/lib/lexer/lexer-compile-error.js.map +1 -0
- package/dist/lib/lexer/lexer-compile.d.ts +94 -0
- package/dist/lib/lexer/lexer-compile.d.ts.map +1 -0
- package/dist/lib/lexer/lexer-compile.js +189 -0
- package/dist/lib/lexer/lexer-compile.js.map +1 -0
- package/dist/lib/lexer/lexer-error.d.ts +15 -0
- package/dist/lib/lexer/lexer-error.d.ts.map +1 -0
- package/dist/lib/lexer/lexer-error.js +18 -0
- package/dist/lib/lexer/lexer-error.js.map +1 -0
- package/dist/lib/lexer/lexer-input-error.d.ts +11 -0
- package/dist/lib/lexer/lexer-input-error.d.ts.map +1 -0
- package/dist/lib/lexer/lexer-input-error.js +13 -0
- package/dist/lib/lexer/lexer-input-error.js.map +1 -0
- package/dist/lib/lexer/lexer-state-error.d.ts +13 -0
- package/dist/lib/lexer/lexer-state-error.d.ts.map +1 -0
- package/dist/lib/lexer/lexer-state-error.js +15 -0
- package/dist/lib/lexer/lexer-state-error.js.map +1 -0
- package/dist/lib/lexer/lexer.d.ts +111 -0
- package/dist/lib/lexer/lexer.d.ts.map +1 -0
- package/dist/lib/lexer/lexer.js +270 -0
- package/dist/lib/lexer/lexer.js.map +1 -0
- package/dist/lib/lexer/token.d.ts +34 -0
- package/dist/lib/lexer/token.d.ts.map +1 -0
- package/dist/lib/lexer/token.js +38 -0
- package/dist/lib/lexer/token.js.map +1 -0
- package/dist/lib/parse-context-error.d.ts +13 -0
- package/dist/lib/parse-context-error.d.ts.map +1 -0
- package/dist/lib/parse-context-error.js +15 -0
- package/dist/lib/parse-context-error.js.map +1 -0
- package/dist/lib/parse-context.d.ts +106 -0
- package/dist/lib/parse-context.d.ts.map +1 -0
- package/dist/lib/parse-context.js +133 -0
- package/dist/lib/parse-context.js.map +1 -0
- package/dist/lib/parse-output-error.d.ts +13 -0
- package/dist/lib/parse-output-error.d.ts.map +1 -0
- package/dist/lib/parse-output-error.js +15 -0
- package/dist/lib/parse-output-error.js.map +1 -0
- package/dist/lib/parse-output.d.ts +10 -0
- package/dist/lib/parse-output.d.ts.map +1 -0
- package/dist/lib/parse-output.js +15 -0
- package/dist/lib/parse-output.js.map +1 -0
- package/dist/lib/parse-table/analysis/first-follow.d.ts +124 -0
- package/dist/lib/parse-table/analysis/first-follow.d.ts.map +1 -0
- package/dist/lib/parse-table/analysis/first-follow.js +274 -0
- package/dist/lib/parse-table/analysis/first-follow.js.map +1 -0
- package/dist/lib/parse-table/analysis/index.d.ts +2 -0
- package/dist/lib/parse-table/analysis/index.d.ts.map +1 -0
- package/dist/lib/parse-table/analysis/index.js +2 -0
- package/dist/lib/parse-table/analysis/index.js.map +1 -0
- package/dist/lib/parse-table/bnf/bnf-grammar.d.ts +65 -0
- package/dist/lib/parse-table/bnf/bnf-grammar.d.ts.map +1 -0
- package/dist/lib/parse-table/bnf/bnf-grammar.js +136 -0
- package/dist/lib/parse-table/bnf/bnf-grammar.js.map +1 -0
- package/dist/lib/parse-table/bnf/bnf-production.d.ts +12 -0
- package/dist/lib/parse-table/bnf/bnf-production.d.ts.map +1 -0
- package/dist/lib/parse-table/bnf/bnf-production.js +2 -0
- package/dist/lib/parse-table/bnf/bnf-production.js.map +1 -0
- package/dist/lib/parse-table/bnf/bnf-symbol.d.ts +40 -0
- package/dist/lib/parse-table/bnf/bnf-symbol.d.ts.map +1 -0
- package/dist/lib/parse-table/bnf/bnf-symbol.js +35 -0
- package/dist/lib/parse-table/bnf/bnf-symbol.js.map +1 -0
- package/dist/lib/parse-table/bnf/desugar-ebnf.d.ts +104 -0
- package/dist/lib/parse-table/bnf/desugar-ebnf.d.ts.map +1 -0
- package/dist/lib/parse-table/bnf/desugar-ebnf.js +217 -0
- package/dist/lib/parse-table/bnf/desugar-ebnf.js.map +1 -0
- package/dist/lib/parse-table/bnf/index.d.ts +6 -0
- package/dist/lib/parse-table/bnf/index.d.ts.map +1 -0
- package/dist/lib/parse-table/bnf/index.js +4 -0
- package/dist/lib/parse-table/bnf/index.js.map +1 -0
- package/dist/lib/parse-table/build-lr-table.d.ts +11 -0
- package/dist/lib/parse-table/build-lr-table.d.ts.map +1 -0
- package/dist/lib/parse-table/build-lr-table.js +158 -0
- package/dist/lib/parse-table/build-lr-table.js.map +1 -0
- package/dist/lib/parse-table/index.d.ts +22 -0
- package/dist/lib/parse-table/index.d.ts.map +1 -0
- package/dist/lib/parse-table/index.js +15 -0
- package/dist/lib/parse-table/index.js.map +1 -0
- package/dist/lib/parse-table/lr-algorithm-error.d.ts +13 -0
- package/dist/lib/parse-table/lr-algorithm-error.d.ts.map +1 -0
- package/dist/lib/parse-table/lr-algorithm-error.js +15 -0
- package/dist/lib/parse-table/lr-algorithm-error.js.map +1 -0
- package/dist/lib/parse-table/lr-algorithm.d.ts +19 -0
- package/dist/lib/parse-table/lr-algorithm.d.ts.map +1 -0
- package/dist/lib/parse-table/lr-algorithm.js +27 -0
- package/dist/lib/parse-table/lr-algorithm.js.map +1 -0
- package/dist/lib/parse-table/lr0/index.d.ts +3 -0
- package/dist/lib/parse-table/lr0/index.d.ts.map +1 -0
- package/dist/lib/parse-table/lr0/index.js +2 -0
- package/dist/lib/parse-table/lr0/index.js.map +1 -0
- package/dist/lib/parse-table/lr0/lr0-item-set.d.ts +106 -0
- package/dist/lib/parse-table/lr0/lr0-item-set.d.ts.map +1 -0
- package/dist/lib/parse-table/lr0/lr0-item-set.js +235 -0
- package/dist/lib/parse-table/lr0/lr0-item-set.js.map +1 -0
- package/dist/lib/parse-table/lr1/index.d.ts +3 -0
- package/dist/lib/parse-table/lr1/index.d.ts.map +1 -0
- package/dist/lib/parse-table/lr1/index.js +2 -0
- package/dist/lib/parse-table/lr1/index.js.map +1 -0
- package/dist/lib/parse-table/lr1/lr1-item-set.d.ts +157 -0
- package/dist/lib/parse-table/lr1/lr1-item-set.d.ts.map +1 -0
- package/dist/lib/parse-table/lr1/lr1-item-set.js +380 -0
- package/dist/lib/parse-table/lr1/lr1-item-set.js.map +1 -0
- package/dist/lib/parse-table/parse-table-build-error.d.ts +17 -0
- package/dist/lib/parse-table/parse-table-build-error.d.ts.map +1 -0
- package/dist/lib/parse-table/parse-table-build-error.js +20 -0
- package/dist/lib/parse-table/parse-table-build-error.js.map +1 -0
- package/dist/lib/parse-table/parse-table-error.d.ts +13 -0
- package/dist/lib/parse-table/parse-table-error.d.ts.map +1 -0
- package/dist/lib/parse-table/parse-table-error.js +15 -0
- package/dist/lib/parse-table/parse-table-error.js.map +1 -0
- package/dist/lib/parse-table/parse-table-json.d.ts +50 -0
- package/dist/lib/parse-table/parse-table-json.d.ts.map +1 -0
- package/dist/lib/parse-table/parse-table-json.js +9 -0
- package/dist/lib/parse-table/parse-table-json.js.map +1 -0
- package/dist/lib/parse-table/parse-table.d.ts +154 -0
- package/dist/lib/parse-table/parse-table.d.ts.map +1 -0
- package/dist/lib/parse-table/parse-table.js +314 -0
- package/dist/lib/parse-table/parse-table.js.map +1 -0
- package/dist/lib/parse-table/slr/index.d.ts +4 -0
- package/dist/lib/parse-table/slr/index.d.ts.map +1 -0
- package/dist/lib/parse-table/slr/index.js +3 -0
- package/dist/lib/parse-table/slr/index.js.map +1 -0
- package/dist/lib/parse-table/slr/parse-action.d.ts +3 -0
- package/dist/lib/parse-table/slr/parse-action.d.ts.map +1 -0
- package/dist/lib/parse-table/slr/parse-action.js +2 -0
- package/dist/lib/parse-table/slr/parse-action.js.map +1 -0
- package/dist/lib/parse-table/slr/slr-table.d.ts +14 -0
- package/dist/lib/parse-table/slr/slr-table.d.ts.map +1 -0
- package/dist/lib/parse-table/slr/slr-table.js +14 -0
- package/dist/lib/parse-table/slr/slr-table.js.map +1 -0
- package/dist/lib/parse-table/table/index.d.ts +5 -0
- package/dist/lib/parse-table/table/index.d.ts.map +1 -0
- package/dist/lib/parse-table/table/index.js +4 -0
- package/dist/lib/parse-table/table/index.js.map +1 -0
- package/dist/lib/parse-table/table/lr-parse-table.d.ts +92 -0
- package/dist/lib/parse-table/table/lr-parse-table.d.ts.map +1 -0
- package/dist/lib/parse-table/table/lr-parse-table.js +144 -0
- package/dist/lib/parse-table/table/lr-parse-table.js.map +1 -0
- package/dist/lib/parse-table/table/parse-action.d.ts +47 -0
- package/dist/lib/parse-table/table/parse-action.d.ts.map +1 -0
- package/dist/lib/parse-table/table/parse-action.js +49 -0
- package/dist/lib/parse-table/table/parse-action.js.map +1 -0
- package/dist/lib/parse-table/table/table-builder-base.d.ts +63 -0
- package/dist/lib/parse-table/table/table-builder-base.d.ts.map +1 -0
- package/dist/lib/parse-table/table/table-builder-base.js +129 -0
- package/dist/lib/parse-table/table/table-builder-base.js.map +1 -0
- package/dist/lib/parse-table/token-inventory.d.ts +9 -0
- package/dist/lib/parse-table/token-inventory.d.ts.map +1 -0
- package/dist/lib/parse-table/token-inventory.js +15 -0
- package/dist/lib/parse-table/token-inventory.js.map +1 -0
- package/dist/lib/parser-lr.d.ts +96 -2
- package/dist/lib/parser-lr.d.ts.map +1 -1
- package/dist/lib/parser-lr.js +130 -2
- package/dist/lib/parser-lr.js.map +1 -1
- package/dist/lib/shift-reduce/index.d.ts +3 -0
- package/dist/lib/shift-reduce/index.d.ts.map +1 -0
- package/dist/lib/shift-reduce/index.js +2 -0
- package/dist/lib/shift-reduce/index.js.map +1 -0
- package/dist/lib/shift-reduce/shift-reduce-engine.d.ts +82 -0
- package/dist/lib/shift-reduce/shift-reduce-engine.d.ts.map +1 -0
- package/dist/lib/shift-reduce/shift-reduce-engine.js +204 -0
- package/dist/lib/shift-reduce/shift-reduce-engine.js.map +1 -0
- package/dist/lib/transform/binding-map.d.ts +32 -0
- package/dist/lib/transform/binding-map.d.ts.map +1 -0
- package/dist/lib/transform/binding-map.js +59 -0
- package/dist/lib/transform/binding-map.js.map +1 -0
- package/dist/lib/transform/cst-transformer.d.ts +158 -0
- package/dist/lib/transform/cst-transformer.d.ts.map +1 -0
- package/dist/lib/transform/cst-transformer.js +381 -0
- package/dist/lib/transform/cst-transformer.js.map +1 -0
- package/dist/lib/transform/index.d.ts +4 -0
- package/dist/lib/transform/index.d.ts.map +1 -0
- package/dist/lib/transform/index.js +3 -0
- package/dist/lib/transform/index.js.map +1 -0
- package/docs/grammar.md +170 -0
- package/package.json +12 -4
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import { bnfParserSymbolKey, bnfSymbolKey } from '../bnf/bnf-symbol.js';
|
|
2
|
+
/**
|
|
3
|
+
* Returns a stable string key for an LR(0) item.
|
|
4
|
+
*
|
|
5
|
+
* @param grammar - Grammar containing the referenced production.
|
|
6
|
+
* @param item - LR(0) item to encode.
|
|
7
|
+
*/
|
|
8
|
+
export function lr0ItemKey(grammar, item) {
|
|
9
|
+
const production = grammar.production(item.productionId);
|
|
10
|
+
if (production === null) {
|
|
11
|
+
return `${String(item.productionId)}@${String(item.dot)}`;
|
|
12
|
+
}
|
|
13
|
+
const rhs = production.rhs.map((symbol) => bnfSymbolKey(symbol));
|
|
14
|
+
const before = rhs.slice(0, item.dot).join(' ');
|
|
15
|
+
const after = rhs.slice(item.dot).join(' ');
|
|
16
|
+
if (before.length === 0) {
|
|
17
|
+
return `${production.name} → · ${after}`.trimEnd();
|
|
18
|
+
}
|
|
19
|
+
if (after.length === 0) {
|
|
20
|
+
return `${production.name} → ${before} ·`;
|
|
21
|
+
}
|
|
22
|
+
return `${production.name} → ${before} · ${after}`;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Returns whether two LR(0) items are identical.
|
|
26
|
+
*
|
|
27
|
+
* @param left - First item.
|
|
28
|
+
* @param right - Second item.
|
|
29
|
+
*/
|
|
30
|
+
export function lr0ItemsEqual(left, right) {
|
|
31
|
+
return left.productionId === right.productionId && left.dot === right.dot;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Sorts LR(0) items for canonical set comparison.
|
|
35
|
+
*
|
|
36
|
+
* @param items - Items to sort.
|
|
37
|
+
*/
|
|
38
|
+
export function sortLr0Items(items) {
|
|
39
|
+
return [...items].sort((left, right) => {
|
|
40
|
+
if (left.productionId !== right.productionId) {
|
|
41
|
+
return left.productionId - right.productionId;
|
|
42
|
+
}
|
|
43
|
+
return left.dot - right.dot;
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Computes the LR(0) closure of an item set.
|
|
48
|
+
*
|
|
49
|
+
* @param grammar - Plain or augmented BNF grammar.
|
|
50
|
+
* @param items - Seed items.
|
|
51
|
+
*/
|
|
52
|
+
export function lr0Closure(grammar, items) {
|
|
53
|
+
const result = sortLr0Items(items);
|
|
54
|
+
const itemKeys = new Set(result.map((item) => Lr0ItemSetBuilder.itemIdentity(item)));
|
|
55
|
+
let changed = true;
|
|
56
|
+
while (changed) {
|
|
57
|
+
changed = false;
|
|
58
|
+
for (const item of [...result]) {
|
|
59
|
+
const production = grammar.production(item.productionId);
|
|
60
|
+
if (production === null) {
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
const nextSymbol = production.rhs[item.dot];
|
|
64
|
+
if (nextSymbol === undefined || nextSymbol.kind !== 'nonTerminal') {
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
for (const candidate of grammar.productionsFor(nextSymbol.name)) {
|
|
68
|
+
const closureItem = {
|
|
69
|
+
productionId: candidate.id,
|
|
70
|
+
dot: 0,
|
|
71
|
+
};
|
|
72
|
+
const identity = Lr0ItemSetBuilder.itemIdentity(closureItem);
|
|
73
|
+
if (!itemKeys.has(identity)) {
|
|
74
|
+
itemKeys.add(identity);
|
|
75
|
+
result.push(closureItem);
|
|
76
|
+
changed = true;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return sortLr0Items(result);
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Computes the LR(0) GOTO set for symbol `symbolKey`.
|
|
85
|
+
*
|
|
86
|
+
* @param grammar - Plain or augmented BNF grammar.
|
|
87
|
+
* @param items - Closed item set.
|
|
88
|
+
* @param symbolKey - Encoded terminal or non-terminal symbol.
|
|
89
|
+
*/
|
|
90
|
+
export function lr0Goto(grammar, items, symbolKey) {
|
|
91
|
+
const moved = [];
|
|
92
|
+
for (const item of items) {
|
|
93
|
+
const production = grammar.production(item.productionId);
|
|
94
|
+
if (production === null) {
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
const nextSymbol = production.rhs[item.dot];
|
|
98
|
+
if (nextSymbol === undefined || bnfParserSymbolKey(nextSymbol) !== symbolKey) {
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
moved.push({
|
|
102
|
+
productionId: item.productionId,
|
|
103
|
+
dot: item.dot + 1,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
if (moved.length === 0) {
|
|
107
|
+
return [];
|
|
108
|
+
}
|
|
109
|
+
return lr0Closure(grammar, moved);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Canonical collection of LR(0) item sets for a BNF grammar.
|
|
113
|
+
*/
|
|
114
|
+
export class Lr0ItemSetCollection {
|
|
115
|
+
grammar;
|
|
116
|
+
itemSets;
|
|
117
|
+
/**
|
|
118
|
+
* Creates a collection from an ordered list of closed item sets.
|
|
119
|
+
*
|
|
120
|
+
* @param grammar - Grammar the item sets were built from.
|
|
121
|
+
* @param itemSets - Closed LR(0) item sets in discovery order.
|
|
122
|
+
*/
|
|
123
|
+
constructor(grammar, itemSets) {
|
|
124
|
+
this.grammar = grammar;
|
|
125
|
+
this.itemSets = itemSets;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Returns the index of an item set matching `items`, or null when absent.
|
|
129
|
+
*
|
|
130
|
+
* @param items - Closed item set to locate.
|
|
131
|
+
*/
|
|
132
|
+
indexOf(items) {
|
|
133
|
+
const target = Lr0ItemSetBuilder.setIdentity(items);
|
|
134
|
+
for (let index = 0; index < this.itemSets.length; index += 1) {
|
|
135
|
+
if (Lr0ItemSetBuilder.setIdentity(this.itemSets[index]) === target) {
|
|
136
|
+
return index;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Builds LR(0) item sets for a BNF grammar.
|
|
144
|
+
*/
|
|
145
|
+
export class Lr0ItemSetBuilder {
|
|
146
|
+
/**
|
|
147
|
+
* Builds the canonical LR(0) collection for a grammar.
|
|
148
|
+
*
|
|
149
|
+
* @param grammar - Augmented or plain BNF grammar.
|
|
150
|
+
*/
|
|
151
|
+
static build(grammar) {
|
|
152
|
+
const startProductions = grammar.productionsFor(grammar.startSymbol);
|
|
153
|
+
if (startProductions.length === 0) {
|
|
154
|
+
return new Lr0ItemSetCollection(grammar, []);
|
|
155
|
+
}
|
|
156
|
+
const initial = lr0Closure(grammar, [{
|
|
157
|
+
productionId: startProductions[0].id,
|
|
158
|
+
dot: 0,
|
|
159
|
+
}]);
|
|
160
|
+
const itemSets = [[...initial]];
|
|
161
|
+
const itemSetKeys = new Map([
|
|
162
|
+
[Lr0ItemSetBuilder.setIdentity(initial), 0],
|
|
163
|
+
]);
|
|
164
|
+
const symbols = Lr0ItemSetBuilder.grammarSymbolKeys(grammar);
|
|
165
|
+
let changed = true;
|
|
166
|
+
while (changed) {
|
|
167
|
+
changed = false;
|
|
168
|
+
for (const itemSet of [...itemSets]) {
|
|
169
|
+
for (const symbolKey of symbols) {
|
|
170
|
+
const gotoSet = lr0Goto(grammar, itemSet, symbolKey);
|
|
171
|
+
if (gotoSet.length === 0) {
|
|
172
|
+
continue;
|
|
173
|
+
}
|
|
174
|
+
const gotoKey = Lr0ItemSetBuilder.setIdentity(gotoSet);
|
|
175
|
+
const existingIndex = itemSetKeys.get(gotoKey);
|
|
176
|
+
if (existingIndex === undefined) {
|
|
177
|
+
const nextIndex = itemSets.length;
|
|
178
|
+
itemSetKeys.set(gotoKey, nextIndex);
|
|
179
|
+
itemSets.push([...gotoSet]);
|
|
180
|
+
changed = true;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return new Lr0ItemSetCollection(grammar, itemSets);
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Returns every terminal and non-terminal key that can appear in GOTO.
|
|
189
|
+
*
|
|
190
|
+
* @param grammar - BNF grammar to inspect.
|
|
191
|
+
*/
|
|
192
|
+
static grammarSymbolKeys(grammar) {
|
|
193
|
+
const keys = new Set(grammar.terminalKeys());
|
|
194
|
+
for (const name of grammar.nonTerminalNames()) {
|
|
195
|
+
keys.add(name);
|
|
196
|
+
}
|
|
197
|
+
return [...keys].sort();
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Returns a stable identity string for one LR(0) item.
|
|
201
|
+
*
|
|
202
|
+
* @param item - Item to encode.
|
|
203
|
+
*/
|
|
204
|
+
static itemIdentity(item) {
|
|
205
|
+
return `${String(item.productionId)}:${String(item.dot)}`;
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Returns a stable identity string for an item set.
|
|
209
|
+
*
|
|
210
|
+
* @param items - Closed item set.
|
|
211
|
+
*/
|
|
212
|
+
static setIdentity(items) {
|
|
213
|
+
return sortLr0Items(items)
|
|
214
|
+
.map((item) => Lr0ItemSetBuilder.itemIdentity(item))
|
|
215
|
+
.join('|');
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Builds the canonical LR(0) item set collection for a grammar.
|
|
220
|
+
*
|
|
221
|
+
* @param grammar - Augmented or plain BNF grammar.
|
|
222
|
+
*/
|
|
223
|
+
export function buildLr0ItemSets(grammar) {
|
|
224
|
+
return Lr0ItemSetBuilder.build(grammar);
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Returns readable item set labels for tests and diagnostics.
|
|
228
|
+
*
|
|
229
|
+
* @param grammar - Grammar containing referenced productions.
|
|
230
|
+
* @param items - Closed item set.
|
|
231
|
+
*/
|
|
232
|
+
export function formatLr0ItemSet(grammar, items) {
|
|
233
|
+
return sortLr0Items(items).map((item) => lr0ItemKey(grammar, item));
|
|
234
|
+
}
|
|
235
|
+
//# sourceMappingURL=lr0-item-set.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lr0-item-set.js","sourceRoot":"","sources":["../../../../src/lib/parse-table/lr0/lr0-item-set.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { buildLalrGotoTargets, buildLr1ItemSets, firstAfterSymbols, lr1Closure, lr1CoreKey, lr1CoreSetIdentity, lr1Goto, lr1ItemIdentity, lr1SetIdentity, Lr1ItemSetBuilder, Lr1ItemSetCollection, mergeLalrItemSets, sortLr1Items, } from './lr1-item-set.js';
|
|
2
|
+
export type { Lr1Item } from './lr1-item-set.js';
|
|
3
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/parse-table/lr1/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,EACjB,UAAU,EACV,UAAU,EACV,kBAAkB,EAClB,OAAO,EACP,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,oBAAoB,EACpB,iBAAiB,EACjB,YAAY,GACf,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { buildLalrGotoTargets, buildLr1ItemSets, firstAfterSymbols, lr1Closure, lr1CoreKey, lr1CoreSetIdentity, lr1Goto, lr1ItemIdentity, lr1SetIdentity, Lr1ItemSetBuilder, Lr1ItemSetCollection, mergeLalrItemSets, sortLr1Items, } from './lr1-item-set.js';
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/parse-table/lr1/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,EACjB,UAAU,EACV,UAAU,EACV,kBAAkB,EAClB,OAAO,EACP,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,oBAAoB,EACpB,iBAAiB,EACjB,YAAY,GACf,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import type { GrammarAnalysis } from '../analysis/first-follow.js';
|
|
2
|
+
import type { BnfGrammar } from '../bnf/bnf-grammar.js';
|
|
3
|
+
import { type BnfSymbol } from '../bnf/bnf-symbol.js';
|
|
4
|
+
import type { Lr0Item } from '../lr0/lr0-item-set.js';
|
|
5
|
+
/**
|
|
6
|
+
* One LR(1) item: a dotted production with a single lookahead terminal.
|
|
7
|
+
*/
|
|
8
|
+
export interface Lr1Item {
|
|
9
|
+
readonly productionId: number;
|
|
10
|
+
readonly dot: number;
|
|
11
|
+
readonly lookahead: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Returns whether two LR(1) items are identical.
|
|
15
|
+
*
|
|
16
|
+
* @param left - First item.
|
|
17
|
+
* @param right - Second item.
|
|
18
|
+
*/
|
|
19
|
+
export declare function lr1ItemsEqual(left: Lr1Item, right: Lr1Item): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Sorts LR(1) items for canonical set comparison.
|
|
22
|
+
*
|
|
23
|
+
* @param items - Items to sort.
|
|
24
|
+
*/
|
|
25
|
+
export declare function sortLr1Items(items: readonly Lr1Item[]): Lr1Item[];
|
|
26
|
+
/**
|
|
27
|
+
* Returns the LR(0) core key for one LR(1) item.
|
|
28
|
+
*
|
|
29
|
+
* @param item - LR(1) item to encode.
|
|
30
|
+
*/
|
|
31
|
+
export declare function lr1CoreKey(item: Lr1Item): string;
|
|
32
|
+
/**
|
|
33
|
+
* Returns a stable identity string for one LR(1) item.
|
|
34
|
+
*
|
|
35
|
+
* @param item - Item to encode.
|
|
36
|
+
*/
|
|
37
|
+
export declare function lr1ItemIdentity(item: Lr1Item): string;
|
|
38
|
+
/**
|
|
39
|
+
* Returns a stable identity string for an LR(1) item set.
|
|
40
|
+
*
|
|
41
|
+
* @param items - Closed item set.
|
|
42
|
+
*/
|
|
43
|
+
export declare function lr1SetIdentity(items: readonly Lr1Item[]): string;
|
|
44
|
+
/**
|
|
45
|
+
* Returns the LR(0) core identity for an LR(1) item set.
|
|
46
|
+
*
|
|
47
|
+
* @param items - LR(1) item set.
|
|
48
|
+
*/
|
|
49
|
+
export declare function lr1CoreSetIdentity(items: readonly Lr1Item[]): string;
|
|
50
|
+
/**
|
|
51
|
+
* Computes FIRST(β) ∪ { lookahead } when every symbol in β is nullable.
|
|
52
|
+
*
|
|
53
|
+
* @param beta - Remaining right-hand side symbols after a non-terminal.
|
|
54
|
+
* @param lookahead - Lookahead terminal following β.
|
|
55
|
+
* @param analysis - Nullable and FIRST analysis for the grammar.
|
|
56
|
+
*/
|
|
57
|
+
export declare function firstAfterSymbols(beta: readonly BnfSymbol[], lookahead: string, analysis: GrammarAnalysis): ReadonlySet<string>;
|
|
58
|
+
/**
|
|
59
|
+
* Computes the LR(1) closure of an item set.
|
|
60
|
+
*
|
|
61
|
+
* @param grammar - Augmented BNF grammar.
|
|
62
|
+
* @param analysis - Nullable and FIRST analysis for the grammar.
|
|
63
|
+
* @param items - Seed items.
|
|
64
|
+
*/
|
|
65
|
+
export declare function lr1Closure(grammar: BnfGrammar, analysis: GrammarAnalysis, items: readonly Lr1Item[]): readonly Lr1Item[];
|
|
66
|
+
/**
|
|
67
|
+
* Computes the LR(1) GOTO set for symbol `symbolKey`.
|
|
68
|
+
*
|
|
69
|
+
* @param grammar - Augmented BNF grammar.
|
|
70
|
+
* @param analysis - Nullable and FIRST analysis for the grammar.
|
|
71
|
+
* @param items - Closed item set.
|
|
72
|
+
* @param symbolKey - Encoded terminal or non-terminal symbol.
|
|
73
|
+
*/
|
|
74
|
+
export declare function lr1Goto(grammar: BnfGrammar, analysis: GrammarAnalysis, items: readonly Lr1Item[], symbolKey: string): readonly Lr1Item[];
|
|
75
|
+
/**
|
|
76
|
+
* Canonical collection of LR(1) item sets for a BNF grammar.
|
|
77
|
+
*/
|
|
78
|
+
export declare class Lr1ItemSetCollection {
|
|
79
|
+
readonly grammar: BnfGrammar;
|
|
80
|
+
readonly itemSets: readonly (readonly Lr1Item[])[];
|
|
81
|
+
/**
|
|
82
|
+
* Creates a collection from an ordered list of closed item sets.
|
|
83
|
+
*
|
|
84
|
+
* @param grammar - Grammar the item sets were built from.
|
|
85
|
+
* @param itemSets - Closed LR(1) item sets in discovery order.
|
|
86
|
+
*/
|
|
87
|
+
constructor(grammar: BnfGrammar, itemSets: readonly (readonly Lr1Item[])[]);
|
|
88
|
+
/**
|
|
89
|
+
* Returns the index of an item set matching `items`, or null when absent.
|
|
90
|
+
*
|
|
91
|
+
* @param items - Closed item set to locate.
|
|
92
|
+
*/
|
|
93
|
+
indexOf(items: readonly Lr1Item[]): number | null;
|
|
94
|
+
/**
|
|
95
|
+
* Returns LR(0) items derived from one LR(1) item set.
|
|
96
|
+
*
|
|
97
|
+
* @param items - LR(1) item set.
|
|
98
|
+
*/
|
|
99
|
+
static lr0Core(items: readonly Lr1Item[]): readonly Lr0Item[];
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Builds LR(1) item sets for a BNF grammar.
|
|
103
|
+
*/
|
|
104
|
+
export declare class Lr1ItemSetBuilder {
|
|
105
|
+
/**
|
|
106
|
+
* Builds the canonical LR(1) collection for a grammar.
|
|
107
|
+
*
|
|
108
|
+
* @param grammar - Augmented BNF grammar.
|
|
109
|
+
* @param analysis - Nullable and FIRST analysis for the grammar.
|
|
110
|
+
* @param startLookahead - Lookahead terminal for the initial item.
|
|
111
|
+
*/
|
|
112
|
+
static build(grammar: BnfGrammar, analysis: GrammarAnalysis, startLookahead: string): Lr1ItemSetCollection;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Builds the canonical LR(1) item set collection for a grammar.
|
|
116
|
+
*
|
|
117
|
+
* @param grammar - Augmented BNF grammar.
|
|
118
|
+
* @param analysis - Nullable and FIRST analysis for the grammar.
|
|
119
|
+
* @param startLookahead - Lookahead terminal for the initial item.
|
|
120
|
+
*/
|
|
121
|
+
export declare function buildLr1ItemSets(grammar: BnfGrammar, analysis: GrammarAnalysis, startLookahead: string): Lr1ItemSetCollection;
|
|
122
|
+
/**
|
|
123
|
+
* Merges LR(1) item sets that share the same LR(0) core into LALR item sets.
|
|
124
|
+
*
|
|
125
|
+
* @param collection - Canonical LR(1) item set collection.
|
|
126
|
+
*/
|
|
127
|
+
export declare function mergeLalrItemSets(collection: Lr1ItemSetCollection): Lr1ItemSetCollection;
|
|
128
|
+
/**
|
|
129
|
+
* Builds LALR GOTO target indices from an LR(1) collection and merged LALR states.
|
|
130
|
+
*
|
|
131
|
+
* @param grammar - Augmented BNF grammar.
|
|
132
|
+
* @param analysis - Nullable and FIRST analysis for the grammar.
|
|
133
|
+
* @param lr1Collection - Canonical LR(1) item set collection.
|
|
134
|
+
* @param lalrCollection - Merged LALR item set collection.
|
|
135
|
+
* @param lr1ToLalr - LR(1) state index to LALR state index map.
|
|
136
|
+
*/
|
|
137
|
+
export declare function buildLalrGotoTargets(grammar: BnfGrammar, analysis: GrammarAnalysis, lr1Collection: Lr1ItemSetCollection, lr1ToLalr: ReadonlyMap<number, number>): ReadonlyMap<string, number>;
|
|
138
|
+
/**
|
|
139
|
+
* Merges lookaheads for LR(1) items sharing the same LR(0) core.
|
|
140
|
+
*/
|
|
141
|
+
export declare namespace Lr1ItemSetBuilder {
|
|
142
|
+
/**
|
|
143
|
+
* Unions lookaheads for items with the same dotted production.
|
|
144
|
+
*
|
|
145
|
+
* @param left - Existing merged item set.
|
|
146
|
+
* @param right - Additional LR(1) item set to merge in.
|
|
147
|
+
*/
|
|
148
|
+
function mergeItems(left: readonly Lr1Item[], right: readonly Lr1Item[]): Lr1Item[];
|
|
149
|
+
/**
|
|
150
|
+
* Builds the LR(1) to LALR state index map for merged item sets.
|
|
151
|
+
*
|
|
152
|
+
* @param lr1Collection - Canonical LR(1) item set collection.
|
|
153
|
+
* @param lalrCollection - Merged LALR item set collection.
|
|
154
|
+
*/
|
|
155
|
+
function buildLr1ToLalrMap(lr1Collection: Lr1ItemSetCollection, lalrCollection: Lr1ItemSetCollection): Map<number, number>;
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=lr1-item-set.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lr1-item-set.d.ts","sourceRoot":"","sources":["../../../../src/lib/parse-table/lr1/lr1-item-set.ts"],"names":[],"mappings":"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"}
|