eggtended-js
Version:
A extended version of the Egg programming language from the Eloquent Javascript book.
70 lines (56 loc) • 2.02 kB
JavaScript
const fs = require("fs");
const commander = require("commander");
const process = require("process");
const { Eggvm } = require("../lib/interp/eggvm.js");
const { Parser } = require("../lib/parser/parse.js");
const { Lexer } = require("../lib/parser/lexer.js");
const { Semantic } = require("../lib/parser/semantic.js");
const { Optimizer } = require("../lib/parser/optimizer.js");
const { repl } = require("../lib/repl/repl.js");
commander
.version(`eggtended-js ${require("../package.json").version}`)
.option(
"-r --run <fileName.egg>",
"compiles the input egg program and runs it using the egg interpreter"
)
.option(
"-c --compile <fileName.egg>",
"compile the input egg program to produce a JSON containing the resulting egg AST"
)
.option(
"-t --tokenize <fileName.egg>",
"tokenize the input egg program and print the array of tokens produced"
)
.option("-o --optimize", "optimize the resulting AST, generating a smaller one")
.option("-i --interpret <fileName>", "interprets the input egg AST")
.parse(process.argv);
// Interpreter args
if (commander.run) {
let tree = Parser.parseFromFile(commander.run);
tree = Semantic.check(tree);
if (commander.optimize) {
console.log("Optimizer called");
tree = Optimizer.optimize(tree);
}
const output = Eggvm.eval(tree);
console.log(`Return value: ${output}`);
} else if (commander.compile) {
let tree = Parser.parseFromFile(commander.compile);
tree = Semantic.check(tree);
if (commander.optimize) {
console.log("Optimizer called");
tree = Optimizer.optimize(tree);
}
const json = JSON.stringify(tree, null, " ");
fs.writeFileSync(commander.compile + ".evm", json);
console.log(json);
} else if (commander.tokenize) {
const tokens = Lexer.tokenizeFromFile(commander.tokenize);
console.log(tokens);
} else if (commander.interpret) {
const output = Eggvm.runFromEVM(commander.interpret);
console.log(`Return value: ${output}`);
} else {
repl();
}