UNPKG

@parser-generator/cli

Version:

A Parser Generator that supports LL,SLR,LR1,LALR

56 lines 2.8 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const webpack_1 = __importDefault(require("webpack")); const html_webpack_plugin_1 = __importDefault(require("html-webpack-plugin")); const fs_1 = __importDefault(require("fs")); const path_1 = __importDefault(require("path")); const grammar_interpreter_1 = require("@parser-generator/grammar-interpreter"); const TEMPLATE_PATH = path_1.default.resolve(__dirname, "./template/index.html"); const LR_ENTRY_PATH = path_1.default.resolve(__dirname, "./template/lr.js"); const LL_ENTRY_PATH = path_1.default.resolve(__dirname, "./template/ll.js"); function codegen({ parser, lang, outputDir, file }) { /*************************************** 生成代码文件 ****************************************/ let rawGrammar = fs_1.default.readFileSync(file, { encoding: "utf-8" }); let { code, grammar, firstTable, followTable, lrTable, lrAutomata } = grammar_interpreter_1.genParser(rawGrammar, { parser, lang }); //1. 生成parser let ext = lang == "TS" ? ".ts" : ".js"; fs_1.default.writeFileSync(path_1.default.resolve(outputDir, "parser" + ext), code); //2.生成模版 let tmplData = { prods: grammar.productions(), first: undefined, follow: undefined, lrTable: undefined, lrAutomata: undefined }; if (firstTable != undefined) tmplData.first = grammar_interpreter_1.adapter.firstTableToDimArr(firstTable); if (followTable != undefined) tmplData.follow = grammar_interpreter_1.adapter.followTableToDimArr(followTable); if (lrTable != undefined) tmplData.lrTable = grammar_interpreter_1.adapter.lrTableToDimArr(lrTable); if (lrAutomata != undefined) tmplData.lrAutomata = JSON.stringify(grammar_interpreter_1.adapter.lrAutomataToGraph(lrAutomata)); let entry = parser == "LL" ? LL_ENTRY_PATH : LR_ENTRY_PATH; webpack_1.default({ mode: "production", // stats: "verbose", entry, output: { path: outputDir }, plugins: [ new html_webpack_plugin_1.default({ inject: true, templateParameters: tmplData, template: TEMPLATE_PATH, }), new webpack_1.default.BannerPlugin(`Copyright (c) 2019 light Licensed under the MIT License (MIT), see https://github.com/light0x00/parser-generator`), ] }, (err, stats) => { if (err) { console.error(err.stack || err); } if (stats.hasWarnings() || stats.hasErrors()) console.log(stats.toString({ colors: true })); }); } exports.codegen = codegen; //# sourceMappingURL=codegen.js.map