build: optimize antlr script (#171)
This commit is contained in:
85
scripts/antlr4.js
Normal file
85
scripts/antlr4.js
Normal file
@ -0,0 +1,85 @@
|
||||
const path = require("path");
|
||||
const exec = require("child_process").exec;
|
||||
const fs = require("fs");
|
||||
const argv = require("yargs-parser")(process.argv.slice(2));
|
||||
const inquirer = require("inquirer");
|
||||
const chalk = require("chalk");
|
||||
|
||||
const grammarsPath = path.resolve(__dirname, "../src/grammar");
|
||||
const outputPath = path.resolve(__dirname, "../src/lib");
|
||||
|
||||
const languageEntries = fs
|
||||
.readdirSync(grammarsPath)
|
||||
.filter((item) => item !== "impala"); // impala is not support yet.
|
||||
|
||||
const baseCmd = 'antlr4ts -visitor -listener -Xexact-output-dir -o';
|
||||
|
||||
function compile(language) {
|
||||
const cmd = `${baseCmd} ${outputPath}/${language} ${grammarsPath}/${language}/*.g4`;
|
||||
|
||||
console.info(chalk.green(`\nRemoving:`, chalk.gray(`${outputPath}/${language}/*`)));
|
||||
fs.rmdirSync(`${outputPath}/${language}`, { recursive: true })
|
||||
|
||||
console.info(chalk.green("Executing:"), chalk.gray(cmd));
|
||||
exec(cmd, (err) => {
|
||||
if (err) {
|
||||
console.error(
|
||||
chalk.redBright(`\n[Antlr4 compile error]:`),
|
||||
chalk.cyan(language),
|
||||
chalk.gray(err)
|
||||
);
|
||||
} else {
|
||||
console.log(chalk.greenBright(`\nCompile ${language} succeeded!`));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function prompt() {
|
||||
inquirer
|
||||
.prompt([
|
||||
{
|
||||
type: "list",
|
||||
name: "language",
|
||||
message: "Which language you want compile (or all languages)",
|
||||
choices: ["All Languages", ...languageEntries],
|
||||
loop: true,
|
||||
},
|
||||
])
|
||||
.then((result) => {
|
||||
const language = result.language;
|
||||
if(language === 'All Languages') {
|
||||
languageEntries.forEach((language) => {
|
||||
compile(language);
|
||||
});
|
||||
} else {
|
||||
compile(result.language);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function main() {
|
||||
if (argv.all) {
|
||||
// compile all: yarn antlr4 --all
|
||||
languageEntries.forEach((language) => {
|
||||
compile(language);
|
||||
});
|
||||
} else if (argv.lang) {
|
||||
// compile single: yarn antlr4 --lang=generic
|
||||
const supportedLanguage = languageEntries.some(
|
||||
(language) => language === argv.lang
|
||||
);
|
||||
if (supportedLanguage) {
|
||||
compile(argv.lang);
|
||||
} else {
|
||||
console.error(
|
||||
chalk.bold.red("\n[Invalid language]:"),
|
||||
chalk.white.underline(`${argv.lang}\n`)
|
||||
);
|
||||
prompt();
|
||||
}
|
||||
} else {
|
||||
prompt();
|
||||
}
|
||||
}
|
||||
|
||||
main();
|
Reference in New Issue
Block a user