Add exponentiation operator

This commit is contained in:
Anthony Van de Gejuchte
2016-06-18 00:25:18 +02:00
committed by Richard van Velzen
parent 2246c79318
commit 6eaeb19a4a
6 changed files with 190 additions and 4 deletions

View File

@@ -1088,6 +1088,7 @@ merge(Compressor.prototype, {
case "^" : return ev(left, c) ^ ev(right, c);
case "+" : return ev(left, c) + ev(right, c);
case "*" : return ev(left, c) * ev(right, c);
case "**" : return Math.pow(ev(left, c), ev(right, c));
case "/" : return ev(left, c) / ev(right, c);
case "%" : return ev(left, c) % ev(right, c);
case "-" : return ev(left, c) - ev(right, c);

View File

@@ -538,7 +538,13 @@ function OutputStream(options) {
PARENS([ AST_Unary, AST_Undefined ], function(output){
var p = output.parent();
return p instanceof AST_PropAccess && p.expression === this
|| p instanceof AST_New;
|| p instanceof AST_New
|| p instanceof AST_Binary
&& p.operator === "**"
&& this instanceof AST_UnaryPrefix
&& p.left === this
&& this.operator !== "++"
&& this.operator !== "--";
});
PARENS(AST_Seq, function(output){

View File

@@ -80,6 +80,7 @@ var OPERATORS = makePredicate([
"|",
"^",
"*",
"**",
"/",
"%",
">>",
@@ -99,6 +100,7 @@ var OPERATORS = makePredicate([
"-=",
"/=",
"*=",
"**=",
"%=",
">>=",
"<<=",
@@ -694,7 +696,7 @@ var UNARY_PREFIX = makePredicate([
var UNARY_POSTFIX = makePredicate([ "--", "++" ]);
var ASSIGNMENT = makePredicate([ "=", "+=", "-=", "/=", "*=", "%=", ">>=", "<<=", ">>>=", "|=", "^=", "&=" ]);
var ASSIGNMENT = makePredicate([ "=", "+=", "-=", "/=", "*=", "**=", "%=", ">>=", "<<=", ">>>=", "|=", "^=", "&=" ]);
var PRECEDENCE = (function(a, ret){
for (var i = 0; i < a.length; ++i) {
@@ -715,7 +717,8 @@ var PRECEDENCE = (function(a, ret){
["<", ">", "<=", ">=", "in", "instanceof"],
[">>", "<<", ">>>"],
["+", "-"],
["*", "/", "%"]
["*", "/", "%"],
["**"]
],
{}
);
@@ -2015,8 +2018,12 @@ function parse($TEXT, options) {
var expr_op = function(left, min_prec, no_in) {
var op = is("operator") ? S.token.value : null;
if (op == "in" && no_in) op = null;
if (op == "**" && left instanceof AST_UnaryPrefix
&& left.end === S.prev /* unary token in front not allowed, but allowed if prev is for example `)` */
&& left.operator !== "--" && left.operator !== "++")
unexpected(left.start);
var prec = op != null ? PRECEDENCE[op] : null;
if (prec != null && prec > min_prec) {
if (prec != null && (prec > min_prec || (op === "**" && min_prec === prec))) {
next();
var right = expr_op(maybe_unary(true), prec, no_in);
return expr_op(new AST_Binary({