pogo
Version:
A readable, DSL friendly programming language that compiles to JavaScript
94 lines • 3.84 kB
JavaScript
(function() {
var self = this;
var $class, _;
$class = require("./class").class;
_ = require("underscore");
module.exports = function(terms) {
var self = this;
var macroDirectory, createMacroDirectory;
macroDirectory = $class({
constructor: function() {
var self = this;
return self.nameTreeRoot = {};
},
nameNode: function(name) {
var self = this;
var nameTree;
nameTree = self.nameTreeRoot;
_(name).each(function(nameSegment) {
if (!nameTree.hasOwnProperty(nameSegment)) {
return nameTree = nameTree[nameSegment] = {};
} else {
return nameTree = nameTree[nameSegment];
}
});
return nameTree;
},
addMacro: function(name, createMacro) {
var self = this;
var nameTree;
nameTree = self.nameNode(name);
return nameTree["create macro"] = createMacro;
},
addWildCardMacro: function(name, matchMacro) {
var self = this;
var nameTree, matchMacros;
nameTree = self.nameNode(name);
matchMacros = void 0;
if (!nameTree.hasOwnProperty("match macro")) {
matchMacros = nameTree["match macro"] = [];
} else {
matchMacros = nameTree["match macro"];
}
return matchMacros.push(matchMacro);
},
findMacro: function(name) {
var self = this;
var findMatchingWildMacro, findMacroInTree;
findMatchingWildMacro = function(wildMacros, name) {
var n, wildMacro, macro;
n = 0;
while (n < wildMacros.length) {
wildMacro = wildMacros[n];
macro = wildMacro(name);
if (macro) {
return macro;
}
++n;
}
return void 0;
};
findMacroInTree = function(nameTree, name, index, wildMacros) {
var subtree;
if (index < name.length) {
if (nameTree.hasOwnProperty(name[index])) {
subtree = nameTree[name[index]];
if (subtree.hasOwnProperty("match macro")) {
wildMacros = subtree["match macro"].concat(wildMacros);
}
return findMacroInTree(subtree, name, index + 1, wildMacros);
} else {
return findMatchingWildMacro(wildMacros, name);
}
} else {
if (nameTree.hasOwnProperty("create macro")) {
return nameTree["create macro"];
} else {
return findMatchingWildMacro(wildMacros, name);
}
}
};
return findMacroInTree(self.nameTreeRoot, name, 0, []);
}
});
return createMacroDirectory = function() {
var args = Array.prototype.slice.call(arguments, 0, arguments.length);
var gen1_c;
gen1_c = function() {
macroDirectory.apply(this, args);
};
gen1_c.prototype = macroDirectory.prototype;
return new gen1_c();
};
};
}).call(this);