coco b615379: optimized @ensureBalance

This commit is contained in:
Jeremy Ashkenas 2010-11-09 00:36:13 -05:00
parent a151ceccc6
commit 188ad03c17
2 changed files with 22 additions and 35 deletions

View File

@ -253,42 +253,32 @@
});
};
exports.Rewriter.prototype.ensureBalance = function(pairs) {
var key, levels, open, openLine, unclosed, value, _results;
var close, level, levels, open, openLine, tag, token, _i, _j, _len, _len2, _ref, _ref2;
levels = {};
openLine = {};
this.scanTokens(function(token, i) {
var close, open, tag, _i, _len, _ref;
_ref = this.tokens;
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
token = _ref[_i];
tag = token[0];
for (_i = 0, _len = pairs.length; _i < _len; _i++) {
_ref = pairs[_i], open = _ref[0], close = _ref[1];
for (_j = 0, _len2 = pairs.length; _j < _len2; _j++) {
_ref2 = pairs[_j], open = _ref2[0], close = _ref2[1];
levels[open] |= 0;
if (tag === open) {
if (levels[open] === 0) {
if (levels[open]++ === 0) {
openLine[open] = token[2];
}
levels[open] += 1;
} else if (tag === close) {
levels[open] -= 1;
}
if (levels[open] < 0) {
} else if (tag === close && --levels[open] < 0) {
throw Error("too many " + token[1] + " on line " + (token[2] + 1));
}
}
return 1;
});
unclosed = ((function() {
_results = [];
for (key in levels) {
value = levels[key];
if (value > 0) {
_results.push(key);
}
}
return _results;
})());
if (unclosed.length) {
throw Error("unclosed " + (open = unclosed[0]) + " on line " + (openLine[open] + 1));
}
for (open in levels) {
level = levels[open];
if (level > 0) {
throw Error("unclosed " + open + " on line " + (openLine[open] + 1));
}
}
return this;
};
exports.Rewriter.prototype.rewriteClosingParens = function() {
var debt, key, stack;

View File

@ -204,20 +204,17 @@ class exports.Rewriter
ensureBalance: (pairs) ->
levels = {}
openLine = {}
@scanTokens (token, i) ->
for token in @tokens
[tag] = token
for [open, close] in pairs
levels[open] |= 0
if tag is open
openLine[open] = token[2] if levels[open] is 0
levels[open] += 1
else if tag is close
levels[open] -= 1
throw Error "too many #{token[1]} on line #{token[2] + 1}" if levels[open] < 0
1
unclosed = (key for all key, value of levels when value > 0)
if unclosed.length
throw Error "unclosed #{ open = unclosed[0] } on line #{openLine[open] + 1}"
openLine[open] = token[2] if levels[open]++ is 0
else if tag is close and --levels[open] < 0
throw Error "too many #{token[1]} on line #{token[2] + 1}"
for all open, level of levels when level > 0
throw Error "unclosed #{ open } on line #{openLine[open] + 1}"
this
# We'd like to support syntax like this:
#