parse.js refectory is done

This commit is contained in:
Onoshko Dan 2014-04-17 17:10:18 +07:00
parent db5ea25e30
commit d461f9d927
5 changed files with 56 additions and 31 deletions

View File

@ -75,7 +75,9 @@ function Compressor(options, false_by_default) {
angular : false,
warnings : true,
global_defs : {}
global_defs : {},
is_js : false
}, true);
};
@ -1996,7 +1998,7 @@ Cola.merge(Compressor.prototype, {
// result. hence, force switch.
if (!(self.left instanceof Cola.AST_Binary
&& Cola.PRECEDENCE[self.left.operator] >= Cola.PRECEDENCE[self.operator])) {
&& (compressor.option("is_js") ? Cola.PRECEDENCE : Cola.cPRECEDENCE)[self.left.operator] >= (compressor.option("is_js") ? Cola.PRECEDENCE : Cola.cPRECEDENCE)[self.operator])) {
reverse(null, true);
}
}
@ -2345,7 +2347,7 @@ Cola.merge(Compressor.prototype, {
var prop = self.property;
if (prop instanceof Cola.AST_String && compressor.option("properties")) {
prop = prop.getValue();
if (Cola.RESERVED_WORDS(prop) ? compressor.option("screw_ie8") : Cola.is_identifier_string(prop)) {
if ((compressor.option("is_js") ? Cola.RESERVED_WORDS : Cola.cRESERVED_WORDS)(prop) ? compressor.option("screw_ie8") : Cola.is_identifier_string(prop)) {
return make_node(Cola.AST_Dot, self, {
expression : self.expression,
property : prop

View File

@ -63,8 +63,8 @@
localStorage.source = source;
localStorage.isjs = isjs.checked ? "t" : "f";
stream = OutputStream({ beautify : true });
compressor = Compressor();
stream = OutputStream({ beautify : true, is_js : isjs.checked });
compressor = Compressor({ is_js : isjs.checked });
try {
// 1. compile
@ -80,7 +80,7 @@
// 3. mangle
ast.figure_out_scope();
ast.compute_char_frequency();
ast.mangle_names({ sort : true, toplevel : true });
ast.mangle_names({ is_js : isjs.checked, sort : true, toplevel : true });
stream = OutputStream();
ast.print(stream);

View File

@ -63,6 +63,7 @@ function OutputStream(options) {
preserve_line : false,
screw_ie8 : false,
preamble : null,
is_js : false
}, true);
var indentation = 0;
@ -485,8 +486,8 @@ function OutputStream(options) {
return true;
// this deals with precedence: 3 * (2 + 1)
if (p instanceof Cola.AST_Binary) {
var po = p.operator, pp = Cola.PRECEDENCE[po];
var so = this.operator, sp = Cola.PRECEDENCE[so];
var po = p.operator, pp = (output.option("is_js") ? Cola.PRECEDENCE : Cola.cPRECEDENCE)[po];
var so = this.operator, sp = (output.option("is_js") ? Cola.PRECEDENCE : Cola.cPRECEDENCE)[so];
if (pp > sp
|| (pp == sp
&& this === p.right)) {
@ -1073,7 +1074,7 @@ function OutputStream(options) {
&& +key + "" == key)
&& parseFloat(key) >= 0) {
output.print(make_num(key));
} else if (Cola.RESERVED_WORDS(key) ? output.option("screw_ie8") : Cola.is_identifier_string(key)) {
} else if ((output.option("is_js") ? Cola.RESERVED_WORDS : Cola.cRESERVED_WORDS)(key) ? output.option("screw_ie8") : Cola.is_identifier_string(key)) {
output.print_name(key);
} else {
output.print_string(key);

View File

@ -177,8 +177,8 @@ Cola.is_unicode_connector_punctuation = function (ch) {
return Cola.UNICODE.connector_punctuation.test(ch);
};
Cola.is_identifier = function (name) {
return !Cola.RESERVED_WORDS(name) && /^[a-z_$][a-z0-9_$]*$/i.test(name);
Cola.is_identifier = function (name, is_js) {
return (is_js && !Cola.RESERVED_WORDS(name) || !is_js && !Cola.cRESERVED_WORDS(name)) && /^[a-z_$][a-z0-9_$]*$/i.test(name);
};
Cola.is_identifier_start = function (code) {
@ -259,6 +259,16 @@ Cola.Tokenizer = function ($TEXT, filename, is_js, html5_comments) {
level : 0
};
if(is_js){
this.KEYWORDS = Cola.KEYWORDS;
this.KEYWORDS_ATOM = Cola.KEYWORDS_ATOM;
this.OPERATORS = Cola.OPERATORS;
} else {
this.KEYWORDS = Cola.cKEYWORDS;
this.KEYWORDS_ATOM = Cola.cKEYWORDS_ATOM;
this.OPERATORS = Cola.cOPERATORS;
}
this.is_js = !!is_js;
this.html5_comments = html5_comments;
this.prev_was_dot = false;
@ -558,7 +568,7 @@ Cola.Tokenizer.prototype.read_name = function () {
backslash = false;
}
}
if (Cola.KEYWORDS(name) && escaped) {
if (this.KEYWORDS(name) && escaped) {
hex = name.charCodeAt(0).toString(16).toUpperCase();
name = "\\u" + "0000".substr(hex.length) + hex + name.slice(1);
}
@ -593,7 +603,7 @@ Cola.Tokenizer.prototype.read_operator = function (prefix) {
function grow(op) {
if (!_this.peek()) return op;
var bigger = op + _this.peek();
if (Cola.OPERATORS(bigger)) {
if (_this.OPERATORS(bigger)) {
_this.next();
return grow(bigger);
} else {
@ -626,9 +636,9 @@ Cola.Tokenizer.prototype.handle_dot = function () {
Cola.Tokenizer.prototype.read_word = function () {
var word = this.read_name();
if (this.prev_was_dot) return this.token("name", word);
return Cola.KEYWORDS_ATOM(word) ? this.token("atom", word)
: !Cola.KEYWORDS(word) ? this.token("name", word)
: Cola.OPERATORS(word) ? this.token("operator", word)
return this.KEYWORDS_ATOM(word) ? this.token("atom", word)
: !this.KEYWORDS(word) ? this.token("name", word)
: this.OPERATORS(word) ? this.token("operator", word)
: this.token("keyword", word);
};
@ -659,8 +669,8 @@ Cola.Tokenizer.prototype.next_token = function (force_regexp) {
ch = this.peek();
if (!ch) return this.token("eof");
var code = ch.charCodeAt(0);
if(!this.is_js && code == 96) this.read_string();
else switch (code) {
if(!this.is_js && code == 96) return this.read_string();
switch (code) {
case 34: case 39: return this.read_string();
case 46: return this.handle_dot();
case 47: return this.handle_slash();
@ -800,8 +810,17 @@ Cola.Parser = function ($TEXT, options, is_js) {
labels : []
};
this.S.input.context = function(){ return _this.tokenizer.context() };
this.S.token = this.next();
if(is_js){
this.UNARY_PREFIX = Cola.UNARY_PREFIX;
this.PRECEDENCE = Cola.PRECEDENCE;
this.ASSIGNMENT = Cola.ASSIGNMENT;
} else {
this.UNARY_PREFIX = Cola.cUNARY_PREFIX;
this.PRECEDENCE = Cola.cPRECEDENCE;
this.ASSIGNMENT = Cola.cASSIGNMENT;
}
};
Cola.Parser.prototype.parse = function () {
@ -881,7 +900,7 @@ Cola.Parser.prototype.expect_token = function (type, val) {
Cola.Parser.prototype.expect = function (punc) { return this.expect_token("punc", punc); };
Cola.Parser.prototype.can_insert_semicolon = function () {
return false; // ColaScript
if(!this.is_js) return false; // ColaScript
return !this.options.strict && (
this.S.token.nlb || this.is("eof") || this.is("punc", "}")
);
@ -918,7 +937,7 @@ Cola.Parser.prototype.handle_regexp = function () {
};
Cola.Parser.prototype.statement = Cola.Parser.embed_tokens(function() {
var tmp;
var tmp, _this = this;
this.handle_regexp();
switch (this.S.token.type) {
case "string":
@ -970,14 +989,14 @@ Cola.Parser.prototype.statement = Cola.Parser.embed_tokens(function() {
case "do":
return new Cola.AST_Do({
body : this.in_loop(statement),
body : this.in_loop(function(){ return _this.statement() }),
condition : (this.expect_token("keyword", "while"), tmp = this.parenthesised(), this.semicolon(), tmp)
});
case "while":
return new Cola.AST_While({
condition : this.parenthesised(),
body : this.in_loop(statement)
body : this.in_loop(function(){ return _this.statement() })
});
case "for":
@ -1108,11 +1127,12 @@ Cola.Parser.prototype.regular_for = function (init) {
this.expect(";");
var step = this.is("punc", ")") ? null : this.expression(true);
this.expect(")");
var _this = this;
return new Cola.AST_For({
init : init,
condition : test,
step : step,
body : this.in_loop(statement)
body : this.in_loop(function(){ return _this.statement() })
});
};
@ -1120,11 +1140,12 @@ Cola.Parser.prototype.for_in = function (init) {
var lhs = init instanceof Cola.AST_Var ? init.definitions[0].name : null;
var obj = this.expression(true);
this.expect(")");
var _this = this;
return new Cola.AST_ForIn({
init : init,
name : lhs,
object : obj,
body : this.in_loop(statement)
body : this.in_loop(function(){ return _this.statement() })
});
};
@ -1578,7 +1599,7 @@ Cola.Parser.prototype.subscripts = function(expr, allow_calls) {
Cola.Parser.prototype.maybe_unary = function(allow_calls) {
var start = this.S.token;
if (this.is("operator") && Cola.UNARY_PREFIX(start.value)) {
if (this.is("operator") && this.UNARY_PREFIX(start.value)) {
this.next();
this.handle_regexp();
var ex = this.make_unary(Cola.AST_UnaryPrefix, start.value, this.maybe_unary(allow_calls));
@ -1605,7 +1626,7 @@ Cola.Parser.prototype.make_unary = function (ctor, op, expr) {
Cola.Parser.prototype.expr_op = function(left, min_prec, no_in) {
var op = this.is("operator") ? this.S.token.value : null;
if (op == "in" && no_in) op = null;
var prec = op != null ? Cola.PRECEDENCE[op] : null;
var prec = op != null ? this.PRECEDENCE[op] : null;
if (prec != null && prec > min_prec) {
this.next();
var right = this.expr_op(this.maybe_unary(true), prec, no_in);
@ -1651,7 +1672,7 @@ Cola.Parser.prototype.is_assignable = function (expr) {
Cola.Parser.prototype.maybe_assign = function(no_in) {
var start = this.S.token;
var left = this.maybe_conditional(no_in), val = this.S.token.value;
if (this.is("operator") && Cola.ASSIGNMENT(val)) {
if (this.is("operator") && this.ASSIGNMENT(val)) {
if (this.is_assignable(left)) {
this.next();
return new Cola.AST_Assign({

View File

@ -245,7 +245,7 @@ Cola.AST_Scope.DEFMETHOD("next_mangled", function(options){
var ext = this.enclosed;
out: while (true) {
var m = base54(++this.cname);
if (!Cola.is_identifier(m)) continue; // skip over "do"
if (!Cola.is_identifier(m, options.is_js)) continue; // skip over "do"
// https://github.com/mishoo/UglifyJS2/issues/242 -- do not
// shadow a name excepted from mangling.
@ -326,7 +326,8 @@ Cola.AST_Toplevel.DEFMETHOD("_default_mangler_options", function(options){
eval : false,
sort : false,
toplevel : false,
screw_ie8 : false
screw_ie8 : false,
is_js : false
});
});
@ -361,7 +362,7 @@ Cola.AST_Toplevel.DEFMETHOD("mangle_names", function(options){
}
if (node instanceof Cola.AST_Label) {
var name;
do name = base54(++lname); while (!Cola.is_identifier(name));
do name = base54(++lname); while (!Cola.is_identifier(name, options.is_js));
node.mangled_name = name;
return true;
}