parser-lr 0.6.0 → 0.7.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 +14 -30
- package/bin/parser-lr.js +11388 -11409
- package/bin/parser-lr.js.map +1 -1
- package/dist/lib/grammar/index.d.ts +1 -1
- package/dist/lib/grammar/index.d.ts.map +1 -1
- package/dist/lib/grammar/index.js +1 -1
- package/dist/lib/grammar/index.js.map +1 -1
- package/dist/lib/grammar/meta-grammar-table.d.ts +0 -12
- package/dist/lib/grammar/meta-grammar-table.d.ts.map +1 -1
- package/dist/lib/grammar/meta-grammar-table.js +5 -22
- package/dist/lib/grammar/meta-grammar-table.js.map +1 -1
- package/dist/lib/grammar-entry.d.ts +42 -0
- package/dist/lib/grammar-entry.d.ts.map +1 -0
- package/dist/lib/grammar-entry.js +45 -0
- package/dist/lib/grammar-entry.js.map +1 -0
- package/dist/lib/index.d.ts +7 -5
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +0 -3
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/parse-context.d.ts +4 -15
- package/dist/lib/parse-context.d.ts.map +1 -1
- package/dist/lib/parse-context.js +4 -23
- package/dist/lib/parse-context.js.map +1 -1
- package/dist/lib/transform/grammar-fixture.js +3 -3
- package/dist/lib/transform/grammar-fixture.js.map +1 -1
- package/docs/parser-lr-browser-lib-split.md +174 -0
- package/package.json +26 -3
- package/dist/lib/grammar/grammar-json-path.d.ts +0 -2
- package/dist/lib/grammar/grammar-json-path.d.ts.map +0 -1
- package/dist/lib/grammar/grammar-json-path.esm.d.ts +0 -5
- package/dist/lib/grammar/grammar-json-path.esm.d.ts.map +0 -1
- package/dist/lib/grammar/grammar-json-path.esm.js +0 -9
- package/dist/lib/grammar/grammar-json-path.esm.js.map +0 -1
- package/dist/lib/grammar/grammar-json-path.js +0 -2
- package/dist/lib/grammar/grammar-json-path.js.map +0 -1
- package/dist/lib-cjs/ast/ast-node.js +0 -70
- package/dist/lib-cjs/ast/ast-node.js.map +0 -1
- package/dist/lib-cjs/errors/index.js +0 -9
- package/dist/lib-cjs/errors/index.js.map +0 -1
- package/dist/lib-cjs/errors/parser-lr-error.js +0 -52
- package/dist/lib-cjs/errors/parser-lr-error.js.map +0 -1
- package/dist/lib-cjs/grammar/ast-schema.js +0 -43
- package/dist/lib-cjs/grammar/ast-schema.js.map +0 -1
- package/dist/lib-cjs/grammar/ast-type.js +0 -3
- package/dist/lib-cjs/grammar/ast-type.js.map +0 -1
- package/dist/lib-cjs/grammar/expression.js +0 -3
- package/dist/lib-cjs/grammar/expression.js.map +0 -1
- package/dist/lib-cjs/grammar/grammar-from-cst.js +0 -641
- package/dist/lib-cjs/grammar/grammar-from-cst.js.map +0 -1
- package/dist/lib-cjs/grammar/grammar-json-path.js +0 -13
- package/dist/lib-cjs/grammar/grammar-json-path.js.map +0 -1
- package/dist/lib-cjs/grammar/grammar-literals.js +0 -71
- package/dist/lib-cjs/grammar/grammar-literals.js.map +0 -1
- package/dist/lib-cjs/grammar/grammar.js +0 -64
- package/dist/lib-cjs/grammar/grammar.js.map +0 -1
- package/dist/lib-cjs/grammar/grammar.json +0 -5760
- package/dist/lib-cjs/grammar/index.js +0 -21
- package/dist/lib-cjs/grammar/index.js.map +0 -1
- package/dist/lib-cjs/grammar/meta-grammar-table.js +0 -68
- package/dist/lib-cjs/grammar/meta-grammar-table.js.map +0 -1
- package/dist/lib-cjs/grammar/production.js +0 -3
- package/dist/lib-cjs/grammar/production.js.map +0 -1
- package/dist/lib-cjs/grammar/read-grammar-error.js +0 -22
- package/dist/lib-cjs/grammar/read-grammar-error.js.map +0 -1
- package/dist/lib-cjs/grammar/read-grammar.js +0 -24
- package/dist/lib-cjs/grammar/read-grammar.js.map +0 -1
- package/dist/lib-cjs/grammar/table-validator.js +0 -262
- package/dist/lib-cjs/grammar/table-validator.js.map +0 -1
- package/dist/lib-cjs/grammar/token-rule.js +0 -3
- package/dist/lib-cjs/grammar/token-rule.js.map +0 -1
- package/dist/lib-cjs/grammar/transform-expression.js +0 -3
- package/dist/lib-cjs/grammar/transform-expression.js.map +0 -1
- package/dist/lib-cjs/grammar/transform-rule.js +0 -3
- package/dist/lib-cjs/grammar/transform-rule.js.map +0 -1
- package/dist/lib-cjs/grammar/transform-schema.js +0 -43
- package/dist/lib-cjs/grammar/transform-schema.js.map +0 -1
- package/dist/lib-cjs/index.js +0 -66
- package/dist/lib-cjs/index.js.map +0 -1
- package/dist/lib-cjs/lexer/index.js +0 -32
- package/dist/lib-cjs/lexer/index.js.map +0 -1
- package/dist/lib-cjs/lexer/lexer-compile-error.js +0 -22
- package/dist/lib-cjs/lexer/lexer-compile-error.js.map +0 -1
- package/dist/lib-cjs/lexer/lexer-compile.js +0 -201
- package/dist/lib-cjs/lexer/lexer-compile.js.map +0 -1
- package/dist/lib-cjs/lexer/lexer-error.js +0 -22
- package/dist/lib-cjs/lexer/lexer-error.js.map +0 -1
- package/dist/lib-cjs/lexer/lexer-input-error.js +0 -17
- package/dist/lib-cjs/lexer/lexer-input-error.js.map +0 -1
- package/dist/lib-cjs/lexer/lexer-state-error.js +0 -19
- package/dist/lib-cjs/lexer/lexer-state-error.js.map +0 -1
- package/dist/lib-cjs/lexer/lexer.js +0 -278
- package/dist/lib-cjs/lexer/lexer.js.map +0 -1
- package/dist/lib-cjs/lexer/token.js +0 -44
- package/dist/lib-cjs/lexer/token.js.map +0 -1
- package/dist/lib-cjs/package.json +0 -3
- package/dist/lib-cjs/parse-context-error.js +0 -19
- package/dist/lib-cjs/parse-context-error.js.map +0 -1
- package/dist/lib-cjs/parse-context.js +0 -137
- package/dist/lib-cjs/parse-context.js.map +0 -1
- package/dist/lib-cjs/parse-output-error.js +0 -19
- package/dist/lib-cjs/parse-output-error.js.map +0 -1
- package/dist/lib-cjs/parse-output.js +0 -18
- package/dist/lib-cjs/parse-output.js.map +0 -1
- package/dist/lib-cjs/parse-table/analysis/first-follow.js +0 -294
- package/dist/lib-cjs/parse-table/analysis/first-follow.js.map +0 -1
- package/dist/lib-cjs/parse-table/analysis/index.js +0 -9
- package/dist/lib-cjs/parse-table/analysis/index.js.map +0 -1
- package/dist/lib-cjs/parse-table/bnf/bnf-grammar.js +0 -140
- package/dist/lib-cjs/parse-table/bnf/bnf-grammar.js.map +0 -1
- package/dist/lib-cjs/parse-table/bnf/bnf-production.js +0 -3
- package/dist/lib-cjs/parse-table/bnf/bnf-production.js.map +0 -1
- package/dist/lib-cjs/parse-table/bnf/bnf-symbol.js +0 -39
- package/dist/lib-cjs/parse-table/bnf/bnf-symbol.js.map +0 -1
- package/dist/lib-cjs/parse-table/bnf/desugar-ebnf.js +0 -224
- package/dist/lib-cjs/parse-table/bnf/desugar-ebnf.js.map +0 -1
- package/dist/lib-cjs/parse-table/bnf/index.js +0 -13
- package/dist/lib-cjs/parse-table/bnf/index.js.map +0 -1
- package/dist/lib-cjs/parse-table/build-lr-table.js +0 -171
- package/dist/lib-cjs/parse-table/build-lr-table.js.map +0 -1
- package/dist/lib-cjs/parse-table/index.js +0 -49
- package/dist/lib-cjs/parse-table/index.js.map +0 -1
- package/dist/lib-cjs/parse-table/lr-algorithm-error.js +0 -19
- package/dist/lib-cjs/parse-table/lr-algorithm-error.js.map +0 -1
- package/dist/lib-cjs/parse-table/lr-algorithm.js +0 -31
- package/dist/lib-cjs/parse-table/lr-algorithm.js.map +0 -1
- package/dist/lib-cjs/parse-table/lr0/index.js +0 -14
- package/dist/lib-cjs/parse-table/lr0/index.js.map +0 -1
- package/dist/lib-cjs/parse-table/lr0/lr0-item-set.js +0 -286
- package/dist/lib-cjs/parse-table/lr0/lr0-item-set.js.map +0 -1
- package/dist/lib-cjs/parse-table/lr1/index.js +0 -18
- package/dist/lib-cjs/parse-table/lr1/index.js.map +0 -1
- package/dist/lib-cjs/parse-table/lr1/lr1-item-set.js +0 -432
- package/dist/lib-cjs/parse-table/lr1/lr1-item-set.js.map +0 -1
- package/dist/lib-cjs/parse-table/parse-table-build-error.js +0 -24
- package/dist/lib-cjs/parse-table/parse-table-build-error.js.map +0 -1
- package/dist/lib-cjs/parse-table/parse-table-error.js +0 -19
- package/dist/lib-cjs/parse-table/parse-table-error.js.map +0 -1
- package/dist/lib-cjs/parse-table/parse-table-json.js +0 -12
- package/dist/lib-cjs/parse-table/parse-table-json.js.map +0 -1
- package/dist/lib-cjs/parse-table/parse-table.js +0 -345
- package/dist/lib-cjs/parse-table/parse-table.js.map +0 -1
- package/dist/lib-cjs/parse-table/slr/index.js +0 -13
- package/dist/lib-cjs/parse-table/slr/index.js.map +0 -1
- package/dist/lib-cjs/parse-table/slr/parse-action.js +0 -8
- package/dist/lib-cjs/parse-table/slr/parse-action.js.map +0 -1
- package/dist/lib-cjs/parse-table/slr/slr-table.js +0 -18
- package/dist/lib-cjs/parse-table/slr/slr-table.js.map +0 -1
- package/dist/lib-cjs/parse-table/table/index.js +0 -21
- package/dist/lib-cjs/parse-table/table/index.js.map +0 -1
- package/dist/lib-cjs/parse-table/table/lr-parse-table.js +0 -192
- package/dist/lib-cjs/parse-table/table/lr-parse-table.js.map +0 -1
- package/dist/lib-cjs/parse-table/table/parse-action.js +0 -54
- package/dist/lib-cjs/parse-table/table/parse-action.js.map +0 -1
- package/dist/lib-cjs/parse-table/table/table-builder-base.js +0 -153
- package/dist/lib-cjs/parse-table/table/table-builder-base.js.map +0 -1
- package/dist/lib-cjs/parse-table/token-inventory.js +0 -18
- package/dist/lib-cjs/parse-table/token-inventory.js.map +0 -1
- package/dist/lib-cjs/parser-lr.js +0 -143
- package/dist/lib-cjs/parser-lr.js.map +0 -1
- package/dist/lib-cjs/shift-reduce/index.js +0 -11
- package/dist/lib-cjs/shift-reduce/index.js.map +0 -1
- package/dist/lib-cjs/shift-reduce/shift-reduce-engine.js +0 -224
- package/dist/lib-cjs/shift-reduce/shift-reduce-engine.js.map +0 -1
- package/dist/lib-cjs/transform/binding-map.js +0 -82
- package/dist/lib-cjs/transform/binding-map.js.map +0 -1
- package/dist/lib-cjs/transform/cst-transformer.js +0 -480
- package/dist/lib-cjs/transform/cst-transformer.js.map +0 -1
- package/dist/lib-cjs/transform/grammar-fixture.js +0 -109
- package/dist/lib-cjs/transform/grammar-fixture.js.map +0 -1
- package/dist/lib-cjs/transform/index.js +0 -12
- package/dist/lib-cjs/transform/index.js.map +0 -1
- package/docs/parser-lr-enhancement-proposals.md +0 -337
- package/grammars/fixtures/table-only-import/table-only-smoke.cjs +0 -38
|
@@ -3,7 +3,7 @@ export { AstSchema } from './ast-schema.js';
|
|
|
3
3
|
export type { Alternative, BoundReferenceExpression, ChoiceExpression, Expression, GroupExpression, OptionalExpression, ReferenceExpression, RepeatExpression, SequenceExpression, TerminalExpression, } from './expression.js';
|
|
4
4
|
export { Grammar } from './grammar.js';
|
|
5
5
|
export { grammarFromCst } from './grammar-from-cst.js';
|
|
6
|
-
export {
|
|
6
|
+
export { lexGrammarSource, metaGrammar, metaGrammarTable } from './meta-grammar-table.js';
|
|
7
7
|
export { readGrammar } from './read-grammar.js';
|
|
8
8
|
export { ReadGrammarError } from './read-grammar-error.js';
|
|
9
9
|
export type { Production } from './production.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/grammar/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,YAAY,EACR,WAAW,EACX,wBAAwB,EACxB,gBAAgB,EAChB,UAAU,EACV,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,GACrB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/grammar/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,YAAY,EACR,WAAW,EACX,wBAAwB,EACxB,gBAAgB,EAChB,UAAU,EACV,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,GACrB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC1F,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,YAAY,EACR,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,aAAa,EACb,mBAAmB,GACtB,MAAM,2BAA2B,CAAC;AACnC,YAAY,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EACH,2BAA2B,EAC3B,oBAAoB,GACvB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export { AstSchema } from './ast-schema.js';
|
|
2
2
|
export { Grammar } from './grammar.js';
|
|
3
3
|
export { grammarFromCst } from './grammar-from-cst.js';
|
|
4
|
-
export {
|
|
4
|
+
export { lexGrammarSource, metaGrammar, metaGrammarTable } from './meta-grammar-table.js';
|
|
5
5
|
export { readGrammar } from './read-grammar.js';
|
|
6
6
|
export { ReadGrammarError } from './read-grammar-error.js';
|
|
7
7
|
export { TransformSchema } from './transform-schema.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/grammar/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAa5C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/grammar/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAa5C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC1F,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAa3D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EACH,2BAA2B,EAC3B,oBAAoB,GACvB,MAAM,sBAAsB,CAAC"}
|
|
@@ -1,18 +1,6 @@
|
|
|
1
1
|
import type { Token } from '../lexer/token.js';
|
|
2
2
|
import { ParseTable } from '../parse-table/parse-table.js';
|
|
3
|
-
import type { ParseTableJson } from '../parse-table/parse-table.js';
|
|
4
3
|
import type { Grammar } from './grammar.js';
|
|
5
|
-
/**
|
|
6
|
-
* Overrides the bootstrapped meta-grammar table before any grammar file is read.
|
|
7
|
-
*
|
|
8
|
-
* @remarks
|
|
9
|
-
* The bundled CLI injects its inlined `grammar.json` here so it never depends on
|
|
10
|
-
* a `grammar.json` file on disk. Library consumers do not call this; they fall
|
|
11
|
-
* back to the lazy filesystem read in {@link bootstrapTableJson}.
|
|
12
|
-
*
|
|
13
|
-
* @param table - Serialized meta-grammar parse table.
|
|
14
|
-
*/
|
|
15
|
-
export declare function setBootstrapTableJson(table: ParseTableJson): void;
|
|
16
4
|
/**
|
|
17
5
|
* Returns the bootstrapped meta-grammar table for `.grammar` files.
|
|
18
6
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"meta-grammar-table.d.ts","sourceRoot":"","sources":["../../../src/lib/grammar/meta-grammar-table.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"meta-grammar-table.d.ts","sourceRoot":"","sources":["../../../src/lib/grammar/meta-grammar-table.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAG3D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAsB5C;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,UAAU,CAG7C;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,OAAO,CAQrC;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,KAAK,EAAE,CAKjE"}
|
|
@@ -1,36 +1,19 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { join } from 'node:path';
|
|
1
|
+
import grammarTableJson from './grammar.json' with { type: 'json' };
|
|
3
2
|
import { Lexer } from '../lexer/lexer.js';
|
|
4
3
|
import { isEofToken } from '../lexer/token.js';
|
|
5
4
|
import { ParseTable } from '../parse-table/parse-table.js';
|
|
6
|
-
import { grammarJsonDirectory } from './grammar-json-path.js';
|
|
7
5
|
let bootstrapTable = null;
|
|
8
6
|
let bootstrapMetaGrammar = null;
|
|
9
7
|
/**
|
|
10
|
-
*
|
|
8
|
+
* Returns the bootstrapped meta-grammar table JSON on first use.
|
|
11
9
|
*
|
|
12
10
|
* @remarks
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
* back to the lazy filesystem read in {@link bootstrapTableJson}.
|
|
16
|
-
*
|
|
17
|
-
* @param table - Serialized meta-grammar parse table.
|
|
18
|
-
*/
|
|
19
|
-
export function setBootstrapTableJson(table) {
|
|
20
|
-
bootstrapTable = table;
|
|
21
|
-
bootstrapMetaGrammar = null;
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* Reads and caches the bootstrapped `grammar.json` on first use.
|
|
25
|
-
*
|
|
26
|
-
* @remarks
|
|
27
|
-
* Loading is deferred so that importing the parse runtime (for example
|
|
28
|
-
* {@link ParseContext.fromTableJson}) never touches the filesystem or evaluates
|
|
29
|
-
* `import.meta`. Only grammar-file consumers pay this cost.
|
|
11
|
+
* Parsing is deferred so grammar-file consumers pay table construction only when
|
|
12
|
+
* needed. The JSON is imported at compile time; no filesystem path resolution.
|
|
30
13
|
*/
|
|
31
14
|
function bootstrapTableJson() {
|
|
32
15
|
if (bootstrapTable === null) {
|
|
33
|
-
bootstrapTable =
|
|
16
|
+
bootstrapTable = grammarTableJson;
|
|
34
17
|
}
|
|
35
18
|
return bootstrapTable;
|
|
36
19
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"meta-grammar-table.js","sourceRoot":"","sources":["../../../src/lib/grammar/meta-grammar-table.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"meta-grammar-table.js","sourceRoot":"","sources":["../../../src/lib/grammar/meta-grammar-table.ts"],"names":[],"mappings":"AAAA,OAAO,gBAAgB,MAAM,gBAAgB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAEpE,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAK3D,IAAI,cAAc,GAA0B,IAAI,CAAC;AACjD,IAAI,oBAAoB,GAAmB,IAAI,CAAC;AAEhD;;;;;;GAMG;AACH,SAAS,kBAAkB;IAEvB,IAAI,cAAc,KAAK,IAAI,EAC3B,CAAC;QACG,cAAc,GAAG,gBAAkC,CAAC;IACxD,CAAC;IAED,OAAO,cAAc,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAE5B,OAAO,UAAU,CAAC,QAAQ,CAAC,kBAAkB,EAAE,CAAC,CAAC;AACrD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW;IAEvB,IAAI,oBAAoB,KAAK,IAAI,EACjC,CAAC;QACG,oBAAoB,GAAG,gBAAgB,EAAE,CAAC,SAAS,EAAE,CAAC;IAC1D,CAAC;IAED,OAAO,oBAAoB,CAAC;AAChC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAE3C,MAAM,MAAM,GAAG,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAEpD,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;AACxD,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Node-only grammar-file entry point for parser-lr.
|
|
3
|
+
*/
|
|
4
|
+
export type { AstType } from './grammar/ast-type.js';
|
|
5
|
+
export { AstSchema } from './grammar/ast-schema.js';
|
|
6
|
+
export type { Alternative, BoundReferenceExpression, ChoiceExpression, Expression, GroupExpression, OptionalExpression, ReferenceExpression, RepeatExpression, SequenceExpression, TerminalExpression, } from './grammar/expression.js';
|
|
7
|
+
export { Grammar } from './grammar/grammar.js';
|
|
8
|
+
export { readGrammar } from './grammar/read-grammar.js';
|
|
9
|
+
export { ReadGrammarError } from './grammar/read-grammar-error.js';
|
|
10
|
+
export type { Production } from './grammar/production.js';
|
|
11
|
+
export type { TokenRule } from './grammar/token-rule.js';
|
|
12
|
+
export type { BuildTransform, DropTransform, FlattenTransform, FoldLeftTransform, FoldRightTransform, PassTransform, TransformExpression, } from './grammar/transform-expression.js';
|
|
13
|
+
export type { TransformAlternative, TransformRule } from './grammar/transform-rule.js';
|
|
14
|
+
export { TransformSchema } from './grammar/transform-schema.js';
|
|
15
|
+
export { formatTableValidationIssues, validateGrammarTable, } from './grammar/table-validator.js';
|
|
16
|
+
export type { TableValidationIssue, TableValidationSeverity } from './grammar/table-validator.js';
|
|
17
|
+
import { ParseContext } from './parse-context.js';
|
|
18
|
+
import type { LrAlgorithm } from './parse-table/lr-algorithm.js';
|
|
19
|
+
/**
|
|
20
|
+
* Builds a parse context from grammar file text.
|
|
21
|
+
*
|
|
22
|
+
* @param source - Full `.grammar` file contents.
|
|
23
|
+
* @param algorithm - LR algorithm used to build the table.
|
|
24
|
+
* @returns Parser and parse table ready for lexing or parsing.
|
|
25
|
+
*/
|
|
26
|
+
export declare function parseContextFromGrammar(source: string, algorithm?: LrAlgorithm): ParseContext;
|
|
27
|
+
/**
|
|
28
|
+
* In-memory sources for constructing a {@link ParseContext} from grammar or table input.
|
|
29
|
+
*/
|
|
30
|
+
export interface GrammarParseContextSources {
|
|
31
|
+
readonly grammarSource?: string;
|
|
32
|
+
readonly tableJson?: string;
|
|
33
|
+
readonly algorithm?: string;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Builds a parse context from a grammar or table source string.
|
|
37
|
+
*
|
|
38
|
+
* @param options - Grammar source, table JSON, and optional algorithm.
|
|
39
|
+
* @returns Parser and parse table ready for lexing or parsing.
|
|
40
|
+
*/
|
|
41
|
+
export declare function parseContextFromSources(options: GrammarParseContextSources): ParseContext;
|
|
42
|
+
//# sourceMappingURL=grammar-entry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grammar-entry.d.ts","sourceRoot":"","sources":["../../src/lib/grammar-entry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,YAAY,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,YAAY,EACR,WAAW,EACX,wBAAwB,EACxB,gBAAgB,EAChB,UAAU,EACV,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,GACrB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,YAAY,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC1D,YAAY,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACzD,YAAY,EACR,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,aAAa,EACb,mBAAmB,GACtB,MAAM,mCAAmC,CAAC;AAC3C,YAAY,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACvF,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EACH,2BAA2B,EAC3B,oBAAoB,GACvB,MAAM,8BAA8B,CAAC;AACtC,YAAY,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAGlG,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAKjE;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACnC,MAAM,EAAE,MAAM,EACd,SAAS,GAAE,WAAmB,GAC/B,YAAY,CAOd;AAED;;GAEG;AACH,MAAM,WAAW,0BAA0B;IAEvC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,0BAA0B,GAAG,YAAY,CAiBzF"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Node-only grammar-file entry point for parser-lr.
|
|
3
|
+
*/
|
|
4
|
+
export { AstSchema } from './grammar/ast-schema.js';
|
|
5
|
+
export { Grammar } from './grammar/grammar.js';
|
|
6
|
+
export { readGrammar } from './grammar/read-grammar.js';
|
|
7
|
+
export { ReadGrammarError } from './grammar/read-grammar-error.js';
|
|
8
|
+
export { TransformSchema } from './grammar/transform-schema.js';
|
|
9
|
+
export { formatTableValidationIssues, validateGrammarTable, } from './grammar/table-validator.js';
|
|
10
|
+
import { ParseContextError } from './parse-context-error.js';
|
|
11
|
+
import { ParseContext } from './parse-context.js';
|
|
12
|
+
import { readGrammar } from './grammar/read-grammar.js';
|
|
13
|
+
import { parseLrAlgorithm } from './parse-table/lr-algorithm.js';
|
|
14
|
+
import { ParseTable } from './parse-table/parse-table.js';
|
|
15
|
+
import { ParserLr } from './parser-lr.js';
|
|
16
|
+
/**
|
|
17
|
+
* Builds a parse context from grammar file text.
|
|
18
|
+
*
|
|
19
|
+
* @param source - Full `.grammar` file contents.
|
|
20
|
+
* @param algorithm - LR algorithm used to build the table.
|
|
21
|
+
* @returns Parser and parse table ready for lexing or parsing.
|
|
22
|
+
*/
|
|
23
|
+
export function parseContextFromGrammar(source, algorithm = 'lr1') {
|
|
24
|
+
const grammar = readGrammar(source);
|
|
25
|
+
const table = ParseTable.fromGrammar(grammar, algorithm);
|
|
26
|
+
const parser = new ParserLr(grammar, table);
|
|
27
|
+
return new ParseContext(parser, table);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Builds a parse context from a grammar or table source string.
|
|
31
|
+
*
|
|
32
|
+
* @param options - Grammar source, table JSON, and optional algorithm.
|
|
33
|
+
* @returns Parser and parse table ready for lexing or parsing.
|
|
34
|
+
*/
|
|
35
|
+
export function parseContextFromSources(options) {
|
|
36
|
+
// Prefer grammar source over a saved table when both are supplied.
|
|
37
|
+
if (options.grammarSource !== undefined) {
|
|
38
|
+
return parseContextFromGrammar(options.grammarSource, parseLrAlgorithm(options.algorithm));
|
|
39
|
+
}
|
|
40
|
+
if (options.tableJson !== undefined) {
|
|
41
|
+
return ParseContext.fromTableJson(options.tableJson);
|
|
42
|
+
}
|
|
43
|
+
throw new ParseContextError('required: grammar source or table JSON');
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=grammar-entry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grammar-entry.js","sourceRoot":"","sources":["../../src/lib/grammar-entry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAapD,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAanE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EACH,2BAA2B,EAC3B,oBAAoB,GACvB,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C;;;;;;GAMG;AACH,MAAM,UAAU,uBAAuB,CACnC,MAAc,EACd,YAAyB,KAAK;IAG9B,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IACpC,MAAM,KAAK,GAAG,UAAU,CAAC,WAAW,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,IAAI,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAE5C,OAAO,IAAI,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAC3C,CAAC;AAYD;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CAAC,OAAmC;IAEvE,mEAAmE;IACnE,IAAI,OAAO,CAAC,aAAa,KAAK,SAAS,EACvC,CAAC;QACG,OAAO,uBAAuB,CAC1B,OAAO,CAAC,aAAa,EACrB,gBAAgB,CAAC,OAAO,CAAC,SAAS,CAAC,CACtC,CAAC;IACN,CAAC;IAED,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,EACnC,CAAC;QACG,OAAO,YAAY,CAAC,aAAa,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,IAAI,iBAAiB,CAAC,wCAAwC,CAAC,CAAC;AAC1E,CAAC"}
|
package/dist/lib/index.d.ts
CHANGED
|
@@ -3,11 +3,13 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export { AstNode } from './ast/ast-node.js';
|
|
5
5
|
export type { SourceLocation } from './ast/ast-node.js';
|
|
6
|
-
export type {
|
|
7
|
-
export {
|
|
8
|
-
export {
|
|
9
|
-
export type {
|
|
10
|
-
export {
|
|
6
|
+
export type { AstType } from './grammar/ast-type.js';
|
|
7
|
+
export type { Alternative, BoundReferenceExpression, ChoiceExpression, Expression, GroupExpression, OptionalExpression, ReferenceExpression, RepeatExpression, SequenceExpression, TerminalExpression, } from './grammar/expression.js';
|
|
8
|
+
export type { Grammar } from './grammar/grammar.js';
|
|
9
|
+
export type { Production } from './grammar/production.js';
|
|
10
|
+
export type { TokenRule } from './grammar/token-rule.js';
|
|
11
|
+
export type { BuildTransform, DropTransform, FlattenTransform, FoldLeftTransform, FoldRightTransform, PassTransform, TransformExpression, } from './grammar/transform-expression.js';
|
|
12
|
+
export type { TransformAlternative, TransformRule } from './grammar/transform-rule.js';
|
|
11
13
|
export { Lexer, LexerCompileError, LexerInputError, LexerStateError, lexChunkStream, lexChunkStreamAsync, lexChunks, lexChunksAsync } from './lexer/index.js';
|
|
12
14
|
export { DEFAULT_LEXER_STATE, EOF_TOKEN_NAME, LexerError, compileLexerRules, eofToken, isEofToken, token, } from './lexer/index.js';
|
|
13
15
|
export type { CompiledLexerRules, CompiledRule, Token } from './lexer/index.js';
|
package/dist/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,YAAY,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,YAAY,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACrD,YAAY,EACR,WAAW,EACX,wBAAwB,EACxB,gBAAgB,EAChB,UAAU,EACV,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,GACrB,MAAM,yBAAyB,CAAC;AACjC,YAAY,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACpD,YAAY,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC1D,YAAY,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACzD,YAAY,EACR,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,aAAa,EACb,mBAAmB,GACtB,MAAM,mCAAmC,CAAC;AAC3C,YAAY,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACvF,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,eAAe,EAAE,cAAc,EAAE,mBAAmB,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC9J,OAAO,EACH,mBAAmB,EACnB,cAAc,EACd,UAAU,EACV,iBAAiB,EACjB,QAAQ,EACR,UAAU,EACV,KAAK,GACR,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,kBAAkB,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAChF,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,UAAU,EAAE,eAAe,EAAE,aAAa,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7J,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,yBAAyB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAC/G,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,YAAY,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAClG,YAAY,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC"}
|
package/dist/lib/index.js
CHANGED
|
@@ -2,9 +2,6 @@
|
|
|
2
2
|
* Public library entry point for parser-lr.
|
|
3
3
|
*/
|
|
4
4
|
export { AstNode } from './ast/ast-node.js';
|
|
5
|
-
export { AstSchema, Grammar, TransformSchema } from './grammar/index.js';
|
|
6
|
-
export { formatTableValidationIssues, validateGrammarTable, } from './grammar/index.js';
|
|
7
|
-
export { ReadGrammarError, readGrammar } from './grammar/index.js';
|
|
8
5
|
export { Lexer, LexerCompileError, LexerInputError, LexerStateError, lexChunkStream, lexChunkStreamAsync, lexChunks, lexChunksAsync } from './lexer/index.js';
|
|
9
6
|
export { DEFAULT_LEXER_STATE, EOF_TOKEN_NAME, LexerError, compileLexerRules, eofToken, isEofToken, token, } from './lexer/index.js';
|
|
10
7
|
export { LrAlgorithmError, PARSE_TABLE_VERSION, ParseTable, ParseTableError, isLrAlgorithm, parseLrAlgorithm, tokenInventory } from './parse-table/index.js';
|
package/dist/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lib/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lib/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AA4B5C,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,eAAe,EAAE,cAAc,EAAE,mBAAmB,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC9J,OAAO,EACH,mBAAmB,EACnB,cAAc,EACd,UAAU,EACV,iBAAiB,EACjB,QAAQ,EACR,UAAU,EACV,KAAK,GACR,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,UAAU,EAAE,eAAe,EAAE,aAAa,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7J,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,yBAAyB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAC/G,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAElG,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import type { AstNode } from './ast/ast-node.js';
|
|
2
2
|
import type { Lexer } from './lexer/lexer.js';
|
|
3
3
|
import type { Token } from './lexer/token.js';
|
|
4
|
-
import type { LrAlgorithm } from './parse-table/lr-algorithm.js';
|
|
5
4
|
import { ParseTable } from './parse-table/parse-table.js';
|
|
6
5
|
import { ParserLr } from './parser-lr.js';
|
|
7
6
|
/**
|
|
8
|
-
* Parser and parse table loaded from a
|
|
7
|
+
* Parser and parse table loaded from a serialized table.
|
|
9
8
|
*/
|
|
10
9
|
export declare class ParseContext {
|
|
11
10
|
readonly parser: ParserLr;
|
|
@@ -17,14 +16,6 @@ export declare class ParseContext {
|
|
|
17
16
|
* @param table - Parse table backing the parser.
|
|
18
17
|
*/
|
|
19
18
|
constructor(parser: ParserLr, table: ParseTable);
|
|
20
|
-
/**
|
|
21
|
-
* Builds a parse context from grammar file text.
|
|
22
|
-
*
|
|
23
|
-
* @param source - Full `.grammar` file contents.
|
|
24
|
-
* @param algorithm - LR algorithm used to build the table.
|
|
25
|
-
* @returns Parser and parse table ready for lexing or parsing.
|
|
26
|
-
*/
|
|
27
|
-
static fromGrammar(source: string, algorithm?: LrAlgorithm): ParseContext;
|
|
28
19
|
/**
|
|
29
20
|
* Builds a parse context from serialized parse table JSON.
|
|
30
21
|
*
|
|
@@ -33,9 +24,9 @@ export declare class ParseContext {
|
|
|
33
24
|
*/
|
|
34
25
|
static fromTableJson(json: string): ParseContext;
|
|
35
26
|
/**
|
|
36
|
-
* Builds a parse context from
|
|
27
|
+
* Builds a parse context from serialized table JSON options.
|
|
37
28
|
*
|
|
38
|
-
* @param options -
|
|
29
|
+
* @param options - Table JSON source.
|
|
39
30
|
* @returns Parser and parse table ready for lexing or parsing.
|
|
40
31
|
*/
|
|
41
32
|
static fromSources(options: ParseContextSources): ParseContext;
|
|
@@ -96,11 +87,9 @@ export declare class ParseContext {
|
|
|
96
87
|
parseSource(source: string): AstNode | null;
|
|
97
88
|
}
|
|
98
89
|
/**
|
|
99
|
-
* In-memory sources for constructing a {@link ParseContext}.
|
|
90
|
+
* In-memory sources for constructing a {@link ParseContext} from table JSON.
|
|
100
91
|
*/
|
|
101
92
|
export interface ParseContextSources {
|
|
102
|
-
readonly grammarSource?: string;
|
|
103
93
|
readonly tableJson?: string;
|
|
104
|
-
readonly algorithm?: string;
|
|
105
94
|
}
|
|
106
95
|
//# sourceMappingURL=parse-context.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-context.d.ts","sourceRoot":"","sources":["../../src/lib/parse-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"parse-context.d.ts","sourceRoot":"","sources":["../../src/lib/parse-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C;;GAEG;AACH,qBAAa,YAAY;aASD,MAAM,EAAE,QAAQ;aAChB,KAAK,EAAE,UAAU;IARrC;;;;;OAKG;gBAEiB,MAAM,EAAE,QAAQ,EAChB,KAAK,EAAE,UAAU;IAKrC;;;;;OAKG;WACW,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY;IAOvD;;;;;OAKG;WACW,WAAW,CAAC,OAAO,EAAE,mBAAmB,GAAG,YAAY;IAUrE;;;;OAIG;IACI,WAAW,IAAI,KAAK;IAK3B;;;;;OAKG;IACI,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,KAAK,EAAE;IAK5C;;;;;OAKG;IACI,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,gBAAgB,CAAC,KAAK,CAAC;IAKnE;;;;;OAKG;IACI,cAAc,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,qBAAqB,CAAC,KAAK,CAAC;IAKlF;;;;;OAKG;IACI,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,SAAS,KAAK,EAAE;IAKjE;;;;;OAKG;IACU,mBAAmB,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,KAAK,EAAE,CAAC;IAK1F;;;;;OAKG;IACI,KAAK,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,GAAG,OAAO,GAAG,IAAI;IAKtD;;;;;OAKG;IACI,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI;CAIrD;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAEhC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC/B"}
|
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
import { ParseContextError } from './parse-context-error.js';
|
|
2
|
-
import { readGrammar } from './grammar/read-grammar.js';
|
|
3
|
-
import { parseLrAlgorithm } from './parse-table/lr-algorithm.js';
|
|
4
2
|
import { ParseTable } from './parse-table/parse-table.js';
|
|
5
3
|
import { ParserLr } from './parser-lr.js';
|
|
6
4
|
/**
|
|
7
|
-
* Parser and parse table loaded from a
|
|
5
|
+
* Parser and parse table loaded from a serialized table.
|
|
8
6
|
*/
|
|
9
7
|
export class ParseContext {
|
|
10
8
|
parser;
|
|
@@ -19,19 +17,6 @@ export class ParseContext {
|
|
|
19
17
|
this.parser = parser;
|
|
20
18
|
this.table = table;
|
|
21
19
|
}
|
|
22
|
-
/**
|
|
23
|
-
* Builds a parse context from grammar file text.
|
|
24
|
-
*
|
|
25
|
-
* @param source - Full `.grammar` file contents.
|
|
26
|
-
* @param algorithm - LR algorithm used to build the table.
|
|
27
|
-
* @returns Parser and parse table ready for lexing or parsing.
|
|
28
|
-
*/
|
|
29
|
-
static fromGrammar(source, algorithm = 'lr1') {
|
|
30
|
-
const grammar = readGrammar(source);
|
|
31
|
-
const table = ParseTable.fromGrammar(grammar, algorithm);
|
|
32
|
-
const parser = new ParserLr(grammar, table);
|
|
33
|
-
return new ParseContext(parser, table);
|
|
34
|
-
}
|
|
35
20
|
/**
|
|
36
21
|
* Builds a parse context from serialized parse table JSON.
|
|
37
22
|
*
|
|
@@ -43,20 +28,16 @@ export class ParseContext {
|
|
|
43
28
|
return new ParseContext(ParserLr.fromParseTable(table), table);
|
|
44
29
|
}
|
|
45
30
|
/**
|
|
46
|
-
* Builds a parse context from
|
|
31
|
+
* Builds a parse context from serialized table JSON options.
|
|
47
32
|
*
|
|
48
|
-
* @param options -
|
|
33
|
+
* @param options - Table JSON source.
|
|
49
34
|
* @returns Parser and parse table ready for lexing or parsing.
|
|
50
35
|
*/
|
|
51
36
|
static fromSources(options) {
|
|
52
|
-
// Prefer grammar source over a saved table when both are supplied.
|
|
53
|
-
if (options.grammarSource !== undefined) {
|
|
54
|
-
return ParseContext.fromGrammar(options.grammarSource, parseLrAlgorithm(options.algorithm));
|
|
55
|
-
}
|
|
56
37
|
if (options.tableJson !== undefined) {
|
|
57
38
|
return ParseContext.fromTableJson(options.tableJson);
|
|
58
39
|
}
|
|
59
|
-
throw new ParseContextError('required:
|
|
40
|
+
throw new ParseContextError('required: table JSON');
|
|
60
41
|
}
|
|
61
42
|
/**
|
|
62
43
|
* Creates a stream lexer for this context's grammar.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-context.js","sourceRoot":"","sources":["../../src/lib/parse-context.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"parse-context.js","sourceRoot":"","sources":["../../src/lib/parse-context.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAG7D,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C;;GAEG;AACH,MAAM,OAAO,YAAY;IASD;IACA;IARpB;;;;;OAKG;IACH,YACoB,MAAgB,EAChB,KAAiB;QADjB,WAAM,GAAN,MAAM,CAAU;QAChB,UAAK,GAAL,KAAK,CAAY;IAGrC,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,aAAa,CAAC,IAAY;QAEpC,MAAM,KAAK,GAAG,UAAU,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAE9C,OAAO,IAAI,YAAY,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;IACnE,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,WAAW,CAAC,OAA4B;QAElD,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,EACnC,CAAC;YACG,OAAO,YAAY,CAAC,aAAa,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACzD,CAAC;QAED,MAAM,IAAI,iBAAiB,CAAC,sBAAsB,CAAC,CAAC;IACxD,CAAC;IAED;;;;OAIG;IACI,WAAW;QAEd,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;IACrC,CAAC;IAED;;;;;OAKG;IACI,GAAG,CAAC,MAAc;QAErB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;IAED;;;;;OAKG;IACI,SAAS,CAAC,MAAwB;QAErC,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACzC,CAAC;IAED;;;;;OAKG;IACI,cAAc,CAAC,MAA6B;QAE/C,OAAO,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IAC9C,CAAC;IAED;;;;;OAKG;IACI,cAAc,CAAC,MAAwB;QAE1C,OAAO,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IAC9C,CAAC;IAED;;;;;OAKG;IACI,KAAK,CAAC,mBAAmB,CAAC,MAA6B;QAE1D,OAAO,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;IACnD,CAAC;IAED;;;;;OAKG;IACI,KAAK,CAAC,MAAwB;QAEjC,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC;IAED;;;;;OAKG;IACI,WAAW,CAAC,MAAc;QAE7B,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAC3C,CAAC;CACJ"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { existsSync, readdirSync, readFileSync } from 'node:fs';
|
|
2
2
|
import { basename, join } from 'node:path';
|
|
3
|
-
import {
|
|
3
|
+
import { parseContextFromGrammar } from '../grammar-entry.js';
|
|
4
4
|
/**
|
|
5
5
|
* Returns the `.grammar` file for one fixture directory.
|
|
6
6
|
*
|
|
@@ -45,7 +45,7 @@ export function parseFixture(fixtureDir, inputFileName = 'input.txt') {
|
|
|
45
45
|
}
|
|
46
46
|
const grammarSource = readFileSync(grammarPath, 'utf8');
|
|
47
47
|
const input = readFileSync(join(fixtureDir, inputFileName), 'utf8').trimEnd();
|
|
48
|
-
const context =
|
|
48
|
+
const context = parseContextFromGrammar(grammarSource, 'lr1');
|
|
49
49
|
return context.parseSource(input);
|
|
50
50
|
}
|
|
51
51
|
/**
|
|
@@ -90,7 +90,7 @@ export function discoverFixtures(rootDir) {
|
|
|
90
90
|
export function runFixtureCase(fixture, expectFn) {
|
|
91
91
|
const grammarSource = readFileSync(fixture.grammarPath, 'utf8');
|
|
92
92
|
const input = readFileSync(fixture.inputPath, 'utf8').trimEnd();
|
|
93
|
-
const context =
|
|
93
|
+
const context = parseContextFromGrammar(grammarSource, 'lr1');
|
|
94
94
|
const ast = context.parseSource(input);
|
|
95
95
|
if (fixture.expectedPath !== null) {
|
|
96
96
|
const expected = JSON.parse(readFileSync(fixture.expectedPath, 'utf8'));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grammar-fixture.js","sourceRoot":"","sources":["../../../src/lib/transform/grammar-fixture.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAG3C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"grammar-fixture.js","sourceRoot":"","sources":["../../../src/lib/transform/grammar-fixture.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
# parser-lr: browser-safe library / Node CLI split
|
|
2
|
+
|
|
3
|
+
**Audience:** agent working on [parser-lr](https://github.com/adamrmoss/parser-lr)
|
|
4
|
+
**Consumer:** [edu-basic](https://github.com/adamrmoss/edu-basic) (`parser-lr@0.6.1`)
|
|
5
|
+
|
|
6
|
+
## Required architecture
|
|
7
|
+
|
|
8
|
+
| Artifact | Node dependencies | Runs in browser |
|
|
9
|
+
|----------|-------------------|-----------------|
|
|
10
|
+
| **Library** (`parser-lr` package entry, `dist/lib/`) | **None** | **Yes** |
|
|
11
|
+
| **CLI** (`bin/parser-lr.js`) | **All** (`fs`, `path`, `url`, grammar reading, `import.meta`) | No |
|
|
12
|
+
|
|
13
|
+
The CLI is a bundled binary that includes everything it needs. The library is a parse runtime only: load a pre-generated table JSON, lex, parse, return AST.
|
|
14
|
+
|
|
15
|
+
Grammar-file reading and table generation belong in the CLI (and optionally a separate Node-only subpath). They must not be on the main library import graph.
|
|
16
|
+
|
|
17
|
+
## Current failure
|
|
18
|
+
|
|
19
|
+
`ng build` in edu-basic fails:
|
|
20
|
+
|
|
21
|
+
```text
|
|
22
|
+
Could not resolve "node:fs"
|
|
23
|
+
Could not resolve "node:path"
|
|
24
|
+
Could not resolve "node:url"
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Import chain from `import { ParseContext } from 'parser-lr'`:
|
|
28
|
+
|
|
29
|
+
```text
|
|
30
|
+
dist/lib/index.js
|
|
31
|
+
→ grammar/index.js
|
|
32
|
+
→ read-grammar.js
|
|
33
|
+
→ meta-grammar-table.js (readFileSync)
|
|
34
|
+
→ grammar-json-path.esm.js (import.meta.url)
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Also: `dist/lib/parse-context.js` has a **top-level** `import { readGrammar } from './grammar/read-grammar.js'`, so `ParseContext.fromTableJson` still pulls grammar code even though edu-basic never calls `fromGrammar`.
|
|
38
|
+
|
|
39
|
+
Edu-basic runtime use: `ParseContext.fromTableJson(prebuiltTableJson)` → `lex` / `parseSource`. No `.grammar` files at runtime.
|
|
40
|
+
|
|
41
|
+
## Required changes
|
|
42
|
+
|
|
43
|
+
### 1. Library entry has no Node imports
|
|
44
|
+
|
|
45
|
+
`dist/lib/index.js` (and CJS twin) must not statically import:
|
|
46
|
+
|
|
47
|
+
- `read-grammar.js`
|
|
48
|
+
- `meta-grammar-table.js`
|
|
49
|
+
- `grammar-json-path*.js`
|
|
50
|
+
- any `node:*` module
|
|
51
|
+
|
|
52
|
+
### 2. `ParseContext` must not statically import grammar
|
|
53
|
+
|
|
54
|
+
`fromTableJson` / table branch of `fromSources` must work without loading grammar modules.
|
|
55
|
+
|
|
56
|
+
Options (pick one):
|
|
57
|
+
|
|
58
|
+
- Remove `fromGrammar` from the main library export; grammar construction lives in CLI only.
|
|
59
|
+
- Keep `fromGrammar` but implement it with **lazy** `import()` inside the method so it is not in the static graph.
|
|
60
|
+
|
|
61
|
+
### 3. Grammar APIs off the main entry
|
|
62
|
+
|
|
63
|
+
If Node consumers still need grammar-file APIs, expose them on a **separate** subpath only, e.g. `parser-lr/grammar`:
|
|
64
|
+
|
|
65
|
+
- `readGrammar`
|
|
66
|
+
- `validateGrammarTable`
|
|
67
|
+
- `formatTableValidationIssues`
|
|
68
|
+
- `Grammar`, `AstSchema`, `TransformSchema`
|
|
69
|
+
|
|
70
|
+
Do not re-export these from the main `parser-lr` entry.
|
|
71
|
+
|
|
72
|
+
### 4. CLI bundles all Node code
|
|
73
|
+
|
|
74
|
+
`bin/parser-lr.js` must include grammar reading, meta-grammar bootstrap, and filesystem path resolution. Fix the existing bug where CLI looks for `bin/grammar.json` instead of `dist/lib/grammar/grammar.json` (see symptom below).
|
|
75
|
+
|
|
76
|
+
### 5. Lazy meta-grammar on grammar path
|
|
77
|
+
|
|
78
|
+
Even on the grammar/CLI path, do not load `grammar.json` or evaluate `import.meta` at module evaluation time. Load on first `readGrammar()` / `metaGrammarTable()` call.
|
|
79
|
+
|
|
80
|
+
## Library exports (minimum for edu-basic)
|
|
81
|
+
|
|
82
|
+
Main entry must export at least:
|
|
83
|
+
|
|
84
|
+
- `ParseContext`
|
|
85
|
+
- `AstNode`
|
|
86
|
+
- `Token` (type)
|
|
87
|
+
- `isEofToken`
|
|
88
|
+
|
|
89
|
+
Add other runtime symbols only if existing parser-lr tests require them on the main entry.
|
|
90
|
+
|
|
91
|
+
## Acceptance tests
|
|
92
|
+
|
|
93
|
+
Run all of these against **`npm pack` output**, not only the dev tree.
|
|
94
|
+
|
|
95
|
+
### A. Browser bundle
|
|
96
|
+
|
|
97
|
+
esbuild must succeed:
|
|
98
|
+
|
|
99
|
+
```javascript
|
|
100
|
+
// entry.mjs
|
|
101
|
+
import { ParseContext } from 'parser-lr';
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
esbuild entry.mjs --bundle --platform=browser --outfile=/tmp/out.js
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
Exit 0. No `node:fs`, `node:path`, or `node:url` resolution errors.
|
|
109
|
+
|
|
110
|
+
### B. Table-only runtime (ESM)
|
|
111
|
+
|
|
112
|
+
```javascript
|
|
113
|
+
import { ParseContext } from 'parser-lr';
|
|
114
|
+
import { readFileSync } from 'node:fs';
|
|
115
|
+
|
|
116
|
+
const table = JSON.parse(readFileSync('grammars/calc.table.json', 'utf8'));
|
|
117
|
+
const ctx = ParseContext.fromTableJson(JSON.stringify(table));
|
|
118
|
+
const ast = ctx.parseSource('1 + 2');
|
|
119
|
+
if (!ast) throw new Error('parse failed');
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
Must not throw `import.meta` errors. Must not require `grammar.json` on disk for this import.
|
|
123
|
+
|
|
124
|
+
### C. Table-only runtime (CJS)
|
|
125
|
+
|
|
126
|
+
```javascript
|
|
127
|
+
const { ParseContext } = require('parser-lr');
|
|
128
|
+
// same table smoke as B
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### D. CLI from tarball
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
npm pack
|
|
135
|
+
tmpdir=$(mktemp -d)
|
|
136
|
+
tar -xzf parser-lr-*.tgz -C "$tmpdir"
|
|
137
|
+
cd "$tmpdir/package"
|
|
138
|
+
node bin/parser-lr.js table validate -g grammars/calc.grammar
|
|
139
|
+
node bin/parser-lr.js table generate -g grammars/calc.grammar -o /tmp/calc.json -a lalr
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
Both exit 0.
|
|
143
|
+
|
|
144
|
+
### E. Grammar subpath (if implemented)
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
node -e "import('parser-lr/grammar').then(m => console.log(typeof m.readGrammar))"
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
Must not be required for tests A–C.
|
|
151
|
+
|
|
152
|
+
## Known CLI bug (fix while here)
|
|
153
|
+
|
|
154
|
+
```bash
|
|
155
|
+
npx parser-lr table validate -g grammars/calc.grammar
|
|
156
|
+
# ENOENT: .../node_modules/parser-lr/bin/grammar.json
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
`grammar.json` exists under `dist/lib/grammar/` but CLI resolves relative to `bin/`.
|
|
160
|
+
|
|
161
|
+
## After release
|
|
162
|
+
|
|
163
|
+
edu-basic will:
|
|
164
|
+
|
|
165
|
+
1. Bump `parser-lr` to the new version.
|
|
166
|
+
2. Re-run `npm run build` (Angular) and `npm test`.
|
|
167
|
+
3. No browser polyfills for Node built-ins.
|
|
168
|
+
|
|
169
|
+
Target version: **0.7.0** (export map changes, ESM-only, grammar subpath).
|
|
170
|
+
|
|
171
|
+
## Non-goals
|
|
172
|
+
|
|
173
|
+
- No change to parse semantics, table JSON format, or identity AST shape.
|
|
174
|
+
- No requirement for edu-basic to stub `node:*` in the browser bundle.
|