languages | Cell 1 | transpile code | Search

The code defines a transpiler composition function that loads user input into a tree data structure and generates code using a visitor and generator. It then exports composed transpilers for JavaScript to Java and JavaScript to Python, making it possible to translate JavaScript code into these languages.

Cell 2

// Each composite transpiler instance has the ability to traverse the parse tree
// for a specific language with its 'visit*' methods, and generate output code for 
// another language with its 'emit*' methods.
const getJavascriptVisitor = require('./codegeneration/javascript/Visitor');
const getJavaGenerator = require('./codegeneration/java/Generator');
const getPythonGenerator = require('./codegeneration/python/Generator');
...

const loadJSTree = (input) => {
/* Lexing and parsing the user input */
  ...
};

/**
 * Compose a transpiler and return a compile method that will use that transpiler
 * to visit the tree and return generated code.
 *
 * @param {function} loadTree - the method takes in user input and returns a tree.
 * @param {Visitor} visitor - the input-language visitor.
 * @param {function} generator - returns a generator that inherits from it’s arg.
 * 
 * @returns {function} the compile function to be exported
 */
const composeTranspiler = (loadTree, visitor, generator) => {
  const Transpiler = generator(visitor);
  const transpiler = new Transpiler();

  return {
    compile: (input) => {
      const tree = loadTree(input);
      return transpiler.start(tree);
    }
  };
}

module.exports = {
  javascript: {
    java: composeTranspiler(
      loadJSTree,
      getJavascriptVisitor(JavascriptANTLRVisitor), // Visitor + ANTLR visitor
      getJavaGenerator // Method that takes in a superclass, i.e. the visitor
    ),
    python: composeTranspiler(
      loadJSTree,
      getJavascriptVisitor(JavascriptANTLRVisitor)),
      getPythonGenerator
    ),
    ...
   },
   ...
}

What the code could have been:

// Import required modules
const { Visitor } = require('./codegeneration/javascript/Visitor');
const { Generator } = require('./codegeneration/java/Generator');
const { Generator: PythonGenerator } = require('./codegeneration/python/Generator');
const loadJSTree = require('./lexingAndParsing');

// Define the loadTree function
const loadTree = (input) => {
  // Lexing and parsing the user input
  // TODO: implement lexing and parsing logic
  return {}; // placeholder for tree object
};

/**
 * Compose a transpiler and return a compile method that will use that transpiler
 * to visit the tree and return generated code.
 *
 * @param {function} loadTree - the method takes in user input and returns a tree.
 * @param {Visitor} visitor - the input-language visitor.
 * @param {class} generator - the class that generates code for another language.
 * 
 * @returns {object} the compile function to be exported
 */
const composeTranspiler = (loadTree, visitor, generator) => {
  const transpiler = new generator(visitor);
  
  return {
    /**
     * Compile the input using the composed transpiler.
     *
     * @param {string} input - the user input to be compiled.
     * @returns {string} the compiled code.
     */
    compile: (input) => {
      const tree = loadTree(input);
      return transpiler.start(tree);
    }
  };
};

// Export the transpilers for different languages
module.exports = {
  /**
   * JavaScript transpilers.
   */
  javascript: {
    /**
     * Java transpiler for JavaScript.
     */
    java: composeTranspiler(
      loadJSTree,
      new JavascriptANTLRVisitor(),
      getJavaGenerator
    ),
    /**
     * Python transpiler for JavaScript.
     */
    python: composeTranspiler(
      loadJSTree,
      new JavascriptANTLRVisitor(),
      getPythonGenerator
    ),
    // TODO: add more transpilers for other languages
  },
  /**
   * Other languages transpilers.
   */
  // TODO: add more languages
};

Code Breakdown

Importing Dependencies

const getJavascriptVisitor = require('./codegeneration/javascript/Visitor');
const getJavaGenerator = require('./codegeneration/java/Generator');
const getPythonGenerator = require('./codegeneration/python/Generator');

These lines import functions for generating JavaScript visitors and Java and Python generators from their respective modules.

Defining the Load Tree Function

const loadJSTree = (input) => {
    /* Lexing and parsing the user input */
   ...
};

This function is used to parse the user input into a tree data structure.

Composing a Transpiler

const composeTranspiler = (loadTree, visitor, generator) => {
    const Transpiler = generator(visitor);
    const transpiler = new Transpiler();

    return {
        compile: (input) => {
            const tree = loadTree(input);
            return transpiler.start(tree);
        }
    };
};

This function takes in three parameters:

It creates a new transpiler instance and returns a compile function that:

Exporting the Composed Transpilers

module.exports = {
    javascript: {
        java: composeTranspiler(
            loadJSTree,
            getJavascriptVisitor(JavascriptANTLRVisitor), // Visitor + ANTLR visitor
            getJavaGenerator // Method that takes in a superclass, i.e. the visitor
        ),
        python: composeTranspiler(
            loadJSTree,
            getJavascriptVisitor(JavascriptANTLRVisitor)),
            getPythonGenerator
        ),
       ...
    },
   ...
};

This exports an object with a javascript property, which contains two properties: java and python. Each of these properties is a composed transpiler created by calling composeTranspiler with the corresponding loadTree, visitor, and generator functions.