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,15 @@
|
|
|
1
|
+
import { ParserLrError } from './errors/parser-lr-error.js';
|
|
2
|
+
/**
|
|
3
|
+
* Thrown when parse output cannot be formatted for a requested interchange format.
|
|
4
|
+
*/
|
|
5
|
+
export class ParseOutputError extends ParserLrError {
|
|
6
|
+
/**
|
|
7
|
+
* Creates a parse output formatting error.
|
|
8
|
+
*
|
|
9
|
+
* @param format - Requested output format name.
|
|
10
|
+
*/
|
|
11
|
+
constructor(format) {
|
|
12
|
+
super(`Unsupported output format ${JSON.stringify(format)}`);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=parse-output-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-output-error.js","sourceRoot":"","sources":["../../src/lib/parse-output-error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAE5D;;GAEG;AACH,MAAM,OAAO,gBAAiB,SAAQ,aAAa;IAE/C;;;;OAIG;IACH,YAAmB,MAAc;QAE7B,KAAK,CAAC,6BAA6B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACjE,CAAC;CACJ"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { AstNode } from './ast/ast-node.js';
|
|
2
|
+
/**
|
|
3
|
+
* Formats parse output for a named interchange format.
|
|
4
|
+
*
|
|
5
|
+
* @param tree - Parsed concrete syntax tree, or null on syntax error.
|
|
6
|
+
* @param format - Output format name.
|
|
7
|
+
* @returns Formatted output text.
|
|
8
|
+
*/
|
|
9
|
+
export declare function formatParseOutput(tree: AstNode | null, format: string): string;
|
|
10
|
+
//# sourceMappingURL=parse-output.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-output.d.ts","sourceRoot":"","sources":["../../src/lib/parse-output.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAGjD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAQ9E"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { ParseOutputError } from './parse-output-error.js';
|
|
2
|
+
/**
|
|
3
|
+
* Formats parse output for a named interchange format.
|
|
4
|
+
*
|
|
5
|
+
* @param tree - Parsed concrete syntax tree, or null on syntax error.
|
|
6
|
+
* @param format - Output format name.
|
|
7
|
+
* @returns Formatted output text.
|
|
8
|
+
*/
|
|
9
|
+
export function formatParseOutput(tree, format) {
|
|
10
|
+
if (format !== 'json') {
|
|
11
|
+
throw new ParseOutputError(format);
|
|
12
|
+
}
|
|
13
|
+
return JSON.stringify({ ast: tree }, null, 4);
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=parse-output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-output.js","sourceRoot":"","sources":["../../src/lib/parse-output.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAoB,EAAE,MAAc;IAElE,IAAI,MAAM,KAAK,MAAM,EACrB,CAAC;QACG,MAAM,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;IAED,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAClD,CAAC"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { type BnfGrammar } from '../bnf/bnf-grammar.js';
|
|
2
|
+
import type { BnfProduction } from '../bnf/bnf-production.js';
|
|
3
|
+
import { type BnfSymbol } from '../bnf/bnf-symbol.js';
|
|
4
|
+
/**
|
|
5
|
+
* Nullable non-terminals and FIRST/FOLLOW sets for a BNF grammar.
|
|
6
|
+
*/
|
|
7
|
+
export declare class GrammarAnalysis {
|
|
8
|
+
private readonly nullable;
|
|
9
|
+
private readonly firstByNonTerminal;
|
|
10
|
+
private readonly followByNonTerminal;
|
|
11
|
+
/**
|
|
12
|
+
* Computes nullable, FIRST, and FOLLOW sets for a BNF grammar.
|
|
13
|
+
*
|
|
14
|
+
* @param grammar - Plain BNF grammar to analyze.
|
|
15
|
+
*/
|
|
16
|
+
constructor(grammar: BnfGrammar);
|
|
17
|
+
/**
|
|
18
|
+
* Returns whether a non-terminal can derive the empty string.
|
|
19
|
+
*
|
|
20
|
+
* @param name - Non-terminal name to test.
|
|
21
|
+
*/
|
|
22
|
+
isNullable(name: string): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Returns FIRST symbols for a non-terminal as encoded terminal keys.
|
|
25
|
+
*
|
|
26
|
+
* @param name - Non-terminal name to look up.
|
|
27
|
+
*/
|
|
28
|
+
firstOfNonTerminal(name: string): ReadonlySet<string>;
|
|
29
|
+
/**
|
|
30
|
+
* Returns FOLLOW symbols for a non-terminal as encoded terminal keys.
|
|
31
|
+
*
|
|
32
|
+
* @param name - Non-terminal name to look up.
|
|
33
|
+
*/
|
|
34
|
+
followOfNonTerminal(name: string): ReadonlySet<string>;
|
|
35
|
+
/**
|
|
36
|
+
* Returns FIRST symbols for a symbol sequence.
|
|
37
|
+
*
|
|
38
|
+
* @param symbols - Right-hand side prefix or full sequence.
|
|
39
|
+
*/
|
|
40
|
+
firstOfSequence(symbols: readonly BnfSymbol[]): ReadonlySet<string>;
|
|
41
|
+
/**
|
|
42
|
+
* Returns FIRST symbols for one grammar symbol.
|
|
43
|
+
*
|
|
44
|
+
* @param symbol - Terminal, token, or non-terminal symbol.
|
|
45
|
+
*/
|
|
46
|
+
firstOfSymbol(symbol: BnfSymbol): ReadonlySet<string>;
|
|
47
|
+
/**
|
|
48
|
+
* Returns whether a symbol can begin with the empty string.
|
|
49
|
+
*
|
|
50
|
+
* @param symbol - Terminal, token, or non-terminal symbol.
|
|
51
|
+
*/
|
|
52
|
+
isSymbolNullable(symbol: BnfSymbol): boolean;
|
|
53
|
+
/**
|
|
54
|
+
* Computes nullable non-terminals by fixed-point iteration.
|
|
55
|
+
*
|
|
56
|
+
* @param grammar - Plain BNF grammar to analyze.
|
|
57
|
+
*/
|
|
58
|
+
private static computeNullable;
|
|
59
|
+
/**
|
|
60
|
+
* Computes FIRST sets for every non-terminal.
|
|
61
|
+
*
|
|
62
|
+
* @param grammar - Plain BNF grammar to analyze.
|
|
63
|
+
* @param nullable - Nullable non-terminal names.
|
|
64
|
+
*/
|
|
65
|
+
private static computeFirst;
|
|
66
|
+
/**
|
|
67
|
+
* Computes FOLLOW sets for every non-terminal.
|
|
68
|
+
*
|
|
69
|
+
* @param grammar - Plain BNF grammar to analyze.
|
|
70
|
+
* @param firstByNonTerminal - Precomputed FIRST sets.
|
|
71
|
+
* @param nullable - Nullable non-terminal names.
|
|
72
|
+
*/
|
|
73
|
+
private static computeFollow;
|
|
74
|
+
/**
|
|
75
|
+
* Adds FIRST symbols for a symbol sequence into a working set.
|
|
76
|
+
*
|
|
77
|
+
* @param target - FIRST set being accumulated.
|
|
78
|
+
* @param symbols - Right-hand side sequence.
|
|
79
|
+
* @param firstByNonTerminal - Precomputed FIRST sets.
|
|
80
|
+
* @param nullable - Nullable non-terminal names.
|
|
81
|
+
*/
|
|
82
|
+
private static addFirstOfSequence;
|
|
83
|
+
/**
|
|
84
|
+
* Returns FIRST symbols for a symbol sequence using precomputed maps.
|
|
85
|
+
*
|
|
86
|
+
* @param symbols - Right-hand side sequence.
|
|
87
|
+
* @param firstByNonTerminal - Precomputed FIRST sets.
|
|
88
|
+
* @param nullable - Nullable non-terminal names.
|
|
89
|
+
*/
|
|
90
|
+
private static firstOfSequenceStatic;
|
|
91
|
+
/**
|
|
92
|
+
* Returns whether every symbol in a sequence is nullable.
|
|
93
|
+
*
|
|
94
|
+
* @param symbols - Right-hand side sequence.
|
|
95
|
+
* @param nullable - Nullable non-terminal names.
|
|
96
|
+
*/
|
|
97
|
+
private static isSequenceNullableStatic;
|
|
98
|
+
/**
|
|
99
|
+
* Adds all members of `source` into `target`.
|
|
100
|
+
*
|
|
101
|
+
* @param target - Destination set.
|
|
102
|
+
* @param source - Source set.
|
|
103
|
+
*/
|
|
104
|
+
private static addAll;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Computes nullable, FIRST, and FOLLOW sets for a BNF grammar.
|
|
108
|
+
*
|
|
109
|
+
* @param grammar - Plain BNF grammar to analyze.
|
|
110
|
+
*/
|
|
111
|
+
export declare function analyzeGrammar(grammar: BnfGrammar): GrammarAnalysis;
|
|
112
|
+
/**
|
|
113
|
+
* Returns a readable production label for diagnostics and tests.
|
|
114
|
+
*
|
|
115
|
+
* @param production - Production to format.
|
|
116
|
+
*/
|
|
117
|
+
export declare function formatBnfProduction(production: BnfProduction): string;
|
|
118
|
+
/**
|
|
119
|
+
* Returns whether a grammar uses the augmented `$accept` start production.
|
|
120
|
+
*
|
|
121
|
+
* @param grammar - Grammar to inspect.
|
|
122
|
+
*/
|
|
123
|
+
export declare function isAugmentedGrammar(grammar: BnfGrammar): boolean;
|
|
124
|
+
//# sourceMappingURL=first-follow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"first-follow.d.ts","sourceRoot":"","sources":["../../../../src/lib/parse-table/analysis/first-follow.ts"],"names":[],"mappings":"AAEA,OAAO,EAA0B,KAAK,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAChF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAoC,KAAK,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAExF;;GAEG;AACH,qBAAa,eAAe;IAExB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAsB;IAC/C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAA2C;IAC9E,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAA2C;IAE/E;;;;OAIG;gBACgB,OAAO,EAAE,UAAU;IAWtC;;;;OAIG;IACI,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAKxC;;;;OAIG;IACI,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC;IAK5D;;;;OAIG;IACI,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC;IAK7D;;;;OAIG;IACI,eAAe,CAAC,OAAO,EAAE,SAAS,SAAS,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC;IAyB1E;;;;OAIG;IACI,aAAa,CAAC,MAAM,EAAE,SAAS,GAAG,WAAW,CAAC,MAAM,CAAC;IAU5D;;;;OAIG;IACI,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO;IAUnD;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,eAAe;IAiC9B;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,YAAY;IAoC3B;;;;;;OAMG;IACH,OAAO,CAAC,MAAM,CAAC,aAAa;IAgE5B;;;;;;;OAOG;IACH,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAajC;;;;;;OAMG;IACH,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAqCpC;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,wBAAwB;IAcvC;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,MAAM;CAOxB;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,UAAU,GAAG,eAAe,CAGnE;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,aAAa,GAAG,MAAM,CAUrE;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAG/D"}
|
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
import { EOF_TOKEN_NAME } from '../../lexer/token.js';
|
|
2
|
+
import { AUGMENTED_START_SYMBOL } from '../bnf/bnf-grammar.js';
|
|
3
|
+
import { bnfParserSymbolKey, bnfSymbolKey } from '../bnf/bnf-symbol.js';
|
|
4
|
+
/**
|
|
5
|
+
* Nullable non-terminals and FIRST/FOLLOW sets for a BNF grammar.
|
|
6
|
+
*/
|
|
7
|
+
export class GrammarAnalysis {
|
|
8
|
+
nullable;
|
|
9
|
+
firstByNonTerminal;
|
|
10
|
+
followByNonTerminal;
|
|
11
|
+
/**
|
|
12
|
+
* Computes nullable, FIRST, and FOLLOW sets for a BNF grammar.
|
|
13
|
+
*
|
|
14
|
+
* @param grammar - Plain BNF grammar to analyze.
|
|
15
|
+
*/
|
|
16
|
+
constructor(grammar) {
|
|
17
|
+
this.nullable = GrammarAnalysis.computeNullable(grammar);
|
|
18
|
+
this.firstByNonTerminal = GrammarAnalysis.computeFirst(grammar, this.nullable);
|
|
19
|
+
this.followByNonTerminal = GrammarAnalysis.computeFollow(grammar, this.firstByNonTerminal, this.nullable);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Returns whether a non-terminal can derive the empty string.
|
|
23
|
+
*
|
|
24
|
+
* @param name - Non-terminal name to test.
|
|
25
|
+
*/
|
|
26
|
+
isNullable(name) {
|
|
27
|
+
return this.nullable.has(name);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Returns FIRST symbols for a non-terminal as encoded terminal keys.
|
|
31
|
+
*
|
|
32
|
+
* @param name - Non-terminal name to look up.
|
|
33
|
+
*/
|
|
34
|
+
firstOfNonTerminal(name) {
|
|
35
|
+
return this.firstByNonTerminal.get(name) ?? new Set();
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Returns FOLLOW symbols for a non-terminal as encoded terminal keys.
|
|
39
|
+
*
|
|
40
|
+
* @param name - Non-terminal name to look up.
|
|
41
|
+
*/
|
|
42
|
+
followOfNonTerminal(name) {
|
|
43
|
+
return this.followByNonTerminal.get(name) ?? new Set();
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Returns FIRST symbols for a symbol sequence.
|
|
47
|
+
*
|
|
48
|
+
* @param symbols - Right-hand side prefix or full sequence.
|
|
49
|
+
*/
|
|
50
|
+
firstOfSequence(symbols) {
|
|
51
|
+
const result = new Set();
|
|
52
|
+
let allNullable = true;
|
|
53
|
+
for (const symbol of symbols) {
|
|
54
|
+
const symbolFirst = this.firstOfSymbol(symbol);
|
|
55
|
+
GrammarAnalysis.addAll(result, symbolFirst);
|
|
56
|
+
if (!this.isSymbolNullable(symbol)) {
|
|
57
|
+
allNullable = false;
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
if (allNullable) {
|
|
62
|
+
result.add(EOF_TOKEN_NAME);
|
|
63
|
+
}
|
|
64
|
+
return result;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Returns FIRST symbols for one grammar symbol.
|
|
68
|
+
*
|
|
69
|
+
* @param symbol - Terminal, token, or non-terminal symbol.
|
|
70
|
+
*/
|
|
71
|
+
firstOfSymbol(symbol) {
|
|
72
|
+
if (symbol.kind === 'nonTerminal') {
|
|
73
|
+
return this.firstOfNonTerminal(symbol.name);
|
|
74
|
+
}
|
|
75
|
+
return new Set([bnfParserSymbolKey(symbol)]);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Returns whether a symbol can begin with the empty string.
|
|
79
|
+
*
|
|
80
|
+
* @param symbol - Terminal, token, or non-terminal symbol.
|
|
81
|
+
*/
|
|
82
|
+
isSymbolNullable(symbol) {
|
|
83
|
+
if (symbol.kind === 'nonTerminal') {
|
|
84
|
+
return this.isNullable(symbol.name);
|
|
85
|
+
}
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Computes nullable non-terminals by fixed-point iteration.
|
|
90
|
+
*
|
|
91
|
+
* @param grammar - Plain BNF grammar to analyze.
|
|
92
|
+
*/
|
|
93
|
+
static computeNullable(grammar) {
|
|
94
|
+
const nullable = new Set();
|
|
95
|
+
let changed = true;
|
|
96
|
+
while (changed) {
|
|
97
|
+
changed = false;
|
|
98
|
+
for (const production of grammar.productions) {
|
|
99
|
+
if (production.rhs.length === 0 && !nullable.has(production.name)) {
|
|
100
|
+
nullable.add(production.name);
|
|
101
|
+
changed = true;
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
if (production.rhs.every((symbol) => symbol.kind === 'nonTerminal' && nullable.has(symbol.name))) {
|
|
105
|
+
if (!nullable.has(production.name)) {
|
|
106
|
+
nullable.add(production.name);
|
|
107
|
+
changed = true;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return nullable;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Computes FIRST sets for every non-terminal.
|
|
116
|
+
*
|
|
117
|
+
* @param grammar - Plain BNF grammar to analyze.
|
|
118
|
+
* @param nullable - Nullable non-terminal names.
|
|
119
|
+
*/
|
|
120
|
+
static computeFirst(grammar, nullable) {
|
|
121
|
+
const firstByNonTerminal = new Map();
|
|
122
|
+
for (const name of grammar.nonTerminalNames()) {
|
|
123
|
+
firstByNonTerminal.set(name, new Set());
|
|
124
|
+
}
|
|
125
|
+
let changed = true;
|
|
126
|
+
while (changed) {
|
|
127
|
+
changed = false;
|
|
128
|
+
for (const production of grammar.productions) {
|
|
129
|
+
const first = firstByNonTerminal.get(production.name) ?? new Set();
|
|
130
|
+
const before = first.size;
|
|
131
|
+
GrammarAnalysis.addFirstOfSequence(first, production.rhs, firstByNonTerminal, nullable);
|
|
132
|
+
if (first.size !== before) {
|
|
133
|
+
changed = true;
|
|
134
|
+
}
|
|
135
|
+
firstByNonTerminal.set(production.name, first);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return firstByNonTerminal;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Computes FOLLOW sets for every non-terminal.
|
|
142
|
+
*
|
|
143
|
+
* @param grammar - Plain BNF grammar to analyze.
|
|
144
|
+
* @param firstByNonTerminal - Precomputed FIRST sets.
|
|
145
|
+
* @param nullable - Nullable non-terminal names.
|
|
146
|
+
*/
|
|
147
|
+
static computeFollow(grammar, firstByNonTerminal, nullable) {
|
|
148
|
+
const followByNonTerminal = new Map();
|
|
149
|
+
for (const name of grammar.nonTerminalNames()) {
|
|
150
|
+
followByNonTerminal.set(name, new Set());
|
|
151
|
+
}
|
|
152
|
+
const startFollow = followByNonTerminal.get(grammar.startSymbol) ?? new Set();
|
|
153
|
+
startFollow.add(EOF_TOKEN_NAME);
|
|
154
|
+
followByNonTerminal.set(grammar.startSymbol, startFollow);
|
|
155
|
+
let changed = true;
|
|
156
|
+
while (changed) {
|
|
157
|
+
changed = false;
|
|
158
|
+
for (const production of grammar.productions) {
|
|
159
|
+
for (let index = 0; index < production.rhs.length; index += 1) {
|
|
160
|
+
const symbol = production.rhs[index];
|
|
161
|
+
if (symbol.kind !== 'nonTerminal') {
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
const follow = followByNonTerminal.get(symbol.name) ?? new Set();
|
|
165
|
+
const before = follow.size;
|
|
166
|
+
const beta = production.rhs.slice(index + 1);
|
|
167
|
+
const betaFirst = GrammarAnalysis.firstOfSequenceStatic(beta, firstByNonTerminal, nullable);
|
|
168
|
+
GrammarAnalysis.addAll(follow, betaFirst);
|
|
169
|
+
if (beta.length === 0 || GrammarAnalysis.isSequenceNullableStatic(beta, nullable)) {
|
|
170
|
+
const lhsFollow = followByNonTerminal.get(production.name) ?? new Set();
|
|
171
|
+
GrammarAnalysis.addAll(follow, lhsFollow);
|
|
172
|
+
}
|
|
173
|
+
if (follow.size !== before) {
|
|
174
|
+
changed = true;
|
|
175
|
+
}
|
|
176
|
+
followByNonTerminal.set(symbol.name, follow);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return followByNonTerminal;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Adds FIRST symbols for a symbol sequence into a working set.
|
|
184
|
+
*
|
|
185
|
+
* @param target - FIRST set being accumulated.
|
|
186
|
+
* @param symbols - Right-hand side sequence.
|
|
187
|
+
* @param firstByNonTerminal - Precomputed FIRST sets.
|
|
188
|
+
* @param nullable - Nullable non-terminal names.
|
|
189
|
+
*/
|
|
190
|
+
static addFirstOfSequence(target, symbols, firstByNonTerminal, nullable) {
|
|
191
|
+
GrammarAnalysis.addAll(target, GrammarAnalysis.firstOfSequenceStatic(symbols, firstByNonTerminal, nullable));
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Returns FIRST symbols for a symbol sequence using precomputed maps.
|
|
195
|
+
*
|
|
196
|
+
* @param symbols - Right-hand side sequence.
|
|
197
|
+
* @param firstByNonTerminal - Precomputed FIRST sets.
|
|
198
|
+
* @param nullable - Nullable non-terminal names.
|
|
199
|
+
*/
|
|
200
|
+
static firstOfSequenceStatic(symbols, firstByNonTerminal, nullable) {
|
|
201
|
+
const result = new Set();
|
|
202
|
+
let allNullable = true;
|
|
203
|
+
for (const symbol of symbols) {
|
|
204
|
+
if (symbol.kind === 'nonTerminal') {
|
|
205
|
+
GrammarAnalysis.addAll(result, firstByNonTerminal.get(symbol.name) ?? new Set());
|
|
206
|
+
if (!nullable.has(symbol.name)) {
|
|
207
|
+
allNullable = false;
|
|
208
|
+
break;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
else {
|
|
212
|
+
result.add(bnfParserSymbolKey(symbol));
|
|
213
|
+
allNullable = false;
|
|
214
|
+
break;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
if (allNullable) {
|
|
218
|
+
result.add(EOF_TOKEN_NAME);
|
|
219
|
+
}
|
|
220
|
+
return result;
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Returns whether every symbol in a sequence is nullable.
|
|
224
|
+
*
|
|
225
|
+
* @param symbols - Right-hand side sequence.
|
|
226
|
+
* @param nullable - Nullable non-terminal names.
|
|
227
|
+
*/
|
|
228
|
+
static isSequenceNullableStatic(symbols, nullable) {
|
|
229
|
+
if (symbols.length === 0) {
|
|
230
|
+
return true;
|
|
231
|
+
}
|
|
232
|
+
return symbols.every((symbol) => symbol.kind === 'nonTerminal' && nullable.has(symbol.name));
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Adds all members of `source` into `target`.
|
|
236
|
+
*
|
|
237
|
+
* @param target - Destination set.
|
|
238
|
+
* @param source - Source set.
|
|
239
|
+
*/
|
|
240
|
+
static addAll(target, source) {
|
|
241
|
+
for (const value of source) {
|
|
242
|
+
target.add(value);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Computes nullable, FIRST, and FOLLOW sets for a BNF grammar.
|
|
248
|
+
*
|
|
249
|
+
* @param grammar - Plain BNF grammar to analyze.
|
|
250
|
+
*/
|
|
251
|
+
export function analyzeGrammar(grammar) {
|
|
252
|
+
return new GrammarAnalysis(grammar);
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Returns a readable production label for diagnostics and tests.
|
|
256
|
+
*
|
|
257
|
+
* @param production - Production to format.
|
|
258
|
+
*/
|
|
259
|
+
export function formatBnfProduction(production) {
|
|
260
|
+
if (production.rhs.length === 0) {
|
|
261
|
+
return `${production.name} → ε`;
|
|
262
|
+
}
|
|
263
|
+
const rhs = production.rhs.map((symbol) => bnfSymbolKey(symbol)).join(' ');
|
|
264
|
+
return `${production.name} → ${rhs}`;
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Returns whether a grammar uses the augmented `$accept` start production.
|
|
268
|
+
*
|
|
269
|
+
* @param grammar - Grammar to inspect.
|
|
270
|
+
*/
|
|
271
|
+
export function isAugmentedGrammar(grammar) {
|
|
272
|
+
return grammar.startSymbol === AUGMENTED_START_SYMBOL;
|
|
273
|
+
}
|
|
274
|
+
//# sourceMappingURL=first-follow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"first-follow.js","sourceRoot":"","sources":["../../../../src/lib/parse-table/analysis/first-follow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/parse-table/analysis/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/parse-table/analysis/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { BnfProduction } from './bnf-production.js';
|
|
2
|
+
import { type BnfSymbol } from './bnf-symbol.js';
|
|
3
|
+
/** Sentinel non-terminal introducing the augmented start production. */
|
|
4
|
+
export declare const AUGMENTED_START_SYMBOL = "$accept";
|
|
5
|
+
/**
|
|
6
|
+
* Plain BNF grammar used for LR table construction.
|
|
7
|
+
*/
|
|
8
|
+
export declare class BnfGrammar {
|
|
9
|
+
readonly startSymbol: string;
|
|
10
|
+
readonly productions: readonly BnfProduction[];
|
|
11
|
+
readonly tokenNames: readonly string[];
|
|
12
|
+
private readonly productionsByName;
|
|
13
|
+
private readonly productionById;
|
|
14
|
+
/**
|
|
15
|
+
* Creates a BNF grammar from its productions and token inventory.
|
|
16
|
+
*
|
|
17
|
+
* @param startSymbol - Entry non-terminal from the source grammar.
|
|
18
|
+
* @param productions - Flat BNF productions with stable ids.
|
|
19
|
+
* @param tokenNames - Token rule names treated as terminals.
|
|
20
|
+
*/
|
|
21
|
+
constructor(startSymbol: string, productions: readonly BnfProduction[], tokenNames: readonly string[]);
|
|
22
|
+
/**
|
|
23
|
+
* Returns productions with a given left-hand side non-terminal.
|
|
24
|
+
*
|
|
25
|
+
* @param name - Non-terminal name to look up.
|
|
26
|
+
*/
|
|
27
|
+
productionsFor(name: string): readonly BnfProduction[];
|
|
28
|
+
/**
|
|
29
|
+
* Returns a production by its stable id.
|
|
30
|
+
*
|
|
31
|
+
* @param id - Production id assigned during desugaring.
|
|
32
|
+
*/
|
|
33
|
+
production(id: number): BnfProduction | null;
|
|
34
|
+
/**
|
|
35
|
+
* Whether a name is a declared token rule.
|
|
36
|
+
*
|
|
37
|
+
* @param name - Candidate token name.
|
|
38
|
+
*/
|
|
39
|
+
isToken(name: string): boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Returns every non-terminal name appearing in the grammar.
|
|
42
|
+
*/
|
|
43
|
+
nonTerminalNames(): readonly string[];
|
|
44
|
+
/**
|
|
45
|
+
* Returns every terminal key appearing on a production right-hand side.
|
|
46
|
+
*/
|
|
47
|
+
terminalKeys(): readonly string[];
|
|
48
|
+
/**
|
|
49
|
+
* Builds an augmented grammar with `$accept → startSymbol`.
|
|
50
|
+
*/
|
|
51
|
+
augment(): BnfGrammar;
|
|
52
|
+
/**
|
|
53
|
+
* Returns whether a symbol key is a shift symbol (terminal or token).
|
|
54
|
+
*
|
|
55
|
+
* @param key - Encoded symbol from {@link bnfSymbolKey}.
|
|
56
|
+
*/
|
|
57
|
+
isTerminalKey(key: string): boolean;
|
|
58
|
+
/**
|
|
59
|
+
* Finds the BNF symbol matching an encoded terminal key on some production rhs.
|
|
60
|
+
*
|
|
61
|
+
* @param key - Encoded terminal key.
|
|
62
|
+
*/
|
|
63
|
+
terminalSymbolForKey(key: string): BnfSymbol | null;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=bnf-grammar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bnf-grammar.d.ts","sourceRoot":"","sources":["../../../../src/lib/parse-table/bnf/bnf-grammar.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAoC,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEnF,wEAAwE;AACxE,eAAO,MAAM,sBAAsB,YAAY,CAAC;AAEhD;;GAEG;AACH,qBAAa,UAAU;aAaC,WAAW,EAAE,MAAM;aACnB,WAAW,EAAE,SAAS,aAAa,EAAE;aACrC,UAAU,EAAE,SAAS,MAAM,EAAE;IAbjD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAgD;IAClF,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAqC;IAEpE;;;;;;OAMG;gBAEiB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,SAAS,aAAa,EAAE,EACrC,UAAU,EAAE,SAAS,MAAM,EAAE;IAmBjD;;;;OAIG;IACI,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,aAAa,EAAE;IAK7D;;;;OAIG;IACI,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI;IAKnD;;;;OAIG;IACI,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAKrC;;OAEG;IACI,gBAAgB,IAAI,SAAS,MAAM,EAAE;IAoB5C;;OAEG;IACI,YAAY,IAAI,SAAS,MAAM,EAAE;IAkBxC;;OAEG;IACI,OAAO,IAAI,UAAU;IAuB5B;;;;OAIG;IACI,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAY1C;;;;OAIG;IACI,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;CAe7D"}
|