parser-lr 0.0.0 → 0.2.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 +48 -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/package.json +10 -3
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { bnfParserSymbolKey } from './bnf-symbol.js';
|
|
2
|
+
/** Sentinel non-terminal introducing the augmented start production. */
|
|
3
|
+
export const AUGMENTED_START_SYMBOL = '$accept';
|
|
4
|
+
/**
|
|
5
|
+
* Plain BNF grammar used for LR table construction.
|
|
6
|
+
*/
|
|
7
|
+
export class BnfGrammar {
|
|
8
|
+
startSymbol;
|
|
9
|
+
productions;
|
|
10
|
+
tokenNames;
|
|
11
|
+
productionsByName;
|
|
12
|
+
productionById;
|
|
13
|
+
/**
|
|
14
|
+
* Creates a BNF grammar from its productions and token inventory.
|
|
15
|
+
*
|
|
16
|
+
* @param startSymbol - Entry non-terminal from the source grammar.
|
|
17
|
+
* @param productions - Flat BNF productions with stable ids.
|
|
18
|
+
* @param tokenNames - Token rule names treated as terminals.
|
|
19
|
+
*/
|
|
20
|
+
constructor(startSymbol, productions, tokenNames) {
|
|
21
|
+
this.startSymbol = startSymbol;
|
|
22
|
+
this.productions = productions;
|
|
23
|
+
this.tokenNames = tokenNames;
|
|
24
|
+
// Index productions by left-hand side name.
|
|
25
|
+
const productionsByName = new Map();
|
|
26
|
+
const productionById = new Map();
|
|
27
|
+
for (const production of productions) {
|
|
28
|
+
const existing = productionsByName.get(production.name) ?? [];
|
|
29
|
+
existing.push(production);
|
|
30
|
+
productionsByName.set(production.name, existing);
|
|
31
|
+
productionById.set(production.id, production);
|
|
32
|
+
}
|
|
33
|
+
this.productionsByName = productionsByName;
|
|
34
|
+
this.productionById = productionById;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Returns productions with a given left-hand side non-terminal.
|
|
38
|
+
*
|
|
39
|
+
* @param name - Non-terminal name to look up.
|
|
40
|
+
*/
|
|
41
|
+
productionsFor(name) {
|
|
42
|
+
return this.productionsByName.get(name) ?? [];
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Returns a production by its stable id.
|
|
46
|
+
*
|
|
47
|
+
* @param id - Production id assigned during desugaring.
|
|
48
|
+
*/
|
|
49
|
+
production(id) {
|
|
50
|
+
return this.productionById.get(id) ?? null;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Whether a name is a declared token rule.
|
|
54
|
+
*
|
|
55
|
+
* @param name - Candidate token name.
|
|
56
|
+
*/
|
|
57
|
+
isToken(name) {
|
|
58
|
+
return this.tokenNames.includes(name);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Returns every non-terminal name appearing in the grammar.
|
|
62
|
+
*/
|
|
63
|
+
nonTerminalNames() {
|
|
64
|
+
const names = new Set();
|
|
65
|
+
for (const production of this.productions) {
|
|
66
|
+
names.add(production.name);
|
|
67
|
+
for (const symbol of production.rhs) {
|
|
68
|
+
if (symbol.kind === 'nonTerminal') {
|
|
69
|
+
names.add(symbol.name);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return [...names].sort();
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Returns every terminal key appearing on a production right-hand side.
|
|
77
|
+
*/
|
|
78
|
+
terminalKeys() {
|
|
79
|
+
const keys = new Set();
|
|
80
|
+
for (const production of this.productions) {
|
|
81
|
+
for (const symbol of production.rhs) {
|
|
82
|
+
if (symbol.kind === 'terminal' || symbol.kind === 'token') {
|
|
83
|
+
keys.add(bnfParserSymbolKey(symbol));
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return [...keys].sort();
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Builds an augmented grammar with `$accept → startSymbol`.
|
|
91
|
+
*/
|
|
92
|
+
augment() {
|
|
93
|
+
const acceptProduction = {
|
|
94
|
+
id: this.productions.length,
|
|
95
|
+
name: AUGMENTED_START_SYMBOL,
|
|
96
|
+
rhs: [
|
|
97
|
+
{
|
|
98
|
+
kind: 'nonTerminal',
|
|
99
|
+
name: this.startSymbol,
|
|
100
|
+
binding: null,
|
|
101
|
+
},
|
|
102
|
+
],
|
|
103
|
+
variant: null,
|
|
104
|
+
origin: AUGMENTED_START_SYMBOL,
|
|
105
|
+
};
|
|
106
|
+
return new BnfGrammar(AUGMENTED_START_SYMBOL, [...this.productions, acceptProduction], this.tokenNames);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Returns whether a symbol key is a shift symbol (terminal or token).
|
|
110
|
+
*
|
|
111
|
+
* @param key - Encoded symbol from {@link bnfSymbolKey}.
|
|
112
|
+
*/
|
|
113
|
+
isTerminalKey(key) {
|
|
114
|
+
if (key.startsWith('"') && key.endsWith('"')) {
|
|
115
|
+
return true;
|
|
116
|
+
}
|
|
117
|
+
const bareName = key.includes(':') ? key.slice(key.indexOf(':') + 1) : key;
|
|
118
|
+
return this.tokenNames.includes(bareName);
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Finds the BNF symbol matching an encoded terminal key on some production rhs.
|
|
122
|
+
*
|
|
123
|
+
* @param key - Encoded terminal key.
|
|
124
|
+
*/
|
|
125
|
+
terminalSymbolForKey(key) {
|
|
126
|
+
for (const production of this.productions) {
|
|
127
|
+
for (const symbol of production.rhs) {
|
|
128
|
+
if (symbol.kind !== 'nonTerminal' && bnfParserSymbolKey(symbol) === key) {
|
|
129
|
+
return symbol;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=bnf-grammar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bnf-grammar.js","sourceRoot":"","sources":["../../../../src/lib/parse-table/bnf/bnf-grammar.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { BnfSymbol } from './bnf-symbol.js';
|
|
2
|
+
/**
|
|
3
|
+
* One plain BNF production after EBNF desugaring.
|
|
4
|
+
*/
|
|
5
|
+
export interface BnfProduction {
|
|
6
|
+
readonly id: number;
|
|
7
|
+
readonly name: string;
|
|
8
|
+
readonly rhs: readonly BnfSymbol[];
|
|
9
|
+
readonly variant: string | null;
|
|
10
|
+
readonly origin: string;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=bnf-production.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bnf-production.d.ts","sourceRoot":"","sources":["../../../../src/lib/parse-table/bnf/bnf-production.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD;;GAEG;AACH,MAAM,WAAW,aAAa;IAE1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,SAAS,SAAS,EAAE,CAAC;IACnC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CAC3B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bnf-production.js","sourceRoot":"","sources":["../../../../src/lib/parse-table/bnf/bnf-production.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Terminal literal from a quoted string in a production.
|
|
3
|
+
*/
|
|
4
|
+
export interface BnfTerminalSymbol {
|
|
5
|
+
readonly kind: 'terminal';
|
|
6
|
+
readonly value: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Reference to a parser non-terminal production.
|
|
10
|
+
*/
|
|
11
|
+
export interface BnfNonTerminalSymbol {
|
|
12
|
+
readonly kind: 'nonTerminal';
|
|
13
|
+
readonly name: string;
|
|
14
|
+
readonly binding: string | null;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Reference to a lexer token rule by name.
|
|
18
|
+
*/
|
|
19
|
+
export interface BnfTokenSymbol {
|
|
20
|
+
readonly kind: 'token';
|
|
21
|
+
readonly name: string;
|
|
22
|
+
readonly binding: string | null;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* One symbol on the right-hand side of a BNF production.
|
|
26
|
+
*/
|
|
27
|
+
export type BnfSymbol = BnfTerminalSymbol | BnfNonTerminalSymbol | BnfTokenSymbol;
|
|
28
|
+
/**
|
|
29
|
+
* Returns a stable string key for a BNF symbol, including binding metadata.
|
|
30
|
+
*
|
|
31
|
+
* @param symbol - Symbol to encode.
|
|
32
|
+
*/
|
|
33
|
+
export declare function bnfSymbolKey(symbol: BnfSymbol): string;
|
|
34
|
+
/**
|
|
35
|
+
* Returns the parser symbol key used in ACTION and GOTO tables.
|
|
36
|
+
*
|
|
37
|
+
* @param symbol - Symbol to encode.
|
|
38
|
+
*/
|
|
39
|
+
export declare function bnfParserSymbolKey(symbol: BnfSymbol): string;
|
|
40
|
+
//# sourceMappingURL=bnf-symbol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bnf-symbol.d.ts","sourceRoot":"","sources":["../../../../src/lib/parse-table/bnf/bnf-symbol.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAE9B,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IAEjC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAE3B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC;AAED;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,iBAAiB,GAAG,oBAAoB,GAAG,cAAc,CAAC;AAElF;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAiBtD;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAa5D"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Returns a stable string key for a BNF symbol, including binding metadata.
|
|
3
|
+
*
|
|
4
|
+
* @param symbol - Symbol to encode.
|
|
5
|
+
*/
|
|
6
|
+
export function bnfSymbolKey(symbol) {
|
|
7
|
+
switch (symbol.kind) {
|
|
8
|
+
case 'terminal':
|
|
9
|
+
return `"${symbol.value}"`;
|
|
10
|
+
case 'nonTerminal':
|
|
11
|
+
return symbol.binding === null
|
|
12
|
+
? symbol.name
|
|
13
|
+
: `[${symbol.binding}]:${symbol.name}`;
|
|
14
|
+
case 'token':
|
|
15
|
+
return symbol.binding === null
|
|
16
|
+
? symbol.name
|
|
17
|
+
: `[${symbol.binding}]:${symbol.name}`;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Returns the parser symbol key used in ACTION and GOTO tables.
|
|
22
|
+
*
|
|
23
|
+
* @param symbol - Symbol to encode.
|
|
24
|
+
*/
|
|
25
|
+
export function bnfParserSymbolKey(symbol) {
|
|
26
|
+
switch (symbol.kind) {
|
|
27
|
+
case 'terminal':
|
|
28
|
+
return `"${symbol.value}"`;
|
|
29
|
+
case 'nonTerminal':
|
|
30
|
+
return symbol.name;
|
|
31
|
+
case 'token':
|
|
32
|
+
return symbol.name;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
//# 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":"AAkCA;;;;GAIG;AACH,MAAM,UAAU,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,MAAM,UAAU,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,104 @@
|
|
|
1
|
+
import { Grammar } from '../../grammar/grammar.js';
|
|
2
|
+
import { BnfGrammar } from './bnf-grammar.js';
|
|
3
|
+
/**
|
|
4
|
+
* Expands EBNF productions into plain BNF suitable for LR analysis.
|
|
5
|
+
*/
|
|
6
|
+
export declare class EbnfDesugarer {
|
|
7
|
+
private readonly grammar;
|
|
8
|
+
private readonly tokenNames;
|
|
9
|
+
private readonly productions;
|
|
10
|
+
private nextProductionId;
|
|
11
|
+
private nextSyntheticId;
|
|
12
|
+
/**
|
|
13
|
+
* Creates a desugarer for a parsed grammar model.
|
|
14
|
+
*
|
|
15
|
+
* @param grammar - Parsed `.grammar` file model.
|
|
16
|
+
*/
|
|
17
|
+
constructor(grammar: Grammar);
|
|
18
|
+
/**
|
|
19
|
+
* Desugars all parser productions into a flat BNF grammar.
|
|
20
|
+
*
|
|
21
|
+
* @returns Plain BNF grammar with synthetic non-terminals for EBNF constructs.
|
|
22
|
+
*/
|
|
23
|
+
desugar(): BnfGrammar;
|
|
24
|
+
/**
|
|
25
|
+
* Expands one named production into plain BNF alternatives.
|
|
26
|
+
*
|
|
27
|
+
* @param production - Source production from the grammar model.
|
|
28
|
+
*/
|
|
29
|
+
private desugarProduction;
|
|
30
|
+
/**
|
|
31
|
+
* Records one BNF production with the next stable id.
|
|
32
|
+
*
|
|
33
|
+
* @param name - Left-hand side non-terminal.
|
|
34
|
+
* @param rhs - Right-hand side symbol sequence; empty for epsilon.
|
|
35
|
+
* @param variant - Choice label preserved from the source grammar, if any.
|
|
36
|
+
* @param origin - Source production or synthetic construct name.
|
|
37
|
+
*/
|
|
38
|
+
private addProduction;
|
|
39
|
+
/**
|
|
40
|
+
* Allocates a fresh synthetic non-terminal name scoped to a source production.
|
|
41
|
+
*
|
|
42
|
+
* @param ownerName - Production currently being expanded.
|
|
43
|
+
* @param suffix - Synthetic construct kind.
|
|
44
|
+
*/
|
|
45
|
+
private freshName;
|
|
46
|
+
/**
|
|
47
|
+
* Expands an EBNF expression into zero or more BNF right-hand sides.
|
|
48
|
+
*
|
|
49
|
+
* @param ownerName - Production providing scope for synthetic non-terminals.
|
|
50
|
+
* @param expression - EBNF expression subtree.
|
|
51
|
+
* @param variant - Choice label inherited from an outer alternative.
|
|
52
|
+
*/
|
|
53
|
+
private expandExpression;
|
|
54
|
+
/**
|
|
55
|
+
* Expands a concatenated sequence by combining element alternatives.
|
|
56
|
+
*
|
|
57
|
+
* @param elements - Sequence members in source order.
|
|
58
|
+
* @param variant - Choice label inherited from an outer alternative.
|
|
59
|
+
*/
|
|
60
|
+
private expandSequence;
|
|
61
|
+
/**
|
|
62
|
+
* Expands `[ element ]` into epsilon and the element expansion.
|
|
63
|
+
*
|
|
64
|
+
* @param element - Optional sub-expression.
|
|
65
|
+
* @param variant - Choice label inherited from an outer alternative.
|
|
66
|
+
*/
|
|
67
|
+
private expandOptional;
|
|
68
|
+
/**
|
|
69
|
+
* Expands `{ element }` using a fresh left-recursive list non-terminal.
|
|
70
|
+
*
|
|
71
|
+
* @param element - Repeated sub-expression.
|
|
72
|
+
* @param variant - Choice label inherited from an outer alternative.
|
|
73
|
+
*/
|
|
74
|
+
private expandRepeat;
|
|
75
|
+
/**
|
|
76
|
+
* Builds a non-terminal symbol reference.
|
|
77
|
+
*
|
|
78
|
+
* @param name - Referenced production name.
|
|
79
|
+
* @param binding - Optional slot binding from the source grammar.
|
|
80
|
+
*/
|
|
81
|
+
private nonTerminalSymbol;
|
|
82
|
+
/**
|
|
83
|
+
* Builds a token symbol reference.
|
|
84
|
+
*
|
|
85
|
+
* @param name - Referenced token rule name.
|
|
86
|
+
* @param binding - Optional slot binding from the source grammar.
|
|
87
|
+
*/
|
|
88
|
+
private tokenSymbol;
|
|
89
|
+
/**
|
|
90
|
+
* Resolves a bound or unbound reference to a token or non-terminal symbol.
|
|
91
|
+
*
|
|
92
|
+
* @param binding - Slot binding, or null for an unbound reference.
|
|
93
|
+
* @param name - Referenced symbol name.
|
|
94
|
+
*/
|
|
95
|
+
private resolveReference;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Desugars a parsed grammar into plain BNF for LR table construction.
|
|
99
|
+
*
|
|
100
|
+
* @param grammar - Parsed `.grammar` file model.
|
|
101
|
+
* @returns Flat BNF grammar with synthetic non-terminals for EBNF constructs.
|
|
102
|
+
*/
|
|
103
|
+
export declare function desugarEbnf(grammar: Grammar): BnfGrammar;
|
|
104
|
+
//# sourceMappingURL=desugar-ebnf.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"desugar-ebnf.d.ts","sourceRoot":"","sources":["../../../../src/lib/parse-table/bnf/desugar-ebnf.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAGnD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAc9C;;GAEG;AACH,qBAAa,aAAa;IAEtB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoB;IAC/C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAuB;IACnD,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,eAAe,CAAK;IAE5B;;;;OAIG;gBACgB,OAAO,EAAE,OAAO;IAMnC;;;;OAIG;IACI,OAAO,IAAI,UAAU;IAe5B;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAezB;;;;;;;OAOG;IACH,OAAO,CAAC,aAAa;IAiBrB;;;;;OAKG;IACH,OAAO,CAAC,SAAS;IAQjB;;;;;;OAMG;IACH,OAAO,CAAC,gBAAgB;IAgDxB;;;;;OAKG;IACH,OAAO,CAAC,cAAc;IA8BtB;;;;;OAKG;IACH,OAAO,CAAC,cAAc;IActB;;;;;OAKG;IACH,OAAO,CAAC,YAAY;IA8BpB;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB;IASzB;;;;;OAKG;IACH,OAAO,CAAC,WAAW;IASnB;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB;CAc3B;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,UAAU,CAGxD"}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import { BnfGrammar } from './bnf-grammar.js';
|
|
2
|
+
import { tokenInventory } from '../token-inventory.js';
|
|
3
|
+
/**
|
|
4
|
+
* Expands EBNF productions into plain BNF suitable for LR analysis.
|
|
5
|
+
*/
|
|
6
|
+
export class EbnfDesugarer {
|
|
7
|
+
grammar;
|
|
8
|
+
tokenNames;
|
|
9
|
+
productions = [];
|
|
10
|
+
nextProductionId = 0;
|
|
11
|
+
nextSyntheticId = 0;
|
|
12
|
+
/**
|
|
13
|
+
* Creates a desugarer for a parsed grammar model.
|
|
14
|
+
*
|
|
15
|
+
* @param grammar - Parsed `.grammar` file model.
|
|
16
|
+
*/
|
|
17
|
+
constructor(grammar) {
|
|
18
|
+
this.grammar = grammar;
|
|
19
|
+
this.tokenNames = tokenInventory(grammar);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Desugars all parser productions into a flat BNF grammar.
|
|
23
|
+
*
|
|
24
|
+
* @returns Plain BNF grammar with synthetic non-terminals for EBNF constructs.
|
|
25
|
+
*/
|
|
26
|
+
desugar() {
|
|
27
|
+
// Expand each declared production into one or more BNF productions.
|
|
28
|
+
for (const production of this.grammar.productions) {
|
|
29
|
+
this.desugarProduction(production);
|
|
30
|
+
}
|
|
31
|
+
return new BnfGrammar(this.grammar.startSymbol, this.productions, this.tokenNames);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Expands one named production into plain BNF alternatives.
|
|
35
|
+
*
|
|
36
|
+
* @param production - Source production from the grammar model.
|
|
37
|
+
*/
|
|
38
|
+
desugarProduction(production) {
|
|
39
|
+
const alternatives = this.expandExpression(production.name, production.expression, null);
|
|
40
|
+
for (const alternative of alternatives) {
|
|
41
|
+
this.addProduction(production.name, alternative.symbols, alternative.variant, production.name);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Records one BNF production with the next stable id.
|
|
46
|
+
*
|
|
47
|
+
* @param name - Left-hand side non-terminal.
|
|
48
|
+
* @param rhs - Right-hand side symbol sequence; empty for epsilon.
|
|
49
|
+
* @param variant - Choice label preserved from the source grammar, if any.
|
|
50
|
+
* @param origin - Source production or synthetic construct name.
|
|
51
|
+
*/
|
|
52
|
+
addProduction(name, rhs, variant, origin) {
|
|
53
|
+
this.productions.push({
|
|
54
|
+
id: this.nextProductionId,
|
|
55
|
+
name,
|
|
56
|
+
rhs,
|
|
57
|
+
variant,
|
|
58
|
+
origin,
|
|
59
|
+
});
|
|
60
|
+
this.nextProductionId += 1;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Allocates a fresh synthetic non-terminal name scoped to a source production.
|
|
64
|
+
*
|
|
65
|
+
* @param ownerName - Production currently being expanded.
|
|
66
|
+
* @param suffix - Synthetic construct kind.
|
|
67
|
+
*/
|
|
68
|
+
freshName(ownerName, suffix) {
|
|
69
|
+
const syntheticName = `${ownerName}$${suffix}_${this.nextSyntheticId}`;
|
|
70
|
+
this.nextSyntheticId += 1;
|
|
71
|
+
return syntheticName;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Expands an EBNF expression into zero or more BNF right-hand sides.
|
|
75
|
+
*
|
|
76
|
+
* @param ownerName - Production providing scope for synthetic non-terminals.
|
|
77
|
+
* @param expression - EBNF expression subtree.
|
|
78
|
+
* @param variant - Choice label inherited from an outer alternative.
|
|
79
|
+
*/
|
|
80
|
+
expandExpression(ownerName, expression, variant) {
|
|
81
|
+
switch (expression.kind) {
|
|
82
|
+
case 'reference':
|
|
83
|
+
return [{
|
|
84
|
+
symbols: [this.resolveReference(null, expression.name)],
|
|
85
|
+
variant,
|
|
86
|
+
}];
|
|
87
|
+
case 'boundReference':
|
|
88
|
+
return [{
|
|
89
|
+
symbols: [this.resolveReference(expression.binding, expression.name)],
|
|
90
|
+
variant,
|
|
91
|
+
}];
|
|
92
|
+
case 'terminal':
|
|
93
|
+
return [{
|
|
94
|
+
symbols: [{ kind: 'terminal', value: expression.value }],
|
|
95
|
+
variant,
|
|
96
|
+
}];
|
|
97
|
+
case 'sequence':
|
|
98
|
+
return this.expandSequence(ownerName, expression.elements, variant);
|
|
99
|
+
case 'choice':
|
|
100
|
+
return expression.alternatives.flatMap((alternative) => this.expandExpression(ownerName, alternative.expression, alternative.label ?? variant));
|
|
101
|
+
case 'optional':
|
|
102
|
+
return this.expandOptional(ownerName, expression.element, variant);
|
|
103
|
+
case 'repeat':
|
|
104
|
+
return this.expandRepeat(ownerName, expression.element, variant);
|
|
105
|
+
case 'group':
|
|
106
|
+
return this.expandExpression(ownerName, expression.element, variant);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Expands a concatenated sequence by combining element alternatives.
|
|
111
|
+
*
|
|
112
|
+
* @param elements - Sequence members in source order.
|
|
113
|
+
* @param variant - Choice label inherited from an outer alternative.
|
|
114
|
+
*/
|
|
115
|
+
expandSequence(ownerName, elements, variant) {
|
|
116
|
+
let results = [{ symbols: [], variant }];
|
|
117
|
+
for (const element of elements) {
|
|
118
|
+
const elementAlternatives = this.expandExpression(ownerName, element, variant);
|
|
119
|
+
const combined = [];
|
|
120
|
+
for (const left of results) {
|
|
121
|
+
for (const right of elementAlternatives) {
|
|
122
|
+
combined.push({
|
|
123
|
+
symbols: [...left.symbols, ...right.symbols],
|
|
124
|
+
variant: right.variant ?? left.variant,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
results = combined;
|
|
129
|
+
}
|
|
130
|
+
return results;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Expands `[ element ]` into epsilon and the element expansion.
|
|
134
|
+
*
|
|
135
|
+
* @param element - Optional sub-expression.
|
|
136
|
+
* @param variant - Choice label inherited from an outer alternative.
|
|
137
|
+
*/
|
|
138
|
+
expandOptional(ownerName, element, variant) {
|
|
139
|
+
const inner = this.expandExpression(ownerName, element, variant);
|
|
140
|
+
return [
|
|
141
|
+
{ symbols: [], variant },
|
|
142
|
+
...inner,
|
|
143
|
+
];
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Expands `{ element }` using a fresh left-recursive list non-terminal.
|
|
147
|
+
*
|
|
148
|
+
* @param element - Repeated sub-expression.
|
|
149
|
+
* @param variant - Choice label inherited from an outer alternative.
|
|
150
|
+
*/
|
|
151
|
+
expandRepeat(ownerName, element, variant) {
|
|
152
|
+
const repeatName = this.freshName(ownerName, 'repeat');
|
|
153
|
+
const elementAlternatives = this.expandExpression(repeatName, element, null);
|
|
154
|
+
const repeatReference = this.nonTerminalSymbol(repeatName, null);
|
|
155
|
+
// Build `R → α R` for each expansion of the repeated element.
|
|
156
|
+
for (const alternative of elementAlternatives) {
|
|
157
|
+
this.addProduction(repeatName, [...alternative.symbols, repeatReference], alternative.variant, repeatName);
|
|
158
|
+
}
|
|
159
|
+
// Add the epsilon base case `R → ε`.
|
|
160
|
+
this.addProduction(repeatName, [], null, repeatName);
|
|
161
|
+
return [{
|
|
162
|
+
symbols: [repeatReference],
|
|
163
|
+
variant,
|
|
164
|
+
}];
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Builds a non-terminal symbol reference.
|
|
168
|
+
*
|
|
169
|
+
* @param name - Referenced production name.
|
|
170
|
+
* @param binding - Optional slot binding from the source grammar.
|
|
171
|
+
*/
|
|
172
|
+
nonTerminalSymbol(name, binding) {
|
|
173
|
+
return {
|
|
174
|
+
kind: 'nonTerminal',
|
|
175
|
+
name,
|
|
176
|
+
binding,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Builds a token symbol reference.
|
|
181
|
+
*
|
|
182
|
+
* @param name - Referenced token rule name.
|
|
183
|
+
* @param binding - Optional slot binding from the source grammar.
|
|
184
|
+
*/
|
|
185
|
+
tokenSymbol(name, binding) {
|
|
186
|
+
return {
|
|
187
|
+
kind: 'token',
|
|
188
|
+
name,
|
|
189
|
+
binding,
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Resolves a bound or unbound reference to a token or non-terminal symbol.
|
|
194
|
+
*
|
|
195
|
+
* @param binding - Slot binding, or null for an unbound reference.
|
|
196
|
+
* @param name - Referenced symbol name.
|
|
197
|
+
*/
|
|
198
|
+
resolveReference(binding, name) {
|
|
199
|
+
if (this.grammar.hasProduction(name)) {
|
|
200
|
+
return this.nonTerminalSymbol(name, binding);
|
|
201
|
+
}
|
|
202
|
+
if (this.tokenNames.includes(name)) {
|
|
203
|
+
return this.tokenSymbol(name, binding);
|
|
204
|
+
}
|
|
205
|
+
return this.nonTerminalSymbol(name, binding);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Desugars a parsed grammar into plain BNF for LR table construction.
|
|
210
|
+
*
|
|
211
|
+
* @param grammar - Parsed `.grammar` file model.
|
|
212
|
+
* @returns Flat BNF grammar with synthetic non-terminals for EBNF constructs.
|
|
213
|
+
*/
|
|
214
|
+
export function desugarEbnf(grammar) {
|
|
215
|
+
return new EbnfDesugarer(grammar).desugar();
|
|
216
|
+
}
|
|
217
|
+
//# 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":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { bnfParserSymbolKey, bnfSymbolKey } from './bnf-symbol.js';
|
|
2
|
+
export type { BnfNonTerminalSymbol, BnfSymbol, BnfTerminalSymbol, BnfTokenSymbol, } from './bnf-symbol.js';
|
|
3
|
+
export type { BnfProduction } from './bnf-production.js';
|
|
4
|
+
export { AUGMENTED_START_SYMBOL, BnfGrammar } from './bnf-grammar.js';
|
|
5
|
+
export { desugarEbnf, EbnfDesugarer } from './desugar-ebnf.js';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/parse-table/bnf/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACnE,YAAY,EACR,oBAAoB,EACpB,SAAS,EACT,iBAAiB,EACjB,cAAc,GACjB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/parse-table/bnf/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAQnE,OAAO,EAAE,sBAAsB,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type BnfGrammar } from './bnf/bnf-grammar.js';
|
|
2
|
+
import type { LrAlgorithm } from './lr-algorithm.js';
|
|
3
|
+
import { LrParseTable } from './table/lr-parse-table.js';
|
|
4
|
+
/**
|
|
5
|
+
* Builds an LR parse table for a plain BNF grammar.
|
|
6
|
+
*
|
|
7
|
+
* @param grammar - Plain BNF grammar to analyze.
|
|
8
|
+
* @param algorithm - LR table construction algorithm.
|
|
9
|
+
*/
|
|
10
|
+
export declare function buildLrTable(grammar: BnfGrammar, algorithm: LrAlgorithm): LrParseTable;
|
|
11
|
+
//# sourceMappingURL=build-lr-table.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-lr-table.d.ts","sourceRoot":"","sources":["../../../src/lib/parse-table/build-lr-table.ts"],"names":[],"mappings":"AAGA,OAAO,EAA0B,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAgBrD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAGzD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,GAAG,YAAY,CAmBtF"}
|