UNPKG

eggtended-js

Version:

A extended version of the Egg programming language from the Eloquent Javascript book.

44 lines (36 loc) 1.01 kB
const estraverse = require("estraverse"); const { ARITHM_OPERATORS } = require("../interp/registry.js"); const { Eggvm } = require("../interp/eggvm.js"); const { Value } = require("../interp/ast.js"); class Optimizer { optimize(tree) { const optimized_tree = estraverse.replace(tree, { leave: function(node) { if (node.type === "apply") { // If all arguments are literals, substitute the node with the result of the // evaluation if ( ARITHM_OPERATORS.includes(node.operator.name) && node.args.every(arg => arg.type === "value") ) { const result = Eggvm.eval(node); return new Value({ value: result }); } } }, keys: { apply: ["operator", "args"], word: [], value: [], regex: [] } }); return optimized_tree; } static optimize(tree) { return new Optimizer().optimize(tree); } } module.exports = { Optimizer };