Home Reference Source Test

lib/repl/repl.js

const process = require("process");
const readline = require("readline");

const { Lexer } = require("../parser/lexer.js");
const { Parser } = require("../parser/parse.js");
const { TopEnv } = require("../interp/environment.js");
const { Eggvm } = require("../interp/eggvm.js");

const extensions = require("./extensions.js");
const colors = require("./colors.js");

const repl = () => {
  // Create the REPL environment
  const topEnv = Object.create(TopEnv);
  const lexer = new Lexer();
  const parser = new Parser();

  let program = "";
  let stack = 0;

  extensions.eggInfo();

  try {
    const rl = readline.createInterface(process.stdin, process.stdout, line => {
      return extensions.eggCompleter(line, topEnv);
    });

    rl.setPrompt(extensions.getPromptLine());
    rl.prompt();

    rl.on("line", line => {
      program += line + "\n";

      // Count the number of LPS (+) or RPS (-)
      stack = lexer.getParBalance(program);

      if (stack <= 0) {
        try {
          Eggvm.eval(parser.parse(program), topEnv);
        } catch (err) {
          console.log(`${colors.RED} Error:: ${err} ${colors.DEFAULT}`);
        } finally {
          program = "";
          stack = 0;
        }
      }

      rl.setPrompt(extensions.getPromptLine() + "..".repeat(stack));
      rl.prompt();
    });

    rl.on("close", extensions.eggExit);

    rl.on("SIGINT", () => {
      console.log(
        `\n${colors.GREEN}\n--> Expression discarded ${colors.DEFAULT}`
      );

      program = "";
      stack = 0;

      rl.clearLine(process.stdout);

      rl.setPrompt(extensions.getPromptLine());
      rl.prompt();
    });
  } catch (err) {
    console.log(err);
    extensions.eggHelp();
  }
};

module.exports = {
  repl
};