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();