@parser-generator/cli
Version:
A Parser Generator that supports LL,SLR,LR1,LALR
56 lines • 2.8 kB
JavaScript
;
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