UNPKG

@lcap/nasl-parser

Version:

Take Nasl text to Nasl AST with the help of generalized parsing.

140 lines 5.55 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.toNaslAST = toNaslAST; // import * as nasl from '@lcap/nasl'; const nasl = __importStar(require("./decorated-nasl-ast")); const common_util_1 = require("./common-util"); const process_annotations_1 = require("./process-annotations"); const resolve_local_bindings_1 = require("./resolve-local-bindings"); const asserts_1 = require("@lcap/nasl-concepts/asserts"); const resolve_global_bindings_1 = require("./resolve-global-bindings"); /** * 缺失: * *** Type<Ty, Ty> 使用处的 Ty 区分是引入的 type variable 还是外层定义的 reference type。 * *** Annotation 处理 * NewList 缺 TypeAnnotation * ArrayAccess 多维下标支持,翻译成连续 Get 调用 * callNameSpace 完整实现 * type 的 nameSpace 完整实现 * qualified name 等 * { } 和 [ ] 的识别 * */ /** * 已实现: * toNaslAST 不会区分函数、逻辑、接口调用、new 构造器调用,先统一为逻辑调用。会在下一个 refine-nasl-call 阶段区分。 * */ /** * class 方法与全局函数相比 * - 可隐式传递数据,(通过 this)。仁者见仁,智者见智。 * * 承上,visitor 模式与普通架构相比 * - 在 this 上动态派发(通过 override),将多个函数名 toNaslAAA、toNaslBBB、toNaslCCC 全部统一为 toNasl 或 visit。 * 这样大量的递归调用 toNaslAAA、toNaslBBB 也可全部统一为 toNasl 或 visit。仁者见仁,智者见智。 * - 如使用外部 visitor 模式,仍需要遍历一遍整棵 AST 结构来写出 visitor,并不节约代码量。 * 如使用内部 visitor 模式,仍没有充足的控制权,如遍历顺序等。仁者见仁,智者见智。 */ // defs.nasl 是一个数组,方便后续处理 function toNaslAST(seqNasl) { if (!seqNasl) { return null; } const cei = new resolve_global_bindings_1.CompilerEnvInfo(); seqNasl = addGlobalBindings(cei, seqNasl); seqNasl = addLocalBindings(cei, seqNasl); const dataSources = new Array(); (0, process_annotations_1.processAnnotations)(cei, seqNasl, dataSources); const app = new nasl.App({ logics: extractLogics(seqNasl), enums: extractEnums(seqNasl), structures: extractStructures(seqNasl), frontendTypes: seqNasl.filter(asserts_1.isFrontendType), dataSources: [], }); app.name = 'UnstableFeatureTestOnly'; // const app : nasl.App = collectAppFromSeqNasl(sn); // app.dataSources = dataSources; // return PackNaslAndCst(app, {App: defs.cst}); return app; } function addGlobalBindings(cei, seqNaslDefs) { const tasks = (env, obj) => { (0, resolve_global_bindings_1.collectAllGlobalDefinitions)(env, obj); return obj; }; const clean = (env, obj) => { (0, resolve_global_bindings_1.leaveNamespace)(env, obj); return obj; }; return new common_util_1.Visitor().preOrderVisitAll(cei, seqNaslDefs, tasks, clean); } function addLocalBindings(cei, seqNaslDefs) { const tasks = (env, obj) => { (0, resolve_local_bindings_1.usingNamespace)(env, obj); (0, resolve_local_bindings_1.addLogicLocalBindings)(env, obj); obj = (0, resolve_local_bindings_1.resolveCallee)(env, obj); obj = (0, resolve_local_bindings_1.resolveTypeRef)(env, obj); obj = (0, resolve_local_bindings_1.resolveQEnumId)(env, obj); return obj; }; const clean = (env, obj) => { (0, resolve_local_bindings_1.removeLogicLocalBindings)(env, obj); return obj; }; return new common_util_1.Visitor().preOrderVisitAll(cei, seqNaslDefs, tasks, clean); } function extractStructures(nodes) { const res = []; new common_util_1.Visitor().preOrderVisitAll(null, nodes, (env, obj) => { if ((0, asserts_1.isStructure)(obj)) { res.push(obj); } return obj; }); return res; } function extractEnums(nodes) { const res = []; new common_util_1.Visitor().preOrderVisitAll(null, nodes, (env, obj) => { if ((0, asserts_1.isEnum)(obj)) { res.push(obj); } return obj; }); return res; } function extractLogics(nodes) { const res = []; new common_util_1.Visitor().preOrderVisitAll(null, nodes, (env, obj) => { if ((0, asserts_1.isLogic)(obj)) { res.push(obj); } return obj; }); return res; } //# sourceMappingURL=to-nasl-ast.js.map