parser-lr 0.4.0 → 0.5.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 +35 -1
- package/bin/parser-lr.js +369 -9068
- package/bin/parser-lr.js.map +1 -1
- package/dist/lib/grammar/grammar-json-path.d.ts +2 -0
- package/dist/lib/grammar/grammar-json-path.d.ts.map +1 -0
- package/dist/lib/grammar/grammar-json-path.esm.d.ts +5 -0
- package/dist/lib/grammar/grammar-json-path.esm.d.ts.map +1 -0
- package/dist/lib/grammar/grammar-json-path.esm.js +9 -0
- package/dist/lib/grammar/grammar-json-path.esm.js.map +1 -0
- package/dist/lib/grammar/grammar-json-path.js +2 -0
- package/dist/lib/grammar/grammar-json-path.js.map +1 -0
- package/dist/lib/grammar/grammar.json +1218 -4476
- package/dist/lib/grammar/index.d.ts +2 -0
- package/dist/lib/grammar/index.d.ts.map +1 -1
- package/dist/lib/grammar/index.js +1 -0
- package/dist/lib/grammar/index.js.map +1 -1
- package/dist/lib/grammar/meta-grammar-table.d.ts.map +1 -1
- package/dist/lib/grammar/meta-grammar-table.js +4 -2
- package/dist/lib/grammar/meta-grammar-table.js.map +1 -1
- package/dist/lib/grammar/table-validator.d.ts +26 -0
- package/dist/lib/grammar/table-validator.d.ts.map +1 -0
- package/dist/lib/grammar/table-validator.js +211 -0
- package/dist/lib/grammar/table-validator.js.map +1 -0
- package/dist/lib/index.d.ts +2 -0
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +1 -0
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/transform/cst-transformer.d.ts +14 -0
- package/dist/lib/transform/cst-transformer.d.ts.map +1 -1
- package/dist/lib/transform/cst-transformer.js +82 -11
- package/dist/lib/transform/cst-transformer.js.map +1 -1
- package/dist/lib/transform/grammar-fixture.d.ts +56 -0
- package/dist/lib/transform/grammar-fixture.d.ts.map +1 -0
- package/dist/lib/transform/grammar-fixture.js +101 -0
- package/dist/lib/transform/grammar-fixture.js.map +1 -0
- package/dist/lib-cjs/ast/ast-node.js +70 -0
- package/dist/lib-cjs/ast/ast-node.js.map +1 -0
- package/dist/lib-cjs/errors/index.js +9 -0
- package/dist/lib-cjs/errors/index.js.map +1 -0
- package/dist/lib-cjs/errors/parser-lr-error.js +52 -0
- package/dist/lib-cjs/errors/parser-lr-error.js.map +1 -0
- package/dist/lib-cjs/grammar/ast-schema.js +43 -0
- package/dist/lib-cjs/grammar/ast-schema.js.map +1 -0
- package/dist/lib-cjs/grammar/ast-type.js +3 -0
- package/dist/lib-cjs/grammar/ast-type.js.map +1 -0
- package/dist/lib-cjs/grammar/expression.js +3 -0
- package/dist/lib-cjs/grammar/expression.js.map +1 -0
- package/dist/lib-cjs/grammar/grammar-from-cst.js +641 -0
- package/dist/lib-cjs/grammar/grammar-from-cst.js.map +1 -0
- package/dist/lib-cjs/grammar/grammar-json-path.js +13 -0
- package/dist/lib-cjs/grammar/grammar-json-path.js.map +1 -0
- package/dist/lib-cjs/grammar/grammar-literals.js +71 -0
- package/dist/lib-cjs/grammar/grammar-literals.js.map +1 -0
- package/dist/lib-cjs/grammar/grammar.js +64 -0
- package/dist/lib-cjs/grammar/grammar.js.map +1 -0
- package/dist/lib-cjs/grammar/grammar.json +5760 -0
- package/dist/lib-cjs/grammar/index.js +19 -0
- package/dist/lib-cjs/grammar/index.js.map +1 -0
- package/dist/lib-cjs/grammar/meta-grammar-table.js +39 -0
- package/dist/lib-cjs/grammar/meta-grammar-table.js.map +1 -0
- package/dist/lib-cjs/grammar/production.js +3 -0
- package/dist/lib-cjs/grammar/production.js.map +1 -0
- package/dist/lib-cjs/grammar/read-grammar-error.js +22 -0
- package/dist/lib-cjs/grammar/read-grammar-error.js.map +1 -0
- package/dist/lib-cjs/grammar/read-grammar.js +24 -0
- package/dist/lib-cjs/grammar/read-grammar.js.map +1 -0
- package/dist/lib-cjs/grammar/table-validator.js +215 -0
- package/dist/lib-cjs/grammar/table-validator.js.map +1 -0
- package/dist/lib-cjs/grammar/token-rule.js +3 -0
- package/dist/lib-cjs/grammar/token-rule.js.map +1 -0
- package/dist/lib-cjs/grammar/transform-expression.js +3 -0
- package/dist/lib-cjs/grammar/transform-expression.js.map +1 -0
- package/dist/lib-cjs/grammar/transform-rule.js +3 -0
- package/dist/lib-cjs/grammar/transform-rule.js.map +1 -0
- package/dist/lib-cjs/grammar/transform-schema.js +43 -0
- package/dist/lib-cjs/grammar/transform-schema.js.map +1 -0
- package/dist/lib-cjs/index.js +66 -0
- package/dist/lib-cjs/index.js.map +1 -0
- package/dist/lib-cjs/lexer/index.js +32 -0
- package/dist/lib-cjs/lexer/index.js.map +1 -0
- package/dist/lib-cjs/lexer/lexer-compile-error.js +22 -0
- package/dist/lib-cjs/lexer/lexer-compile-error.js.map +1 -0
- package/dist/lib-cjs/lexer/lexer-compile.js +201 -0
- package/dist/lib-cjs/lexer/lexer-compile.js.map +1 -0
- package/dist/lib-cjs/lexer/lexer-error.js +22 -0
- package/dist/lib-cjs/lexer/lexer-error.js.map +1 -0
- package/dist/lib-cjs/lexer/lexer-input-error.js +17 -0
- package/dist/lib-cjs/lexer/lexer-input-error.js.map +1 -0
- package/dist/lib-cjs/lexer/lexer-state-error.js +19 -0
- package/dist/lib-cjs/lexer/lexer-state-error.js.map +1 -0
- package/dist/lib-cjs/lexer/lexer.js +278 -0
- package/dist/lib-cjs/lexer/lexer.js.map +1 -0
- package/dist/lib-cjs/lexer/token.js +44 -0
- package/dist/lib-cjs/lexer/token.js.map +1 -0
- package/dist/lib-cjs/package.json +3 -0
- package/dist/lib-cjs/parse-context-error.js +19 -0
- package/dist/lib-cjs/parse-context-error.js.map +1 -0
- package/dist/lib-cjs/parse-context.js +137 -0
- package/dist/lib-cjs/parse-context.js.map +1 -0
- package/dist/lib-cjs/parse-output-error.js +19 -0
- package/dist/lib-cjs/parse-output-error.js.map +1 -0
- package/dist/lib-cjs/parse-output.js +18 -0
- package/dist/lib-cjs/parse-output.js.map +1 -0
- package/dist/lib-cjs/parse-table/analysis/first-follow.js +294 -0
- package/dist/lib-cjs/parse-table/analysis/first-follow.js.map +1 -0
- package/dist/lib-cjs/parse-table/analysis/index.js +9 -0
- package/dist/lib-cjs/parse-table/analysis/index.js.map +1 -0
- package/dist/lib-cjs/parse-table/bnf/bnf-grammar.js +140 -0
- package/dist/lib-cjs/parse-table/bnf/bnf-grammar.js.map +1 -0
- package/dist/lib-cjs/parse-table/bnf/bnf-production.js +3 -0
- package/dist/lib-cjs/parse-table/bnf/bnf-production.js.map +1 -0
- package/dist/lib-cjs/parse-table/bnf/bnf-symbol.js +39 -0
- package/dist/lib-cjs/parse-table/bnf/bnf-symbol.js.map +1 -0
- package/dist/lib-cjs/parse-table/bnf/desugar-ebnf.js +224 -0
- package/dist/lib-cjs/parse-table/bnf/desugar-ebnf.js.map +1 -0
- package/dist/lib-cjs/parse-table/bnf/index.js +13 -0
- package/dist/lib-cjs/parse-table/bnf/index.js.map +1 -0
- package/dist/lib-cjs/parse-table/build-lr-table.js +171 -0
- package/dist/lib-cjs/parse-table/build-lr-table.js.map +1 -0
- package/dist/lib-cjs/parse-table/index.js +49 -0
- package/dist/lib-cjs/parse-table/index.js.map +1 -0
- package/dist/lib-cjs/parse-table/lr-algorithm-error.js +19 -0
- package/dist/lib-cjs/parse-table/lr-algorithm-error.js.map +1 -0
- package/dist/lib-cjs/parse-table/lr-algorithm.js +31 -0
- package/dist/lib-cjs/parse-table/lr-algorithm.js.map +1 -0
- package/dist/lib-cjs/parse-table/lr0/index.js +14 -0
- package/dist/lib-cjs/parse-table/lr0/index.js.map +1 -0
- package/dist/lib-cjs/parse-table/lr0/lr0-item-set.js +286 -0
- package/dist/lib-cjs/parse-table/lr0/lr0-item-set.js.map +1 -0
- package/dist/lib-cjs/parse-table/lr1/index.js +18 -0
- package/dist/lib-cjs/parse-table/lr1/index.js.map +1 -0
- package/dist/lib-cjs/parse-table/lr1/lr1-item-set.js +432 -0
- package/dist/lib-cjs/parse-table/lr1/lr1-item-set.js.map +1 -0
- package/dist/lib-cjs/parse-table/parse-table-build-error.js +24 -0
- package/dist/lib-cjs/parse-table/parse-table-build-error.js.map +1 -0
- package/dist/lib-cjs/parse-table/parse-table-error.js +19 -0
- package/dist/lib-cjs/parse-table/parse-table-error.js.map +1 -0
- package/dist/lib-cjs/parse-table/parse-table-json.js +12 -0
- package/dist/lib-cjs/parse-table/parse-table-json.js.map +1 -0
- package/dist/lib-cjs/parse-table/parse-table.js +345 -0
- package/dist/lib-cjs/parse-table/parse-table.js.map +1 -0
- package/dist/lib-cjs/parse-table/slr/index.js +13 -0
- package/dist/lib-cjs/parse-table/slr/index.js.map +1 -0
- package/dist/lib-cjs/parse-table/slr/parse-action.js +8 -0
- package/dist/lib-cjs/parse-table/slr/parse-action.js.map +1 -0
- package/dist/lib-cjs/parse-table/slr/slr-table.js +18 -0
- package/dist/lib-cjs/parse-table/slr/slr-table.js.map +1 -0
- package/dist/lib-cjs/parse-table/table/index.js +21 -0
- package/dist/lib-cjs/parse-table/table/index.js.map +1 -0
- package/dist/lib-cjs/parse-table/table/lr-parse-table.js +192 -0
- package/dist/lib-cjs/parse-table/table/lr-parse-table.js.map +1 -0
- package/dist/lib-cjs/parse-table/table/parse-action.js +54 -0
- package/dist/lib-cjs/parse-table/table/parse-action.js.map +1 -0
- package/dist/lib-cjs/parse-table/table/table-builder-base.js +153 -0
- package/dist/lib-cjs/parse-table/table/table-builder-base.js.map +1 -0
- package/dist/lib-cjs/parse-table/token-inventory.js +18 -0
- package/dist/lib-cjs/parse-table/token-inventory.js.map +1 -0
- package/dist/lib-cjs/parser-lr.js +143 -0
- package/dist/lib-cjs/parser-lr.js.map +1 -0
- package/dist/lib-cjs/shift-reduce/index.js +11 -0
- package/dist/lib-cjs/shift-reduce/index.js.map +1 -0
- package/dist/lib-cjs/shift-reduce/shift-reduce-engine.js +224 -0
- package/dist/lib-cjs/shift-reduce/shift-reduce-engine.js.map +1 -0
- package/dist/lib-cjs/transform/binding-map.js +82 -0
- package/dist/lib-cjs/transform/binding-map.js.map +1 -0
- package/dist/lib-cjs/transform/cst-transformer.js +480 -0
- package/dist/lib-cjs/transform/cst-transformer.js.map +1 -0
- package/dist/lib-cjs/transform/grammar-fixture.js +109 -0
- package/dist/lib-cjs/transform/grammar-fixture.js.map +1 -0
- package/dist/lib-cjs/transform/index.js +12 -0
- package/dist/lib-cjs/transform/index.js.map +1 -0
- package/docs/grammar.md +80 -0
- package/docs/parser-lr-enhancement-proposals.md +548 -0
- package/grammars/6502.grammar +233 -0
- package/grammars/calc.grammar +30 -0
- package/grammars/ferrite.grammar +991 -0
- package/grammars/fixtures/build-optional/build-optional.grammar +32 -0
- package/grammars/fixtures/build-optional/input.txt +1 -0
- package/grammars/fixtures/comparison-op/comparison-op.grammar +28 -0
- package/grammars/fixtures/comparison-op/input.txt +1 -0
- package/grammars/fixtures/flatten-repeat/flatten-repeat.grammar +28 -0
- package/grammars/fixtures/flatten-repeat/input.txt +1 -0
- package/grammars/fixtures/help-topic/help-topic.grammar +28 -0
- package/grammars/fixtures/help-topic/input.txt +1 -0
- package/grammars/fixtures/let-target/input.txt +1 -0
- package/grammars/fixtures/let-target/let-target.grammar +33 -0
- package/grammars/fixtures/pass-preserves-production/bare-terminal/bare-terminal.grammar +24 -0
- package/grammars/fixtures/pass-preserves-production/bare-terminal/input.txt +1 -0
- package/grammars/fixtures/pass-preserves-production/labeled-variant/input-end-if.txt +1 -0
- package/grammars/fixtures/pass-preserves-production/labeled-variant/input-end.txt +1 -0
- package/grammars/fixtures/pass-preserves-production/labeled-variant/labeled-variant.grammar +24 -0
- package/grammars/fixtures/pass-preserves-production/optional-absent/input.txt +1 -0
- package/grammars/fixtures/pass-preserves-production/optional-absent/optional-absent.grammar +24 -0
- package/grammars/fixtures/pass-preserves-production/optional-present/input.txt +1 -0
- package/grammars/fixtures/pass-preserves-production/optional-present/optional-present.grammar +24 -0
- package/grammars/grammar.grammar +428 -0
- package/grammars/lisp.grammar +95 -0
- package/package.json +10 -5
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grammar-fixture.d.ts","sourceRoot":"","sources":["../../../src/lib/transform/grammar-fixture.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAGlD;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAE/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CACxC;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKpE;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,EAAE,CAG7E;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAG/E;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CACxB,UAAU,EAAE,MAAM,EAClB,aAAa,SAAc,GAC5B,OAAO,GAAG,IAAI,CAchB;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,kBAAkB,EAAE,CAyCtE;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC1B,OAAO,EAAE,kBAAkB,EAC3B,QAAQ,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK;IAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAA;CAAE,GACtE,OAAO,GAAG,IAAI,CAehB"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { existsSync, readdirSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { basename, join } from 'node:path';
|
|
3
|
+
import { ParseContext } from '../parse-context.js';
|
|
4
|
+
/**
|
|
5
|
+
* Returns the `.grammar` file for one fixture directory.
|
|
6
|
+
*
|
|
7
|
+
* Fixture grammars are named after their directory (for example
|
|
8
|
+
* `bare-terminal/bare-terminal.grammar`). The meta-grammar keeps the reserved
|
|
9
|
+
* name `grammar.grammar` at the repo root only.
|
|
10
|
+
*
|
|
11
|
+
* @param fixtureDir - Directory containing a fixture grammar and input files.
|
|
12
|
+
*/
|
|
13
|
+
export function fixtureGrammarPath(fixtureDir) {
|
|
14
|
+
const grammarPath = join(fixtureDir, `${basename(fixtureDir)}.grammar`);
|
|
15
|
+
return existsSync(grammarPath) ? grammarPath : null;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Returns child AST nodes matching a symbol name.
|
|
19
|
+
*
|
|
20
|
+
* @param node - Parent AST node.
|
|
21
|
+
* @param symbol - Child symbol to find.
|
|
22
|
+
*/
|
|
23
|
+
export function findChildrenBySymbol(node, symbol) {
|
|
24
|
+
return node.children.filter((child) => child.symbol === symbol);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Returns the first child AST node matching a symbol name.
|
|
28
|
+
*
|
|
29
|
+
* @param node - Parent AST node.
|
|
30
|
+
* @param symbol - Child symbol to find.
|
|
31
|
+
*/
|
|
32
|
+
export function findChildBySymbol(node, symbol) {
|
|
33
|
+
return node.children.find((child) => child.symbol === symbol) ?? null;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Parses one fixture grammar and input file into an AST.
|
|
37
|
+
*
|
|
38
|
+
* @param fixtureDir - Directory containing a named fixture grammar and an input file.
|
|
39
|
+
* @param inputFileName - Input file name within the fixture directory.
|
|
40
|
+
*/
|
|
41
|
+
export function parseFixture(fixtureDir, inputFileName = 'input.txt') {
|
|
42
|
+
const grammarPath = fixtureGrammarPath(fixtureDir);
|
|
43
|
+
if (grammarPath === null) {
|
|
44
|
+
throw new Error(`fixture grammar not found in ${fixtureDir}`);
|
|
45
|
+
}
|
|
46
|
+
const grammarSource = readFileSync(grammarPath, 'utf8');
|
|
47
|
+
const input = readFileSync(join(fixtureDir, inputFileName), 'utf8').trimEnd();
|
|
48
|
+
const context = ParseContext.fromGrammar(grammarSource, 'lr1');
|
|
49
|
+
return context.parseSource(input);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Discovers fixture directories containing a named `.grammar` file under a root path.
|
|
53
|
+
*
|
|
54
|
+
* @param rootDir - Root directory to scan recursively.
|
|
55
|
+
*/
|
|
56
|
+
export function discoverFixtures(rootDir) {
|
|
57
|
+
const fixtures = [];
|
|
58
|
+
const visit = (directory) => {
|
|
59
|
+
const grammarPath = fixtureGrammarPath(directory);
|
|
60
|
+
if (grammarPath !== null) {
|
|
61
|
+
const inputFiles = readdirSync(directory)
|
|
62
|
+
.filter((name) => name.startsWith('input') && name.endsWith('.txt'))
|
|
63
|
+
.sort();
|
|
64
|
+
for (const inputFile of inputFiles) {
|
|
65
|
+
const baseName = inputFile.replace(/^input/, '').replace(/\.txt$/, '');
|
|
66
|
+
const expectedName = baseName === '' ? 'expected.json' : `expected${baseName}.json`;
|
|
67
|
+
const expectedPath = join(directory, expectedName);
|
|
68
|
+
fixtures.push({
|
|
69
|
+
name: `${directory.split('/').slice(-2).join('/')}/${inputFile}`,
|
|
70
|
+
grammarPath,
|
|
71
|
+
inputPath: join(directory, inputFile),
|
|
72
|
+
expectedPath: existsSync(expectedPath) ? expectedPath : null,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
for (const entry of readdirSync(directory, { withFileTypes: true })) {
|
|
77
|
+
if (entry.isDirectory()) {
|
|
78
|
+
visit(join(directory, entry.name));
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
visit(rootDir);
|
|
83
|
+
return fixtures;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Parses a fixture case and compares to expected JSON when present.
|
|
87
|
+
*
|
|
88
|
+
* @param fixture - Fixture metadata.
|
|
89
|
+
*/
|
|
90
|
+
export function runFixtureCase(fixture, expectFn) {
|
|
91
|
+
const grammarSource = readFileSync(fixture.grammarPath, 'utf8');
|
|
92
|
+
const input = readFileSync(fixture.inputPath, 'utf8').trimEnd();
|
|
93
|
+
const context = ParseContext.fromGrammar(grammarSource, 'lr1');
|
|
94
|
+
const ast = context.parseSource(input);
|
|
95
|
+
if (fixture.expectedPath !== null) {
|
|
96
|
+
const expected = JSON.parse(readFileSync(fixture.expectedPath, 'utf8'));
|
|
97
|
+
expectFn(ast).toEqual(expected);
|
|
98
|
+
}
|
|
99
|
+
return ast;
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=grammar-fixture.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grammar-fixture.js","sourceRoot":"","sources":["../../../src/lib/transform/grammar-fixture.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AstNode = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Tree node used for both parse (CST) and abstract (AST) phases.
|
|
6
|
+
*
|
|
7
|
+
* After parsing, {@link symbol} is a grammar production and {@link variant}
|
|
8
|
+
* is the matched `#` label. After transform, {@link symbol} is an AST type
|
|
9
|
+
* name and {@link variant} is the AST alternative label.
|
|
10
|
+
*/
|
|
11
|
+
class AstNode {
|
|
12
|
+
symbol;
|
|
13
|
+
children;
|
|
14
|
+
text;
|
|
15
|
+
location;
|
|
16
|
+
variant;
|
|
17
|
+
productionId;
|
|
18
|
+
origin;
|
|
19
|
+
/**
|
|
20
|
+
* Creates a tree node.
|
|
21
|
+
*
|
|
22
|
+
* @param symbol - Production or AST type name.
|
|
23
|
+
* @param children - Child subtrees.
|
|
24
|
+
* @param text - Lexeme or literal text for leaves; null for interior nodes.
|
|
25
|
+
* @param location - Optional source span.
|
|
26
|
+
* @param variant - `#` alternative label when present.
|
|
27
|
+
* @param productionId - Parse table production id for CST nodes, or null after transform.
|
|
28
|
+
* @param origin - Source production or synthetic construct name for CST nodes.
|
|
29
|
+
*/
|
|
30
|
+
constructor(symbol, children = [], text = null, location = null, variant = null, productionId = null, origin = null) {
|
|
31
|
+
this.symbol = symbol;
|
|
32
|
+
this.children = children;
|
|
33
|
+
this.text = text;
|
|
34
|
+
this.location = location;
|
|
35
|
+
this.variant = variant;
|
|
36
|
+
this.productionId = productionId;
|
|
37
|
+
this.origin = origin;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Whether this node is a terminal leaf with lexeme text.
|
|
41
|
+
*/
|
|
42
|
+
get isTerminal() {
|
|
43
|
+
return this.text !== null;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Builds an interior node from a grammar or AST reduction.
|
|
47
|
+
*
|
|
48
|
+
* @param symbol - Production or AST type name.
|
|
49
|
+
* @param children - Reduced child subtrees.
|
|
50
|
+
* @param location - Optional source span covering the full production.
|
|
51
|
+
* @param variant - `#` alternative label when present.
|
|
52
|
+
* @param productionId - Parse table production id for CST nodes.
|
|
53
|
+
* @param origin - Source production or synthetic construct name for CST nodes.
|
|
54
|
+
*/
|
|
55
|
+
static rule(symbol, children, location = null, variant = null, productionId = null, origin = null) {
|
|
56
|
+
return new AstNode(symbol, children, null, location, variant, productionId, origin);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Builds a terminal leaf node.
|
|
60
|
+
*
|
|
61
|
+
* @param symbol - Terminal symbol name.
|
|
62
|
+
* @param text - Matched lexeme text.
|
|
63
|
+
* @param location - Optional source span for the lexeme.
|
|
64
|
+
*/
|
|
65
|
+
static terminal(symbol, text, location = null) {
|
|
66
|
+
return new AstNode(symbol, [], text, location, null);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
exports.AstNode = AstNode;
|
|
70
|
+
//# sourceMappingURL=ast-node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ast-node.js","sourceRoot":"","sources":["../../../src/lib/ast/ast-node.ts"],"names":[],"mappings":";;;AASA;;;;;;GAMG;AACH,MAAa,OAAO;IAcI;IACA;IACA;IACA;IACA;IACA;IACA;IAlBpB;;;;;;;;;;OAUG;IACH,YACoB,MAAc,EACd,WAA+B,EAAE,EACjC,OAAsB,IAAI,EAC1B,WAAkC,IAAI,EACtC,UAAyB,IAAI,EAC7B,eAA8B,IAAI,EAClC,SAAwB,IAAI;QAN5B,WAAM,GAAN,MAAM,CAAQ;QACd,aAAQ,GAAR,QAAQ,CAAyB;QACjC,SAAI,GAAJ,IAAI,CAAsB;QAC1B,aAAQ,GAAR,QAAQ,CAA8B;QACtC,YAAO,GAAP,OAAO,CAAsB;QAC7B,iBAAY,GAAZ,YAAY,CAAsB;QAClC,WAAM,GAAN,MAAM,CAAsB;IAGhD,CAAC;IAED;;OAEG;IACH,IAAW,UAAU;QAEjB,OAAO,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC;IAC9B,CAAC;IAED;;;;;;;;;OASG;IACI,MAAM,CAAC,IAAI,CACd,MAAc,EACd,QAA4B,EAC5B,WAAkC,IAAI,EACtC,UAAyB,IAAI,EAC7B,eAA8B,IAAI,EAClC,SAAwB,IAAI;QAG5B,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;IACxF,CAAC;IAED;;;;;;OAMG;IACI,MAAM,CAAC,QAAQ,CAClB,MAAc,EACd,IAAY,EACZ,WAAkC,IAAI;QAGtC,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;IACzD,CAAC;CACJ;AAtED,0BAsEC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ParserLrError = exports.messageContainsStackTrace = exports.isParserLrError = exports.formatUserError = void 0;
|
|
4
|
+
var parser_lr_error_js_1 = require("./parser-lr-error.js");
|
|
5
|
+
Object.defineProperty(exports, "formatUserError", { enumerable: true, get: function () { return parser_lr_error_js_1.formatUserError; } });
|
|
6
|
+
Object.defineProperty(exports, "isParserLrError", { enumerable: true, get: function () { return parser_lr_error_js_1.isParserLrError; } });
|
|
7
|
+
Object.defineProperty(exports, "messageContainsStackTrace", { enumerable: true, get: function () { return parser_lr_error_js_1.messageContainsStackTrace; } });
|
|
8
|
+
Object.defineProperty(exports, "ParserLrError", { enumerable: true, get: function () { return parser_lr_error_js_1.ParserLrError; } });
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/errors/index.ts"],"names":[],"mappings":";;;AAAA,2DAK8B;AAJ1B,qHAAA,eAAe,OAAA;AACf,qHAAA,eAAe,OAAA;AACf,+HAAA,yBAAyB,OAAA;AACzB,mHAAA,aAAa,OAAA"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ParserLrError = void 0;
|
|
4
|
+
exports.isParserLrError = isParserLrError;
|
|
5
|
+
exports.formatUserError = formatUserError;
|
|
6
|
+
exports.messageContainsStackTrace = messageContainsStackTrace;
|
|
7
|
+
/**
|
|
8
|
+
* Base class for library errors surfaced to callers and the CLI.
|
|
9
|
+
*/
|
|
10
|
+
class ParserLrError extends Error {
|
|
11
|
+
/**
|
|
12
|
+
* Creates a parser-lr error with a caller-safe message.
|
|
13
|
+
*
|
|
14
|
+
* @param message - Human-readable failure description without stack frames.
|
|
15
|
+
*/
|
|
16
|
+
constructor(message) {
|
|
17
|
+
super(message);
|
|
18
|
+
this.name = new.target.name;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
exports.ParserLrError = ParserLrError;
|
|
22
|
+
/**
|
|
23
|
+
* Returns whether a value is a parser-lr domain error.
|
|
24
|
+
*
|
|
25
|
+
* @param error - Value to test.
|
|
26
|
+
*/
|
|
27
|
+
function isParserLrError(error) {
|
|
28
|
+
return error instanceof ParserLrError;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Returns a user-facing message for an error value.
|
|
32
|
+
*
|
|
33
|
+
* @param error - Thrown value or Error instance.
|
|
34
|
+
*/
|
|
35
|
+
function formatUserError(error) {
|
|
36
|
+
if (error instanceof ParserLrError) {
|
|
37
|
+
return error.message;
|
|
38
|
+
}
|
|
39
|
+
if (error instanceof Error) {
|
|
40
|
+
return error.message;
|
|
41
|
+
}
|
|
42
|
+
return String(error);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Returns whether a message contains embedded stack trace frames.
|
|
46
|
+
*
|
|
47
|
+
* @param message - Error message text to inspect.
|
|
48
|
+
*/
|
|
49
|
+
function messageContainsStackTrace(message) {
|
|
50
|
+
return /\n\s+at .+/.test(message);
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=parser-lr-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser-lr-error.js","sourceRoot":"","sources":["../../../src/lib/errors/parser-lr-error.ts"],"names":[],"mappings":";;;AAsBA,0CAGC;AAOD,0CAaC;AAOD,8DAGC;AAvDD;;GAEG;AACH,MAAa,aAAc,SAAQ,KAAK;IAEpC;;;;OAIG;IACH,YAAmB,OAAe;QAE9B,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC;IAChC,CAAC;CACJ;AAZD,sCAYC;AAED;;;;GAIG;AACH,SAAgB,eAAe,CAAC,KAAc;IAE1C,OAAO,KAAK,YAAY,aAAa,CAAC;AAC1C,CAAC;AAED;;;;GAIG;AACH,SAAgB,eAAe,CAAC,KAAc;IAE1C,IAAI,KAAK,YAAY,aAAa,EAClC,CAAC;QACG,OAAO,KAAK,CAAC,OAAO,CAAC;IACzB,CAAC;IAED,IAAI,KAAK,YAAY,KAAK,EAC1B,CAAC;QACG,OAAO,KAAK,CAAC,OAAO,CAAC;IACzB,CAAC;IAED,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACzB,CAAC;AAED;;;;GAIG;AACH,SAAgB,yBAAyB,CAAC,OAAe;IAErD,OAAO,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AstSchema = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* AST shape declared in the `ast` section of a `.grammar` file.
|
|
6
|
+
*/
|
|
7
|
+
class AstSchema {
|
|
8
|
+
types;
|
|
9
|
+
typesByName;
|
|
10
|
+
/**
|
|
11
|
+
* Creates an AST schema from declared types.
|
|
12
|
+
*
|
|
13
|
+
* @param types - Named AST types from the `ast` section.
|
|
14
|
+
*/
|
|
15
|
+
constructor(types) {
|
|
16
|
+
this.types = types;
|
|
17
|
+
// Index types by name for lookup.
|
|
18
|
+
const typesByName = new Map();
|
|
19
|
+
for (const type of types) {
|
|
20
|
+
typesByName.set(type.name, type);
|
|
21
|
+
}
|
|
22
|
+
this.typesByName = typesByName;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Returns an AST type by name.
|
|
26
|
+
*
|
|
27
|
+
* @param name - Type name to look up.
|
|
28
|
+
* @returns The matching type, or null when the name is undefined.
|
|
29
|
+
*/
|
|
30
|
+
type(name) {
|
|
31
|
+
return this.typesByName.get(name) ?? null;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Whether a named AST type is defined in this schema.
|
|
35
|
+
*
|
|
36
|
+
* @param name - Type name to test.
|
|
37
|
+
*/
|
|
38
|
+
hasType(name) {
|
|
39
|
+
return this.typesByName.has(name);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
exports.AstSchema = AstSchema;
|
|
43
|
+
//# sourceMappingURL=ast-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ast-schema.js","sourceRoot":"","sources":["../../../src/lib/grammar/ast-schema.ts"],"names":[],"mappings":";;;AAEA;;GAEG;AACH,MAAa,SAAS;IASiB;IAPlB,WAAW,CAA+B;IAE3D;;;;OAIG;IACH,YAAmC,KAAyB;QAAzB,UAAK,GAAL,KAAK,CAAoB;QAExD,kCAAkC;QAClC,MAAM,WAAW,GAAG,IAAI,GAAG,EAAmB,CAAC;QAE/C,KAAK,MAAM,IAAI,IAAI,KAAK,EACxB,CAAC;YACG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACrC,CAAC;QAED,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IACnC,CAAC;IAED;;;;;OAKG;IACI,IAAI,CAAC,IAAY;QAEpB,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;IAC9C,CAAC;IAED;;;;OAIG;IACI,OAAO,CAAC,IAAY;QAEvB,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;CACJ;AA1CD,8BA0CC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ast-type.js","sourceRoot":"","sources":["../../../src/lib/grammar/ast-type.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expression.js","sourceRoot":"","sources":["../../../src/lib/grammar/expression.ts"],"names":[],"mappings":""}
|