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.
- package/README.md +632 -0
- package/lib/codegen/CodegenAstFactory.d.ts +14 -0
- package/lib/codegen/CodegenAstFactory.js +119 -0
- package/lib/codegen/CodegenAstFactory.js.map +1 -0
- package/lib/codegen/CodegenGrammar.d.ts +21 -0
- package/lib/codegen/CodegenGrammar.js +145 -0
- package/lib/codegen/CodegenGrammar.js.map +1 -0
- package/lib/codegen/CodegenList.d.ts +15 -0
- package/lib/codegen/CodegenList.js +63 -0
- package/lib/codegen/CodegenList.js.map +1 -0
- package/lib/codegen/CodegenProduction.d.ts +15 -0
- package/lib/codegen/CodegenProduction.js +72 -0
- package/lib/codegen/CodegenProduction.js.map +1 -0
- package/lib/codegen/CodegenTerminal.d.ts +14 -0
- package/lib/codegen/CodegenTerminal.js +133 -0
- package/lib/codegen/CodegenTerminal.js.map +1 -0
- package/lib/codegen/CodegenUnion.d.ts +15 -0
- package/lib/codegen/CodegenUnion.js +71 -0
- package/lib/codegen/CodegenUnion.js.map +1 -0
- package/lib/codegen/Pattern.d.ts +8 -0
- package/lib/codegen/Pattern.js +41 -0
- package/lib/codegen/Pattern.js.map +1 -0
- package/lib/context.d.ts +13 -0
- package/lib/context.js +20 -0
- package/lib/context.js.map +1 -0
- package/lib/generator.d.ts +20 -0
- package/lib/generator.js +100 -0
- package/lib/generator.js.map +1 -0
- package/lib/grammars/calculator.d.ts +2 -0
- package/lib/grammars/calculator.js +76 -0
- package/lib/grammars/calculator.js.map +1 -0
- package/lib/grammars/esql.d.ts +2 -0
- package/lib/grammars/esql.js +221 -0
- package/lib/grammars/esql.js.map +1 -0
- package/lib/grammars/javascript.d.ts +2 -0
- package/lib/grammars/javascript.js +251 -0
- package/lib/grammars/javascript.js.map +1 -0
- package/lib/grammars/json-expression.d.ts +2 -0
- package/lib/grammars/json-expression.js +101 -0
- package/lib/grammars/json-expression.js.map +1 -0
- package/lib/grammars/json.d.ts +2 -0
- package/lib/grammars/json.js +79 -0
- package/lib/grammars/json.js.map +1 -0
- package/lib/index.d.ts +0 -0
- package/lib/index.js +2 -0
- package/lib/index.js.map +1 -0
- package/lib/matches.d.ts +15 -0
- package/lib/matches.js +21 -0
- package/lib/matches.js.map +1 -0
- package/lib/print.d.ts +11 -0
- package/lib/print.js +97 -0
- package/lib/print.js.map +1 -0
- package/lib/testing/cli.d.ts +1 -0
- package/lib/testing/cli.js +84 -0
- package/lib/testing/cli.js.map +1 -0
- package/lib/testing/driver.d.ts +21 -0
- package/lib/testing/driver.js +73 -0
- package/lib/testing/driver.js.map +1 -0
- package/lib/testing/index.d.ts +5 -0
- package/lib/testing/index.js +9 -0
- package/lib/testing/index.js.map +1 -0
- package/lib/testing/jest.d.ts +4 -0
- package/lib/testing/jest.js +31 -0
- package/lib/testing/jest.js.map +1 -0
- package/lib/testing/report.d.ts +3 -0
- package/lib/testing/report.js +64 -0
- package/lib/testing/report.js.map +1 -0
- package/lib/testing/runner.d.ts +29 -0
- package/lib/testing/runner.js +93 -0
- package/lib/testing/runner.js.map +1 -0
- package/lib/testing/types.d.ts +34 -0
- package/lib/testing/types.js +3 -0
- package/lib/testing/types.js.map +1 -0
- package/lib/types.d.ts +70 -0
- package/lib/types.js +3 -0
- package/lib/types.js.map +1 -0
- package/lib/util.d.ts +10 -0
- package/lib/util.js +39 -0
- package/lib/util.js.map +1 -0
- 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":";;;AAAA,2DAAsD;AACtD,wCAA0C;AAC1C,uCAAqD;AACrD,kEAA+E;AAC/E,0EAAwE;AACxE,kCAAkF;AAGlF,MAAM,YAAY,GAAmB,GAAG,EAAE,CAAC,IAAI,CAAC;AAEhD,MAAM,4BAA4B,GAAG,CAAC,IAAa,EAAE,EAAE;IACrD,OAAO,IAAI,YAAY,KAAK,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,aAAa,CAAC;AACpG,CAAC,CAAC;AAEF,MAAM,0BAA0B,GAAG,CAAC,IAAa,EAAE,EAAE;IACnD,OAAO,IAAI,YAAY,KAAK,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,WAAW,CAAC;AAClG,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,UAAgB,EAAE,EAAE;IAC7C,MAAM,WAAW,GAAG,IAAI,uCAAqB,CAAC;QAC5C,UAAU;QACV,SAAS,EAAE,wBAAY;KACxB,CAAC,CAAC;IACH,OAAO,WAAW,CAAC,GAAG,EAAE,CAAC,UAAU,EAAE,CAAC;AACxC,CAAC,CAAC;AAEF,MAAa,iBAAiB;IAgB5B,YACqB,IAAyB,EACzB,GAAY,EACZ,GAAmB;QAFnB,SAAI,GAAJ,IAAI,CAAqB;QACzB,QAAG,GAAH,GAAG,CAAS;QACZ,QAAG,GAAH,GAAG,CAAgB;QAEtC,IAAI,CAAC,OAAO,GAAG,IAAI,iBAAO,CAAC;YACzB,IAAI,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC;SACrB,CAAC,CAAC;IACL,CAAC;IAEM,QAAQ;QACb,MAAM,EAAC,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAC,GAAG,IAAI,CAAC;QACvC,IAAI,4BAA4B,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAI3C,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAChC,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE;gBACtB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,MAAM,GAAG,CAAC,CAAC;gBACtD,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,cAAc,MAAM,QAAQ,CAAC,CAAC;gBACrE,OAAO,CAAC,EAAE,CAAC,GAAG,SAAS,UAAU,EAAE,GAAG,EAAE;oBACtC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBAC5B,CAAC,CAAC,CAAC;gBACH,OAAO,CAAC,EAAE,CAAC,GAAG,MAAM,KAAK,CAAC,CAAC;YAC7B,CAAC,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QACD,MAAM,iBAAiB,GAAG,GAAG,EAAE;YAC7B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAChC,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YAC9C,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACvC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,SAAS,CAAC,CAAC;YACnD,OAAO,CAAC,KAAK,CAAC,GAAG,MAAM,MAAM,OAAO,EAAE,EAAE,GAAG,EAAE;gBAC3C,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,IAAI,MAAM,GAAG,CAAC,CAAC;gBACtD,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,cAAc,MAAM,QAAQ,CAAC,CAAC;gBACrE,OAAO,CAAC,EAAE,CAAC,GAAG,SAAS,UAAU,EAAE,GAAG,EAAE;oBACtC,OAAO,CAAC,EAAE,CAAC,GAAG,YAAY,SAAS,SAAS,IAAI,CAAC,CAAC;gBACpD,CAAC,CAAC,CAAC;gBACH,OAAO,CAAC,EAAE,CAAC,GAAG,MAAM,KAAK,CAAC,CAAC;YAC7B,CAAC,CAAC,CAAC;YACH,OAAO,YAAY,CAAC;QACtB,CAAC,CAAC;QACF,IAAI,0BAA0B,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAIzC,OAAO,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC,CAAC;YACpC,OAAO;QACT,CAAC;QACD,MAAM,KAAK,GAAG,OAAO,CAAC,cAAc,CAAC,sBAAI,CAAC,CAAC;QAC3C,IAAI,aAAa,GAAG,EAAE,CAAC;QACvB,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QACnC,IAAI,IAAA,qBAAc,EAAC,IAAI,CAAC,EAAE,CAAC;YACzB,aAAa,GAAG,oCAAoC,CAAC;QACvD,CAAC;aAAM,IAAI,IAAA,kBAAW,EAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;YAC9C,OAAO,CAAC,EAAE,CAAC,GAAG,YAAY,OAAO,MAAM,cAAc,MAAM,UAAU,CAAC,CAAC;YACvE,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACjC,aAAa,GAAG,eAAe,YAAY,EAAE,CAAC;YAChD,CAAC;QACH,CAAC;aAAM,IAAI,IAAA,uBAAgB,EAAC,IAAI,CAAC,IAAI,IAAA,iBAAU,EAAC,IAAI,CAAC,EAAE,CAAC;YACtD,OAAO,CAAC,EAAE,CAAC,GAAG,YAAY,MAAM,iBAAiB,EAAE,GAAG,CAAC,CAAC;YACxD,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACjC,aAAa,GAAG,eAAe,YAAY,EAAE,CAAC;YAChD,CAAC;QACH,CAAC;QACD,MAAM,gBAAgB,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,8BAA8B,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7E,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,gBAAgB,GAAG,aAAa,GAAG,CAAC,CAAC;QAC1G,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAElB,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAExD,OAAO,CAAC,EAAE,CAAC,GAAG,WAAW,IAAI,IAAI,MAAM,YAAY,IAAI,GAAG,YAAY,CAAC,CAAC;YAC1E,CAAC;QAGH,CAAC;QACD,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,iBAAiB,CAAC,IAAI,CAAC,GAAU,CAAC,CAAC;YAChD,MAAM,KAAK,GAAG,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;YAC3C,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,IAAI,WAAW,GAAG,CAAC,CAAC;YAC1D,OAAO,CAAC,MAAM,CAAC,GAAG,KAAK,IAAI,KAAK,GAAG,CAAC,CAAC;QACvC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,MAAM,CAAC,GAAG,WAAW,EAAE,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAEM,OAAO;QACZ,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QAElC,OAAO,EAAE,CAAC;IACZ,CAAC;;AA3GH,8CA4GC;AA3GwB,yBAAO,GAAG,CAC/B,IAAyB,EACzB,GAAY,EACZ,MAAsB,IAAI,wBAAc,EAAE,EAC1B,EAAE;IAClB,IAAI,CAAC,GAAG,CAAC,cAAc;QAAE,OAAO,2BAAiB,CAAC;IAClD,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS;QAAE,OAAO,2BAAiB,CAAC;IACpF,IAAI,IAAI,CAAC,GAAG,KAAK,IAAI;QAAE,OAAO,YAAY,CAAC;IAC3C,MAAM,OAAO,GAAG,IAAI,iBAAiB,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IACtD,OAAO,CAAC,QAAQ,EAAE,CAAC;IACnB,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;AAC3B,CAAC,CAAC"}
|
|
@@ -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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"}
|