@lcap/nasl-parser
Version:
Take Nasl text to Nasl AST with the help of generalized parsing.
140 lines • 5.55 kB
JavaScript
;
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