jit-parser 1.0.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.
Files changed (80) hide show
  1. package/README.md +632 -0
  2. package/lib/codegen/CodegenAstFactory.d.ts +14 -0
  3. package/lib/codegen/CodegenAstFactory.js +119 -0
  4. package/lib/codegen/CodegenAstFactory.js.map +1 -0
  5. package/lib/codegen/CodegenGrammar.d.ts +21 -0
  6. package/lib/codegen/CodegenGrammar.js +145 -0
  7. package/lib/codegen/CodegenGrammar.js.map +1 -0
  8. package/lib/codegen/CodegenList.d.ts +15 -0
  9. package/lib/codegen/CodegenList.js +63 -0
  10. package/lib/codegen/CodegenList.js.map +1 -0
  11. package/lib/codegen/CodegenProduction.d.ts +15 -0
  12. package/lib/codegen/CodegenProduction.js +72 -0
  13. package/lib/codegen/CodegenProduction.js.map +1 -0
  14. package/lib/codegen/CodegenTerminal.d.ts +14 -0
  15. package/lib/codegen/CodegenTerminal.js +133 -0
  16. package/lib/codegen/CodegenTerminal.js.map +1 -0
  17. package/lib/codegen/CodegenUnion.d.ts +15 -0
  18. package/lib/codegen/CodegenUnion.js +71 -0
  19. package/lib/codegen/CodegenUnion.js.map +1 -0
  20. package/lib/codegen/Pattern.d.ts +8 -0
  21. package/lib/codegen/Pattern.js +41 -0
  22. package/lib/codegen/Pattern.js.map +1 -0
  23. package/lib/context.d.ts +13 -0
  24. package/lib/context.js +20 -0
  25. package/lib/context.js.map +1 -0
  26. package/lib/generator.d.ts +20 -0
  27. package/lib/generator.js +100 -0
  28. package/lib/generator.js.map +1 -0
  29. package/lib/grammars/calculator.d.ts +2 -0
  30. package/lib/grammars/calculator.js +76 -0
  31. package/lib/grammars/calculator.js.map +1 -0
  32. package/lib/grammars/esql.d.ts +2 -0
  33. package/lib/grammars/esql.js +221 -0
  34. package/lib/grammars/esql.js.map +1 -0
  35. package/lib/grammars/javascript.d.ts +2 -0
  36. package/lib/grammars/javascript.js +251 -0
  37. package/lib/grammars/javascript.js.map +1 -0
  38. package/lib/grammars/json-expression.d.ts +2 -0
  39. package/lib/grammars/json-expression.js +101 -0
  40. package/lib/grammars/json-expression.js.map +1 -0
  41. package/lib/grammars/json.d.ts +2 -0
  42. package/lib/grammars/json.js +79 -0
  43. package/lib/grammars/json.js.map +1 -0
  44. package/lib/index.d.ts +0 -0
  45. package/lib/index.js +2 -0
  46. package/lib/index.js.map +1 -0
  47. package/lib/matches.d.ts +15 -0
  48. package/lib/matches.js +21 -0
  49. package/lib/matches.js.map +1 -0
  50. package/lib/print.d.ts +11 -0
  51. package/lib/print.js +97 -0
  52. package/lib/print.js.map +1 -0
  53. package/lib/testing/cli.d.ts +1 -0
  54. package/lib/testing/cli.js +84 -0
  55. package/lib/testing/cli.js.map +1 -0
  56. package/lib/testing/driver.d.ts +21 -0
  57. package/lib/testing/driver.js +73 -0
  58. package/lib/testing/driver.js.map +1 -0
  59. package/lib/testing/index.d.ts +5 -0
  60. package/lib/testing/index.js +9 -0
  61. package/lib/testing/index.js.map +1 -0
  62. package/lib/testing/jest.d.ts +4 -0
  63. package/lib/testing/jest.js +31 -0
  64. package/lib/testing/jest.js.map +1 -0
  65. package/lib/testing/report.d.ts +3 -0
  66. package/lib/testing/report.js +64 -0
  67. package/lib/testing/report.js.map +1 -0
  68. package/lib/testing/runner.d.ts +29 -0
  69. package/lib/testing/runner.js +93 -0
  70. package/lib/testing/runner.js.map +1 -0
  71. package/lib/testing/types.d.ts +34 -0
  72. package/lib/testing/types.js +3 -0
  73. package/lib/testing/types.js.map +1 -0
  74. package/lib/types.d.ts +70 -0
  75. package/lib/types.js +3 -0
  76. package/lib/types.js.map +1 -0
  77. package/lib/util.d.ts +10 -0
  78. package/lib/util.js +39 -0
  79. package/lib/util.js.map +1 -0
  80. package/package.json +103 -0
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CodegenAstFactory = void 0;
4
+ const codegen_1 = require("@jsonjoy.com/util/lib/codegen");
5
+ const context_1 = require("../context");
6
+ const Pattern_1 = require("./Pattern");
7
+ const json_expression_1 = require("@jsonjoy.com/json-expression");
8
+ const operators_1 = require("@jsonjoy.com/json-expression/lib/operators");
9
+ const util_1 = require("../util");
10
+ const noAstFactory = () => null;
11
+ const isSelectFirstChildExpression = (expr) => {
12
+ return expr instanceof Array && expr.length === 2 && expr[0] === '$' && expr[1] === '/children/0';
13
+ };
14
+ const isSelectChildrenExpression = (expr) => {
15
+ return expr instanceof Array && expr.length === 2 && expr[0] === '$' && expr[1] === '/children';
16
+ };
17
+ const compileExpression = (expression) => {
18
+ const exprCodegen = new json_expression_1.JsonExpressionCodegen({
19
+ expression,
20
+ operators: operators_1.operatorsMap,
21
+ });
22
+ return exprCodegen.run().compileRaw();
23
+ };
24
+ class CodegenAstFactory {
25
+ constructor(node, ptr, ctx) {
26
+ this.node = node;
27
+ this.ptr = ptr;
28
+ this.ctx = ctx;
29
+ this.codegen = new codegen_1.Codegen({
30
+ args: ['cst', 'src'],
31
+ });
32
+ }
33
+ generate() {
34
+ const { codegen, node, ptr, ctx } = this;
35
+ if (isSelectFirstChildExpression(node.ast)) {
36
+ const rIndex = codegen.var(`0`);
37
+ codegen.while('1', () => {
38
+ const rChild = codegen.var(`cst.children[${rIndex}]`);
39
+ const rChildAst = codegen.var(`${rChild}.ptr.toAst(${rChild}, src)`);
40
+ codegen.if(`${rChildAst} != null`, () => {
41
+ codegen.return(rChildAst);
42
+ });
43
+ codegen.js(`${rIndex}++;`);
44
+ });
45
+ return;
46
+ }
47
+ const createChildrenArr = () => {
48
+ const rIndex = codegen.var(`0`);
49
+ const rChildren = codegen.var(`cst.children`);
50
+ const rChildrenAst = codegen.var(`[]`);
51
+ const rLength = codegen.var(`${rChildren}.length`);
52
+ codegen.while(`${rIndex} < ${rLength}`, () => {
53
+ const rChild = codegen.var(`${rChildren}[${rIndex}]`);
54
+ const rChildAst = codegen.var(`${rChild}.ptr.toAst(${rChild}, src)`);
55
+ codegen.if(`${rChildAst} != null`, () => {
56
+ codegen.js(`${rChildrenAst}.push(${rChildAst});`);
57
+ });
58
+ codegen.js(`${rIndex}++;`);
59
+ });
60
+ return rChildrenAst;
61
+ };
62
+ if (isSelectChildrenExpression(node.ast)) {
63
+ codegen.return(createChildrenArr());
64
+ return;
65
+ }
66
+ const dVars = codegen.linkDependency(json_expression_1.Vars);
67
+ let childFragment = '';
68
+ const rChildrenAst = codegen.var();
69
+ if ((0, util_1.isTerminalNode)(node)) {
70
+ childFragment = `, raw: src.slice(cst.pos, cst.end)`;
71
+ }
72
+ else if ((0, util_1.isUnionNode)(node)) {
73
+ const rChild = codegen.var(`cst.children[0]`);
74
+ codegen.js(`${rChildrenAst} = [${rChild}.ptr.toAst(${rChild}, src)];`);
75
+ if (!node.children && !node.leaf) {
76
+ childFragment = `, children: ${rChildrenAst}`;
77
+ }
78
+ }
79
+ else if ((0, util_1.isProductionNode)(node) || (0, util_1.isListNode)(node)) {
80
+ codegen.js(`${rChildrenAst} = ${createChildrenArr()};`);
81
+ if (!node.children && !node.leaf) {
82
+ childFragment = `, children: ${rChildrenAst}`;
83
+ }
84
+ }
85
+ const positionFragment = ctx.positions ? `, pos: cst.pos, end: cst.end` : '';
86
+ const rDefaultAst = codegen.var(`{type: ${JSON.stringify(ptr.type)}${positionFragment}${childFragment}}`);
87
+ if (node.children) {
88
+ for (const [pos, prop] of Object.entries(node.children)) {
89
+ codegen.js(`${rDefaultAst}.${prop} = ${rChildrenAst}[${pos}] ?? null;`);
90
+ }
91
+ }
92
+ if (node.ast !== undefined) {
93
+ const expr = compileExpression(node.ast);
94
+ const dExpr = codegen.linkDependency(expr);
95
+ const rData = codegen.var(`new ${dVars}(${rDefaultAst})`);
96
+ codegen.return(`${dExpr}(${rData})`);
97
+ }
98
+ else {
99
+ codegen.return(`${rDefaultAst}`);
100
+ }
101
+ }
102
+ compile() {
103
+ const fn = this.codegen.compile();
104
+ return fn;
105
+ }
106
+ }
107
+ exports.CodegenAstFactory = CodegenAstFactory;
108
+ CodegenAstFactory.compile = (node, ptr, ctx = new context_1.CodegenContext()) => {
109
+ if (!ctx.astExpressions)
110
+ return Pattern_1.defaultAstFactory;
111
+ if (node.ast === undefined && node.children === undefined)
112
+ return Pattern_1.defaultAstFactory;
113
+ if (node.ast === null)
114
+ return noAstFactory;
115
+ const codegen = new CodegenAstFactory(node, ptr, ctx);
116
+ codegen.generate();
117
+ return codegen.compile();
118
+ };
119
+ //# sourceMappingURL=CodegenAstFactory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CodegenAstFactory.js","sourceRoot":"","sources":["../../src/codegen/CodegenAstFactory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { Grammar, UnionNode, Parser, TerminalNodeShorthand, GrammarNode, TerminalNode, ProductionNode, ListNode, CstNode } from '../types';
2
+ import { CodegenContext } from '../context';
3
+ import { Pattern } from './Pattern';
4
+ export declare class CodegenGrammar {
5
+ readonly grammar: Grammar;
6
+ protected readonly ctx: CodegenContext;
7
+ static readonly compile: (grammar: Grammar, ctx?: CodegenContext) => Parser;
8
+ protected readonly parsers: Map<string, Pattern>;
9
+ protected readonly patterns: Map<string, Pattern>;
10
+ constructor(grammar: Grammar, ctx?: CodegenContext);
11
+ protected compileNode(node: GrammarNode, pattern?: Pattern): Pattern;
12
+ private getNodeParser;
13
+ protected compileTerminal(terminal: TerminalNode | TerminalNodeShorthand, pattern?: Pattern): Pattern;
14
+ protected compileProduction(node: ProductionNode, pattern?: Pattern): Pattern;
15
+ protected compileUnion(node: UnionNode, pattern?: Pattern): Pattern;
16
+ protected compileList(node: ListNode, pattern?: Pattern): Pattern;
17
+ compileRule(name: string): Pattern;
18
+ compile(): Parser;
19
+ walk(node: CstNode, visitor: (node: CstNode) => void): void;
20
+ createAst(cst: CstNode, src: string): unknown;
21
+ }
@@ -0,0 +1,145 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CodegenGrammar = void 0;
4
+ const lazyFunction_1 = require("@jsonjoy.com/util/lib/lazyFunction");
5
+ const CodegenTerminal_1 = require("./CodegenTerminal");
6
+ const CodegenProduction_1 = require("./CodegenProduction");
7
+ const CodegenUnion_1 = require("./CodegenUnion");
8
+ const CodegenList_1 = require("./CodegenList");
9
+ const context_1 = require("../context");
10
+ const Pattern_1 = require("./Pattern");
11
+ const CodegenAstFactory_1 = require("./CodegenAstFactory");
12
+ const util_1 = require("../util");
13
+ class CodegenGrammar {
14
+ constructor(grammar, ctx = new context_1.CodegenContext()) {
15
+ this.grammar = grammar;
16
+ this.ctx = ctx;
17
+ this.parsers = new Map();
18
+ this.patterns = new Map();
19
+ }
20
+ compileNode(node, pattern) {
21
+ if ((0, util_1.isTerminalShorthandNode)(node) || (0, util_1.isTerminalNode)(node)) {
22
+ return this.compileTerminal(node, pattern);
23
+ }
24
+ else if ((0, util_1.isProductionShorthandNode)(node)) {
25
+ return this.compileProduction({ p: node }, pattern);
26
+ }
27
+ else if ((0, util_1.isProductionNode)(node)) {
28
+ return this.compileProduction(node, pattern);
29
+ }
30
+ else if ((0, util_1.isUnionNode)(node)) {
31
+ return this.compileUnion(node, pattern);
32
+ }
33
+ else if ((0, util_1.isListNode)(node)) {
34
+ return this.compileList(node, pattern);
35
+ }
36
+ else if ((0, util_1.isRefNode)(node)) {
37
+ return this.compileRule(node.r);
38
+ }
39
+ else {
40
+ throw new Error('UNKNOWN_NODE');
41
+ }
42
+ }
43
+ getNodeParser(node) {
44
+ if ((0, util_1.isRefNode)(node)) {
45
+ const pattern = this.patterns.get(node.r);
46
+ if (pattern)
47
+ return pattern.parser;
48
+ }
49
+ return (0, lazyFunction_1.lazy)(() => this.compileNode(node).parser);
50
+ }
51
+ compileTerminal(terminal, pattern) {
52
+ const node = (0, util_1.isTerminalShorthandNode)(terminal)
53
+ ? { t: terminal, ast: pattern ? undefined : null }
54
+ : terminal;
55
+ if (pattern && pattern.type && node.ast === undefined) {
56
+ const ast = this.grammar.ast?.[pattern.type];
57
+ if (ast !== void 0)
58
+ node.ast = ast;
59
+ }
60
+ pattern ?? (pattern = new Pattern_1.Pattern(node.type ?? 'Text'));
61
+ pattern.parser = CodegenTerminal_1.CodegenTerminal.compile(node, pattern, this.ctx);
62
+ pattern.toAst = CodegenAstFactory_1.CodegenAstFactory.compile(node, pattern, this.ctx);
63
+ return pattern;
64
+ }
65
+ compileProduction(node, pattern) {
66
+ const parsers = [];
67
+ for (const component of node.p)
68
+ parsers.push(this.getNodeParser(component));
69
+ if (pattern && pattern.type && node.ast === undefined) {
70
+ const ast = this.grammar.ast?.[pattern.type];
71
+ if (ast !== void 0)
72
+ node.ast = ast;
73
+ }
74
+ pattern ?? (pattern = new Pattern_1.Pattern(node.type ?? 'Production'));
75
+ pattern.parser = CodegenProduction_1.CodegenProduction.compile(node, pattern, parsers, this.ctx);
76
+ pattern.toAst = CodegenAstFactory_1.CodegenAstFactory.compile(node, pattern, this.ctx);
77
+ return pattern;
78
+ }
79
+ compileUnion(node, pattern) {
80
+ const parsers = [];
81
+ for (const item of node.u)
82
+ parsers.push(this.getNodeParser(item));
83
+ if (pattern && pattern.type && node.ast === undefined) {
84
+ const ast = this.grammar.ast?.[pattern.type];
85
+ if (ast !== void 0)
86
+ node.ast = ast;
87
+ }
88
+ pattern ?? (pattern = new Pattern_1.Pattern(node.type ?? 'Union'));
89
+ pattern.parser = CodegenUnion_1.CodegenUnion.compile(node, pattern, parsers, this.ctx);
90
+ pattern.toAst = CodegenAstFactory_1.CodegenAstFactory.compile(node, pattern, this.ctx);
91
+ return pattern;
92
+ }
93
+ compileList(node, pattern) {
94
+ if (pattern && pattern.type && node.ast === undefined) {
95
+ const ast = this.grammar.ast?.[pattern.type];
96
+ if (ast !== void 0)
97
+ node.ast = ast;
98
+ }
99
+ pattern ?? (pattern = new Pattern_1.Pattern(node.type ?? 'List'));
100
+ const childParser = this.getNodeParser(node.l);
101
+ pattern.parser = CodegenList_1.CodegenList.compile(node, pattern, childParser, this.ctx);
102
+ pattern.toAst = CodegenAstFactory_1.CodegenAstFactory.compile(node, pattern, this.ctx);
103
+ return pattern;
104
+ }
105
+ compileRule(name) {
106
+ const patterns = this.patterns;
107
+ if (patterns.has(name))
108
+ return patterns.get(name);
109
+ const node = this.grammar.cst[name];
110
+ if (node === undefined)
111
+ throw new Error(`Unknown [rule = ${name}]`);
112
+ const pattern = new Pattern_1.Pattern(name);
113
+ patterns.set(name, pattern);
114
+ this.compileNode(node, pattern);
115
+ return pattern;
116
+ }
117
+ compile() {
118
+ const pattern = this.compileRule(this.grammar.start);
119
+ return pattern.parser;
120
+ }
121
+ walk(node, visitor) {
122
+ const stack = [node];
123
+ while (stack.length > 0) {
124
+ const node = stack.pop();
125
+ const children = node.children;
126
+ if (children) {
127
+ const length = children.length;
128
+ for (let i = length - 1; i >= 0; i--) {
129
+ const child = children[i];
130
+ stack.push(child);
131
+ }
132
+ }
133
+ visitor(node);
134
+ }
135
+ }
136
+ createAst(cst, src) {
137
+ return cst.ptr.toAst(cst, src);
138
+ }
139
+ }
140
+ exports.CodegenGrammar = CodegenGrammar;
141
+ CodegenGrammar.compile = (grammar, ctx) => {
142
+ const codegen = new CodegenGrammar(grammar, ctx);
143
+ return codegen.compile();
144
+ };
145
+ //# sourceMappingURL=CodegenGrammar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CodegenGrammar.js","sourceRoot":"","sources":["../../src/codegen/CodegenGrammar.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { Codegen } from '@jsonjoy.com/util/lib/codegen';
2
+ import { CodegenContext } from '../context';
3
+ import type { ListNode, Parser } from '../types';
4
+ import type { Pattern } from './Pattern';
5
+ export declare class CodegenList {
6
+ protected readonly node: ListNode;
7
+ protected readonly pattern: Pattern;
8
+ protected readonly parser: Parser;
9
+ protected readonly ctx: CodegenContext;
10
+ static readonly compile: (rule: ListNode, pattern: Pattern, parser: Parser, ctx?: CodegenContext) => Parser;
11
+ readonly codegen: Codegen<Parser>;
12
+ constructor(node: ListNode, pattern: Pattern, parser: Parser, ctx: CodegenContext);
13
+ generate(): void;
14
+ compile(): Parser;
15
+ }
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CodegenList = void 0;
4
+ const codegen_1 = require("@jsonjoy.com/util/lib/codegen");
5
+ const matches_1 = require("../matches");
6
+ const context_1 = require("../context");
7
+ class CodegenList {
8
+ constructor(node, pattern, parser, ctx) {
9
+ this.node = node;
10
+ this.pattern = pattern;
11
+ this.parser = parser;
12
+ this.ctx = ctx;
13
+ this.codegen = new codegen_1.Codegen({
14
+ args: ['ctx', 'pos'],
15
+ prologue: 'var str = ctx.str;',
16
+ });
17
+ }
18
+ generate() {
19
+ const { pattern, codegen, parser } = this;
20
+ const dCstMatch = codegen.linkDependency(matches_1.CstMatch);
21
+ const dPattern = codegen.linkDependency(pattern);
22
+ const dParser = codegen.linkDependency(parser);
23
+ const rStart = codegen.var('pos');
24
+ const rChild = codegen.var();
25
+ const rChildren = codegen.var('[]');
26
+ let rDebug = '';
27
+ const rTraceNodeParent = codegen.var();
28
+ if (this.ctx.debug) {
29
+ rDebug = codegen.var();
30
+ const rTrace = codegen.var('ctx.trace');
31
+ codegen.js(`${rTraceNodeParent} = ${rTrace} && ${rTrace}[${rTrace}.length - 1]`);
32
+ codegen.if(rTraceNodeParent, () => {
33
+ codegen.js(`${rDebug} = {ptr: ${dPattern}, pos: pos, children: []}`);
34
+ codegen.js(`${rTraceNodeParent}.children.push(${rDebug})`);
35
+ codegen.js(`${rTrace}.push(${rDebug})`);
36
+ });
37
+ }
38
+ codegen.while(`${rChild} = ${dParser}(ctx, pos)`, () => {
39
+ codegen.js(`if (${rChild}.end === pos) break;`);
40
+ codegen.js(`${rChildren}.push(${rChild})`);
41
+ codegen.js(`pos = ${rChild}.end`);
42
+ });
43
+ const rResult = codegen.var(`new ${dCstMatch}(${rStart}, pos, ${dPattern}, ${rChildren})`);
44
+ if (this.ctx.debug) {
45
+ codegen.if(`${rTraceNodeParent}`, () => {
46
+ codegen.js(`ctx.trace.pop();`);
47
+ codegen.js(`${rDebug}.match = ${rResult}`);
48
+ });
49
+ }
50
+ codegen.return(rResult);
51
+ }
52
+ compile() {
53
+ const fn = this.codegen.compile();
54
+ return fn;
55
+ }
56
+ }
57
+ exports.CodegenList = CodegenList;
58
+ CodegenList.compile = (rule, pattern, parser, ctx = new context_1.CodegenContext()) => {
59
+ const codegen = new CodegenList(rule, pattern, parser, ctx);
60
+ codegen.generate();
61
+ return codegen.compile();
62
+ };
63
+ //# sourceMappingURL=CodegenList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CodegenList.js","sourceRoot":"","sources":["../../src/codegen/CodegenList.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { Codegen } from '@jsonjoy.com/util/lib/codegen';
2
+ import { CodegenContext } from '../context';
3
+ import type { Parser, ProductionNode, ProductionNodeShorthand } from '../types';
4
+ import type { Pattern } from './Pattern';
5
+ export declare class CodegenProduction {
6
+ protected readonly node: ProductionNode;
7
+ protected readonly pattern: Pattern;
8
+ protected readonly parsers: Parser[];
9
+ protected readonly ctx: CodegenContext;
10
+ static readonly compile: (production: ProductionNode | ProductionNodeShorthand, pattern: Pattern, parsers: Parser[], ctx?: CodegenContext) => Parser;
11
+ readonly codegen: Codegen<Parser>;
12
+ constructor(node: ProductionNode, pattern: Pattern, parsers: Parser[], ctx: CodegenContext);
13
+ generate(): void;
14
+ compile(): Parser;
15
+ }
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CodegenProduction = void 0;
4
+ const codegen_1 = require("@jsonjoy.com/util/lib/codegen");
5
+ const matches_1 = require("../matches");
6
+ const context_1 = require("../context");
7
+ class CodegenProduction {
8
+ constructor(node, pattern, parsers, ctx) {
9
+ this.node = node;
10
+ this.pattern = pattern;
11
+ this.parsers = parsers;
12
+ this.ctx = ctx;
13
+ this.codegen = new codegen_1.Codegen({
14
+ args: ['ctx', 'pos'],
15
+ prologue: 'var str = ctx.str;',
16
+ });
17
+ }
18
+ generate() {
19
+ const { codegen, pattern, parsers } = this;
20
+ const results = [];
21
+ const dCstMatch = codegen.linkDependency(matches_1.CstMatch);
22
+ const rStart = codegen.var('pos');
23
+ const rChildren = codegen.var('[]');
24
+ const dPattern = codegen.linkDependency(pattern);
25
+ const rDebug = codegen.var();
26
+ const rTraceNodeParent = codegen.var();
27
+ if (this.ctx.debug) {
28
+ const rTrace = codegen.var('ctx.trace');
29
+ codegen.js(`${rTraceNodeParent} = ${rTrace} && ${rTrace}[${rTrace}.length - 1]`);
30
+ codegen.if(rTraceNodeParent, () => {
31
+ codegen.js(`${rDebug} = {ptr: ${dPattern}, pos: pos, children: []}`);
32
+ codegen.js(`${rTraceNodeParent}.children.push(${rDebug})`);
33
+ codegen.js(`${rTrace}.push(${rDebug})`);
34
+ });
35
+ }
36
+ for (const parser of parsers) {
37
+ const dep = codegen.linkDependency(parser);
38
+ const reg = codegen.var(`${dep}(ctx, pos)`);
39
+ results.push(reg);
40
+ codegen.if(`!${reg}`, () => {
41
+ if (this.ctx.debug) {
42
+ codegen.if(rTraceNodeParent, () => {
43
+ codegen.js(`ctx.trace.pop();`);
44
+ });
45
+ }
46
+ codegen.return('');
47
+ });
48
+ codegen.js(`pos = ${reg}.end`);
49
+ codegen.js(`${rChildren}.push(${reg})`);
50
+ }
51
+ const rMatch = codegen.var(`new ${dCstMatch}(${rStart}, pos, ${dPattern}, ${rChildren})`);
52
+ if (this.ctx.debug) {
53
+ codegen.if(rTraceNodeParent, () => {
54
+ codegen.js(`ctx.trace.pop();`);
55
+ codegen.js(`${rDebug}.match = ${rMatch}`);
56
+ });
57
+ }
58
+ codegen.return(rMatch);
59
+ }
60
+ compile() {
61
+ const fn = this.codegen.compile();
62
+ return fn;
63
+ }
64
+ }
65
+ exports.CodegenProduction = CodegenProduction;
66
+ CodegenProduction.compile = (production, pattern, parsers, ctx = new context_1.CodegenContext()) => {
67
+ const production2 = production instanceof Array ? { p: production } : production;
68
+ const codegen = new CodegenProduction(production2, pattern, parsers, ctx);
69
+ codegen.generate();
70
+ return codegen.compile();
71
+ };
72
+ //# sourceMappingURL=CodegenProduction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CodegenProduction.js","sourceRoot":"","sources":["../../src/codegen/CodegenProduction.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { Codegen } from '@jsonjoy.com/util/lib/codegen';
2
+ import { CodegenContext } from '../context';
3
+ import type { Parser, TerminalNode, TerminalNodeShorthand } from '../types';
4
+ import type { Pattern } from './Pattern';
5
+ export declare class CodegenTerminal {
6
+ protected readonly node: TerminalNode;
7
+ protected readonly pattern: Pattern;
8
+ protected readonly ctx: CodegenContext;
9
+ static readonly compile: (terminal: TerminalNode | TerminalNodeShorthand, pattern: Pattern, ctx?: CodegenContext) => Parser;
10
+ readonly codegen: Codegen<Parser>;
11
+ constructor(node: TerminalNode, pattern: Pattern, ctx: CodegenContext);
12
+ generate(): void;
13
+ compile(): Parser;
14
+ }
@@ -0,0 +1,133 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CodegenTerminal = void 0;
4
+ const codegen_1 = require("@jsonjoy.com/util/lib/codegen");
5
+ const helpers_1 = require("@jsonjoy.com/util/lib/codegen/util/helpers");
6
+ const matches_1 = require("../matches");
7
+ const util_1 = require("../util");
8
+ const context_1 = require("../context");
9
+ const isTerminalShorthandNode = (item) => typeof item === 'string' || item instanceof RegExp;
10
+ class CodegenTerminal {
11
+ constructor(node, pattern, ctx) {
12
+ this.node = node;
13
+ this.pattern = pattern;
14
+ this.ctx = ctx;
15
+ this.codegen = new codegen_1.Codegen({
16
+ args: ['ctx', 'pos'],
17
+ prologue: 'var str = ctx.str;',
18
+ });
19
+ }
20
+ generate() {
21
+ const { codegen, node, pattern } = this;
22
+ const match = node.t;
23
+ const dPattern = codegen.linkDependency(pattern);
24
+ const dLeafCstMatch = codegen.linkDependency(matches_1.LeafCstMatch);
25
+ let rDebug = '';
26
+ const rTraceNodeParent = codegen.var();
27
+ if (this.ctx.debug) {
28
+ rDebug = codegen.var();
29
+ const rTrace = codegen.var('ctx.trace');
30
+ codegen.js(`${rTraceNodeParent} = ${rTrace} && ${rTrace}[${rTrace}.length - 1]`);
31
+ codegen.if(rTraceNodeParent, () => {
32
+ codegen.js(`${rDebug} = {ptr: ${dPattern}, pos: pos}`);
33
+ codegen.js(`${rTraceNodeParent}.children.push(${rDebug})`);
34
+ });
35
+ }
36
+ if (typeof match === 'string') {
37
+ const cleanTerminal = (0, util_1.scrub)(match);
38
+ const condition = cleanTerminal ? (0, helpers_1.emitStringMatch)('str', 'pos', cleanTerminal) : 'true';
39
+ codegen.if(`!(${condition})`, () => {
40
+ codegen.return('');
41
+ });
42
+ const rMatch = codegen.var(`new ${dLeafCstMatch}(pos, pos + ${cleanTerminal.length}, ${dPattern});`);
43
+ if (this.ctx.debug) {
44
+ codegen.if(rTraceNodeParent, () => {
45
+ codegen.js(`${rDebug}.match = ${rMatch}`);
46
+ });
47
+ }
48
+ codegen.return(rMatch);
49
+ }
50
+ else if (match instanceof RegExp) {
51
+ const source = '^(?:' + match.source + ')';
52
+ const regExp = new RegExp(source, match.flags);
53
+ const dRegExp = codegen.linkDependency(regExp);
54
+ const rSlice = codegen.var(`str.slice(pos)`);
55
+ const rMatch = codegen.var(`${rSlice}.match(${dRegExp})`);
56
+ codegen.if(`!${rMatch}`, () => {
57
+ codegen.return('');
58
+ });
59
+ const rLength = codegen.var(`${rMatch} ? +(${rMatch}[0].length) : 0`);
60
+ const rResult = codegen.var(`new ${dLeafCstMatch}(pos, pos + ${rLength}, ${dPattern});`);
61
+ if (this.ctx.debug) {
62
+ codegen.if(rTraceNodeParent, () => {
63
+ codegen.js(`${rDebug}.match = ${rResult}`);
64
+ });
65
+ }
66
+ codegen.return(rResult);
67
+ }
68
+ else if (match instanceof Array) {
69
+ if (node.repeat) {
70
+ const rEnd = codegen.var('pos');
71
+ codegen.while('1', () => {
72
+ for (const match0 of match) {
73
+ const cleanTerminal = (0, util_1.scrub)(match0);
74
+ const condition = (0, helpers_1.emitStringMatch)('str', rEnd, cleanTerminal);
75
+ codegen.if(condition, () => {
76
+ codegen.js(`${rEnd} += ${cleanTerminal.length};`);
77
+ codegen.js('continue;');
78
+ });
79
+ }
80
+ codegen.js('break;');
81
+ });
82
+ if (node.repeat === '+') {
83
+ codegen.if(`${rEnd} === pos`, () => {
84
+ codegen.return('');
85
+ });
86
+ }
87
+ const rMatch = codegen.var(`new ${dLeafCstMatch}(pos, ${rEnd}, ${dPattern});`);
88
+ if (this.ctx.debug) {
89
+ codegen.if(rTraceNodeParent, () => {
90
+ codegen.js(`${rDebug}.match = ${rMatch}`);
91
+ });
92
+ }
93
+ codegen.return(rMatch);
94
+ }
95
+ else {
96
+ const rEnd = codegen.var('pos');
97
+ for (const match0 of match) {
98
+ const cleanTerminal = (0, util_1.scrub)(match0);
99
+ const condition = (0, helpers_1.emitStringMatch)('str', 'pos', cleanTerminal);
100
+ codegen.if(condition, () => {
101
+ codegen.js(`${rEnd} += ${cleanTerminal.length};`);
102
+ });
103
+ }
104
+ codegen.if(`${rEnd} === pos`, () => {
105
+ codegen.return('');
106
+ });
107
+ const rMatch = codegen.var(`new ${dLeafCstMatch}(pos, ${rEnd}, ${dPattern});`);
108
+ if (this.ctx.debug) {
109
+ codegen.if(rTraceNodeParent, () => {
110
+ codegen.js(`${rDebug}.match = ${rMatch}`);
111
+ });
112
+ }
113
+ codegen.return(rMatch);
114
+ }
115
+ }
116
+ else {
117
+ throw new Error('INVALID_TERMINAL');
118
+ }
119
+ }
120
+ compile() {
121
+ const fn = this.codegen.compile();
122
+ return fn;
123
+ }
124
+ }
125
+ exports.CodegenTerminal = CodegenTerminal;
126
+ CodegenTerminal.compile = (terminal, pattern, ctx = new context_1.CodegenContext()) => {
127
+ if (isTerminalShorthandNode(terminal))
128
+ return CodegenTerminal.compile({ t: terminal }, pattern, ctx);
129
+ const codegen = new CodegenTerminal(terminal, pattern, ctx);
130
+ codegen.generate();
131
+ return codegen.compile();
132
+ };
133
+ //# sourceMappingURL=CodegenTerminal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CodegenTerminal.js","sourceRoot":"","sources":["../../src/codegen/CodegenTerminal.ts"],"names":[],"mappings":"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"}