Home Reference Source Test

lib/interp/eggvm.js

// Add monkey-patching functions and extended functions
require("./monkey-patching.js");
require("./require.js");
require("./arithm.js");
require("./exceptions.js");

const fs = require("fs");

const { Parser } = require("../parser/parse.js");
const { Semantic } = require("../parser/semantic.js");
const { TopEnv } = require("./environment.js");
const { json2AST } = require("../parser/json2AST.js");

class Eggvm {
  run(program) {
    const tree = Parser.parse(program);

    return this.eval(tree);
  }

  static run(program) {
    return new Eggvm().run(program);
  }

  runFromFile(file) {
    const program = fs.readFileSync(file, "utf8");

    return this.run(program);
  }

  static runFromFile(file) {
    return new Eggvm().runFromFile(file);
  }

  runFromEVM(file) {
    const rawData = fs.readFileSync(file);
    let json = JSON.parse(rawData);

    const tree = json2AST(json);

    return this.eval(tree);
  }

  static runFromEVM(file) {
    return new Eggvm().runFromEVM(file);
  }

  eval(tree, env) {
    // Create a new env if not already defined on parameters
    if (env === undefined || env === null) {
      env = Object.create(TopEnv);
    }

    // Check that the tree doesn't have errors before evaluation
    Semantic.check(tree);

    return tree !== null ? tree.evaluate(env) : null;
  }

  static eval(tree, env) {
    return new Eggvm().eval(tree, env);
  }

  getEnvFromFile(file) {
    const env = Object.create(TopEnv);
    const tree = Parser.parseFromFile(file);
    this.eval(tree, env);

    return env;
  }

  static getEnvFromFile(file) {
    return new Eggvm().getEnvFromFile(file);
  }
}

module.exports = {
  Eggvm
};