@parser-generator/cli
Version:
A Parser Generator that supports LL,SLR,LR1,LALR
50 lines • 2.26 kB
JavaScript
import webpack from "webpack";
import HtmlWebpackPlugin from "html-webpack-plugin";
import fs from "fs";
import path from "path";
import { genParser, adapter } from "@parser-generator/grammar-interpreter";
const TEMPLATE_PATH = path.resolve(__dirname, "./template/index.html");
const LR_ENTRY_PATH = path.resolve(__dirname, "./template/lr.js");
const LL_ENTRY_PATH = path.resolve(__dirname, "./template/ll.js");
export function codegen({ parser, lang, outputDir, file }) {
/*************************************** 生成代码文件 ****************************************/
let rawGrammar = fs.readFileSync(file, { encoding: "utf-8" });
let { code, grammar, firstTable, followTable, lrTable, lrAutomata } = genParser(rawGrammar, { parser, lang });
//1. 生成parser
let ext = lang == "TS" ? ".ts" : ".js";
fs.writeFileSync(path.resolve(outputDir, "parser" + ext), code);
//2.生成模版
let tmplData = { prods: grammar.productions(), first: undefined, follow: undefined, lrTable: undefined, lrAutomata: undefined };
if (firstTable != undefined)
tmplData.first = adapter.firstTableToDimArr(firstTable);
if (followTable != undefined)
tmplData.follow = adapter.followTableToDimArr(followTable);
if (lrTable != undefined)
tmplData.lrTable = adapter.lrTableToDimArr(lrTable);
if (lrAutomata != undefined)
tmplData.lrAutomata = JSON.stringify(adapter.lrAutomataToGraph(lrAutomata));
let entry = parser == "LL" ? LL_ENTRY_PATH : LR_ENTRY_PATH;
webpack({
mode: "production",
// stats: "verbose",
entry,
output: { path: outputDir },
plugins: [
new HtmlWebpackPlugin({
inject: true,
templateParameters: tmplData,
template: TEMPLATE_PATH,
}),
new webpack.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 }));
});
}
//# sourceMappingURL=codegen.js.map