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

@@ -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({