diff --git a/annotated_source/docco.css b/annotated_source/docco.css
index e5545f0..c3d580f 100644
--- a/annotated_source/docco.css
+++ b/annotated_source/docco.css
@@ -21,11 +21,11 @@
}
@font-face {
- font-family: 'novecento-bold';
- src: url('public/fonts/novecento-bold.eot');
- src: url('public/fonts/novecento-bold.eot?#iefix') format('embedded-opentype'),
- url('public/fonts/novecento-bold.woff') format('woff'),
- url('public/fonts/novecento-bold.ttf') format('truetype');
+ font-family: 'roboto-black';
+ src: url('public/fonts/roboto-black.eot');
+ src: url('public/fonts/roboto-black.eot?#iefix') format('embedded-opentype'),
+ url('public/fonts/roboto-black.woff') format('woff'),
+ url('public/fonts/roboto-black.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
@@ -39,7 +39,6 @@ body {
color: #30404f;
margin: 0; padding: 0;
height:100%;
- tab-size: 4;
}
#container { min-height: 100%; }
@@ -52,15 +51,23 @@ b, strong {
font-family: "aller-bold";
}
-p, ul, ol {
+p {
margin: 15px 0 0px;
}
+ .annotation ul, .annotation ol {
+ margin: 25px 0;
+ }
+ .annotation ul li, .annotation ol li {
+ font-size: 14px;
+ line-height: 18px;
+ margin: 10px 0;
+ }
h1, h2, h3, h4, h5, h6 {
color: #112233;
line-height: 1em;
font-weight: normal;
- font-family: "novecento-bold";
+ font-family: "roboto-black";
text-transform: uppercase;
margin: 30px 0 15px 0;
}
@@ -68,10 +75,13 @@ h1, h2, h3, h4, h5, h6 {
h1 {
margin-top: 40px;
}
+h2 {
+ font-size: 1.26em;
+}
hr {
border: 0;
- background: 1px solid #ddd;
+ background: 1px #ddd;
height: 1px;
margin: 20px 0;
}
@@ -173,9 +183,18 @@ ul.sections > li > div {
display: block;
}
+#jump_page_wrapper{
+ position: fixed;
+ right: 0;
+ top: 0;
+ bottom: 0;
+}
+
#jump_page {
padding: 5px 0 3px;
margin: 0 0 25px 25px;
+ max-height: 100%;
+ overflow: auto;
}
#jump_page .source {
@@ -194,7 +213,7 @@ ul.sections > li > div {
/*---------------------- Low resolutions (> 320px) ---------------------*/
@media only screen and (min-width: 320px) {
- .pilwrap { display: none; }
+ .sswrap { display: none; }
ul.sections > li > div {
display: block;
@@ -206,7 +225,6 @@ ul.sections > li > div {
}
ul.sections > li > div.content {
- background: #f5f5ff;
overflow-x:auto;
-webkit-box-shadow: inset 0 0 5px #e5e5ee;
box-shadow: inset 0 0 5px #e5e5ee;
@@ -307,18 +325,17 @@ ul.sections > li > div {
ul.sections > li > div.content {
padding: 13px;
vertical-align: top;
- background: #f5f5ff;
border: none;
-webkit-box-shadow: none;
box-shadow: none;
}
- .pilwrap {
+ .sswrap {
position: relative;
display: inline;
}
- .pilcrow {
+ .ss {
font: 12px Arial;
text-decoration: none;
color: #454545;
@@ -328,14 +345,14 @@ ul.sections > li > div {
opacity: 0;
-webkit-transition: opacity 0.2s linear;
}
- .for-h1 .pilcrow {
+ .for-h1 .ss {
top: 47px;
}
- .for-h2 .pilcrow, .for-h3 .pilcrow, .for-h4 .pilcrow {
+ .for-h2 .ss, .for-h3 .ss, .for-h4 .ss {
top: 35px;
}
- ul.sections > li > div.annotation:hover .pilcrow {
+ ul.sections > li > div.annotation:hover .ss {
opacity: 1;
}
}
@@ -377,125 +394,125 @@ pre code {
background: #f8f8ff
}
-pre .comment,
-pre .template_comment,
-pre .diff .header,
-pre .javadoc {
+pre .hljs-comment,
+pre .hljs-template_comment,
+pre .hljs-diff .hljs-header,
+pre .hljs-javadoc {
color: #408080;
font-style: italic
}
-pre .keyword,
-pre .assignment,
-pre .literal,
-pre .css .rule .keyword,
-pre .winutils,
-pre .javascript .title,
-pre .lisp .title,
-pre .subst {
+pre .hljs-keyword,
+pre .hljs-assignment,
+pre .hljs-literal,
+pre .hljs-css .hljs-rule .hljs-keyword,
+pre .hljs-winutils,
+pre .hljs-javascript .hljs-title,
+pre .hljs-lisp .hljs-title,
+pre .hljs-subst {
color: #954121;
/*font-weight: bold*/
}
-pre .number,
-pre .hexcolor {
+pre .hljs-number,
+pre .hljs-hexcolor {
color: #40a070
}
-pre .string,
-pre .tag .value,
-pre .phpdoc,
-pre .tex .formula {
+pre .hljs-string,
+pre .hljs-tag .hljs-value,
+pre .hljs-phpdoc,
+pre .hljs-tex .hljs-formula {
color: #219161;
}
-pre .title,
-pre .id {
+pre .hljs-title,
+pre .hljs-id {
color: #19469D;
}
-pre .params {
+pre .hljs-params {
color: #00F;
}
-pre .javascript .title,
-pre .lisp .title,
-pre .subst {
+pre .hljs-javascript .hljs-title,
+pre .hljs-lisp .hljs-title,
+pre .hljs-subst {
font-weight: normal
}
-pre .class .title,
-pre .haskell .label,
-pre .tex .command {
+pre .hljs-class .hljs-title,
+pre .hljs-haskell .hljs-label,
+pre .hljs-tex .hljs-command {
color: #458;
font-weight: bold
}
-pre .tag,
-pre .tag .title,
-pre .rules .property,
-pre .django .tag .keyword {
+pre .hljs-tag,
+pre .hljs-tag .hljs-title,
+pre .hljs-rules .hljs-property,
+pre .hljs-django .hljs-tag .hljs-keyword {
color: #000080;
font-weight: normal
}
-pre .attribute,
-pre .variable,
-pre .instancevar,
-pre .lisp .body {
+pre .hljs-attribute,
+pre .hljs-variable,
+pre .hljs-instancevar,
+pre .hljs-lisp .hljs-body {
color: #008080
}
-pre .regexp {
+pre .hljs-regexp {
color: #B68
}
-pre .class {
+pre .hljs-class {
color: #458;
font-weight: bold
}
-pre .symbol,
-pre .ruby .symbol .string,
-pre .ruby .symbol .keyword,
-pre .ruby .symbol .keymethods,
-pre .lisp .keyword,
-pre .tex .special,
-pre .input_number {
+pre .hljs-symbol,
+pre .hljs-ruby .hljs-symbol .hljs-string,
+pre .hljs-ruby .hljs-symbol .hljs-keyword,
+pre .hljs-ruby .hljs-symbol .hljs-keymethods,
+pre .hljs-lisp .hljs-keyword,
+pre .hljs-tex .hljs-special,
+pre .hljs-input_number {
color: #990073
}
-pre .builtin,
-pre .constructor,
-pre .built_in,
-pre .lisp .title {
+pre .hljs-builtin,
+pre .hljs-constructor,
+pre .hljs-built_in,
+pre .hljs-lisp .hljs-title {
color: #0086b3
}
-pre .preprocessor,
-pre .pi,
-pre .doctype,
-pre .shebang,
-pre .cdata {
+pre .hljs-preprocessor,
+pre .hljs-pi,
+pre .hljs-doctype,
+pre .hljs-shebang,
+pre .hljs-cdata {
color: #999;
font-weight: bold
}
-pre .deletion {
+pre .hljs-deletion {
background: #fdd
}
-pre .addition {
+pre .hljs-addition {
background: #dfd
}
-pre .diff .change {
+pre .hljs-diff .hljs-change {
background: #0086b3
}
-pre .chunk {
+pre .hljs-chunk {
color: #aaa
}
-pre .tex .formula {
+pre .hljs-tex .hljs-formula {
opacity: 0.5;
}
diff --git a/annotated_source/src/jsep.html b/annotated_source/src/jsep.html
new file mode 100644
index 0000000..7479f4d
--- /dev/null
+++ b/annotated_source/src/jsep.html
@@ -0,0 +1,1399 @@
+
+
+
+
+ jsep.js
+
+
+
+
+
+
+
+
+
+
+
+
+
jsep.js
+
+
+
+
+
+
+
+
+
+
JavaScript Expression Parser (JSEP ) <%= version %>
+JSEP may be freely distributed under the MIT License
+https :
+
+
+
+
+ import Hooks from './hooks.js' ;
+import Plugins from './plugins.js' ;
+
+export class Jsep {
+
+ static get version () {
+
+
+
+
+
+
+
+
+
To be filled in by the template
+
+
+
+ return '<%= version %>' ;
+ }
+
+
+ static toString ( ) {
+ return 'JavaScript Expression Parser (JSEP) v' + Jsep .version ;
+ };
+
+
+
+
+
+
+
+
+
==================== CONFIG ================================
+
+
+
+
+ static addUnaryOp (op_name ) {
+ Jsep .max_unop_len = Math .max (op_name.length , Jsep .max_unop_len );
+ Jsep .unary_ops [op_name] = 1 ;
+ return Jsep ;
+ }
+
+
+ static addBinaryOp (op_name, precedence, isRightAssociative ) {
+ Jsep .max_binop_len = Math .max (op_name.length , Jsep .max_binop_len );
+ Jsep .binary_ops [op_name] = precedence;
+ if (isRightAssociative) {
+ Jsep .right_associative .add (op_name);
+ }
+ else {
+ Jsep .right_associative .delete (op_name);
+ }
+ return Jsep ;
+ }
+
+
+ static addIdentifierChar (char ) {
+ Jsep .additional_identifier_chars .add (char);
+ return Jsep ;
+ }
+
+
+ static addLiteral (literal_name, literal_value ) {
+ Jsep .literals [literal_name] = literal_value;
+ return Jsep ;
+ }
+
+
+ static removeUnaryOp (op_name ) {
+ delete Jsep .unary_ops [op_name];
+ if (op_name.length === Jsep .max_unop_len ) {
+ Jsep .max_unop_len = Jsep .getMaxKeyLen (Jsep .unary_ops );
+ }
+ return Jsep ;
+ }
+
+
+ static removeAllUnaryOps ( ) {
+ Jsep .unary_ops = {};
+ Jsep .max_unop_len = 0 ;
+
+ return Jsep ;
+ }
+
+
+ static removeIdentifierChar (char ) {
+ Jsep .additional_identifier_chars .delete (char);
+ return Jsep ;
+ }
+
+
+ static removeBinaryOp (op_name ) {
+ delete Jsep .binary_ops [op_name];
+
+ if (op_name.length === Jsep .max_binop_len ) {
+ Jsep .max_binop_len = Jsep .getMaxKeyLen (Jsep .binary_ops );
+ }
+ Jsep .right_associative .delete (op_name);
+
+ return Jsep ;
+ }
+
+
+ static removeAllBinaryOps ( ) {
+ Jsep .binary_ops = {};
+ Jsep .max_binop_len = 0 ;
+
+ return Jsep ;
+ }
+
+
+ static removeLiteral (literal_name ) {
+ delete Jsep .literals [literal_name];
+ return Jsep ;
+ }
+
+
+ static removeAllLiterals ( ) {
+ Jsep .literals = {};
+
+ return Jsep ;
+ }
+
+
+
+
+
+
+
+
+
==================== END CONFIG ============================
+
+
+
+
+
+
+ get char () {
+ return this .expr .charAt (this .index );
+ }
+
+
+ get code () {
+ return this .expr .charCodeAt (this .index );
+ };
+
+
+
+ constructor (expr ) {
+
+
+
+
+
+
+
+
+
index
stores the character number we are currently at
+All of the gobbles below will modify index
as we move along
+
+
+
+ this .expr = expr;
+ this .index = 0 ;
+ }
+
+
+ static parse (expr ) {
+ return (new Jsep (expr)).parse ();
+ }
+
+
+ static getMaxKeyLen (obj ) {
+ return Math .max (0 , ...Object .keys (obj).map (k => k.length ));
+ }
+
+
+ static isDecimalDigit (ch ) {
+ return (ch >= 48 && ch <= 57 );
+ }
+
+
+ static binaryPrecedence (op_val ) {
+ return Jsep .binary_ops [op_val] || 0 ;
+ }
+
+
+ static isIdentifierStart (ch ) {
+ return (ch >= 65 && ch <= 90 ) ||
+ (ch >= 97 && ch <= 122 ) ||
+ (ch >= 128 && !Jsep .binary_ops [String .fromCharCode (ch)]) ||
+ (Jsep .additional_identifier_chars .has (String .fromCharCode (ch)));
+ }
+
+
+ static isIdentifierPart (ch ) {
+ return Jsep .isIdentifierStart (ch) || Jsep .isDecimalDigit (ch);
+ }
+
+
+ throwError (message ) {
+ const error = new Error (message + ' at character ' + this .index );
+ error.index = this .index ;
+ error.description = message;
+ throw error;
+ }
+
+
+ runHook (name, node ) {
+ if (Jsep .hooks [name]) {
+ const env = { context : this , node };
+ Jsep .hooks .run (name, env);
+ return env.node ;
+ }
+ return node;
+ }
+
+
+ searchHook (name ) {
+ if (Jsep .hooks [name]) {
+ const env = { context : this };
+ Jsep .hooks [name].find (function (callback ) {
+ callback.call (env.context , env);
+ return env.node ;
+ });
+ return env.node ;
+ }
+ }
+
+
+ gobbleSpaces ( ) {
+ let ch = this .code ;
+
+
+
+
+
+
+
+ while (ch === Jsep .SPACE_CODE
+ || ch === Jsep .TAB_CODE
+ || ch === Jsep .LF_CODE
+ || ch === Jsep .CR_CODE ) {
+ ch = this .expr .charCodeAt (++this .index );
+ }
+ this .runHook ('gobble-spaces' );
+ }
+
+
+ parse ( ) {
+ this .runHook ('before-all' );
+ const nodes = this .gobbleExpressions ();
+
+
+
+
+
+
+
+
+
If there’s only one expression just try returning the expression
+
+
+
+ const node = nodes.length === 1
+ ? nodes[0 ]
+ : {
+ type : Jsep .COMPOUND ,
+ body : nodes
+ };
+ return this .runHook ('after-all' , node);
+ }
+
+
+ gobbleExpressions (untilICode ) {
+ let nodes = [], ch_i, node;
+
+ while (this .index < this .expr .length ) {
+ ch_i = this .code ;
+
+
+
+
+
+
+
+
+
Expressions can be separated by semicolons, commas, or just inferred without any
+separators
+
+
+
+ if (ch_i === Jsep .SEMCOL_CODE || ch_i === Jsep .COMMA_CODE ) {
+ this .index ++;
+ }
+ else {
+
+
+
+
+
+
+
+
+
Try to gobble each expression individually
+
+
+
+ if (node = this .gobbleExpression ()) {
+ nodes.push (node);
+
+
+
+
+
+
+
+
+
If we weren’t able to find a binary expression and are out of room, then
+the expression passed in probably has too much
+
+
+
+ }
+ else if (this .index < this .expr .length ) {
+ if (ch_i === untilICode) {
+ break ;
+ }
+ this .throwError ('Unexpected "' + this .char + '"' );
+ }
+ }
+ }
+
+ return nodes;
+ }
+
+
+ gobbleExpression ( ) {
+ const node = this .searchHook ('gobble-expression' ) || this .gobbleBinaryExpression ();
+ this .gobbleSpaces ();
+
+ return this .runHook ('after-expression' , node);
+ }
+
+
+ gobbleBinaryOp ( ) {
+ this .gobbleSpaces ();
+ let to_check = this .expr .substr (this .index , Jsep .max_binop_len );
+ let tc_len = to_check.length ;
+
+ while (tc_len > 0 ) {
+
+
+
+
+
+
+
+
+
Don’t accept a binary op when it is an identifier.
+Binary ops that start with a identifier-valid character must be followed
+by a non identifier-part valid character
+
+
+
+ if (Jsep .binary_ops .hasOwnProperty (to_check) && (
+ !Jsep .isIdentifierStart (this .code ) ||
+ (this .index + to_check.length < this .expr .length && !Jsep .isIdentifierPart (this .expr .charCodeAt (this .index + to_check.length )))
+ )) {
+ this .index += tc_len;
+ return to_check;
+ }
+ to_check = to_check.substr (0 , --tc_len);
+ }
+ return false ;
+ }
+
+
+ gobbleBinaryExpression ( ) {
+ let node, biop, prec, stack, biop_info, left, right, i, cur_biop;
+
+
+
+
+
+
+
+
+
First, try to get the leftmost thing
+Then, check to see if there’s a binary operator operating on that leftmost thing
+Don’t gobbleBinaryOp without a left-hand-side
+
+
+
+ left = this .gobbleToken ();
+ if (!left) {
+ return left;
+ }
+ biop = this .gobbleBinaryOp ();
+
+
+
+
+
+
+
+
+
If there wasn’t a binary operator, just return the leftmost node
+
+
+
+ if (!biop) {
+ return left;
+ }
+
+
+
+
+
+
+
+
+
Otherwise, we need to start a stack to properly place the binary operations in their
+precedence structure
+
+
+
+ biop_info = { value : biop, prec : Jsep .binaryPrecedence (biop), right_a : Jsep .right_associative .has (biop) };
+
+ right = this .gobbleToken ();
+
+ if (!right) {
+ this .throwError ("Expected expression after " + biop);
+ }
+
+ stack = [left, biop_info, right];
+
+
+
+
+
+
+
+ while ((biop = this .gobbleBinaryOp ())) {
+ prec = Jsep .binaryPrecedence (biop);
+
+ if (prec === 0 ) {
+ this .index -= biop.length ;
+ break ;
+ }
+
+ biop_info = { value : biop, prec, right_a : Jsep .right_associative .has (biop) };
+
+ cur_biop = biop;
+
+
+
+
+
+
+
+
+
Reduce: make a binary expression from the three topmost entries.
+
+
+
+ const comparePrev = prev => biop_info.right_a && prev.right_a
+ ? prec > prev.prec
+ : prec <= prev.prec ;
+ while ((stack.length > 2 ) && comparePrev (stack[stack.length - 2 ])) {
+ right = stack.pop ();
+ biop = stack.pop ().value ;
+ left = stack.pop ();
+ node = {
+ type : Jsep .BINARY_EXP ,
+ operator : biop,
+ left,
+ right
+ };
+ stack.push (node);
+ }
+
+ node = this .gobbleToken ();
+
+ if (!node) {
+ this .throwError ("Expected expression after " + cur_biop);
+ }
+
+ stack.push (biop_info, node);
+ }
+
+ i = stack.length - 1 ;
+ node = stack[i];
+
+ while (i > 1 ) {
+ node = {
+ type : Jsep .BINARY_EXP ,
+ operator : stack[i - 1 ].value ,
+ left : stack[i - 2 ],
+ right : node
+ };
+ i -= 2 ;
+ }
+
+ return node;
+ }
+
+
+ gobbleToken ( ) {
+ let ch, to_check, tc_len, node;
+
+ this .gobbleSpaces ();
+ node = this .searchHook ('gobble-token' );
+ if (node) {
+ return this .runHook ('after-token' , node);
+ }
+
+ ch = this .code ;
+
+ if (Jsep .isDecimalDigit (ch) || ch === Jsep .PERIOD_CODE ) {
+
+
+
+
+
+
+
+
+
Char code 46 is a dot .
which can start off a numeric literal
+
+
+
+ return this .gobbleNumericLiteral ();
+ }
+
+ if (ch === Jsep .SQUOTE_CODE || ch === Jsep .DQUOTE_CODE ) {
+
+
+
+
+
+
+
+
+
Single or double quotes
+
+
+
+ node = this .gobbleStringLiteral ();
+ }
+ else if (ch === Jsep .OBRACK_CODE ) {
+ node = this .gobbleArray ();
+ }
+ else {
+ to_check = this .expr .substr (this .index , Jsep .max_unop_len );
+ tc_len = to_check.length ;
+
+ while (tc_len > 0 ) {
+
+
+
+
+
+
+
+
+
Don’t accept an unary op when it is an identifier.
+Unary ops that start with a identifier-valid character must be followed
+by a non identifier-part valid character
+
+
+
+ if (Jsep .unary_ops .hasOwnProperty (to_check) && (
+ !Jsep .isIdentifierStart (this .code ) ||
+ (this .index + to_check.length < this .expr .length && !Jsep .isIdentifierPart (this .expr .charCodeAt (this .index + to_check.length )))
+ )) {
+ this .index += tc_len;
+ const argument = this .gobbleToken ();
+ if (!argument) {
+ this .throwError ('missing unaryOp argument' );
+ }
+ return this .runHook ('after-token' , {
+ type : Jsep .UNARY_EXP ,
+ operator : to_check,
+ argument,
+ prefix : true
+ });
+ }
+
+ to_check = to_check.substr (0 , --tc_len);
+ }
+
+ if (Jsep .isIdentifierStart (ch)) {
+ node = this .gobbleIdentifier ();
+ if (Jsep .literals .hasOwnProperty (node.name )) {
+ node = {
+ type : Jsep .LITERAL ,
+ value : Jsep .literals [node.name ],
+ raw : node.name ,
+ };
+ }
+ else if (node.name === Jsep .this_str ) {
+ node = { type : Jsep .THIS_EXP };
+ }
+ }
+ else if (ch === Jsep .OPAREN_CODE ) {
+ node = this .gobbleGroup ();
+ }
+ }
+
+ if (!node) {
+ return this .runHook ('after-token' , false );
+ }
+
+ node = this .gobbleTokenProperty (node);
+ return this .runHook ('after-token' , node);
+ }
+
+
+ gobbleTokenProperty (node ) {
+ this .gobbleSpaces ();
+
+ let ch = this .code ;
+ while (ch === Jsep .PERIOD_CODE || ch === Jsep .OBRACK_CODE || ch === Jsep .OPAREN_CODE || ch === Jsep .QUMARK_CODE ) {
+ let optional;
+ if (ch === Jsep .QUMARK_CODE ) {
+ if (this .expr .charCodeAt (this .index + 1 ) !== Jsep .PERIOD_CODE ) {
+ break ;
+ }
+ optional = true ;
+ this .index += 2 ;
+ this .gobbleSpaces ();
+ ch = this .code ;
+ }
+ this .index ++;
+
+ if (ch === Jsep .OBRACK_CODE ) {
+ node = {
+ type : Jsep .MEMBER_EXP ,
+ computed : true ,
+ object : node,
+ property : this .gobbleExpression ()
+ };
+ if (!node.property ) {
+ this .throwError ('Unexpected "' + this .char + '"' );
+ }
+ this .gobbleSpaces ();
+ ch = this .code ;
+ if (ch !== Jsep .CBRACK_CODE ) {
+ this .throwError ('Unclosed [' );
+ }
+ this .index ++;
+ }
+ else if (ch === Jsep .OPAREN_CODE ) {
+
+
+
+
+
+
+
+
+
A function call is being made; gobble all the arguments
+
+
+
+ node = {
+ type : Jsep .CALL_EXP ,
+ 'arguments' : this .gobbleArguments (Jsep .CPAREN_CODE ),
+ callee : node
+ };
+ }
+ else if (ch === Jsep .PERIOD_CODE || optional) {
+ if (optional) {
+ this .index --;
+ }
+ this .gobbleSpaces ();
+ node = {
+ type : Jsep .MEMBER_EXP ,
+ computed : false ,
+ object : node,
+ property : this .gobbleIdentifier (),
+ };
+ }
+
+ if (optional) {
+ node.optional = true ;
+ }
+
+ this .gobbleSpaces ();
+ ch = this .code ;
+ }
+
+ return node;
+ }
+
+
+ gobbleNumericLiteral ( ) {
+ let number = '' , ch, chCode;
+
+ while (Jsep .isDecimalDigit (this .code )) {
+ number += this .expr .charAt (this .index ++);
+ }
+
+ if (this .code === Jsep .PERIOD_CODE ) {
+ number += this .expr .charAt (this .index ++);
+
+ while (Jsep .isDecimalDigit (this .code )) {
+ number += this .expr .charAt (this .index ++);
+ }
+ }
+
+ ch = this .char ;
+
+ if (ch === 'e' || ch === 'E' ) {
+ number += this .expr .charAt (this .index ++);
+ ch = this .char ;
+
+ if (ch === '+' || ch === '-' ) {
+ number += this .expr .charAt (this .index ++);
+ }
+
+ while (Jsep .isDecimalDigit (this .code )) {
+ number += this .expr .charAt (this .index ++);
+ }
+
+ if (!Jsep .isDecimalDigit (this .expr .charCodeAt (this .index - 1 )) ) {
+ this .throwError ('Expected exponent (' + number + this .char + ')' );
+ }
+ }
+
+ chCode = this .code ;
+
+
+
+
+
+
+
+
+
Check to make sure this isn’t a variable name that start with a number (123abc)
+
+
+
+ if (Jsep .isIdentifierStart (chCode)) {
+ this .throwError ('Variable names cannot start with a number (' +
+ number + this .char + ')' );
+ }
+ else if (chCode === Jsep .PERIOD_CODE || (number.length === 1 && number.charCodeAt (0 ) === Jsep .PERIOD_CODE )) {
+ this .throwError ('Unexpected period' );
+ }
+
+ return {
+ type : Jsep .LITERAL ,
+ value : parseFloat (number),
+ raw : number
+ };
+ }
+
+
+ gobbleStringLiteral ( ) {
+ let str = '' ;
+ const startIndex = this .index ;
+ const quote = this .expr .charAt (this .index ++);
+ let closed = false ;
+
+ while (this .index < this .expr .length ) {
+ let ch = this .expr .charAt (this .index ++);
+
+ if (ch === quote) {
+ closed = true ;
+ break ;
+ }
+ else if (ch === '\\' ) {
+
+
+
+
+
+
+
+
+
Check for all of the common escape codes
+
+
+
+ ch = this .expr .charAt (this .index ++);
+
+ switch (ch) {
+ case 'n' : str += '\n' ; break ;
+ case 'r' : str += '\r' ; break ;
+ case 't' : str += '\t' ; break ;
+ case 'b' : str += '\b' ; break ;
+ case 'f' : str += '\f' ; break ;
+ case 'v' : str += '\x0B' ; break ;
+ default : str += ch;
+ }
+ }
+ else {
+ str += ch;
+ }
+ }
+
+ if (!closed) {
+ this .throwError ('Unclosed quote after "' + str + '"' );
+ }
+
+ return {
+ type : Jsep .LITERAL ,
+ value : str,
+ raw : this .expr .substring (startIndex, this .index ),
+ };
+ }
+
+
+ gobbleIdentifier ( ) {
+ let ch = this .code , start = this .index ;
+
+ if (Jsep .isIdentifierStart (ch)) {
+ this .index ++;
+ }
+ else {
+ this .throwError ('Unexpected ' + this .char );
+ }
+
+ while (this .index < this .expr .length ) {
+ ch = this .code ;
+
+ if (Jsep .isIdentifierPart (ch)) {
+ this .index ++;
+ }
+ else {
+ break ;
+ }
+ }
+ return {
+ type : Jsep .IDENTIFIER ,
+ name : this .expr .slice (start, this .index ),
+ };
+ }
+
+
+ gobbleArguments (termination ) {
+ const args = [];
+ let closed = false ;
+ let separator_count = 0 ;
+
+ while (this .index < this .expr .length ) {
+ this .gobbleSpaces ();
+ let ch_i = this .code ;
+
+ if (ch_i === termination) {
+ closed = true ;
+ this .index ++;
+
+ if (termination === Jsep .CPAREN_CODE && separator_count && separator_count >= args.length ){
+ this .throwError ('Unexpected token ' + String .fromCharCode (termination));
+ }
+
+ break ;
+ }
+ else if (ch_i === Jsep .COMMA_CODE ) {
+ this .index ++;
+ separator_count++;
+
+ if (separator_count !== args.length ) {
+ if (termination === Jsep .CPAREN_CODE ) {
+ this .throwError ('Unexpected token ,' );
+ }
+ else if (termination === Jsep .CBRACK_CODE ) {
+ for (let arg = args.length ; arg < separator_count; arg++) {
+ args.push (null );
+ }
+ }
+ }
+ }
+ else if (args.length !== separator_count && separator_count !== 0 ) {
+
+
+
+
+
+
+
+
+
NOTE: && separator_count !== 0
allows for either all commas, or all spaces as arguments
+
+
+
+ this .throwError ('Expected comma' );
+ }
+ else {
+ const node = this .gobbleExpression ();
+
+ if (!node || node.type === Jsep .COMPOUND ) {
+ this .throwError ('Expected comma' );
+ }
+
+ args.push (node);
+ }
+ }
+
+ if (!closed) {
+ this .throwError ('Expected ' + String .fromCharCode (termination));
+ }
+
+ return args;
+ }
+
+
+ gobbleGroup ( ) {
+ this .index ++;
+ let nodes = this .gobbleExpressions (Jsep .CPAREN_CODE );
+ if (this .code === Jsep .CPAREN_CODE ) {
+ this .index ++;
+ if (nodes.length === 1 ) {
+ return nodes[0 ];
+ }
+ else if (!nodes.length ) {
+ return false ;
+ }
+ else {
+ return {
+ type : Jsep .SEQUENCE_EXP ,
+ expressions : nodes,
+ };
+ }
+ }
+ else {
+ this .throwError ('Unclosed (' );
+ }
+ }
+
+
+ gobbleArray ( ) {
+ this .index ++;
+
+ return {
+ type : Jsep .ARRAY_EXP ,
+ elements : this .gobbleArguments (Jsep .CBRACK_CODE )
+ };
+ }
+}
+
+
+
+
+
+
+
+ const hooks = new Hooks ();
+Object .assign (Jsep , {
+ hooks,
+ plugins : new Plugins (Jsep ),
+
+
+
+
+
+
+
+
+
Node Types
+
This is the full set of types that any JSEP node can be.
+Store them here to save space when minified
+
+
+
+ COMPOUND : 'Compound' ,
+ SEQUENCE_EXP : 'SequenceExpression' ,
+ IDENTIFIER : 'Identifier' ,
+ MEMBER_EXP : 'MemberExpression' ,
+ LITERAL : 'Literal' ,
+ THIS_EXP : 'ThisExpression' ,
+ CALL_EXP : 'CallExpression' ,
+ UNARY_EXP : 'UnaryExpression' ,
+ BINARY_EXP : 'BinaryExpression' ,
+ ARRAY_EXP : 'ArrayExpression' ,
+
+ TAB_CODE : 9 ,
+ LF_CODE : 10 ,
+ CR_CODE : 13 ,
+ SPACE_CODE : 32 ,
+ PERIOD_CODE : 46 ,
+ COMMA_CODE : 44 ,
+ SQUOTE_CODE : 39 ,
+ DQUOTE_CODE : 34 ,
+ OPAREN_CODE : 40 ,
+ CPAREN_CODE : 41 ,
+ OBRACK_CODE : 91 ,
+ CBRACK_CODE : 93 ,
+ QUMARK_CODE : 63 ,
+ SEMCOL_CODE : 59 ,
+ COLON_CODE : 58 ,
+
+
+
+
+
+
+
+
+
Operations
+
Use a quickly-accessible map to store all of the unary operators
+Values are set to 1
(it really doesn’t matter)
+
+
+
+ unary_ops : {
+ '-' : 1 ,
+ '!' : 1 ,
+ '~' : 1 ,
+ '+' : 1
+ },
+
+
+
+
+
+
+
+
+
Also use a map for the binary operations but set their values to their
+binary precedence for quick reference (higher number = higher precedence)
+see Order of operations
+
+
+
+ binary_ops : {
+ '||' : 1 , '??' : 1 ,
+ '&&' : 2 , '|' : 3 , '^' : 4 , '&' : 5 ,
+ '==' : 6 , '!=' : 6 , '===' : 6 , '!==' : 6 ,
+ '<' : 7 , '>' : 7 , '<=' : 7 , '>=' : 7 ,
+ '<<' : 8 , '>>' : 8 , '>>>' : 8 ,
+ '+' : 9 , '-' : 9 ,
+ '*' : 10 , '/' : 10 , '%' : 10 ,
+ '**' : 11 ,
+ },
+
+
+
+
+
+
+
+
+
sets specific binary_ops as right-associative
+
+
+
+ right_associative : new Set (['**' ]),
+
+
+
+
+
+
+
+
+
Additional valid identifier chars, apart from a-z, A-Z and 0-9 (except on the starting char)
+
+
+
+ additional_identifier_chars : new Set (['$' , '_' ]),
+
+
+
+
+
+
+
+
+
Literals
+
Store the values to return for the various literals we may encounter
+
+
+
+ literals : {
+ 'true' : true ,
+ 'false' : false ,
+ 'null' : null
+ },
+
+
+
+
+
+
+
+
+
Except for this
, which is special. This could be changed to something like 'self'
as well
+
+
+
+ this_str : 'this' ,
+});
+Jsep .max_unop_len = Jsep .getMaxKeyLen (Jsep .unary_ops );
+Jsep .max_binop_len = Jsep .getMaxKeyLen (Jsep .binary_ops );
+
+
+
+
+
+
+
+
+
Backward Compatibility:
+
+
+
+ const jsep = expr => (new Jsep (expr)).parse ();
+const stdClassProps = Object .getOwnPropertyNames (class Test {});
+Object .getOwnPropertyNames (Jsep )
+ .filter (prop => !stdClassProps.includes (prop) && jsep[prop] === undefined )
+ .forEach ((m ) => {
+ jsep[m] = Jsep [m];
+ });
+jsep.Jsep = Jsep ;
+export default jsep;
+
+
+
+
+
+
+
diff --git a/iife/jsep.iife.js b/iife/jsep.iife.js
new file mode 100644
index 0000000..0ef95ac
--- /dev/null
+++ b/iife/jsep.iife.js
@@ -0,0 +1,1132 @@
+var jsep = (function () {
+ 'use strict';
+
+ /**
+ * @implements {IHooks}
+ */
+ class Hooks {
+ /**
+ * @callback HookCallback
+ * @this {*|Jsep} this
+ * @param {Jsep} env
+ * @returns: void
+ */
+ /**
+ * Adds the given callback to the list of callbacks for the given hook.
+ *
+ * The callback will be invoked when the hook it is registered for is run.
+ *
+ * One callback function can be registered to multiple hooks and the same hook multiple times.
+ *
+ * @param {string|object} name The name of the hook, or an object of callbacks keyed by name
+ * @param {HookCallback|boolean} callback The callback function which is given environment variables.
+ * @param {?boolean} [first=false] Will add the hook to the top of the list (defaults to the bottom)
+ * @public
+ */
+ add(name, callback, first) {
+ if (typeof arguments[0] != 'string') {
+ // Multiple hook callbacks, keyed by name
+ for (let name in arguments[0]) {
+ this.add(name, arguments[0][name], arguments[1]);
+ }
+ }
+ else {
+ (Array.isArray(name) ? name : [name]).forEach(function (name) {
+ this[name] = this[name] || [];
+
+ if (callback) {
+ this[name][first ? 'unshift' : 'push'](callback);
+ }
+ }, this);
+ }
+ }
+
+ /**
+ * Runs a hook invoking all registered callbacks with the given environment variables.
+ *
+ * Callbacks will be invoked synchronously and in the order in which they were registered.
+ *
+ * @param {string} name The name of the hook.
+ * @param {Object} env The environment variables of the hook passed to all callbacks registered.
+ * @public
+ */
+ run(name, env) {
+ this[name] = this[name] || [];
+ this[name].forEach(function (callback) {
+ callback.call(env && env.context ? env.context : env, env);
+ });
+ }
+ }
+
+ /**
+ * @implements {IPlugins}
+ */
+ class Plugins {
+ constructor(jsep) {
+ this.jsep = jsep;
+ this.registered = {};
+ }
+
+ /**
+ * @callback PluginSetup
+ * @this {Jsep} jsep
+ * @returns: void
+ */
+ /**
+ * Adds the given plugin(s) to the registry
+ *
+ * @param {object} plugins
+ * @param {string} plugins.name The name of the plugin
+ * @param {PluginSetup} plugins.init The init function
+ * @public
+ */
+ register(...plugins) {
+ plugins.forEach((plugin) => {
+ if (typeof plugin !== 'object' || !plugin.name || !plugin.init) {
+ throw new Error('Invalid JSEP plugin format');
+ }
+ if (this.registered[plugin.name]) {
+ // already registered. Ignore.
+ return;
+ }
+ plugin.init(this.jsep);
+ this.registered[plugin.name] = plugin;
+ });
+ }
+ }
+
+ // JavaScript Expression Parser (JSEP) 1.4.0
+
+ class Jsep {
+ /**
+ * @returns {string}
+ */
+ static get version() {
+ // To be filled in by the template
+ return '1.4.0';
+ }
+
+ /**
+ * @returns {string}
+ */
+ static toString() {
+ return 'JavaScript Expression Parser (JSEP) v' + Jsep.version;
+ };
+
+ // ==================== CONFIG ================================
+ /**
+ * @method addUnaryOp
+ * @param {string} op_name The name of the unary op to add
+ * @returns {Jsep}
+ */
+ static addUnaryOp(op_name) {
+ Jsep.max_unop_len = Math.max(op_name.length, Jsep.max_unop_len);
+ Jsep.unary_ops[op_name] = 1;
+ return Jsep;
+ }
+
+ /**
+ * @method jsep.addBinaryOp
+ * @param {string} op_name The name of the binary op to add
+ * @param {number} precedence The precedence of the binary op (can be a float). Higher number = higher precedence
+ * @param {boolean} [isRightAssociative=false] whether operator is right-associative
+ * @returns {Jsep}
+ */
+ static addBinaryOp(op_name, precedence, isRightAssociative) {
+ Jsep.max_binop_len = Math.max(op_name.length, Jsep.max_binop_len);
+ Jsep.binary_ops[op_name] = precedence;
+ if (isRightAssociative) {
+ Jsep.right_associative.add(op_name);
+ }
+ else {
+ Jsep.right_associative.delete(op_name);
+ }
+ return Jsep;
+ }
+
+ /**
+ * @method addIdentifierChar
+ * @param {string} char The additional character to treat as a valid part of an identifier
+ * @returns {Jsep}
+ */
+ static addIdentifierChar(char) {
+ Jsep.additional_identifier_chars.add(char);
+ return Jsep;
+ }
+
+ /**
+ * @method addLiteral
+ * @param {string} literal_name The name of the literal to add
+ * @param {*} literal_value The value of the literal
+ * @returns {Jsep}
+ */
+ static addLiteral(literal_name, literal_value) {
+ Jsep.literals[literal_name] = literal_value;
+ return Jsep;
+ }
+
+ /**
+ * @method removeUnaryOp
+ * @param {string} op_name The name of the unary op to remove
+ * @returns {Jsep}
+ */
+ static removeUnaryOp(op_name) {
+ delete Jsep.unary_ops[op_name];
+ if (op_name.length === Jsep.max_unop_len) {
+ Jsep.max_unop_len = Jsep.getMaxKeyLen(Jsep.unary_ops);
+ }
+ return Jsep;
+ }
+
+ /**
+ * @method removeAllUnaryOps
+ * @returns {Jsep}
+ */
+ static removeAllUnaryOps() {
+ Jsep.unary_ops = {};
+ Jsep.max_unop_len = 0;
+
+ return Jsep;
+ }
+
+ /**
+ * @method removeIdentifierChar
+ * @param {string} char The additional character to stop treating as a valid part of an identifier
+ * @returns {Jsep}
+ */
+ static removeIdentifierChar(char) {
+ Jsep.additional_identifier_chars.delete(char);
+ return Jsep;
+ }
+
+ /**
+ * @method removeBinaryOp
+ * @param {string} op_name The name of the binary op to remove
+ * @returns {Jsep}
+ */
+ static removeBinaryOp(op_name) {
+ delete Jsep.binary_ops[op_name];
+
+ if (op_name.length === Jsep.max_binop_len) {
+ Jsep.max_binop_len = Jsep.getMaxKeyLen(Jsep.binary_ops);
+ }
+ Jsep.right_associative.delete(op_name);
+
+ return Jsep;
+ }
+
+ /**
+ * @method removeAllBinaryOps
+ * @returns {Jsep}
+ */
+ static removeAllBinaryOps() {
+ Jsep.binary_ops = {};
+ Jsep.max_binop_len = 0;
+
+ return Jsep;
+ }
+
+ /**
+ * @method removeLiteral
+ * @param {string} literal_name The name of the literal to remove
+ * @returns {Jsep}
+ */
+ static removeLiteral(literal_name) {
+ delete Jsep.literals[literal_name];
+ return Jsep;
+ }
+
+ /**
+ * @method removeAllLiterals
+ * @returns {Jsep}
+ */
+ static removeAllLiterals() {
+ Jsep.literals = {};
+
+ return Jsep;
+ }
+ // ==================== END CONFIG ============================
+
+
+ /**
+ * @returns {string}
+ */
+ get char() {
+ return this.expr.charAt(this.index);
+ }
+
+ /**
+ * @returns {number}
+ */
+ get code() {
+ return this.expr.charCodeAt(this.index);
+ };
+
+
+ /**
+ * @param {string} expr a string with the passed in express
+ * @returns Jsep
+ */
+ constructor(expr) {
+ // `index` stores the character number we are currently at
+ // All of the gobbles below will modify `index` as we move along
+ this.expr = expr;
+ this.index = 0;
+ }
+
+ /**
+ * static top-level parser
+ * @returns {jsep.Expression}
+ */
+ static parse(expr) {
+ return (new Jsep(expr)).parse();
+ }
+
+ /**
+ * Get the longest key length of any object
+ * @param {object} obj
+ * @returns {number}
+ */
+ static getMaxKeyLen(obj) {
+ return Math.max(0, ...Object.keys(obj).map(k => k.length));
+ }
+
+ /**
+ * `ch` is a character code in the next three functions
+ * @param {number} ch
+ * @returns {boolean}
+ */
+ static isDecimalDigit(ch) {
+ return (ch >= 48 && ch <= 57); // 0...9
+ }
+
+ /**
+ * Returns the precedence of a binary operator or `0` if it isn't a binary operator. Can be float.
+ * @param {string} op_val
+ * @returns {number}
+ */
+ static binaryPrecedence(op_val) {
+ return Jsep.binary_ops[op_val] || 0;
+ }
+
+ /**
+ * Looks for start of identifier
+ * @param {number} ch
+ * @returns {boolean}
+ */
+ static isIdentifierStart(ch) {
+ return (ch >= 65 && ch <= 90) || // A...Z
+ (ch >= 97 && ch <= 122) || // a...z
+ (ch >= 128 && !Jsep.binary_ops[String.fromCharCode(ch)]) || // any non-ASCII that is not an operator
+ (Jsep.additional_identifier_chars.has(String.fromCharCode(ch))); // additional characters
+ }
+
+ /**
+ * @param {number} ch
+ * @returns {boolean}
+ */
+ static isIdentifierPart(ch) {
+ return Jsep.isIdentifierStart(ch) || Jsep.isDecimalDigit(ch);
+ }
+
+ /**
+ * throw error at index of the expression
+ * @param {string} message
+ * @throws
+ */
+ throwError(message) {
+ const error = new Error(message + ' at character ' + this.index);
+ error.index = this.index;
+ error.description = message;
+ throw error;
+ }
+
+ /**
+ * Run a given hook
+ * @param {string} name
+ * @param {jsep.Expression|false} [node]
+ * @returns {?jsep.Expression}
+ */
+ runHook(name, node) {
+ if (Jsep.hooks[name]) {
+ const env = { context: this, node };
+ Jsep.hooks.run(name, env);
+ return env.node;
+ }
+ return node;
+ }
+
+ /**
+ * Runs a given hook until one returns a node
+ * @param {string} name
+ * @returns {?jsep.Expression}
+ */
+ searchHook(name) {
+ if (Jsep.hooks[name]) {
+ const env = { context: this };
+ Jsep.hooks[name].find(function (callback) {
+ callback.call(env.context, env);
+ return env.node;
+ });
+ return env.node;
+ }
+ }
+
+ /**
+ * Push `index` up to the next non-space character
+ */
+ gobbleSpaces() {
+ let ch = this.code;
+ // Whitespace
+ while (ch === Jsep.SPACE_CODE
+ || ch === Jsep.TAB_CODE
+ || ch === Jsep.LF_CODE
+ || ch === Jsep.CR_CODE) {
+ ch = this.expr.charCodeAt(++this.index);
+ }
+ this.runHook('gobble-spaces');
+ }
+
+ /**
+ * Top-level method to parse all expressions and returns compound or single node
+ * @returns {jsep.Expression}
+ */
+ parse() {
+ this.runHook('before-all');
+ const nodes = this.gobbleExpressions();
+
+ // If there's only one expression just try returning the expression
+ const node = nodes.length === 1
+ ? nodes[0]
+ : {
+ type: Jsep.COMPOUND,
+ body: nodes
+ };
+ return this.runHook('after-all', node);
+ }
+
+ /**
+ * top-level parser (but can be reused within as well)
+ * @param {number} [untilICode]
+ * @returns {jsep.Expression[]}
+ */
+ gobbleExpressions(untilICode) {
+ let nodes = [], ch_i, node;
+
+ while (this.index < this.expr.length) {
+ ch_i = this.code;
+
+ // Expressions can be separated by semicolons, commas, or just inferred without any
+ // separators
+ if (ch_i === Jsep.SEMCOL_CODE || ch_i === Jsep.COMMA_CODE) {
+ this.index++; // ignore separators
+ }
+ else {
+ // Try to gobble each expression individually
+ if (node = this.gobbleExpression()) {
+ nodes.push(node);
+ // If we weren't able to find a binary expression and are out of room, then
+ // the expression passed in probably has too much
+ }
+ else if (this.index < this.expr.length) {
+ if (ch_i === untilICode) {
+ break;
+ }
+ this.throwError('Unexpected "' + this.char + '"');
+ }
+ }
+ }
+
+ return nodes;
+ }
+
+ /**
+ * The main parsing function.
+ * @returns {?jsep.Expression}
+ */
+ gobbleExpression() {
+ const node = this.searchHook('gobble-expression') || this.gobbleBinaryExpression();
+ this.gobbleSpaces();
+
+ return this.runHook('after-expression', node);
+ }
+
+ /**
+ * Search for the operation portion of the string (e.g. `+`, `===`)
+ * Start by taking the longest possible binary operations (3 characters: `===`, `!==`, `>>>`)
+ * and move down from 3 to 2 to 1 character until a matching binary operation is found
+ * then, return that binary operation
+ * @returns {string|boolean}
+ */
+ gobbleBinaryOp() {
+ this.gobbleSpaces();
+ let to_check = this.expr.substr(this.index, Jsep.max_binop_len);
+ let tc_len = to_check.length;
+
+ while (tc_len > 0) {
+ // Don't accept a binary op when it is an identifier.
+ // Binary ops that start with a identifier-valid character must be followed
+ // by a non identifier-part valid character
+ if (Jsep.binary_ops.hasOwnProperty(to_check) && (
+ !Jsep.isIdentifierStart(this.code) ||
+ (this.index + to_check.length < this.expr.length && !Jsep.isIdentifierPart(this.expr.charCodeAt(this.index + to_check.length)))
+ )) {
+ this.index += tc_len;
+ return to_check;
+ }
+ to_check = to_check.substr(0, --tc_len);
+ }
+ return false;
+ }
+
+ /**
+ * This function is responsible for gobbling an individual expression,
+ * e.g. `1`, `1+2`, `a+(b*2)-Math.sqrt(2)`
+ * @returns {?jsep.BinaryExpression}
+ */
+ gobbleBinaryExpression() {
+ let node, biop, prec, stack, biop_info, left, right, i, cur_biop;
+
+ // First, try to get the leftmost thing
+ // Then, check to see if there's a binary operator operating on that leftmost thing
+ // Don't gobbleBinaryOp without a left-hand-side
+ left = this.gobbleToken();
+ if (!left) {
+ return left;
+ }
+ biop = this.gobbleBinaryOp();
+
+ // If there wasn't a binary operator, just return the leftmost node
+ if (!biop) {
+ return left;
+ }
+
+ // Otherwise, we need to start a stack to properly place the binary operations in their
+ // precedence structure
+ biop_info = { value: biop, prec: Jsep.binaryPrecedence(biop), right_a: Jsep.right_associative.has(biop) };
+
+ right = this.gobbleToken();
+
+ if (!right) {
+ this.throwError("Expected expression after " + biop);
+ }
+
+ stack = [left, biop_info, right];
+
+ // Properly deal with precedence using [recursive descent](http://www.engr.mun.ca/~theo/Misc/exp_parsing.htm)
+ while ((biop = this.gobbleBinaryOp())) {
+ prec = Jsep.binaryPrecedence(biop);
+
+ if (prec === 0) {
+ this.index -= biop.length;
+ break;
+ }
+
+ biop_info = { value: biop, prec, right_a: Jsep.right_associative.has(biop) };
+
+ cur_biop = biop;
+
+ // Reduce: make a binary expression from the three topmost entries.
+ const comparePrev = prev => biop_info.right_a && prev.right_a
+ ? prec > prev.prec
+ : prec <= prev.prec;
+ while ((stack.length > 2) && comparePrev(stack[stack.length - 2])) {
+ right = stack.pop();
+ biop = stack.pop().value;
+ left = stack.pop();
+ node = {
+ type: Jsep.BINARY_EXP,
+ operator: biop,
+ left,
+ right
+ };
+ stack.push(node);
+ }
+
+ node = this.gobbleToken();
+
+ if (!node) {
+ this.throwError("Expected expression after " + cur_biop);
+ }
+
+ stack.push(biop_info, node);
+ }
+
+ i = stack.length - 1;
+ node = stack[i];
+
+ while (i > 1) {
+ node = {
+ type: Jsep.BINARY_EXP,
+ operator: stack[i - 1].value,
+ left: stack[i - 2],
+ right: node
+ };
+ i -= 2;
+ }
+
+ return node;
+ }
+
+ /**
+ * An individual part of a binary expression:
+ * e.g. `foo.bar(baz)`, `1`, `"abc"`, `(a % 2)` (because it's in parenthesis)
+ * @returns {boolean|jsep.Expression}
+ */
+ gobbleToken() {
+ let ch, to_check, tc_len, node;
+
+ this.gobbleSpaces();
+ node = this.searchHook('gobble-token');
+ if (node) {
+ return this.runHook('after-token', node);
+ }
+
+ ch = this.code;
+
+ if (Jsep.isDecimalDigit(ch) || ch === Jsep.PERIOD_CODE) {
+ // Char code 46 is a dot `.` which can start off a numeric literal
+ return this.gobbleNumericLiteral();
+ }
+
+ if (ch === Jsep.SQUOTE_CODE || ch === Jsep.DQUOTE_CODE) {
+ // Single or double quotes
+ node = this.gobbleStringLiteral();
+ }
+ else if (ch === Jsep.OBRACK_CODE) {
+ node = this.gobbleArray();
+ }
+ else {
+ to_check = this.expr.substr(this.index, Jsep.max_unop_len);
+ tc_len = to_check.length;
+
+ while (tc_len > 0) {
+ // Don't accept an unary op when it is an identifier.
+ // Unary ops that start with a identifier-valid character must be followed
+ // by a non identifier-part valid character
+ if (Jsep.unary_ops.hasOwnProperty(to_check) && (
+ !Jsep.isIdentifierStart(this.code) ||
+ (this.index + to_check.length < this.expr.length && !Jsep.isIdentifierPart(this.expr.charCodeAt(this.index + to_check.length)))
+ )) {
+ this.index += tc_len;
+ const argument = this.gobbleToken();
+ if (!argument) {
+ this.throwError('missing unaryOp argument');
+ }
+ return this.runHook('after-token', {
+ type: Jsep.UNARY_EXP,
+ operator: to_check,
+ argument,
+ prefix: true
+ });
+ }
+
+ to_check = to_check.substr(0, --tc_len);
+ }
+
+ if (Jsep.isIdentifierStart(ch)) {
+ node = this.gobbleIdentifier();
+ if (Jsep.literals.hasOwnProperty(node.name)) {
+ node = {
+ type: Jsep.LITERAL,
+ value: Jsep.literals[node.name],
+ raw: node.name,
+ };
+ }
+ else if (node.name === Jsep.this_str) {
+ node = { type: Jsep.THIS_EXP };
+ }
+ }
+ else if (ch === Jsep.OPAREN_CODE) { // open parenthesis
+ node = this.gobbleGroup();
+ }
+ }
+
+ if (!node) {
+ return this.runHook('after-token', false);
+ }
+
+ node = this.gobbleTokenProperty(node);
+ return this.runHook('after-token', node);
+ }
+
+ /**
+ * Gobble properties of of identifiers/strings/arrays/groups.
+ * e.g. `foo`, `bar.baz`, `foo['bar'].baz`
+ * It also gobbles function calls:
+ * e.g. `Math.acos(obj.angle)`
+ * @param {jsep.Expression} node
+ * @returns {jsep.Expression}
+ */
+ gobbleTokenProperty(node) {
+ this.gobbleSpaces();
+
+ let ch = this.code;
+ while (ch === Jsep.PERIOD_CODE || ch === Jsep.OBRACK_CODE || ch === Jsep.OPAREN_CODE || ch === Jsep.QUMARK_CODE) {
+ let optional;
+ if (ch === Jsep.QUMARK_CODE) {
+ if (this.expr.charCodeAt(this.index + 1) !== Jsep.PERIOD_CODE) {
+ break;
+ }
+ optional = true;
+ this.index += 2;
+ this.gobbleSpaces();
+ ch = this.code;
+ }
+ this.index++;
+
+ if (ch === Jsep.OBRACK_CODE) {
+ node = {
+ type: Jsep.MEMBER_EXP,
+ computed: true,
+ object: node,
+ property: this.gobbleExpression()
+ };
+ if (!node.property) {
+ this.throwError('Unexpected "' + this.char + '"');
+ }
+ this.gobbleSpaces();
+ ch = this.code;
+ if (ch !== Jsep.CBRACK_CODE) {
+ this.throwError('Unclosed [');
+ }
+ this.index++;
+ }
+ else if (ch === Jsep.OPAREN_CODE) {
+ // A function call is being made; gobble all the arguments
+ node = {
+ type: Jsep.CALL_EXP,
+ 'arguments': this.gobbleArguments(Jsep.CPAREN_CODE),
+ callee: node
+ };
+ }
+ else if (ch === Jsep.PERIOD_CODE || optional) {
+ if (optional) {
+ this.index--;
+ }
+ this.gobbleSpaces();
+ node = {
+ type: Jsep.MEMBER_EXP,
+ computed: false,
+ object: node,
+ property: this.gobbleIdentifier(),
+ };
+ }
+
+ if (optional) {
+ node.optional = true;
+ } // else leave undefined for compatibility with esprima
+
+ this.gobbleSpaces();
+ ch = this.code;
+ }
+
+ return node;
+ }
+
+ /**
+ * Parse simple numeric literals: `12`, `3.4`, `.5`. Do this by using a string to
+ * keep track of everything in the numeric literal and then calling `parseFloat` on that string
+ * @returns {jsep.Literal}
+ */
+ gobbleNumericLiteral() {
+ let number = '', ch, chCode;
+
+ while (Jsep.isDecimalDigit(this.code)) {
+ number += this.expr.charAt(this.index++);
+ }
+
+ if (this.code === Jsep.PERIOD_CODE) { // can start with a decimal marker
+ number += this.expr.charAt(this.index++);
+
+ while (Jsep.isDecimalDigit(this.code)) {
+ number += this.expr.charAt(this.index++);
+ }
+ }
+
+ ch = this.char;
+
+ if (ch === 'e' || ch === 'E') { // exponent marker
+ number += this.expr.charAt(this.index++);
+ ch = this.char;
+
+ if (ch === '+' || ch === '-') { // exponent sign
+ number += this.expr.charAt(this.index++);
+ }
+
+ while (Jsep.isDecimalDigit(this.code)) { // exponent itself
+ number += this.expr.charAt(this.index++);
+ }
+
+ if (!Jsep.isDecimalDigit(this.expr.charCodeAt(this.index - 1)) ) {
+ this.throwError('Expected exponent (' + number + this.char + ')');
+ }
+ }
+
+ chCode = this.code;
+
+ // Check to make sure this isn't a variable name that start with a number (123abc)
+ if (Jsep.isIdentifierStart(chCode)) {
+ this.throwError('Variable names cannot start with a number (' +
+ number + this.char + ')');
+ }
+ else if (chCode === Jsep.PERIOD_CODE || (number.length === 1 && number.charCodeAt(0) === Jsep.PERIOD_CODE)) {
+ this.throwError('Unexpected period');
+ }
+
+ return {
+ type: Jsep.LITERAL,
+ value: parseFloat(number),
+ raw: number
+ };
+ }
+
+ /**
+ * Parses a string literal, staring with single or double quotes with basic support for escape codes
+ * e.g. `"hello world"`, `'this is\nJSEP'`
+ * @returns {jsep.Literal}
+ */
+ gobbleStringLiteral() {
+ let str = '';
+ const startIndex = this.index;
+ const quote = this.expr.charAt(this.index++);
+ let closed = false;
+
+ while (this.index < this.expr.length) {
+ let ch = this.expr.charAt(this.index++);
+
+ if (ch === quote) {
+ closed = true;
+ break;
+ }
+ else if (ch === '\\') {
+ // Check for all of the common escape codes
+ ch = this.expr.charAt(this.index++);
+
+ switch (ch) {
+ case 'n': str += '\n'; break;
+ case 'r': str += '\r'; break;
+ case 't': str += '\t'; break;
+ case 'b': str += '\b'; break;
+ case 'f': str += '\f'; break;
+ case 'v': str += '\x0B'; break;
+ default : str += ch;
+ }
+ }
+ else {
+ str += ch;
+ }
+ }
+
+ if (!closed) {
+ this.throwError('Unclosed quote after "' + str + '"');
+ }
+
+ return {
+ type: Jsep.LITERAL,
+ value: str,
+ raw: this.expr.substring(startIndex, this.index),
+ };
+ }
+
+ /**
+ * Gobbles only identifiers
+ * e.g.: `foo`, `_value`, `$x1`
+ * Also, this function checks if that identifier is a literal:
+ * (e.g. `true`, `false`, `null`) or `this`
+ * @returns {jsep.Identifier}
+ */
+ gobbleIdentifier() {
+ let ch = this.code, start = this.index;
+
+ if (Jsep.isIdentifierStart(ch)) {
+ this.index++;
+ }
+ else {
+ this.throwError('Unexpected ' + this.char);
+ }
+
+ while (this.index < this.expr.length) {
+ ch = this.code;
+
+ if (Jsep.isIdentifierPart(ch)) {
+ this.index++;
+ }
+ else {
+ break;
+ }
+ }
+ return {
+ type: Jsep.IDENTIFIER,
+ name: this.expr.slice(start, this.index),
+ };
+ }
+
+ /**
+ * Gobbles a list of arguments within the context of a function call
+ * or array literal. This function also assumes that the opening character
+ * `(` or `[` has already been gobbled, and gobbles expressions and commas
+ * until the terminator character `)` or `]` is encountered.
+ * e.g. `foo(bar, baz)`, `my_func()`, or `[bar, baz]`
+ * @param {number} termination
+ * @returns {jsep.Expression[]}
+ */
+ gobbleArguments(termination) {
+ const args = [];
+ let closed = false;
+ let separator_count = 0;
+
+ while (this.index < this.expr.length) {
+ this.gobbleSpaces();
+ let ch_i = this.code;
+
+ if (ch_i === termination) { // done parsing
+ closed = true;
+ this.index++;
+
+ if (termination === Jsep.CPAREN_CODE && separator_count && separator_count >= args.length){
+ this.throwError('Unexpected token ' + String.fromCharCode(termination));
+ }
+
+ break;
+ }
+ else if (ch_i === Jsep.COMMA_CODE) { // between expressions
+ this.index++;
+ separator_count++;
+
+ if (separator_count !== args.length) { // missing argument
+ if (termination === Jsep.CPAREN_CODE) {
+ this.throwError('Unexpected token ,');
+ }
+ else if (termination === Jsep.CBRACK_CODE) {
+ for (let arg = args.length; arg < separator_count; arg++) {
+ args.push(null);
+ }
+ }
+ }
+ }
+ else if (args.length !== separator_count && separator_count !== 0) {
+ // NOTE: `&& separator_count !== 0` allows for either all commas, or all spaces as arguments
+ this.throwError('Expected comma');
+ }
+ else {
+ const node = this.gobbleExpression();
+
+ if (!node || node.type === Jsep.COMPOUND) {
+ this.throwError('Expected comma');
+ }
+
+ args.push(node);
+ }
+ }
+
+ if (!closed) {
+ this.throwError('Expected ' + String.fromCharCode(termination));
+ }
+
+ return args;
+ }
+
+ /**
+ * Responsible for parsing a group of things within parentheses `()`
+ * that have no identifier in front (so not a function call)
+ * This function assumes that it needs to gobble the opening parenthesis
+ * and then tries to gobble everything within that parenthesis, assuming
+ * that the next thing it should see is the close parenthesis. If not,
+ * then the expression probably doesn't have a `)`
+ * @returns {boolean|jsep.Expression}
+ */
+ gobbleGroup() {
+ this.index++;
+ let nodes = this.gobbleExpressions(Jsep.CPAREN_CODE);
+ if (this.code === Jsep.CPAREN_CODE) {
+ this.index++;
+ if (nodes.length === 1) {
+ return nodes[0];
+ }
+ else if (!nodes.length) {
+ return false;
+ }
+ else {
+ return {
+ type: Jsep.SEQUENCE_EXP,
+ expressions: nodes,
+ };
+ }
+ }
+ else {
+ this.throwError('Unclosed (');
+ }
+ }
+
+ /**
+ * Responsible for parsing Array literals `[1, 2, 3]`
+ * This function assumes that it needs to gobble the opening bracket
+ * and then tries to gobble the expressions as arguments.
+ * @returns {jsep.ArrayExpression}
+ */
+ gobbleArray() {
+ this.index++;
+
+ return {
+ type: Jsep.ARRAY_EXP,
+ elements: this.gobbleArguments(Jsep.CBRACK_CODE)
+ };
+ }
+ }
+
+ // Static fields:
+ const hooks = new Hooks();
+ Object.assign(Jsep, {
+ hooks,
+ plugins: new Plugins(Jsep),
+
+ // Node Types
+ // ----------
+ // This is the full set of types that any JSEP node can be.
+ // Store them here to save space when minified
+ COMPOUND: 'Compound',
+ SEQUENCE_EXP: 'SequenceExpression',
+ IDENTIFIER: 'Identifier',
+ MEMBER_EXP: 'MemberExpression',
+ LITERAL: 'Literal',
+ THIS_EXP: 'ThisExpression',
+ CALL_EXP: 'CallExpression',
+ UNARY_EXP: 'UnaryExpression',
+ BINARY_EXP: 'BinaryExpression',
+ ARRAY_EXP: 'ArrayExpression',
+
+ TAB_CODE: 9,
+ LF_CODE: 10,
+ CR_CODE: 13,
+ SPACE_CODE: 32,
+ PERIOD_CODE: 46, // '.'
+ COMMA_CODE: 44, // ','
+ SQUOTE_CODE: 39, // single quote
+ DQUOTE_CODE: 34, // double quotes
+ OPAREN_CODE: 40, // (
+ CPAREN_CODE: 41, // )
+ OBRACK_CODE: 91, // [
+ CBRACK_CODE: 93, // ]
+ QUMARK_CODE: 63, // ?
+ SEMCOL_CODE: 59, // ;
+ COLON_CODE: 58, // :
+
+
+ // Operations
+ // ----------
+ // Use a quickly-accessible map to store all of the unary operators
+ // Values are set to `1` (it really doesn't matter)
+ unary_ops: {
+ '-': 1,
+ '!': 1,
+ '~': 1,
+ '+': 1
+ },
+
+ // Also use a map for the binary operations but set their values to their
+ // binary precedence for quick reference (higher number = higher precedence)
+ // see [Order of operations](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence)
+ binary_ops: {
+ '||': 1, '??': 1,
+ '&&': 2, '|': 3, '^': 4, '&': 5,
+ '==': 6, '!=': 6, '===': 6, '!==': 6,
+ '<': 7, '>': 7, '<=': 7, '>=': 7,
+ '<<': 8, '>>': 8, '>>>': 8,
+ '+': 9, '-': 9,
+ '*': 10, '/': 10, '%': 10,
+ '**': 11,
+ },
+
+ // sets specific binary_ops as right-associative
+ right_associative: new Set(['**']),
+
+ // Additional valid identifier chars, apart from a-z, A-Z and 0-9 (except on the starting char)
+ additional_identifier_chars: new Set(['$', '_']),
+
+ // Literals
+ // ----------
+ // Store the values to return for the various literals we may encounter
+ literals: {
+ 'true': true,
+ 'false': false,
+ 'null': null
+ },
+
+ // Except for `this`, which is special. This could be changed to something like `'self'` as well
+ this_str: 'this',
+ });
+ Jsep.max_unop_len = Jsep.getMaxKeyLen(Jsep.unary_ops);
+ Jsep.max_binop_len = Jsep.getMaxKeyLen(Jsep.binary_ops);
+
+ // Backward Compatibility:
+ const jsep = expr => (new Jsep(expr)).parse();
+ const stdClassProps = Object.getOwnPropertyNames(class Test{});
+ Object.getOwnPropertyNames(Jsep)
+ .filter(prop => !stdClassProps.includes(prop) && jsep[prop] === undefined)
+ .forEach((m) => {
+ jsep[m] = Jsep[m];
+ });
+ jsep.Jsep = Jsep; // allows for const { Jsep } = require('jsep');
+
+ const CONDITIONAL_EXP = 'ConditionalExpression';
+
+ var ternary = {
+ name: 'ternary',
+
+ init(jsep) {
+ // Ternary expression: test ? consequent : alternate
+ jsep.hooks.add('after-expression', function gobbleTernary(env) {
+ if (env.node && this.code === jsep.QUMARK_CODE) {
+ this.index++;
+ const test = env.node;
+ const consequent = this.gobbleExpression();
+
+ if (!consequent) {
+ this.throwError('Expected expression');
+ }
+
+ this.gobbleSpaces();
+
+ if (this.code === jsep.COLON_CODE) {
+ this.index++;
+ const alternate = this.gobbleExpression();
+
+ if (!alternate) {
+ this.throwError('Expected expression');
+ }
+ env.node = {
+ type: CONDITIONAL_EXP,
+ test,
+ consequent,
+ alternate,
+ };
+
+ // check for operators of higher priority than ternary (i.e. assignment)
+ // jsep sets || at 1, and assignment at 0.9, and conditional should be between them
+ if (test.operator && jsep.binary_ops[test.operator] <= 0.9) {
+ let newTest = test;
+ while (newTest.right.operator && jsep.binary_ops[newTest.right.operator] <= 0.9) {
+ newTest = newTest.right;
+ }
+ env.node.test = newTest.right;
+ newTest.right = env.node;
+ env.node = test;
+ }
+ }
+ else {
+ this.throwError('Expected :');
+ }
+ }
+ });
+ },
+ };
+
+ // Add default plugins:
+
+ jsep.plugins.register(ternary);
+
+ return jsep;
+
+}());
+//# sourceMappingURL=jsep.iife.js.map
diff --git a/iife/jsep.iife.js.map b/iife/jsep.iife.js.map
new file mode 100644
index 0000000..2ffe265
--- /dev/null
+++ b/iife/jsep.iife.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"jsep.iife.js","sources":["../../src/hooks.js","../../src/plugins.js","../../src/jsep.js","../../packages/ternary/src/index.js","../../src/index.js"],"sourcesContent":["/**\n * @implements {IHooks}\n */\nexport default class Hooks {\n\t/**\n\t * @callback HookCallback\n\t * @this {*|Jsep} this\n\t * @param {Jsep} env\n\t * @returns: void\n\t */\n\t/**\n\t * Adds the given callback to the list of callbacks for the given hook.\n\t *\n\t * The callback will be invoked when the hook it is registered for is run.\n\t *\n\t * One callback function can be registered to multiple hooks and the same hook multiple times.\n\t *\n\t * @param {string|object} name The name of the hook, or an object of callbacks keyed by name\n\t * @param {HookCallback|boolean} callback The callback function which is given environment variables.\n\t * @param {?boolean} [first=false] Will add the hook to the top of the list (defaults to the bottom)\n\t * @public\n\t */\n\tadd(name, callback, first) {\n\t\tif (typeof arguments[0] != 'string') {\n\t\t\t// Multiple hook callbacks, keyed by name\n\t\t\tfor (let name in arguments[0]) {\n\t\t\t\tthis.add(name, arguments[0][name], arguments[1]);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\t(Array.isArray(name) ? name : [name]).forEach(function (name) {\n\t\t\t\tthis[name] = this[name] || [];\n\n\t\t\t\tif (callback) {\n\t\t\t\t\tthis[name][first ? 'unshift' : 'push'](callback);\n\t\t\t\t}\n\t\t\t}, this);\n\t\t}\n\t}\n\n\t/**\n\t * Runs a hook invoking all registered callbacks with the given environment variables.\n\t *\n\t * Callbacks will be invoked synchronously and in the order in which they were registered.\n\t *\n\t * @param {string} name The name of the hook.\n\t * @param {Object} env The environment variables of the hook passed to all callbacks registered.\n\t * @public\n\t */\n\trun(name, env) {\n\t\tthis[name] = this[name] || [];\n\t\tthis[name].forEach(function (callback) {\n\t\t\tcallback.call(env && env.context ? env.context : env, env);\n\t\t});\n\t}\n}\n","/**\n * @implements {IPlugins}\n */\nexport default class Plugins {\n\tconstructor(jsep) {\n\t\tthis.jsep = jsep;\n\t\tthis.registered = {};\n\t}\n\n\t/**\n\t * @callback PluginSetup\n\t * @this {Jsep} jsep\n\t * @returns: void\n\t */\n\t/**\n\t * Adds the given plugin(s) to the registry\n\t *\n\t * @param {object} plugins\n\t * @param {string} plugins.name The name of the plugin\n\t * @param {PluginSetup} plugins.init The init function\n\t * @public\n\t */\n\tregister(...plugins) {\n\t\tplugins.forEach((plugin) => {\n\t\t\tif (typeof plugin !== 'object' || !plugin.name || !plugin.init) {\n\t\t\t\tthrow new Error('Invalid JSEP plugin format');\n\t\t\t}\n\t\t\tif (this.registered[plugin.name]) {\n\t\t\t\t// already registered. Ignore.\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tplugin.init(this.jsep);\n\t\t\tthis.registered[plugin.name] = plugin;\n\t\t});\n\t}\n}\n","// JavaScript Expression Parser (JSEP) <%= version %>\n// JSEP may be freely distributed under the MIT License\n// https://ericsmekens.github.io/jsep/\nimport Hooks from './hooks.js';\nimport Plugins from './plugins.js';\n\nexport class Jsep {\n\t/**\n\t * @returns {string}\n\t */\n\tstatic get version() {\n\t\t// To be filled in by the template\n\t\treturn '<%= version %>';\n\t}\n\n\t/**\n\t * @returns {string}\n\t */\n\tstatic toString() {\n\t\treturn 'JavaScript Expression Parser (JSEP) v' + Jsep.version;\n\t};\n\n\t// ==================== CONFIG ================================\n\t/**\n\t * @method addUnaryOp\n\t * @param {string} op_name The name of the unary op to add\n\t * @returns {Jsep}\n\t */\n\tstatic addUnaryOp(op_name) {\n\t\tJsep.max_unop_len = Math.max(op_name.length, Jsep.max_unop_len);\n\t\tJsep.unary_ops[op_name] = 1;\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method jsep.addBinaryOp\n\t * @param {string} op_name The name of the binary op to add\n\t * @param {number} precedence The precedence of the binary op (can be a float). Higher number = higher precedence\n\t * @param {boolean} [isRightAssociative=false] whether operator is right-associative\n\t * @returns {Jsep}\n\t */\n\tstatic addBinaryOp(op_name, precedence, isRightAssociative) {\n\t\tJsep.max_binop_len = Math.max(op_name.length, Jsep.max_binop_len);\n\t\tJsep.binary_ops[op_name] = precedence;\n\t\tif (isRightAssociative) {\n\t\t\tJsep.right_associative.add(op_name);\n\t\t}\n\t\telse {\n\t\t\tJsep.right_associative.delete(op_name);\n\t\t}\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method addIdentifierChar\n\t * @param {string} char The additional character to treat as a valid part of an identifier\n\t * @returns {Jsep}\n\t */\n\tstatic addIdentifierChar(char) {\n\t\tJsep.additional_identifier_chars.add(char);\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method addLiteral\n\t * @param {string} literal_name The name of the literal to add\n\t * @param {*} literal_value The value of the literal\n\t * @returns {Jsep}\n\t */\n\tstatic addLiteral(literal_name, literal_value) {\n\t\tJsep.literals[literal_name] = literal_value;\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method removeUnaryOp\n\t * @param {string} op_name The name of the unary op to remove\n\t * @returns {Jsep}\n\t */\n\tstatic removeUnaryOp(op_name) {\n\t\tdelete Jsep.unary_ops[op_name];\n\t\tif (op_name.length === Jsep.max_unop_len) {\n\t\t\tJsep.max_unop_len = Jsep.getMaxKeyLen(Jsep.unary_ops);\n\t\t}\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method removeAllUnaryOps\n\t * @returns {Jsep}\n\t */\n\tstatic removeAllUnaryOps() {\n\t\tJsep.unary_ops = {};\n\t\tJsep.max_unop_len = 0;\n\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method removeIdentifierChar\n\t * @param {string} char The additional character to stop treating as a valid part of an identifier\n\t * @returns {Jsep}\n\t */\n\tstatic removeIdentifierChar(char) {\n\t\tJsep.additional_identifier_chars.delete(char);\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method removeBinaryOp\n\t * @param {string} op_name The name of the binary op to remove\n\t * @returns {Jsep}\n\t */\n\tstatic removeBinaryOp(op_name) {\n\t\tdelete Jsep.binary_ops[op_name];\n\n\t\tif (op_name.length === Jsep.max_binop_len) {\n\t\t\tJsep.max_binop_len = Jsep.getMaxKeyLen(Jsep.binary_ops);\n\t\t}\n\t\tJsep.right_associative.delete(op_name);\n\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method removeAllBinaryOps\n\t * @returns {Jsep}\n\t */\n\tstatic removeAllBinaryOps() {\n\t\tJsep.binary_ops = {};\n\t\tJsep.max_binop_len = 0;\n\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method removeLiteral\n\t * @param {string} literal_name The name of the literal to remove\n\t * @returns {Jsep}\n\t */\n\tstatic removeLiteral(literal_name) {\n\t\tdelete Jsep.literals[literal_name];\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method removeAllLiterals\n\t * @returns {Jsep}\n\t */\n\tstatic removeAllLiterals() {\n\t\tJsep.literals = {};\n\n\t\treturn Jsep;\n\t}\n\t// ==================== END CONFIG ============================\n\n\n\t/**\n\t * @returns {string}\n\t */\n\tget char() {\n\t\treturn this.expr.charAt(this.index);\n\t}\n\n\t/**\n\t * @returns {number}\n\t */\n\tget code() {\n\t\treturn this.expr.charCodeAt(this.index);\n\t};\n\n\n\t/**\n\t * @param {string} expr a string with the passed in express\n\t * @returns Jsep\n\t */\n\tconstructor(expr) {\n\t\t// `index` stores the character number we are currently at\n\t\t// All of the gobbles below will modify `index` as we move along\n\t\tthis.expr = expr;\n\t\tthis.index = 0;\n\t}\n\n\t/**\n\t * static top-level parser\n\t * @returns {jsep.Expression}\n\t */\n\tstatic parse(expr) {\n\t\treturn (new Jsep(expr)).parse();\n\t}\n\n\t/**\n\t * Get the longest key length of any object\n\t * @param {object} obj\n\t * @returns {number}\n\t */\n\tstatic getMaxKeyLen(obj) {\n\t\treturn Math.max(0, ...Object.keys(obj).map(k => k.length));\n\t}\n\n\t/**\n\t * `ch` is a character code in the next three functions\n\t * @param {number} ch\n\t * @returns {boolean}\n\t */\n\tstatic isDecimalDigit(ch) {\n\t\treturn (ch >= 48 && ch <= 57); // 0...9\n\t}\n\n\t/**\n\t * Returns the precedence of a binary operator or `0` if it isn't a binary operator. Can be float.\n\t * @param {string} op_val\n\t * @returns {number}\n\t */\n\tstatic binaryPrecedence(op_val) {\n\t\treturn Jsep.binary_ops[op_val] || 0;\n\t}\n\n\t/**\n\t * Looks for start of identifier\n\t * @param {number} ch\n\t * @returns {boolean}\n\t */\n\tstatic isIdentifierStart(ch) {\n\t\treturn (ch >= 65 && ch <= 90) || // A...Z\n\t\t\t(ch >= 97 && ch <= 122) || // a...z\n\t\t\t(ch >= 128 && !Jsep.binary_ops[String.fromCharCode(ch)]) || // any non-ASCII that is not an operator\n\t\t\t(Jsep.additional_identifier_chars.has(String.fromCharCode(ch))); // additional characters\n\t}\n\n\t/**\n\t * @param {number} ch\n\t * @returns {boolean}\n\t */\n\tstatic isIdentifierPart(ch) {\n\t\treturn Jsep.isIdentifierStart(ch) || Jsep.isDecimalDigit(ch);\n\t}\n\n\t/**\n\t * throw error at index of the expression\n\t * @param {string} message\n\t * @throws\n\t */\n\tthrowError(message) {\n\t\tconst error = new Error(message + ' at character ' + this.index);\n\t\terror.index = this.index;\n\t\terror.description = message;\n\t\tthrow error;\n\t}\n\n\t/**\n\t * Run a given hook\n\t * @param {string} name\n\t * @param {jsep.Expression|false} [node]\n\t * @returns {?jsep.Expression}\n\t */\n\trunHook(name, node) {\n\t\tif (Jsep.hooks[name]) {\n\t\t\tconst env = { context: this, node };\n\t\t\tJsep.hooks.run(name, env);\n\t\t\treturn env.node;\n\t\t}\n\t\treturn node;\n\t}\n\n\t/**\n\t * Runs a given hook until one returns a node\n\t * @param {string} name\n\t * @returns {?jsep.Expression}\n\t */\n\tsearchHook(name) {\n\t\tif (Jsep.hooks[name]) {\n\t\t\tconst env = { context: this };\n\t\t\tJsep.hooks[name].find(function (callback) {\n\t\t\t\tcallback.call(env.context, env);\n\t\t\t\treturn env.node;\n\t\t\t});\n\t\t\treturn env.node;\n\t\t}\n\t}\n\n\t/**\n\t * Push `index` up to the next non-space character\n\t */\n\tgobbleSpaces() {\n\t\tlet ch = this.code;\n\t\t// Whitespace\n\t\twhile (ch === Jsep.SPACE_CODE\n\t\t|| ch === Jsep.TAB_CODE\n\t\t|| ch === Jsep.LF_CODE\n\t\t|| ch === Jsep.CR_CODE) {\n\t\t\tch = this.expr.charCodeAt(++this.index);\n\t\t}\n\t\tthis.runHook('gobble-spaces');\n\t}\n\n\t/**\n\t * Top-level method to parse all expressions and returns compound or single node\n\t * @returns {jsep.Expression}\n\t */\n\tparse() {\n\t\tthis.runHook('before-all');\n\t\tconst nodes = this.gobbleExpressions();\n\n\t\t// If there's only one expression just try returning the expression\n\t\tconst node = nodes.length === 1\n\t\t ? nodes[0]\n\t\t\t: {\n\t\t\t\ttype: Jsep.COMPOUND,\n\t\t\t\tbody: nodes\n\t\t\t};\n\t\treturn this.runHook('after-all', node);\n\t}\n\n\t/**\n\t * top-level parser (but can be reused within as well)\n\t * @param {number} [untilICode]\n\t * @returns {jsep.Expression[]}\n\t */\n\tgobbleExpressions(untilICode) {\n\t\tlet nodes = [], ch_i, node;\n\n\t\twhile (this.index < this.expr.length) {\n\t\t\tch_i = this.code;\n\n\t\t\t// Expressions can be separated by semicolons, commas, or just inferred without any\n\t\t\t// separators\n\t\t\tif (ch_i === Jsep.SEMCOL_CODE || ch_i === Jsep.COMMA_CODE) {\n\t\t\t\tthis.index++; // ignore separators\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Try to gobble each expression individually\n\t\t\t\tif (node = this.gobbleExpression()) {\n\t\t\t\t\tnodes.push(node);\n\t\t\t\t\t// If we weren't able to find a binary expression and are out of room, then\n\t\t\t\t\t// the expression passed in probably has too much\n\t\t\t\t}\n\t\t\t\telse if (this.index < this.expr.length) {\n\t\t\t\t\tif (ch_i === untilICode) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tthis.throwError('Unexpected \"' + this.char + '\"');\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn nodes;\n\t}\n\n\t/**\n\t * The main parsing function.\n\t * @returns {?jsep.Expression}\n\t */\n\tgobbleExpression() {\n\t\tconst node = this.searchHook('gobble-expression') || this.gobbleBinaryExpression();\n\t\tthis.gobbleSpaces();\n\n\t\treturn this.runHook('after-expression', node);\n\t}\n\n\t/**\n\t * Search for the operation portion of the string (e.g. `+`, `===`)\n\t * Start by taking the longest possible binary operations (3 characters: `===`, `!==`, `>>>`)\n\t * and move down from 3 to 2 to 1 character until a matching binary operation is found\n\t * then, return that binary operation\n\t * @returns {string|boolean}\n\t */\n\tgobbleBinaryOp() {\n\t\tthis.gobbleSpaces();\n\t\tlet to_check = this.expr.substr(this.index, Jsep.max_binop_len);\n\t\tlet tc_len = to_check.length;\n\n\t\twhile (tc_len > 0) {\n\t\t\t// Don't accept a binary op when it is an identifier.\n\t\t\t// Binary ops that start with a identifier-valid character must be followed\n\t\t\t// by a non identifier-part valid character\n\t\t\tif (Jsep.binary_ops.hasOwnProperty(to_check) && (\n\t\t\t\t!Jsep.isIdentifierStart(this.code) ||\n\t\t\t\t(this.index + to_check.length < this.expr.length && !Jsep.isIdentifierPart(this.expr.charCodeAt(this.index + to_check.length)))\n\t\t\t)) {\n\t\t\t\tthis.index += tc_len;\n\t\t\t\treturn to_check;\n\t\t\t}\n\t\t\tto_check = to_check.substr(0, --tc_len);\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * This function is responsible for gobbling an individual expression,\n\t * e.g. `1`, `1+2`, `a+(b*2)-Math.sqrt(2)`\n\t * @returns {?jsep.BinaryExpression}\n\t */\n\tgobbleBinaryExpression() {\n\t\tlet node, biop, prec, stack, biop_info, left, right, i, cur_biop;\n\n\t\t// First, try to get the leftmost thing\n\t\t// Then, check to see if there's a binary operator operating on that leftmost thing\n\t\t// Don't gobbleBinaryOp without a left-hand-side\n\t\tleft = this.gobbleToken();\n\t\tif (!left) {\n\t\t\treturn left;\n\t\t}\n\t\tbiop = this.gobbleBinaryOp();\n\n\t\t// If there wasn't a binary operator, just return the leftmost node\n\t\tif (!biop) {\n\t\t\treturn left;\n\t\t}\n\n\t\t// Otherwise, we need to start a stack to properly place the binary operations in their\n\t\t// precedence structure\n\t\tbiop_info = { value: biop, prec: Jsep.binaryPrecedence(biop), right_a: Jsep.right_associative.has(biop) };\n\n\t\tright = this.gobbleToken();\n\n\t\tif (!right) {\n\t\t\tthis.throwError(\"Expected expression after \" + biop);\n\t\t}\n\n\t\tstack = [left, biop_info, right];\n\n\t\t// Properly deal with precedence using [recursive descent](http://www.engr.mun.ca/~theo/Misc/exp_parsing.htm)\n\t\twhile ((biop = this.gobbleBinaryOp())) {\n\t\t\tprec = Jsep.binaryPrecedence(biop);\n\n\t\t\tif (prec === 0) {\n\t\t\t\tthis.index -= biop.length;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tbiop_info = { value: biop, prec, right_a: Jsep.right_associative.has(biop) };\n\n\t\t\tcur_biop = biop;\n\n\t\t\t// Reduce: make a binary expression from the three topmost entries.\n\t\t\tconst comparePrev = prev => biop_info.right_a && prev.right_a\n\t\t\t\t? prec > prev.prec\n\t\t\t\t: prec <= prev.prec;\n\t\t\twhile ((stack.length > 2) && comparePrev(stack[stack.length - 2])) {\n\t\t\t\tright = stack.pop();\n\t\t\t\tbiop = stack.pop().value;\n\t\t\t\tleft = stack.pop();\n\t\t\t\tnode = {\n\t\t\t\t\ttype: Jsep.BINARY_EXP,\n\t\t\t\t\toperator: biop,\n\t\t\t\t\tleft,\n\t\t\t\t\tright\n\t\t\t\t};\n\t\t\t\tstack.push(node);\n\t\t\t}\n\n\t\t\tnode = this.gobbleToken();\n\n\t\t\tif (!node) {\n\t\t\t\tthis.throwError(\"Expected expression after \" + cur_biop);\n\t\t\t}\n\n\t\t\tstack.push(biop_info, node);\n\t\t}\n\n\t\ti = stack.length - 1;\n\t\tnode = stack[i];\n\n\t\twhile (i > 1) {\n\t\t\tnode = {\n\t\t\t\ttype: Jsep.BINARY_EXP,\n\t\t\t\toperator: stack[i - 1].value,\n\t\t\t\tleft: stack[i - 2],\n\t\t\t\tright: node\n\t\t\t};\n\t\t\ti -= 2;\n\t\t}\n\n\t\treturn node;\n\t}\n\n\t/**\n\t * An individual part of a binary expression:\n\t * e.g. `foo.bar(baz)`, `1`, `\"abc\"`, `(a % 2)` (because it's in parenthesis)\n\t * @returns {boolean|jsep.Expression}\n\t */\n\tgobbleToken() {\n\t\tlet ch, to_check, tc_len, node;\n\n\t\tthis.gobbleSpaces();\n\t\tnode = this.searchHook('gobble-token');\n\t\tif (node) {\n\t\t\treturn this.runHook('after-token', node);\n\t\t}\n\n\t\tch = this.code;\n\n\t\tif (Jsep.isDecimalDigit(ch) || ch === Jsep.PERIOD_CODE) {\n\t\t\t// Char code 46 is a dot `.` which can start off a numeric literal\n\t\t\treturn this.gobbleNumericLiteral();\n\t\t}\n\n\t\tif (ch === Jsep.SQUOTE_CODE || ch === Jsep.DQUOTE_CODE) {\n\t\t\t// Single or double quotes\n\t\t\tnode = this.gobbleStringLiteral();\n\t\t}\n\t\telse if (ch === Jsep.OBRACK_CODE) {\n\t\t\tnode = this.gobbleArray();\n\t\t}\n\t\telse {\n\t\t\tto_check = this.expr.substr(this.index, Jsep.max_unop_len);\n\t\t\ttc_len = to_check.length;\n\n\t\t\twhile (tc_len > 0) {\n\t\t\t\t// Don't accept an unary op when it is an identifier.\n\t\t\t\t// Unary ops that start with a identifier-valid character must be followed\n\t\t\t\t// by a non identifier-part valid character\n\t\t\t\tif (Jsep.unary_ops.hasOwnProperty(to_check) && (\n\t\t\t\t\t!Jsep.isIdentifierStart(this.code) ||\n\t\t\t\t\t(this.index + to_check.length < this.expr.length && !Jsep.isIdentifierPart(this.expr.charCodeAt(this.index + to_check.length)))\n\t\t\t\t)) {\n\t\t\t\t\tthis.index += tc_len;\n\t\t\t\t\tconst argument = this.gobbleToken();\n\t\t\t\t\tif (!argument) {\n\t\t\t\t\t\tthis.throwError('missing unaryOp argument');\n\t\t\t\t\t}\n\t\t\t\t\treturn this.runHook('after-token', {\n\t\t\t\t\t\ttype: Jsep.UNARY_EXP,\n\t\t\t\t\t\toperator: to_check,\n\t\t\t\t\t\targument,\n\t\t\t\t\t\tprefix: true\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tto_check = to_check.substr(0, --tc_len);\n\t\t\t}\n\n\t\t\tif (Jsep.isIdentifierStart(ch)) {\n\t\t\t\tnode = this.gobbleIdentifier();\n\t\t\t\tif (Jsep.literals.hasOwnProperty(node.name)) {\n\t\t\t\t\tnode = {\n\t\t\t\t\t\ttype: Jsep.LITERAL,\n\t\t\t\t\t\tvalue: Jsep.literals[node.name],\n\t\t\t\t\t\traw: node.name,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\telse if (node.name === Jsep.this_str) {\n\t\t\t\t\tnode = { type: Jsep.THIS_EXP };\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ch === Jsep.OPAREN_CODE) { // open parenthesis\n\t\t\t\tnode = this.gobbleGroup();\n\t\t\t}\n\t\t}\n\n\t\tif (!node) {\n\t\t\treturn this.runHook('after-token', false);\n\t\t}\n\n\t\tnode = this.gobbleTokenProperty(node);\n\t\treturn this.runHook('after-token', node);\n\t}\n\n\t/**\n\t * Gobble properties of of identifiers/strings/arrays/groups.\n\t * e.g. `foo`, `bar.baz`, `foo['bar'].baz`\n\t * It also gobbles function calls:\n\t * e.g. `Math.acos(obj.angle)`\n\t * @param {jsep.Expression} node\n\t * @returns {jsep.Expression}\n\t */\n\tgobbleTokenProperty(node) {\n\t\tthis.gobbleSpaces();\n\n\t\tlet ch = this.code;\n\t\twhile (ch === Jsep.PERIOD_CODE || ch === Jsep.OBRACK_CODE || ch === Jsep.OPAREN_CODE || ch === Jsep.QUMARK_CODE) {\n\t\t\tlet optional;\n\t\t\tif (ch === Jsep.QUMARK_CODE) {\n\t\t\t\tif (this.expr.charCodeAt(this.index + 1) !== Jsep.PERIOD_CODE) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\toptional = true;\n\t\t\t\tthis.index += 2;\n\t\t\t\tthis.gobbleSpaces();\n\t\t\t\tch = this.code;\n\t\t\t}\n\t\t\tthis.index++;\n\n\t\t\tif (ch === Jsep.OBRACK_CODE) {\n\t\t\t\tnode = {\n\t\t\t\t\ttype: Jsep.MEMBER_EXP,\n\t\t\t\t\tcomputed: true,\n\t\t\t\t\tobject: node,\n\t\t\t\t\tproperty: this.gobbleExpression()\n\t\t\t\t};\n\t\t\t\tif (!node.property) {\n\t\t\t\t\tthis.throwError('Unexpected \"' + this.char + '\"');\n\t\t\t\t}\n\t\t\t\tthis.gobbleSpaces();\n\t\t\t\tch = this.code;\n\t\t\t\tif (ch !== Jsep.CBRACK_CODE) {\n\t\t\t\t\tthis.throwError('Unclosed [');\n\t\t\t\t}\n\t\t\t\tthis.index++;\n\t\t\t}\n\t\t\telse if (ch === Jsep.OPAREN_CODE) {\n\t\t\t\t// A function call is being made; gobble all the arguments\n\t\t\t\tnode = {\n\t\t\t\t\ttype: Jsep.CALL_EXP,\n\t\t\t\t\t'arguments': this.gobbleArguments(Jsep.CPAREN_CODE),\n\t\t\t\t\tcallee: node\n\t\t\t\t};\n\t\t\t}\n\t\t\telse if (ch === Jsep.PERIOD_CODE || optional) {\n\t\t\t\tif (optional) {\n\t\t\t\t\tthis.index--;\n\t\t\t\t}\n\t\t\t\tthis.gobbleSpaces();\n\t\t\t\tnode = {\n\t\t\t\t\ttype: Jsep.MEMBER_EXP,\n\t\t\t\t\tcomputed: false,\n\t\t\t\t\tobject: node,\n\t\t\t\t\tproperty: this.gobbleIdentifier(),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (optional) {\n\t\t\t\tnode.optional = true;\n\t\t\t} // else leave undefined for compatibility with esprima\n\n\t\t\tthis.gobbleSpaces();\n\t\t\tch = this.code;\n\t\t}\n\n\t\treturn node;\n\t}\n\n\t/**\n\t * Parse simple numeric literals: `12`, `3.4`, `.5`. Do this by using a string to\n\t * keep track of everything in the numeric literal and then calling `parseFloat` on that string\n\t * @returns {jsep.Literal}\n\t */\n\tgobbleNumericLiteral() {\n\t\tlet number = '', ch, chCode;\n\n\t\twhile (Jsep.isDecimalDigit(this.code)) {\n\t\t\tnumber += this.expr.charAt(this.index++);\n\t\t}\n\n\t\tif (this.code === Jsep.PERIOD_CODE) { // can start with a decimal marker\n\t\t\tnumber += this.expr.charAt(this.index++);\n\n\t\t\twhile (Jsep.isDecimalDigit(this.code)) {\n\t\t\t\tnumber += this.expr.charAt(this.index++);\n\t\t\t}\n\t\t}\n\n\t\tch = this.char;\n\n\t\tif (ch === 'e' || ch === 'E') { // exponent marker\n\t\t\tnumber += this.expr.charAt(this.index++);\n\t\t\tch = this.char;\n\n\t\t\tif (ch === '+' || ch === '-') { // exponent sign\n\t\t\t\tnumber += this.expr.charAt(this.index++);\n\t\t\t}\n\n\t\t\twhile (Jsep.isDecimalDigit(this.code)) { // exponent itself\n\t\t\t\tnumber += this.expr.charAt(this.index++);\n\t\t\t}\n\n\t\t\tif (!Jsep.isDecimalDigit(this.expr.charCodeAt(this.index - 1)) ) {\n\t\t\t\tthis.throwError('Expected exponent (' + number + this.char + ')');\n\t\t\t}\n\t\t}\n\n\t\tchCode = this.code;\n\n\t\t// Check to make sure this isn't a variable name that start with a number (123abc)\n\t\tif (Jsep.isIdentifierStart(chCode)) {\n\t\t\tthis.throwError('Variable names cannot start with a number (' +\n\t\t\t\tnumber + this.char + ')');\n\t\t}\n\t\telse if (chCode === Jsep.PERIOD_CODE || (number.length === 1 && number.charCodeAt(0) === Jsep.PERIOD_CODE)) {\n\t\t\tthis.throwError('Unexpected period');\n\t\t}\n\n\t\treturn {\n\t\t\ttype: Jsep.LITERAL,\n\t\t\tvalue: parseFloat(number),\n\t\t\traw: number\n\t\t};\n\t}\n\n\t/**\n\t * Parses a string literal, staring with single or double quotes with basic support for escape codes\n\t * e.g. `\"hello world\"`, `'this is\\nJSEP'`\n\t * @returns {jsep.Literal}\n\t */\n\tgobbleStringLiteral() {\n\t\tlet str = '';\n\t\tconst startIndex = this.index;\n\t\tconst quote = this.expr.charAt(this.index++);\n\t\tlet closed = false;\n\n\t\twhile (this.index < this.expr.length) {\n\t\t\tlet ch = this.expr.charAt(this.index++);\n\n\t\t\tif (ch === quote) {\n\t\t\t\tclosed = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse if (ch === '\\\\') {\n\t\t\t\t// Check for all of the common escape codes\n\t\t\t\tch = this.expr.charAt(this.index++);\n\n\t\t\t\tswitch (ch) {\n\t\t\t\t\tcase 'n': str += '\\n'; break;\n\t\t\t\t\tcase 'r': str += '\\r'; break;\n\t\t\t\t\tcase 't': str += '\\t'; break;\n\t\t\t\t\tcase 'b': str += '\\b'; break;\n\t\t\t\t\tcase 'f': str += '\\f'; break;\n\t\t\t\t\tcase 'v': str += '\\x0B'; break;\n\t\t\t\t\tdefault : str += ch;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tstr += ch;\n\t\t\t}\n\t\t}\n\n\t\tif (!closed) {\n\t\t\tthis.throwError('Unclosed quote after \"' + str + '\"');\n\t\t}\n\n\t\treturn {\n\t\t\ttype: Jsep.LITERAL,\n\t\t\tvalue: str,\n\t\t\traw: this.expr.substring(startIndex, this.index),\n\t\t};\n\t}\n\n\t/**\n\t * Gobbles only identifiers\n\t * e.g.: `foo`, `_value`, `$x1`\n\t * Also, this function checks if that identifier is a literal:\n\t * (e.g. `true`, `false`, `null`) or `this`\n\t * @returns {jsep.Identifier}\n\t */\n\tgobbleIdentifier() {\n\t\tlet ch = this.code, start = this.index;\n\n\t\tif (Jsep.isIdentifierStart(ch)) {\n\t\t\tthis.index++;\n\t\t}\n\t\telse {\n\t\t\tthis.throwError('Unexpected ' + this.char);\n\t\t}\n\n\t\twhile (this.index < this.expr.length) {\n\t\t\tch = this.code;\n\n\t\t\tif (Jsep.isIdentifierPart(ch)) {\n\t\t\t\tthis.index++;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\ttype: Jsep.IDENTIFIER,\n\t\t\tname: this.expr.slice(start, this.index),\n\t\t};\n\t}\n\n\t/**\n\t * Gobbles a list of arguments within the context of a function call\n\t * or array literal. This function also assumes that the opening character\n\t * `(` or `[` has already been gobbled, and gobbles expressions and commas\n\t * until the terminator character `)` or `]` is encountered.\n\t * e.g. `foo(bar, baz)`, `my_func()`, or `[bar, baz]`\n\t * @param {number} termination\n\t * @returns {jsep.Expression[]}\n\t */\n\tgobbleArguments(termination) {\n\t\tconst args = [];\n\t\tlet closed = false;\n\t\tlet separator_count = 0;\n\n\t\twhile (this.index < this.expr.length) {\n\t\t\tthis.gobbleSpaces();\n\t\t\tlet ch_i = this.code;\n\n\t\t\tif (ch_i === termination) { // done parsing\n\t\t\t\tclosed = true;\n\t\t\t\tthis.index++;\n\n\t\t\t\tif (termination === Jsep.CPAREN_CODE && separator_count && separator_count >= args.length){\n\t\t\t\t\tthis.throwError('Unexpected token ' + String.fromCharCode(termination));\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse if (ch_i === Jsep.COMMA_CODE) { // between expressions\n\t\t\t\tthis.index++;\n\t\t\t\tseparator_count++;\n\n\t\t\t\tif (separator_count !== args.length) { // missing argument\n\t\t\t\t\tif (termination === Jsep.CPAREN_CODE) {\n\t\t\t\t\t\tthis.throwError('Unexpected token ,');\n\t\t\t\t\t}\n\t\t\t\t\telse if (termination === Jsep.CBRACK_CODE) {\n\t\t\t\t\t\tfor (let arg = args.length; arg < separator_count; arg++) {\n\t\t\t\t\t\t\targs.push(null);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (args.length !== separator_count && separator_count !== 0) {\n\t\t\t\t// NOTE: `&& separator_count !== 0` allows for either all commas, or all spaces as arguments\n\t\t\t\tthis.throwError('Expected comma');\n\t\t\t}\n\t\t\telse {\n\t\t\t\tconst node = this.gobbleExpression();\n\n\t\t\t\tif (!node || node.type === Jsep.COMPOUND) {\n\t\t\t\t\tthis.throwError('Expected comma');\n\t\t\t\t}\n\n\t\t\t\targs.push(node);\n\t\t\t}\n\t\t}\n\n\t\tif (!closed) {\n\t\t\tthis.throwError('Expected ' + String.fromCharCode(termination));\n\t\t}\n\n\t\treturn args;\n\t}\n\n\t/**\n\t * Responsible for parsing a group of things within parentheses `()`\n\t * that have no identifier in front (so not a function call)\n\t * This function assumes that it needs to gobble the opening parenthesis\n\t * and then tries to gobble everything within that parenthesis, assuming\n\t * that the next thing it should see is the close parenthesis. If not,\n\t * then the expression probably doesn't have a `)`\n\t * @returns {boolean|jsep.Expression}\n\t */\n\tgobbleGroup() {\n\t\tthis.index++;\n\t\tlet nodes = this.gobbleExpressions(Jsep.CPAREN_CODE);\n\t\tif (this.code === Jsep.CPAREN_CODE) {\n\t\t\tthis.index++;\n\t\t\tif (nodes.length === 1) {\n\t\t\t\treturn nodes[0];\n\t\t\t}\n\t\t\telse if (!nodes.length) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn {\n\t\t\t\t\ttype: Jsep.SEQUENCE_EXP,\n\t\t\t\t\texpressions: nodes,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tthis.throwError('Unclosed (');\n\t\t}\n\t}\n\n\t/**\n\t * Responsible for parsing Array literals `[1, 2, 3]`\n\t * This function assumes that it needs to gobble the opening bracket\n\t * and then tries to gobble the expressions as arguments.\n\t * @returns {jsep.ArrayExpression}\n\t */\n\tgobbleArray() {\n\t\tthis.index++;\n\n\t\treturn {\n\t\t\ttype: Jsep.ARRAY_EXP,\n\t\t\telements: this.gobbleArguments(Jsep.CBRACK_CODE)\n\t\t};\n\t}\n}\n\n// Static fields:\nconst hooks = new Hooks();\nObject.assign(Jsep, {\n\thooks,\n\tplugins: new Plugins(Jsep),\n\n\t// Node Types\n\t// ----------\n\t// This is the full set of types that any JSEP node can be.\n\t// Store them here to save space when minified\n\tCOMPOUND: 'Compound',\n\tSEQUENCE_EXP: 'SequenceExpression',\n\tIDENTIFIER: 'Identifier',\n\tMEMBER_EXP: 'MemberExpression',\n\tLITERAL: 'Literal',\n\tTHIS_EXP: 'ThisExpression',\n\tCALL_EXP: 'CallExpression',\n\tUNARY_EXP: 'UnaryExpression',\n\tBINARY_EXP: 'BinaryExpression',\n\tARRAY_EXP: 'ArrayExpression',\n\n\tTAB_CODE: 9,\n\tLF_CODE: 10,\n\tCR_CODE: 13,\n\tSPACE_CODE: 32,\n\tPERIOD_CODE: 46, // '.'\n\tCOMMA_CODE: 44, // ','\n\tSQUOTE_CODE: 39, // single quote\n\tDQUOTE_CODE: 34, // double quotes\n\tOPAREN_CODE: 40, // (\n\tCPAREN_CODE: 41, // )\n\tOBRACK_CODE: 91, // [\n\tCBRACK_CODE: 93, // ]\n\tQUMARK_CODE: 63, // ?\n\tSEMCOL_CODE: 59, // ;\n\tCOLON_CODE: 58, // :\n\n\n\t// Operations\n\t// ----------\n\t// Use a quickly-accessible map to store all of the unary operators\n\t// Values are set to `1` (it really doesn't matter)\n\tunary_ops: {\n\t\t'-': 1,\n\t\t'!': 1,\n\t\t'~': 1,\n\t\t'+': 1\n\t},\n\n\t// Also use a map for the binary operations but set their values to their\n\t// binary precedence for quick reference (higher number = higher precedence)\n\t// see [Order of operations](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence)\n\tbinary_ops: {\n\t\t'||': 1, '??': 1,\n\t\t'&&': 2, '|': 3, '^': 4, '&': 5,\n\t\t'==': 6, '!=': 6, '===': 6, '!==': 6,\n\t\t'<': 7, '>': 7, '<=': 7, '>=': 7,\n\t\t'<<': 8, '>>': 8, '>>>': 8,\n\t\t'+': 9, '-': 9,\n\t\t'*': 10, '/': 10, '%': 10,\n\t\t'**': 11,\n\t},\n\n\t// sets specific binary_ops as right-associative\n\tright_associative: new Set(['**']),\n\n\t// Additional valid identifier chars, apart from a-z, A-Z and 0-9 (except on the starting char)\n\tadditional_identifier_chars: new Set(['$', '_']),\n\n\t// Literals\n\t// ----------\n\t// Store the values to return for the various literals we may encounter\n\tliterals: {\n\t\t'true': true,\n\t\t'false': false,\n\t\t'null': null\n\t},\n\n\t// Except for `this`, which is special. This could be changed to something like `'self'` as well\n\tthis_str: 'this',\n});\nJsep.max_unop_len = Jsep.getMaxKeyLen(Jsep.unary_ops);\nJsep.max_binop_len = Jsep.getMaxKeyLen(Jsep.binary_ops);\n\n// Backward Compatibility:\nconst jsep = expr => (new Jsep(expr)).parse();\nconst stdClassProps = Object.getOwnPropertyNames(class Test{});\nObject.getOwnPropertyNames(Jsep)\n\t.filter(prop => !stdClassProps.includes(prop) && jsep[prop] === undefined)\n\t.forEach((m) => {\n\t\tjsep[m] = Jsep[m];\n\t});\njsep.Jsep = Jsep; // allows for const { Jsep } = require('jsep');\nexport default jsep;\n\n","const CONDITIONAL_EXP = 'ConditionalExpression';\n\nexport default {\n\tname: 'ternary',\n\n\tinit(jsep) {\n\t\t// Ternary expression: test ? consequent : alternate\n\t\tjsep.hooks.add('after-expression', function gobbleTernary(env) {\n\t\t\tif (env.node && this.code === jsep.QUMARK_CODE) {\n\t\t\t\tthis.index++;\n\t\t\t\tconst test = env.node;\n\t\t\t\tconst consequent = this.gobbleExpression();\n\n\t\t\t\tif (!consequent) {\n\t\t\t\t\tthis.throwError('Expected expression');\n\t\t\t\t}\n\n\t\t\t\tthis.gobbleSpaces();\n\n\t\t\t\tif (this.code === jsep.COLON_CODE) {\n\t\t\t\t\tthis.index++;\n\t\t\t\t\tconst alternate = this.gobbleExpression();\n\n\t\t\t\t\tif (!alternate) {\n\t\t\t\t\t\tthis.throwError('Expected expression');\n\t\t\t\t\t}\n\t\t\t\t\tenv.node = {\n\t\t\t\t\t\ttype: CONDITIONAL_EXP,\n\t\t\t\t\t\ttest,\n\t\t\t\t\t\tconsequent,\n\t\t\t\t\t\talternate,\n\t\t\t\t\t};\n\n\t\t\t\t\t// check for operators of higher priority than ternary (i.e. assignment)\n\t\t\t\t\t// jsep sets || at 1, and assignment at 0.9, and conditional should be between them\n\t\t\t\t\tif (test.operator && jsep.binary_ops[test.operator] <= 0.9) {\n\t\t\t\t\t\tlet newTest = test;\n\t\t\t\t\t\twhile (newTest.right.operator && jsep.binary_ops[newTest.right.operator] <= 0.9) {\n\t\t\t\t\t\t\tnewTest = newTest.right;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tenv.node.test = newTest.right;\n\t\t\t\t\t\tnewTest.right = env.node;\n\t\t\t\t\t\tenv.node = test;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.throwError('Expected :');\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n};\n","// Add default plugins:\nimport jsep from './jsep.js';\nimport ternary from '../packages/ternary/src/index.js';\n\njsep.plugins.register(ternary);\n\nexport * from './jsep.js';\nexport default jsep;\n"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/iife/jsep.iife.min.js b/iife/jsep.iife.min.js
new file mode 100644
index 0000000..b7dee93
--- /dev/null
+++ b/iife/jsep.iife.min.js
@@ -0,0 +1,2 @@
+var jsep=function(){"use strict";class e{static get version(){return"1.4.0"}static toString(){return"JavaScript Expression Parser (JSEP) v"+e.version}static addUnaryOp(t){return e.max_unop_len=Math.max(t.length,e.max_unop_len),e.unary_ops[t]=1,e}static addBinaryOp(t,r,i){return e.max_binop_len=Math.max(t.length,e.max_binop_len),e.binary_ops[t]=r,i?e.right_associative.add(t):e.right_associative.delete(t),e}static addIdentifierChar(t){return e.additional_identifier_chars.add(t),e}static addLiteral(t,r){return e.literals[t]=r,e}static removeUnaryOp(t){return delete e.unary_ops[t],t.length===e.max_unop_len&&(e.max_unop_len=e.getMaxKeyLen(e.unary_ops)),e}static removeAllUnaryOps(){return e.unary_ops={},e.max_unop_len=0,e}static removeIdentifierChar(t){return e.additional_identifier_chars.delete(t),e}static removeBinaryOp(t){return delete e.binary_ops[t],t.length===e.max_binop_len&&(e.max_binop_len=e.getMaxKeyLen(e.binary_ops)),e.right_associative.delete(t),e}static removeAllBinaryOps(){return e.binary_ops={},e.max_binop_len=0,e}static removeLiteral(t){return delete e.literals[t],e}static removeAllLiterals(){return e.literals={},e}get char(){return this.expr.charAt(this.index)}get code(){return this.expr.charCodeAt(this.index)}constructor(e){this.expr=e,this.index=0}static parse(t){return new e(t).parse()}static getMaxKeyLen(e){return Math.max(0,...Object.keys(e).map((e=>e.length)))}static isDecimalDigit(e){return e>=48&&e<=57}static binaryPrecedence(t){return e.binary_ops[t]||0}static isIdentifierStart(t){return t>=65&&t<=90||t>=97&&t<=122||t>=128&&!e.binary_ops[String.fromCharCode(t)]||e.additional_identifier_chars.has(String.fromCharCode(t))}static isIdentifierPart(t){return e.isIdentifierStart(t)||e.isDecimalDigit(t)}throwError(e){const t=new Error(e+" at character "+this.index);throw t.index=this.index,t.description=e,t}runHook(t,r){if(e.hooks[t]){const i={context:this,node:r};return e.hooks.run(t,i),i.node}return r}searchHook(t){if(e.hooks[t]){const r={context:this};return e.hooks[t].find((function(e){return e.call(r.context,r),r.node})),r.node}}gobbleSpaces(){let t=this.code;for(;t===e.SPACE_CODE||t===e.TAB_CODE||t===e.LF_CODE||t===e.CR_CODE;)t=this.expr.charCodeAt(++this.index);this.runHook("gobble-spaces")}parse(){this.runHook("before-all");const t=this.gobbleExpressions(),r=1===t.length?t[0]:{type:e.COMPOUND,body:t};return this.runHook("after-all",r)}gobbleExpressions(t){let r,i,s=[];for(;this.index0;){if(e.binary_ops.hasOwnProperty(t)&&(!e.isIdentifierStart(this.code)||this.index+t.lengthn.right_a&&e.right_a?i>e.prec:i<=e.prec;for(;s.length>2&&a(s[s.length-2]);)h=s.pop(),r=s.pop().value,o=s.pop(),t={type:e.BINARY_EXP,operator:r,left:o,right:h},s.push(t);t=this.gobbleToken(),t||this.throwError("Expected expression after "+l),s.push(n,t)}for(a=s.length-1,t=s[a];a>1;)t={type:e.BINARY_EXP,operator:s[a-1].value,left:s[a-2],right:t},a-=2;return t}gobbleToken(){let t,r,i,s;if(this.gobbleSpaces(),s=this.searchHook("gobble-token"),s)return this.runHook("after-token",s);if(t=this.code,e.isDecimalDigit(t)||t===e.PERIOD_CODE)return this.gobbleNumericLiteral();if(t===e.SQUOTE_CODE||t===e.DQUOTE_CODE)s=this.gobbleStringLiteral();else if(t===e.OBRACK_CODE)s=this.gobbleArray();else{for(r=this.expr.substr(this.index,e.max_unop_len),i=r.length;i>0;){if(e.unary_ops.hasOwnProperty(r)&&(!e.isIdentifierStart(this.code)||this.index+r.length=r.length&&this.throwError("Unexpected token "+String.fromCharCode(t));break}if(n===e.COMMA_CODE){if(this.index++,s++,s!==r.length)if(t===e.CPAREN_CODE)this.throwError("Unexpected token ,");else if(t===e.CBRACK_CODE)for(let e=r.length;e{if("object"!=typeof e||!e.name||!e.init)throw new Error("Invalid JSEP plugin format");this.registered[e.name]||(e.init(this.jsep),this.registered[e.name]=e)}))}}(e),COMPOUND:"Compound",SEQUENCE_EXP:"SequenceExpression",IDENTIFIER:"Identifier",MEMBER_EXP:"MemberExpression",LITERAL:"Literal",THIS_EXP:"ThisExpression",CALL_EXP:"CallExpression",UNARY_EXP:"UnaryExpression",BINARY_EXP:"BinaryExpression",ARRAY_EXP:"ArrayExpression",TAB_CODE:9,LF_CODE:10,CR_CODE:13,SPACE_CODE:32,PERIOD_CODE:46,COMMA_CODE:44,SQUOTE_CODE:39,DQUOTE_CODE:34,OPAREN_CODE:40,CPAREN_CODE:41,OBRACK_CODE:91,CBRACK_CODE:93,QUMARK_CODE:63,SEMCOL_CODE:59,COLON_CODE:58,unary_ops:{"-":1,"!":1,"~":1,"+":1},binary_ops:{"||":1,"??":1,"&&":2,"|":3,"^":4,"&":5,"==":6,"!=":6,"===":6,"!==":6,"<":7,">":7,"<=":7,">=":7,"<<":8,">>":8,">>>":8,"+":9,"-":9,"*":10,"/":10,"%":10,"**":11},right_associative:new Set(["**"]),additional_identifier_chars:new Set(["$","_"]),literals:{true:!0,false:!1,null:null},this_str:"this"}),e.max_unop_len=e.getMaxKeyLen(e.unary_ops),e.max_binop_len=e.getMaxKeyLen(e.binary_ops);const r=t=>new e(t).parse(),i=Object.getOwnPropertyNames(class{});Object.getOwnPropertyNames(e).filter((e=>!i.includes(e)&&void 0===r[e])).forEach((t=>{r[t]=e[t]})),r.Jsep=e;var s={name:"ternary",init(e){e.hooks.add("after-expression",(function(t){if(t.node&&this.code===e.QUMARK_CODE){this.index++;const r=t.node,i=this.gobbleExpression();if(i||this.throwError("Expected expression"),this.gobbleSpaces(),this.code===e.COLON_CODE){this.index++;const s=this.gobbleExpression();if(s||this.throwError("Expected expression"),t.node={type:"ConditionalExpression",test:r,consequent:i,alternate:s},r.operator&&e.binary_ops[r.operator]<=.9){let i=r;for(;i.right.operator&&e.binary_ops[i.right.operator]<=.9;)i=i.right;t.node.test=i.right,i.right=t.node,t.node=r}}else this.throwError("Expected :")}}))}};return r.plugins.register(s),r}();
+//# sourceMappingURL=jsep.iife.min.js.map
diff --git a/iife/jsep.iife.min.js.map b/iife/jsep.iife.min.js.map
new file mode 100644
index 0000000..3205479
--- /dev/null
+++ b/iife/jsep.iife.min.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"jsep.iife.min.js","sources":["../../src/jsep.js","../../src/hooks.js","../../src/plugins.js","../../packages/ternary/src/index.js","../../src/index.js"],"sourcesContent":["// JavaScript Expression Parser (JSEP) <%= version %>\n// JSEP may be freely distributed under the MIT License\n// https://ericsmekens.github.io/jsep/\nimport Hooks from './hooks.js';\nimport Plugins from './plugins.js';\n\nexport class Jsep {\n\t/**\n\t * @returns {string}\n\t */\n\tstatic get version() {\n\t\t// To be filled in by the template\n\t\treturn '<%= version %>';\n\t}\n\n\t/**\n\t * @returns {string}\n\t */\n\tstatic toString() {\n\t\treturn 'JavaScript Expression Parser (JSEP) v' + Jsep.version;\n\t};\n\n\t// ==================== CONFIG ================================\n\t/**\n\t * @method addUnaryOp\n\t * @param {string} op_name The name of the unary op to add\n\t * @returns {Jsep}\n\t */\n\tstatic addUnaryOp(op_name) {\n\t\tJsep.max_unop_len = Math.max(op_name.length, Jsep.max_unop_len);\n\t\tJsep.unary_ops[op_name] = 1;\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method jsep.addBinaryOp\n\t * @param {string} op_name The name of the binary op to add\n\t * @param {number} precedence The precedence of the binary op (can be a float). Higher number = higher precedence\n\t * @param {boolean} [isRightAssociative=false] whether operator is right-associative\n\t * @returns {Jsep}\n\t */\n\tstatic addBinaryOp(op_name, precedence, isRightAssociative) {\n\t\tJsep.max_binop_len = Math.max(op_name.length, Jsep.max_binop_len);\n\t\tJsep.binary_ops[op_name] = precedence;\n\t\tif (isRightAssociative) {\n\t\t\tJsep.right_associative.add(op_name);\n\t\t}\n\t\telse {\n\t\t\tJsep.right_associative.delete(op_name);\n\t\t}\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method addIdentifierChar\n\t * @param {string} char The additional character to treat as a valid part of an identifier\n\t * @returns {Jsep}\n\t */\n\tstatic addIdentifierChar(char) {\n\t\tJsep.additional_identifier_chars.add(char);\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method addLiteral\n\t * @param {string} literal_name The name of the literal to add\n\t * @param {*} literal_value The value of the literal\n\t * @returns {Jsep}\n\t */\n\tstatic addLiteral(literal_name, literal_value) {\n\t\tJsep.literals[literal_name] = literal_value;\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method removeUnaryOp\n\t * @param {string} op_name The name of the unary op to remove\n\t * @returns {Jsep}\n\t */\n\tstatic removeUnaryOp(op_name) {\n\t\tdelete Jsep.unary_ops[op_name];\n\t\tif (op_name.length === Jsep.max_unop_len) {\n\t\t\tJsep.max_unop_len = Jsep.getMaxKeyLen(Jsep.unary_ops);\n\t\t}\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method removeAllUnaryOps\n\t * @returns {Jsep}\n\t */\n\tstatic removeAllUnaryOps() {\n\t\tJsep.unary_ops = {};\n\t\tJsep.max_unop_len = 0;\n\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method removeIdentifierChar\n\t * @param {string} char The additional character to stop treating as a valid part of an identifier\n\t * @returns {Jsep}\n\t */\n\tstatic removeIdentifierChar(char) {\n\t\tJsep.additional_identifier_chars.delete(char);\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method removeBinaryOp\n\t * @param {string} op_name The name of the binary op to remove\n\t * @returns {Jsep}\n\t */\n\tstatic removeBinaryOp(op_name) {\n\t\tdelete Jsep.binary_ops[op_name];\n\n\t\tif (op_name.length === Jsep.max_binop_len) {\n\t\t\tJsep.max_binop_len = Jsep.getMaxKeyLen(Jsep.binary_ops);\n\t\t}\n\t\tJsep.right_associative.delete(op_name);\n\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method removeAllBinaryOps\n\t * @returns {Jsep}\n\t */\n\tstatic removeAllBinaryOps() {\n\t\tJsep.binary_ops = {};\n\t\tJsep.max_binop_len = 0;\n\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method removeLiteral\n\t * @param {string} literal_name The name of the literal to remove\n\t * @returns {Jsep}\n\t */\n\tstatic removeLiteral(literal_name) {\n\t\tdelete Jsep.literals[literal_name];\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method removeAllLiterals\n\t * @returns {Jsep}\n\t */\n\tstatic removeAllLiterals() {\n\t\tJsep.literals = {};\n\n\t\treturn Jsep;\n\t}\n\t// ==================== END CONFIG ============================\n\n\n\t/**\n\t * @returns {string}\n\t */\n\tget char() {\n\t\treturn this.expr.charAt(this.index);\n\t}\n\n\t/**\n\t * @returns {number}\n\t */\n\tget code() {\n\t\treturn this.expr.charCodeAt(this.index);\n\t};\n\n\n\t/**\n\t * @param {string} expr a string with the passed in express\n\t * @returns Jsep\n\t */\n\tconstructor(expr) {\n\t\t// `index` stores the character number we are currently at\n\t\t// All of the gobbles below will modify `index` as we move along\n\t\tthis.expr = expr;\n\t\tthis.index = 0;\n\t}\n\n\t/**\n\t * static top-level parser\n\t * @returns {jsep.Expression}\n\t */\n\tstatic parse(expr) {\n\t\treturn (new Jsep(expr)).parse();\n\t}\n\n\t/**\n\t * Get the longest key length of any object\n\t * @param {object} obj\n\t * @returns {number}\n\t */\n\tstatic getMaxKeyLen(obj) {\n\t\treturn Math.max(0, ...Object.keys(obj).map(k => k.length));\n\t}\n\n\t/**\n\t * `ch` is a character code in the next three functions\n\t * @param {number} ch\n\t * @returns {boolean}\n\t */\n\tstatic isDecimalDigit(ch) {\n\t\treturn (ch >= 48 && ch <= 57); // 0...9\n\t}\n\n\t/**\n\t * Returns the precedence of a binary operator or `0` if it isn't a binary operator. Can be float.\n\t * @param {string} op_val\n\t * @returns {number}\n\t */\n\tstatic binaryPrecedence(op_val) {\n\t\treturn Jsep.binary_ops[op_val] || 0;\n\t}\n\n\t/**\n\t * Looks for start of identifier\n\t * @param {number} ch\n\t * @returns {boolean}\n\t */\n\tstatic isIdentifierStart(ch) {\n\t\treturn (ch >= 65 && ch <= 90) || // A...Z\n\t\t\t(ch >= 97 && ch <= 122) || // a...z\n\t\t\t(ch >= 128 && !Jsep.binary_ops[String.fromCharCode(ch)]) || // any non-ASCII that is not an operator\n\t\t\t(Jsep.additional_identifier_chars.has(String.fromCharCode(ch))); // additional characters\n\t}\n\n\t/**\n\t * @param {number} ch\n\t * @returns {boolean}\n\t */\n\tstatic isIdentifierPart(ch) {\n\t\treturn Jsep.isIdentifierStart(ch) || Jsep.isDecimalDigit(ch);\n\t}\n\n\t/**\n\t * throw error at index of the expression\n\t * @param {string} message\n\t * @throws\n\t */\n\tthrowError(message) {\n\t\tconst error = new Error(message + ' at character ' + this.index);\n\t\terror.index = this.index;\n\t\terror.description = message;\n\t\tthrow error;\n\t}\n\n\t/**\n\t * Run a given hook\n\t * @param {string} name\n\t * @param {jsep.Expression|false} [node]\n\t * @returns {?jsep.Expression}\n\t */\n\trunHook(name, node) {\n\t\tif (Jsep.hooks[name]) {\n\t\t\tconst env = { context: this, node };\n\t\t\tJsep.hooks.run(name, env);\n\t\t\treturn env.node;\n\t\t}\n\t\treturn node;\n\t}\n\n\t/**\n\t * Runs a given hook until one returns a node\n\t * @param {string} name\n\t * @returns {?jsep.Expression}\n\t */\n\tsearchHook(name) {\n\t\tif (Jsep.hooks[name]) {\n\t\t\tconst env = { context: this };\n\t\t\tJsep.hooks[name].find(function (callback) {\n\t\t\t\tcallback.call(env.context, env);\n\t\t\t\treturn env.node;\n\t\t\t});\n\t\t\treturn env.node;\n\t\t}\n\t}\n\n\t/**\n\t * Push `index` up to the next non-space character\n\t */\n\tgobbleSpaces() {\n\t\tlet ch = this.code;\n\t\t// Whitespace\n\t\twhile (ch === Jsep.SPACE_CODE\n\t\t|| ch === Jsep.TAB_CODE\n\t\t|| ch === Jsep.LF_CODE\n\t\t|| ch === Jsep.CR_CODE) {\n\t\t\tch = this.expr.charCodeAt(++this.index);\n\t\t}\n\t\tthis.runHook('gobble-spaces');\n\t}\n\n\t/**\n\t * Top-level method to parse all expressions and returns compound or single node\n\t * @returns {jsep.Expression}\n\t */\n\tparse() {\n\t\tthis.runHook('before-all');\n\t\tconst nodes = this.gobbleExpressions();\n\n\t\t// If there's only one expression just try returning the expression\n\t\tconst node = nodes.length === 1\n\t\t ? nodes[0]\n\t\t\t: {\n\t\t\t\ttype: Jsep.COMPOUND,\n\t\t\t\tbody: nodes\n\t\t\t};\n\t\treturn this.runHook('after-all', node);\n\t}\n\n\t/**\n\t * top-level parser (but can be reused within as well)\n\t * @param {number} [untilICode]\n\t * @returns {jsep.Expression[]}\n\t */\n\tgobbleExpressions(untilICode) {\n\t\tlet nodes = [], ch_i, node;\n\n\t\twhile (this.index < this.expr.length) {\n\t\t\tch_i = this.code;\n\n\t\t\t// Expressions can be separated by semicolons, commas, or just inferred without any\n\t\t\t// separators\n\t\t\tif (ch_i === Jsep.SEMCOL_CODE || ch_i === Jsep.COMMA_CODE) {\n\t\t\t\tthis.index++; // ignore separators\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Try to gobble each expression individually\n\t\t\t\tif (node = this.gobbleExpression()) {\n\t\t\t\t\tnodes.push(node);\n\t\t\t\t\t// If we weren't able to find a binary expression and are out of room, then\n\t\t\t\t\t// the expression passed in probably has too much\n\t\t\t\t}\n\t\t\t\telse if (this.index < this.expr.length) {\n\t\t\t\t\tif (ch_i === untilICode) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tthis.throwError('Unexpected \"' + this.char + '\"');\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn nodes;\n\t}\n\n\t/**\n\t * The main parsing function.\n\t * @returns {?jsep.Expression}\n\t */\n\tgobbleExpression() {\n\t\tconst node = this.searchHook('gobble-expression') || this.gobbleBinaryExpression();\n\t\tthis.gobbleSpaces();\n\n\t\treturn this.runHook('after-expression', node);\n\t}\n\n\t/**\n\t * Search for the operation portion of the string (e.g. `+`, `===`)\n\t * Start by taking the longest possible binary operations (3 characters: `===`, `!==`, `>>>`)\n\t * and move down from 3 to 2 to 1 character until a matching binary operation is found\n\t * then, return that binary operation\n\t * @returns {string|boolean}\n\t */\n\tgobbleBinaryOp() {\n\t\tthis.gobbleSpaces();\n\t\tlet to_check = this.expr.substr(this.index, Jsep.max_binop_len);\n\t\tlet tc_len = to_check.length;\n\n\t\twhile (tc_len > 0) {\n\t\t\t// Don't accept a binary op when it is an identifier.\n\t\t\t// Binary ops that start with a identifier-valid character must be followed\n\t\t\t// by a non identifier-part valid character\n\t\t\tif (Jsep.binary_ops.hasOwnProperty(to_check) && (\n\t\t\t\t!Jsep.isIdentifierStart(this.code) ||\n\t\t\t\t(this.index + to_check.length < this.expr.length && !Jsep.isIdentifierPart(this.expr.charCodeAt(this.index + to_check.length)))\n\t\t\t)) {\n\t\t\t\tthis.index += tc_len;\n\t\t\t\treturn to_check;\n\t\t\t}\n\t\t\tto_check = to_check.substr(0, --tc_len);\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * This function is responsible for gobbling an individual expression,\n\t * e.g. `1`, `1+2`, `a+(b*2)-Math.sqrt(2)`\n\t * @returns {?jsep.BinaryExpression}\n\t */\n\tgobbleBinaryExpression() {\n\t\tlet node, biop, prec, stack, biop_info, left, right, i, cur_biop;\n\n\t\t// First, try to get the leftmost thing\n\t\t// Then, check to see if there's a binary operator operating on that leftmost thing\n\t\t// Don't gobbleBinaryOp without a left-hand-side\n\t\tleft = this.gobbleToken();\n\t\tif (!left) {\n\t\t\treturn left;\n\t\t}\n\t\tbiop = this.gobbleBinaryOp();\n\n\t\t// If there wasn't a binary operator, just return the leftmost node\n\t\tif (!biop) {\n\t\t\treturn left;\n\t\t}\n\n\t\t// Otherwise, we need to start a stack to properly place the binary operations in their\n\t\t// precedence structure\n\t\tbiop_info = { value: biop, prec: Jsep.binaryPrecedence(biop), right_a: Jsep.right_associative.has(biop) };\n\n\t\tright = this.gobbleToken();\n\n\t\tif (!right) {\n\t\t\tthis.throwError(\"Expected expression after \" + biop);\n\t\t}\n\n\t\tstack = [left, biop_info, right];\n\n\t\t// Properly deal with precedence using [recursive descent](http://www.engr.mun.ca/~theo/Misc/exp_parsing.htm)\n\t\twhile ((biop = this.gobbleBinaryOp())) {\n\t\t\tprec = Jsep.binaryPrecedence(biop);\n\n\t\t\tif (prec === 0) {\n\t\t\t\tthis.index -= biop.length;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tbiop_info = { value: biop, prec, right_a: Jsep.right_associative.has(biop) };\n\n\t\t\tcur_biop = biop;\n\n\t\t\t// Reduce: make a binary expression from the three topmost entries.\n\t\t\tconst comparePrev = prev => biop_info.right_a && prev.right_a\n\t\t\t\t? prec > prev.prec\n\t\t\t\t: prec <= prev.prec;\n\t\t\twhile ((stack.length > 2) && comparePrev(stack[stack.length - 2])) {\n\t\t\t\tright = stack.pop();\n\t\t\t\tbiop = stack.pop().value;\n\t\t\t\tleft = stack.pop();\n\t\t\t\tnode = {\n\t\t\t\t\ttype: Jsep.BINARY_EXP,\n\t\t\t\t\toperator: biop,\n\t\t\t\t\tleft,\n\t\t\t\t\tright\n\t\t\t\t};\n\t\t\t\tstack.push(node);\n\t\t\t}\n\n\t\t\tnode = this.gobbleToken();\n\n\t\t\tif (!node) {\n\t\t\t\tthis.throwError(\"Expected expression after \" + cur_biop);\n\t\t\t}\n\n\t\t\tstack.push(biop_info, node);\n\t\t}\n\n\t\ti = stack.length - 1;\n\t\tnode = stack[i];\n\n\t\twhile (i > 1) {\n\t\t\tnode = {\n\t\t\t\ttype: Jsep.BINARY_EXP,\n\t\t\t\toperator: stack[i - 1].value,\n\t\t\t\tleft: stack[i - 2],\n\t\t\t\tright: node\n\t\t\t};\n\t\t\ti -= 2;\n\t\t}\n\n\t\treturn node;\n\t}\n\n\t/**\n\t * An individual part of a binary expression:\n\t * e.g. `foo.bar(baz)`, `1`, `\"abc\"`, `(a % 2)` (because it's in parenthesis)\n\t * @returns {boolean|jsep.Expression}\n\t */\n\tgobbleToken() {\n\t\tlet ch, to_check, tc_len, node;\n\n\t\tthis.gobbleSpaces();\n\t\tnode = this.searchHook('gobble-token');\n\t\tif (node) {\n\t\t\treturn this.runHook('after-token', node);\n\t\t}\n\n\t\tch = this.code;\n\n\t\tif (Jsep.isDecimalDigit(ch) || ch === Jsep.PERIOD_CODE) {\n\t\t\t// Char code 46 is a dot `.` which can start off a numeric literal\n\t\t\treturn this.gobbleNumericLiteral();\n\t\t}\n\n\t\tif (ch === Jsep.SQUOTE_CODE || ch === Jsep.DQUOTE_CODE) {\n\t\t\t// Single or double quotes\n\t\t\tnode = this.gobbleStringLiteral();\n\t\t}\n\t\telse if (ch === Jsep.OBRACK_CODE) {\n\t\t\tnode = this.gobbleArray();\n\t\t}\n\t\telse {\n\t\t\tto_check = this.expr.substr(this.index, Jsep.max_unop_len);\n\t\t\ttc_len = to_check.length;\n\n\t\t\twhile (tc_len > 0) {\n\t\t\t\t// Don't accept an unary op when it is an identifier.\n\t\t\t\t// Unary ops that start with a identifier-valid character must be followed\n\t\t\t\t// by a non identifier-part valid character\n\t\t\t\tif (Jsep.unary_ops.hasOwnProperty(to_check) && (\n\t\t\t\t\t!Jsep.isIdentifierStart(this.code) ||\n\t\t\t\t\t(this.index + to_check.length < this.expr.length && !Jsep.isIdentifierPart(this.expr.charCodeAt(this.index + to_check.length)))\n\t\t\t\t)) {\n\t\t\t\t\tthis.index += tc_len;\n\t\t\t\t\tconst argument = this.gobbleToken();\n\t\t\t\t\tif (!argument) {\n\t\t\t\t\t\tthis.throwError('missing unaryOp argument');\n\t\t\t\t\t}\n\t\t\t\t\treturn this.runHook('after-token', {\n\t\t\t\t\t\ttype: Jsep.UNARY_EXP,\n\t\t\t\t\t\toperator: to_check,\n\t\t\t\t\t\targument,\n\t\t\t\t\t\tprefix: true\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tto_check = to_check.substr(0, --tc_len);\n\t\t\t}\n\n\t\t\tif (Jsep.isIdentifierStart(ch)) {\n\t\t\t\tnode = this.gobbleIdentifier();\n\t\t\t\tif (Jsep.literals.hasOwnProperty(node.name)) {\n\t\t\t\t\tnode = {\n\t\t\t\t\t\ttype: Jsep.LITERAL,\n\t\t\t\t\t\tvalue: Jsep.literals[node.name],\n\t\t\t\t\t\traw: node.name,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\telse if (node.name === Jsep.this_str) {\n\t\t\t\t\tnode = { type: Jsep.THIS_EXP };\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ch === Jsep.OPAREN_CODE) { // open parenthesis\n\t\t\t\tnode = this.gobbleGroup();\n\t\t\t}\n\t\t}\n\n\t\tif (!node) {\n\t\t\treturn this.runHook('after-token', false);\n\t\t}\n\n\t\tnode = this.gobbleTokenProperty(node);\n\t\treturn this.runHook('after-token', node);\n\t}\n\n\t/**\n\t * Gobble properties of of identifiers/strings/arrays/groups.\n\t * e.g. `foo`, `bar.baz`, `foo['bar'].baz`\n\t * It also gobbles function calls:\n\t * e.g. `Math.acos(obj.angle)`\n\t * @param {jsep.Expression} node\n\t * @returns {jsep.Expression}\n\t */\n\tgobbleTokenProperty(node) {\n\t\tthis.gobbleSpaces();\n\n\t\tlet ch = this.code;\n\t\twhile (ch === Jsep.PERIOD_CODE || ch === Jsep.OBRACK_CODE || ch === Jsep.OPAREN_CODE || ch === Jsep.QUMARK_CODE) {\n\t\t\tlet optional;\n\t\t\tif (ch === Jsep.QUMARK_CODE) {\n\t\t\t\tif (this.expr.charCodeAt(this.index + 1) !== Jsep.PERIOD_CODE) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\toptional = true;\n\t\t\t\tthis.index += 2;\n\t\t\t\tthis.gobbleSpaces();\n\t\t\t\tch = this.code;\n\t\t\t}\n\t\t\tthis.index++;\n\n\t\t\tif (ch === Jsep.OBRACK_CODE) {\n\t\t\t\tnode = {\n\t\t\t\t\ttype: Jsep.MEMBER_EXP,\n\t\t\t\t\tcomputed: true,\n\t\t\t\t\tobject: node,\n\t\t\t\t\tproperty: this.gobbleExpression()\n\t\t\t\t};\n\t\t\t\tif (!node.property) {\n\t\t\t\t\tthis.throwError('Unexpected \"' + this.char + '\"');\n\t\t\t\t}\n\t\t\t\tthis.gobbleSpaces();\n\t\t\t\tch = this.code;\n\t\t\t\tif (ch !== Jsep.CBRACK_CODE) {\n\t\t\t\t\tthis.throwError('Unclosed [');\n\t\t\t\t}\n\t\t\t\tthis.index++;\n\t\t\t}\n\t\t\telse if (ch === Jsep.OPAREN_CODE) {\n\t\t\t\t// A function call is being made; gobble all the arguments\n\t\t\t\tnode = {\n\t\t\t\t\ttype: Jsep.CALL_EXP,\n\t\t\t\t\t'arguments': this.gobbleArguments(Jsep.CPAREN_CODE),\n\t\t\t\t\tcallee: node\n\t\t\t\t};\n\t\t\t}\n\t\t\telse if (ch === Jsep.PERIOD_CODE || optional) {\n\t\t\t\tif (optional) {\n\t\t\t\t\tthis.index--;\n\t\t\t\t}\n\t\t\t\tthis.gobbleSpaces();\n\t\t\t\tnode = {\n\t\t\t\t\ttype: Jsep.MEMBER_EXP,\n\t\t\t\t\tcomputed: false,\n\t\t\t\t\tobject: node,\n\t\t\t\t\tproperty: this.gobbleIdentifier(),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (optional) {\n\t\t\t\tnode.optional = true;\n\t\t\t} // else leave undefined for compatibility with esprima\n\n\t\t\tthis.gobbleSpaces();\n\t\t\tch = this.code;\n\t\t}\n\n\t\treturn node;\n\t}\n\n\t/**\n\t * Parse simple numeric literals: `12`, `3.4`, `.5`. Do this by using a string to\n\t * keep track of everything in the numeric literal and then calling `parseFloat` on that string\n\t * @returns {jsep.Literal}\n\t */\n\tgobbleNumericLiteral() {\n\t\tlet number = '', ch, chCode;\n\n\t\twhile (Jsep.isDecimalDigit(this.code)) {\n\t\t\tnumber += this.expr.charAt(this.index++);\n\t\t}\n\n\t\tif (this.code === Jsep.PERIOD_CODE) { // can start with a decimal marker\n\t\t\tnumber += this.expr.charAt(this.index++);\n\n\t\t\twhile (Jsep.isDecimalDigit(this.code)) {\n\t\t\t\tnumber += this.expr.charAt(this.index++);\n\t\t\t}\n\t\t}\n\n\t\tch = this.char;\n\n\t\tif (ch === 'e' || ch === 'E') { // exponent marker\n\t\t\tnumber += this.expr.charAt(this.index++);\n\t\t\tch = this.char;\n\n\t\t\tif (ch === '+' || ch === '-') { // exponent sign\n\t\t\t\tnumber += this.expr.charAt(this.index++);\n\t\t\t}\n\n\t\t\twhile (Jsep.isDecimalDigit(this.code)) { // exponent itself\n\t\t\t\tnumber += this.expr.charAt(this.index++);\n\t\t\t}\n\n\t\t\tif (!Jsep.isDecimalDigit(this.expr.charCodeAt(this.index - 1)) ) {\n\t\t\t\tthis.throwError('Expected exponent (' + number + this.char + ')');\n\t\t\t}\n\t\t}\n\n\t\tchCode = this.code;\n\n\t\t// Check to make sure this isn't a variable name that start with a number (123abc)\n\t\tif (Jsep.isIdentifierStart(chCode)) {\n\t\t\tthis.throwError('Variable names cannot start with a number (' +\n\t\t\t\tnumber + this.char + ')');\n\t\t}\n\t\telse if (chCode === Jsep.PERIOD_CODE || (number.length === 1 && number.charCodeAt(0) === Jsep.PERIOD_CODE)) {\n\t\t\tthis.throwError('Unexpected period');\n\t\t}\n\n\t\treturn {\n\t\t\ttype: Jsep.LITERAL,\n\t\t\tvalue: parseFloat(number),\n\t\t\traw: number\n\t\t};\n\t}\n\n\t/**\n\t * Parses a string literal, staring with single or double quotes with basic support for escape codes\n\t * e.g. `\"hello world\"`, `'this is\\nJSEP'`\n\t * @returns {jsep.Literal}\n\t */\n\tgobbleStringLiteral() {\n\t\tlet str = '';\n\t\tconst startIndex = this.index;\n\t\tconst quote = this.expr.charAt(this.index++);\n\t\tlet closed = false;\n\n\t\twhile (this.index < this.expr.length) {\n\t\t\tlet ch = this.expr.charAt(this.index++);\n\n\t\t\tif (ch === quote) {\n\t\t\t\tclosed = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse if (ch === '\\\\') {\n\t\t\t\t// Check for all of the common escape codes\n\t\t\t\tch = this.expr.charAt(this.index++);\n\n\t\t\t\tswitch (ch) {\n\t\t\t\t\tcase 'n': str += '\\n'; break;\n\t\t\t\t\tcase 'r': str += '\\r'; break;\n\t\t\t\t\tcase 't': str += '\\t'; break;\n\t\t\t\t\tcase 'b': str += '\\b'; break;\n\t\t\t\t\tcase 'f': str += '\\f'; break;\n\t\t\t\t\tcase 'v': str += '\\x0B'; break;\n\t\t\t\t\tdefault : str += ch;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tstr += ch;\n\t\t\t}\n\t\t}\n\n\t\tif (!closed) {\n\t\t\tthis.throwError('Unclosed quote after \"' + str + '\"');\n\t\t}\n\n\t\treturn {\n\t\t\ttype: Jsep.LITERAL,\n\t\t\tvalue: str,\n\t\t\traw: this.expr.substring(startIndex, this.index),\n\t\t};\n\t}\n\n\t/**\n\t * Gobbles only identifiers\n\t * e.g.: `foo`, `_value`, `$x1`\n\t * Also, this function checks if that identifier is a literal:\n\t * (e.g. `true`, `false`, `null`) or `this`\n\t * @returns {jsep.Identifier}\n\t */\n\tgobbleIdentifier() {\n\t\tlet ch = this.code, start = this.index;\n\n\t\tif (Jsep.isIdentifierStart(ch)) {\n\t\t\tthis.index++;\n\t\t}\n\t\telse {\n\t\t\tthis.throwError('Unexpected ' + this.char);\n\t\t}\n\n\t\twhile (this.index < this.expr.length) {\n\t\t\tch = this.code;\n\n\t\t\tif (Jsep.isIdentifierPart(ch)) {\n\t\t\t\tthis.index++;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\ttype: Jsep.IDENTIFIER,\n\t\t\tname: this.expr.slice(start, this.index),\n\t\t};\n\t}\n\n\t/**\n\t * Gobbles a list of arguments within the context of a function call\n\t * or array literal. This function also assumes that the opening character\n\t * `(` or `[` has already been gobbled, and gobbles expressions and commas\n\t * until the terminator character `)` or `]` is encountered.\n\t * e.g. `foo(bar, baz)`, `my_func()`, or `[bar, baz]`\n\t * @param {number} termination\n\t * @returns {jsep.Expression[]}\n\t */\n\tgobbleArguments(termination) {\n\t\tconst args = [];\n\t\tlet closed = false;\n\t\tlet separator_count = 0;\n\n\t\twhile (this.index < this.expr.length) {\n\t\t\tthis.gobbleSpaces();\n\t\t\tlet ch_i = this.code;\n\n\t\t\tif (ch_i === termination) { // done parsing\n\t\t\t\tclosed = true;\n\t\t\t\tthis.index++;\n\n\t\t\t\tif (termination === Jsep.CPAREN_CODE && separator_count && separator_count >= args.length){\n\t\t\t\t\tthis.throwError('Unexpected token ' + String.fromCharCode(termination));\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse if (ch_i === Jsep.COMMA_CODE) { // between expressions\n\t\t\t\tthis.index++;\n\t\t\t\tseparator_count++;\n\n\t\t\t\tif (separator_count !== args.length) { // missing argument\n\t\t\t\t\tif (termination === Jsep.CPAREN_CODE) {\n\t\t\t\t\t\tthis.throwError('Unexpected token ,');\n\t\t\t\t\t}\n\t\t\t\t\telse if (termination === Jsep.CBRACK_CODE) {\n\t\t\t\t\t\tfor (let arg = args.length; arg < separator_count; arg++) {\n\t\t\t\t\t\t\targs.push(null);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (args.length !== separator_count && separator_count !== 0) {\n\t\t\t\t// NOTE: `&& separator_count !== 0` allows for either all commas, or all spaces as arguments\n\t\t\t\tthis.throwError('Expected comma');\n\t\t\t}\n\t\t\telse {\n\t\t\t\tconst node = this.gobbleExpression();\n\n\t\t\t\tif (!node || node.type === Jsep.COMPOUND) {\n\t\t\t\t\tthis.throwError('Expected comma');\n\t\t\t\t}\n\n\t\t\t\targs.push(node);\n\t\t\t}\n\t\t}\n\n\t\tif (!closed) {\n\t\t\tthis.throwError('Expected ' + String.fromCharCode(termination));\n\t\t}\n\n\t\treturn args;\n\t}\n\n\t/**\n\t * Responsible for parsing a group of things within parentheses `()`\n\t * that have no identifier in front (so not a function call)\n\t * This function assumes that it needs to gobble the opening parenthesis\n\t * and then tries to gobble everything within that parenthesis, assuming\n\t * that the next thing it should see is the close parenthesis. If not,\n\t * then the expression probably doesn't have a `)`\n\t * @returns {boolean|jsep.Expression}\n\t */\n\tgobbleGroup() {\n\t\tthis.index++;\n\t\tlet nodes = this.gobbleExpressions(Jsep.CPAREN_CODE);\n\t\tif (this.code === Jsep.CPAREN_CODE) {\n\t\t\tthis.index++;\n\t\t\tif (nodes.length === 1) {\n\t\t\t\treturn nodes[0];\n\t\t\t}\n\t\t\telse if (!nodes.length) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn {\n\t\t\t\t\ttype: Jsep.SEQUENCE_EXP,\n\t\t\t\t\texpressions: nodes,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tthis.throwError('Unclosed (');\n\t\t}\n\t}\n\n\t/**\n\t * Responsible for parsing Array literals `[1, 2, 3]`\n\t * This function assumes that it needs to gobble the opening bracket\n\t * and then tries to gobble the expressions as arguments.\n\t * @returns {jsep.ArrayExpression}\n\t */\n\tgobbleArray() {\n\t\tthis.index++;\n\n\t\treturn {\n\t\t\ttype: Jsep.ARRAY_EXP,\n\t\t\telements: this.gobbleArguments(Jsep.CBRACK_CODE)\n\t\t};\n\t}\n}\n\n// Static fields:\nconst hooks = new Hooks();\nObject.assign(Jsep, {\n\thooks,\n\tplugins: new Plugins(Jsep),\n\n\t// Node Types\n\t// ----------\n\t// This is the full set of types that any JSEP node can be.\n\t// Store them here to save space when minified\n\tCOMPOUND: 'Compound',\n\tSEQUENCE_EXP: 'SequenceExpression',\n\tIDENTIFIER: 'Identifier',\n\tMEMBER_EXP: 'MemberExpression',\n\tLITERAL: 'Literal',\n\tTHIS_EXP: 'ThisExpression',\n\tCALL_EXP: 'CallExpression',\n\tUNARY_EXP: 'UnaryExpression',\n\tBINARY_EXP: 'BinaryExpression',\n\tARRAY_EXP: 'ArrayExpression',\n\n\tTAB_CODE: 9,\n\tLF_CODE: 10,\n\tCR_CODE: 13,\n\tSPACE_CODE: 32,\n\tPERIOD_CODE: 46, // '.'\n\tCOMMA_CODE: 44, // ','\n\tSQUOTE_CODE: 39, // single quote\n\tDQUOTE_CODE: 34, // double quotes\n\tOPAREN_CODE: 40, // (\n\tCPAREN_CODE: 41, // )\n\tOBRACK_CODE: 91, // [\n\tCBRACK_CODE: 93, // ]\n\tQUMARK_CODE: 63, // ?\n\tSEMCOL_CODE: 59, // ;\n\tCOLON_CODE: 58, // :\n\n\n\t// Operations\n\t// ----------\n\t// Use a quickly-accessible map to store all of the unary operators\n\t// Values are set to `1` (it really doesn't matter)\n\tunary_ops: {\n\t\t'-': 1,\n\t\t'!': 1,\n\t\t'~': 1,\n\t\t'+': 1\n\t},\n\n\t// Also use a map for the binary operations but set their values to their\n\t// binary precedence for quick reference (higher number = higher precedence)\n\t// see [Order of operations](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence)\n\tbinary_ops: {\n\t\t'||': 1, '??': 1,\n\t\t'&&': 2, '|': 3, '^': 4, '&': 5,\n\t\t'==': 6, '!=': 6, '===': 6, '!==': 6,\n\t\t'<': 7, '>': 7, '<=': 7, '>=': 7,\n\t\t'<<': 8, '>>': 8, '>>>': 8,\n\t\t'+': 9, '-': 9,\n\t\t'*': 10, '/': 10, '%': 10,\n\t\t'**': 11,\n\t},\n\n\t// sets specific binary_ops as right-associative\n\tright_associative: new Set(['**']),\n\n\t// Additional valid identifier chars, apart from a-z, A-Z and 0-9 (except on the starting char)\n\tadditional_identifier_chars: new Set(['$', '_']),\n\n\t// Literals\n\t// ----------\n\t// Store the values to return for the various literals we may encounter\n\tliterals: {\n\t\t'true': true,\n\t\t'false': false,\n\t\t'null': null\n\t},\n\n\t// Except for `this`, which is special. This could be changed to something like `'self'` as well\n\tthis_str: 'this',\n});\nJsep.max_unop_len = Jsep.getMaxKeyLen(Jsep.unary_ops);\nJsep.max_binop_len = Jsep.getMaxKeyLen(Jsep.binary_ops);\n\n// Backward Compatibility:\nconst jsep = expr => (new Jsep(expr)).parse();\nconst stdClassProps = Object.getOwnPropertyNames(class Test{});\nObject.getOwnPropertyNames(Jsep)\n\t.filter(prop => !stdClassProps.includes(prop) && jsep[prop] === undefined)\n\t.forEach((m) => {\n\t\tjsep[m] = Jsep[m];\n\t});\njsep.Jsep = Jsep; // allows for const { Jsep } = require('jsep');\nexport default jsep;\n\n","/**\n * @implements {IHooks}\n */\nexport default class Hooks {\n\t/**\n\t * @callback HookCallback\n\t * @this {*|Jsep} this\n\t * @param {Jsep} env\n\t * @returns: void\n\t */\n\t/**\n\t * Adds the given callback to the list of callbacks for the given hook.\n\t *\n\t * The callback will be invoked when the hook it is registered for is run.\n\t *\n\t * One callback function can be registered to multiple hooks and the same hook multiple times.\n\t *\n\t * @param {string|object} name The name of the hook, or an object of callbacks keyed by name\n\t * @param {HookCallback|boolean} callback The callback function which is given environment variables.\n\t * @param {?boolean} [first=false] Will add the hook to the top of the list (defaults to the bottom)\n\t * @public\n\t */\n\tadd(name, callback, first) {\n\t\tif (typeof arguments[0] != 'string') {\n\t\t\t// Multiple hook callbacks, keyed by name\n\t\t\tfor (let name in arguments[0]) {\n\t\t\t\tthis.add(name, arguments[0][name], arguments[1]);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\t(Array.isArray(name) ? name : [name]).forEach(function (name) {\n\t\t\t\tthis[name] = this[name] || [];\n\n\t\t\t\tif (callback) {\n\t\t\t\t\tthis[name][first ? 'unshift' : 'push'](callback);\n\t\t\t\t}\n\t\t\t}, this);\n\t\t}\n\t}\n\n\t/**\n\t * Runs a hook invoking all registered callbacks with the given environment variables.\n\t *\n\t * Callbacks will be invoked synchronously and in the order in which they were registered.\n\t *\n\t * @param {string} name The name of the hook.\n\t * @param {Object} env The environment variables of the hook passed to all callbacks registered.\n\t * @public\n\t */\n\trun(name, env) {\n\t\tthis[name] = this[name] || [];\n\t\tthis[name].forEach(function (callback) {\n\t\t\tcallback.call(env && env.context ? env.context : env, env);\n\t\t});\n\t}\n}\n","/**\n * @implements {IPlugins}\n */\nexport default class Plugins {\n\tconstructor(jsep) {\n\t\tthis.jsep = jsep;\n\t\tthis.registered = {};\n\t}\n\n\t/**\n\t * @callback PluginSetup\n\t * @this {Jsep} jsep\n\t * @returns: void\n\t */\n\t/**\n\t * Adds the given plugin(s) to the registry\n\t *\n\t * @param {object} plugins\n\t * @param {string} plugins.name The name of the plugin\n\t * @param {PluginSetup} plugins.init The init function\n\t * @public\n\t */\n\tregister(...plugins) {\n\t\tplugins.forEach((plugin) => {\n\t\t\tif (typeof plugin !== 'object' || !plugin.name || !plugin.init) {\n\t\t\t\tthrow new Error('Invalid JSEP plugin format');\n\t\t\t}\n\t\t\tif (this.registered[plugin.name]) {\n\t\t\t\t// already registered. Ignore.\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tplugin.init(this.jsep);\n\t\t\tthis.registered[plugin.name] = plugin;\n\t\t});\n\t}\n}\n","const CONDITIONAL_EXP = 'ConditionalExpression';\n\nexport default {\n\tname: 'ternary',\n\n\tinit(jsep) {\n\t\t// Ternary expression: test ? consequent : alternate\n\t\tjsep.hooks.add('after-expression', function gobbleTernary(env) {\n\t\t\tif (env.node && this.code === jsep.QUMARK_CODE) {\n\t\t\t\tthis.index++;\n\t\t\t\tconst test = env.node;\n\t\t\t\tconst consequent = this.gobbleExpression();\n\n\t\t\t\tif (!consequent) {\n\t\t\t\t\tthis.throwError('Expected expression');\n\t\t\t\t}\n\n\t\t\t\tthis.gobbleSpaces();\n\n\t\t\t\tif (this.code === jsep.COLON_CODE) {\n\t\t\t\t\tthis.index++;\n\t\t\t\t\tconst alternate = this.gobbleExpression();\n\n\t\t\t\t\tif (!alternate) {\n\t\t\t\t\t\tthis.throwError('Expected expression');\n\t\t\t\t\t}\n\t\t\t\t\tenv.node = {\n\t\t\t\t\t\ttype: CONDITIONAL_EXP,\n\t\t\t\t\t\ttest,\n\t\t\t\t\t\tconsequent,\n\t\t\t\t\t\talternate,\n\t\t\t\t\t};\n\n\t\t\t\t\t// check for operators of higher priority than ternary (i.e. assignment)\n\t\t\t\t\t// jsep sets || at 1, and assignment at 0.9, and conditional should be between them\n\t\t\t\t\tif (test.operator && jsep.binary_ops[test.operator] <= 0.9) {\n\t\t\t\t\t\tlet newTest = test;\n\t\t\t\t\t\twhile (newTest.right.operator && jsep.binary_ops[newTest.right.operator] <= 0.9) {\n\t\t\t\t\t\t\tnewTest = newTest.right;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tenv.node.test = newTest.right;\n\t\t\t\t\t\tnewTest.right = env.node;\n\t\t\t\t\t\tenv.node = test;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.throwError('Expected :');\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n};\n","// Add default plugins:\nimport jsep from './jsep.js';\nimport ternary from '../packages/ternary/src/index.js';\n\njsep.plugins.register(ternary);\n\nexport * from './jsep.js';\nexport default jsep;\n"],"names":["version","toString","Jsep","addUnaryOp","op_name","max_unop_len","Math","max","length","unary_ops","addBinaryOp","precedence","isRightAssociative","max_binop_len","binary_ops","right_associative","add","delete","addIdentifierChar","char","additional_identifier_chars","addLiteral","literal_name","literal_value","literals","removeUnaryOp","getMaxKeyLen","removeAllUnaryOps","removeIdentifierChar","removeBinaryOp","removeAllBinaryOps","removeLiteral","removeAllLiterals","this","expr","charAt","index","code","charCodeAt","constructor","parse","obj","Object","keys","map","k","isDecimalDigit","ch","binaryPrecedence","op_val","isIdentifierStart","String","fromCharCode","has","isIdentifierPart","throwError","message","error","Error","description","runHook","name","node","hooks","env","context","run","searchHook","find","callback","call","gobbleSpaces","SPACE_CODE","TAB_CODE","LF_CODE","CR_CODE","nodes","gobbleExpressions","type","COMPOUND","body","untilICode","ch_i","SEMCOL_CODE","COMMA_CODE","gobbleExpression","push","gobbleBinaryExpression","gobbleBinaryOp","to_check","substr","tc_len","hasOwnProperty","biop","prec","stack","biop_info","left","right","i","cur_biop","gobbleToken","value","right_a","comparePrev","prev","pop","BINARY_EXP","operator","PERIOD_CODE","gobbleNumericLiteral","SQUOTE_CODE","DQUOTE_CODE","gobbleStringLiteral","OBRACK_CODE","gobbleArray","argument","UNARY_EXP","prefix","gobbleIdentifier","LITERAL","raw","this_str","THIS_EXP","OPAREN_CODE","gobbleGroup","gobbleTokenProperty","QUMARK_CODE","optional","MEMBER_EXP","computed","object","property","CBRACK_CODE","CALL_EXP","arguments","gobbleArguments","CPAREN_CODE","callee","chCode","number","parseFloat","str","startIndex","quote","closed","substring","start","IDENTIFIER","slice","termination","args","separator_count","arg","SEQUENCE_EXP","expressions","ARRAY_EXP","elements","first","Array","isArray","forEach","assign","plugins","jsep","registered","register","plugin","init","COLON_CODE","Set","true","false","null","stdClassProps","getOwnPropertyNames","filter","prop","includes","undefined","m","test","consequent","alternate","newTest","ternary"],"mappings":"iCAMA,QAICA,qBAEC,MAAO,QAMRC,kBACC,MAAO,wCAA0CC,EAAKF,QASvDG,kBAAkBC,GAGjB,OAFAF,EAAKG,aAAeC,KAAKC,IAAIH,EAAQI,OAAQN,EAAKG,cAClDH,EAAKO,UAAUL,GAAW,EACnBF,EAURQ,mBAAmBN,EAASO,EAAYC,GASvC,OARAV,EAAKW,cAAgBP,KAAKC,IAAIH,EAAQI,OAAQN,EAAKW,eACnDX,EAAKY,WAAWV,GAAWO,EACvBC,EACHV,EAAKa,kBAAkBC,IAAIZ,GAG3BF,EAAKa,kBAAkBE,OAAOb,GAExBF,EAQRgB,yBAAyBC,GAExB,OADAjB,EAAKkB,4BAA4BJ,IAAIG,GAC9BjB,EASRmB,kBAAkBC,EAAcC,GAE/B,OADArB,EAAKsB,SAASF,GAAgBC,EACvBrB,EAQRuB,qBAAqBrB,GAKpB,cAJOF,EAAKO,UAAUL,GAClBA,EAAQI,SAAWN,EAAKG,eAC3BH,EAAKG,aAAeH,EAAKwB,aAAaxB,EAAKO,YAErCP,EAORyB,2BAIC,OAHAzB,EAAKO,UAAY,GACjBP,EAAKG,aAAe,EAEbH,EAQR0B,4BAA4BT,GAE3B,OADAjB,EAAKkB,4BAA4BH,OAAOE,GACjCjB,EAQR2B,sBAAsBzB,GAQrB,cAPOF,EAAKY,WAAWV,GAEnBA,EAAQI,SAAWN,EAAKW,gBAC3BX,EAAKW,cAAgBX,EAAKwB,aAAaxB,EAAKY,aAE7CZ,EAAKa,kBAAkBE,OAAOb,GAEvBF,EAOR4B,4BAIC,OAHA5B,EAAKY,WAAa,GAClBZ,EAAKW,cAAgB,EAEdX,EAQR6B,qBAAqBT,GAEpB,cADOpB,EAAKsB,SAASF,GACdpB,EAOR8B,2BAGC,OAFA9B,EAAKsB,SAAW,GAETtB,EAQRiB,WACC,OAAOc,KAAKC,KAAKC,OAAOF,KAAKG,OAM9BC,WACC,OAAOJ,KAAKC,KAAKI,WAAWL,KAAKG,OAQlCG,YAAYL,GAGXD,KAAKC,KAAOA,EACZD,KAAKG,MAAQ,EAOdI,aAAaN,GACZ,OAAO,IAAKhC,EAAKgC,GAAOM,QAQzBd,oBAAoBe,GACnB,OAAOnC,KAAKC,IAAI,KAAMmC,OAAOC,KAAKF,GAAKG,KAAIC,GAAKA,EAAErC,UAQnDsC,sBAAsBC,GACrB,OAAQA,GAAM,IAAMA,GAAM,GAQ3BC,wBAAwBC,GACvB,OAAO/C,EAAKY,WAAWmC,IAAW,EAQnCC,yBAAyBH,GACxB,OAASA,GAAM,IAAMA,GAAM,IACzBA,GAAM,IAAMA,GAAM,KAClBA,GAAM,MAAQ7C,EAAKY,WAAWqC,OAAOC,aAAaL,KAClD7C,EAAKkB,4BAA4BiC,IAAIF,OAAOC,aAAaL,IAO5DO,wBAAwBP,GACvB,OAAO7C,EAAKgD,kBAAkBH,IAAO7C,EAAK4C,eAAeC,GAQ1DQ,WAAWC,GACV,MAAMC,EAAQ,IAAIC,MAAMF,EAAU,iBAAmBvB,KAAKG,OAG1D,MAFAqB,EAAMrB,MAAQH,KAAKG,MACnBqB,EAAME,YAAcH,EACdC,EASPG,QAAQC,EAAMC,GACb,GAAI5D,EAAK6D,MAAMF,GAAO,CACrB,MAAMG,EAAM,CAAEC,QAAShC,KAAM6B,KAAAA,GAE7B,OADA5D,EAAK6D,MAAMG,IAAIL,EAAMG,GACdA,EAAIF,KAEZ,OAAOA,EAQRK,WAAWN,GACV,GAAI3D,EAAK6D,MAAMF,GAAO,CACrB,MAAMG,EAAM,CAAEC,QAAShC,MAKvB,OAJA/B,EAAK6D,MAAMF,GAAMO,MAAK,SAAUC,GAE/B,OADAA,EAASC,KAAKN,EAAIC,QAASD,GACpBA,EAAIF,QAELE,EAAIF,MAObS,eACC,IAAIxB,EAAKd,KAAKI,KAEd,KAAOU,IAAO7C,EAAKsE,YAChBzB,IAAO7C,EAAKuE,UACZ1B,IAAO7C,EAAKwE,SACZ3B,IAAO7C,EAAKyE,SACd5B,EAAKd,KAAKC,KAAKI,aAAaL,KAAKG,OAElCH,KAAK2B,QAAQ,iBAOdpB,QACCP,KAAK2B,QAAQ,cACb,MAAMgB,EAAQ3C,KAAK4C,oBAGbf,EAAwB,IAAjBc,EAAMpE,OACfoE,EAAM,GACP,CACDE,KAAM5E,EAAK6E,SACXC,KAAMJ,GAER,OAAO3C,KAAK2B,QAAQ,YAAaE,GAQlCe,kBAAkBI,GACjB,IAAgBC,EAAMpB,EAAlBc,EAAQ,GAEZ,KAAO3C,KAAKG,MAAQH,KAAKC,KAAK1B,QAK7B,GAJA0E,EAAOjD,KAAKI,KAIR6C,IAAShF,EAAKiF,aAAeD,IAAShF,EAAKkF,WAC9CnD,KAAKG,aAIL,GAAI0B,EAAO7B,KAAKoD,mBACfT,EAAMU,KAAKxB,QAIP,GAAI7B,KAAKG,MAAQH,KAAKC,KAAK1B,OAAQ,CACvC,GAAI0E,IAASD,EACZ,MAEDhD,KAAKsB,WAAW,eAAiBtB,KAAKd,KAAO,KAKhD,OAAOyD,EAORS,mBACC,MAAMvB,EAAO7B,KAAKkC,WAAW,sBAAwBlC,KAAKsD,yBAG1D,OAFAtD,KAAKsC,eAEEtC,KAAK2B,QAAQ,mBAAoBE,GAUzC0B,iBACCvD,KAAKsC,eACL,IAAIkB,EAAWxD,KAAKC,KAAKwD,OAAOzD,KAAKG,MAAOlC,EAAKW,eAC7C8E,EAASF,EAASjF,OAEtB,KAAOmF,EAAS,GAAG,CAIlB,GAAIzF,EAAKY,WAAW8E,eAAeH,MACjCvF,EAAKgD,kBAAkBjB,KAAKI,OAC5BJ,KAAKG,MAAQqD,EAASjF,OAASyB,KAAKC,KAAK1B,SAAWN,EAAKoD,iBAAiBrB,KAAKC,KAAKI,WAAWL,KAAKG,MAAQqD,EAASjF,UAGtH,OADAyB,KAAKG,OAASuD,EACPF,EAERA,EAAWA,EAASC,OAAO,IAAKC,GAEjC,OAAO,EAQRJ,yBACC,IAAIzB,EAAM+B,EAAMC,EAAMC,EAAOC,EAAWC,EAAMC,EAAOC,EAAGC,EAMxD,GADAH,EAAOhE,KAAKoE,eACPJ,EACJ,OAAOA,EAKR,GAHAJ,EAAO5D,KAAKuD,kBAGPK,EACJ,OAAOI,EAgBR,IAXAD,EAAY,CAAEM,MAAOT,EAAMC,KAAM5F,EAAK8C,iBAAiB6C,GAAOU,QAASrG,EAAKa,kBAAkBsC,IAAIwC,IAElGK,EAAQjE,KAAKoE,cAERH,GACJjE,KAAKsB,WAAW,6BAA+BsC,GAGhDE,EAAQ,CAACE,EAAMD,EAAWE,GAGlBL,EAAO5D,KAAKuD,kBAAmB,CAGtC,GAFAM,EAAO5F,EAAK8C,iBAAiB6C,GAEhB,IAATC,EAAY,CACf7D,KAAKG,OAASyD,EAAKrF,OACnB,MAGDwF,EAAY,CAAEM,MAAOT,EAAMC,KAAAA,EAAMS,QAASrG,EAAKa,kBAAkBsC,IAAIwC,IAErEO,EAAWP,EAGX,MAAMW,EAAcC,GAAQT,EAAUO,SAAWE,EAAKF,QACnDT,EAAOW,EAAKX,KACZA,GAAQW,EAAKX,KAChB,KAAQC,EAAMvF,OAAS,GAAMgG,EAAYT,EAAMA,EAAMvF,OAAS,KAC7D0F,EAAQH,EAAMW,MACdb,EAAOE,EAAMW,MAAMJ,MACnBL,EAAOF,EAAMW,MACb5C,EAAO,CACNgB,KAAM5E,EAAKyG,WACXC,SAAUf,EACVI,KAAAA,EACAC,MAAAA,GAEDH,EAAMT,KAAKxB,GAGZA,EAAO7B,KAAKoE,cAEPvC,GACJ7B,KAAKsB,WAAW,6BAA+B6C,GAGhDL,EAAMT,KAAKU,EAAWlC,GAMvB,IAHAqC,EAAIJ,EAAMvF,OAAS,EACnBsD,EAAOiC,EAAMI,GAENA,EAAI,GACVrC,EAAO,CACNgB,KAAM5E,EAAKyG,WACXC,SAAUb,EAAMI,EAAI,GAAGG,MACvBL,KAAMF,EAAMI,EAAI,GAChBD,MAAOpC,GAERqC,GAAK,EAGN,OAAOrC,EAQRuC,cACC,IAAItD,EAAI0C,EAAUE,EAAQ7B,EAI1B,GAFA7B,KAAKsC,eACLT,EAAO7B,KAAKkC,WAAW,gBACnBL,EACH,OAAO7B,KAAK2B,QAAQ,cAAeE,GAKpC,GAFAf,EAAKd,KAAKI,KAENnC,EAAK4C,eAAeC,IAAOA,IAAO7C,EAAK2G,YAE1C,OAAO5E,KAAK6E,uBAGb,GAAI/D,IAAO7C,EAAK6G,aAAehE,IAAO7C,EAAK8G,YAE1ClD,EAAO7B,KAAKgF,2BAER,GAAIlE,IAAO7C,EAAKgH,YACpBpD,EAAO7B,KAAKkF,kBAER,CAIJ,IAHA1B,EAAWxD,KAAKC,KAAKwD,OAAOzD,KAAKG,MAAOlC,EAAKG,cAC7CsF,EAASF,EAASjF,OAEXmF,EAAS,GAAG,CAIlB,GAAIzF,EAAKO,UAAUmF,eAAeH,MAChCvF,EAAKgD,kBAAkBjB,KAAKI,OAC5BJ,KAAKG,MAAQqD,EAASjF,OAASyB,KAAKC,KAAK1B,SAAWN,EAAKoD,iBAAiBrB,KAAKC,KAAKI,WAAWL,KAAKG,MAAQqD,EAASjF,UACpH,CACFyB,KAAKG,OAASuD,EACd,MAAMyB,EAAWnF,KAAKoE,cAItB,OAHKe,GACJnF,KAAKsB,WAAW,4BAEVtB,KAAK2B,QAAQ,cAAe,CAClCkB,KAAM5E,EAAKmH,UACXT,SAAUnB,EACV2B,SAAAA,EACAE,QAAQ,IAIV7B,EAAWA,EAASC,OAAO,IAAKC,GAG7BzF,EAAKgD,kBAAkBH,IAC1Be,EAAO7B,KAAKsF,mBACRrH,EAAKsB,SAASoE,eAAe9B,EAAKD,MACrCC,EAAO,CACNgB,KAAM5E,EAAKsH,QACXlB,MAAOpG,EAAKsB,SAASsC,EAAKD,MAC1B4D,IAAK3D,EAAKD,MAGHC,EAAKD,OAAS3D,EAAKwH,WAC3B5D,EAAO,CAAEgB,KAAM5E,EAAKyH,YAGb5E,IAAO7C,EAAK0H,cACpB9D,EAAO7B,KAAK4F,eAId,OAAK/D,GAILA,EAAO7B,KAAK6F,oBAAoBhE,GACzB7B,KAAK2B,QAAQ,cAAeE,IAJ3B7B,KAAK2B,QAAQ,eAAe,GAerCkE,oBAAoBhE,GACnB7B,KAAKsC,eAEL,IAAIxB,EAAKd,KAAKI,KACd,KAAOU,IAAO7C,EAAK2G,aAAe9D,IAAO7C,EAAKgH,aAAenE,IAAO7C,EAAK0H,aAAe7E,IAAO7C,EAAK6H,aAAa,CAChH,IAAIC,EACJ,GAAIjF,IAAO7C,EAAK6H,YAAa,CAC5B,GAAI9F,KAAKC,KAAKI,WAAWL,KAAKG,MAAQ,KAAOlC,EAAK2G,YACjD,MAEDmB,GAAW,EACX/F,KAAKG,OAAS,EACdH,KAAKsC,eACLxB,EAAKd,KAAKI,KAEXJ,KAAKG,QAEDW,IAAO7C,EAAKgH,cACfpD,EAAO,CACNgB,KAAM5E,EAAK+H,WACXC,UAAU,EACVC,OAAQrE,EACRsE,SAAUnG,KAAKoD,qBAEN+C,UACTnG,KAAKsB,WAAW,eAAiBtB,KAAKd,KAAO,KAE9Cc,KAAKsC,eACLxB,EAAKd,KAAKI,KACNU,IAAO7C,EAAKmI,aACfpG,KAAKsB,WAAW,cAEjBtB,KAAKG,SAEGW,IAAO7C,EAAK0H,YAEpB9D,EAAO,CACNgB,KAAM5E,EAAKoI,SACXC,UAAatG,KAAKuG,gBAAgBtI,EAAKuI,aACvCC,OAAQ5E,IAGDf,IAAO7C,EAAK2G,aAAemB,KAC/BA,GACH/F,KAAKG,QAENH,KAAKsC,eACLT,EAAO,CACNgB,KAAM5E,EAAK+H,WACXC,UAAU,EACVC,OAAQrE,EACRsE,SAAUnG,KAAKsF,qBAIbS,IACHlE,EAAKkE,UAAW,GAGjB/F,KAAKsC,eACLxB,EAAKd,KAAKI,KAGX,OAAOyB,EAQRgD,uBACC,IAAiB/D,EAAI4F,EAAjBC,EAAS,GAEb,KAAO1I,EAAK4C,eAAeb,KAAKI,OAC/BuG,GAAU3G,KAAKC,KAAKC,OAAOF,KAAKG,SAGjC,GAAIH,KAAKI,OAASnC,EAAK2G,YAGtB,IAFA+B,GAAU3G,KAAKC,KAAKC,OAAOF,KAAKG,SAEzBlC,EAAK4C,eAAeb,KAAKI,OAC/BuG,GAAU3G,KAAKC,KAAKC,OAAOF,KAAKG,SAMlC,GAFAW,EAAKd,KAAKd,KAEC,MAAP4B,GAAqB,MAAPA,EAAY,CAQ7B,IAPA6F,GAAU3G,KAAKC,KAAKC,OAAOF,KAAKG,SAChCW,EAAKd,KAAKd,KAEC,MAAP4B,GAAqB,MAAPA,IACjB6F,GAAU3G,KAAKC,KAAKC,OAAOF,KAAKG,UAG1BlC,EAAK4C,eAAeb,KAAKI,OAC/BuG,GAAU3G,KAAKC,KAAKC,OAAOF,KAAKG,SAG5BlC,EAAK4C,eAAeb,KAAKC,KAAKI,WAAWL,KAAKG,MAAQ,KAC1DH,KAAKsB,WAAW,sBAAwBqF,EAAS3G,KAAKd,KAAO,KAe/D,OAXAwH,EAAS1G,KAAKI,KAGVnC,EAAKgD,kBAAkByF,GAC1B1G,KAAKsB,WAAW,8CACfqF,EAAS3G,KAAKd,KAAO,MAEdwH,IAAWzI,EAAK2G,aAAkC,IAAlB+B,EAAOpI,QAAgBoI,EAAOtG,WAAW,KAAOpC,EAAK2G,cAC7F5E,KAAKsB,WAAW,qBAGV,CACNuB,KAAM5E,EAAKsH,QACXlB,MAAOuC,WAAWD,GAClBnB,IAAKmB,GASP3B,sBACC,IAAI6B,EAAM,GACV,MAAMC,EAAa9G,KAAKG,MAClB4G,EAAQ/G,KAAKC,KAAKC,OAAOF,KAAKG,SACpC,IAAI6G,GAAS,EAEb,KAAOhH,KAAKG,MAAQH,KAAKC,KAAK1B,QAAQ,CACrC,IAAIuC,EAAKd,KAAKC,KAAKC,OAAOF,KAAKG,SAE/B,GAAIW,IAAOiG,EAAO,CACjBC,GAAS,EACT,MAEI,GAAW,OAAPlG,EAIR,OAFAA,EAAKd,KAAKC,KAAKC,OAAOF,KAAKG,SAEnBW,GACP,IAAK,IAAK+F,GAAO,KAAM,MACvB,IAAK,IAAKA,GAAO,KAAM,MACvB,IAAK,IAAKA,GAAO,KAAM,MACvB,IAAK,IAAKA,GAAO,KAAM,MACvB,IAAK,IAAKA,GAAO,KAAM,MACvB,IAAK,IAAKA,GAAO,KAAQ,MACzB,QAAUA,GAAO/F,OAIlB+F,GAAO/F,EAQT,OAJKkG,GACJhH,KAAKsB,WAAW,yBAA2BuF,EAAM,KAG3C,CACNhE,KAAM5E,EAAKsH,QACXlB,MAAOwC,EACPrB,IAAKxF,KAAKC,KAAKgH,UAAUH,EAAY9G,KAAKG,QAW5CmF,mBACC,IAAIxE,EAAKd,KAAKI,KAAM8G,EAAQlH,KAAKG,MASjC,IAPIlC,EAAKgD,kBAAkBH,GAC1Bd,KAAKG,QAGLH,KAAKsB,WAAW,cAAgBtB,KAAKd,MAG/Bc,KAAKG,MAAQH,KAAKC,KAAK1B,SAC7BuC,EAAKd,KAAKI,KAENnC,EAAKoD,iBAAiBP,KACzBd,KAAKG,QAMP,MAAO,CACN0C,KAAM5E,EAAKkJ,WACXvF,KAAM5B,KAAKC,KAAKmH,MAAMF,EAAOlH,KAAKG,QAapCoG,gBAAgBc,GACf,MAAMC,EAAO,GACb,IAAIN,GAAS,EACTO,EAAkB,EAEtB,KAAOvH,KAAKG,MAAQH,KAAKC,KAAK1B,QAAQ,CACrCyB,KAAKsC,eACL,IAAIW,EAAOjD,KAAKI,KAEhB,GAAI6C,IAASoE,EAAa,CACzBL,GAAS,EACThH,KAAKG,QAEDkH,IAAgBpJ,EAAKuI,aAAee,GAAmBA,GAAmBD,EAAK/I,QAClFyB,KAAKsB,WAAW,oBAAsBJ,OAAOC,aAAakG,IAG3D,MAEI,GAAIpE,IAAShF,EAAKkF,YAItB,GAHAnD,KAAKG,QACLoH,IAEIA,IAAoBD,EAAK/I,OAC5B,GAAI8I,IAAgBpJ,EAAKuI,YACxBxG,KAAKsB,WAAW,2BAEZ,GAAI+F,IAAgBpJ,EAAKmI,YAC7B,IAAK,IAAIoB,EAAMF,EAAK/I,OAAQiJ,EAAMD,EAAiBC,IAClDF,EAAKjE,KAAK,WAKT,GAAIiE,EAAK/I,SAAWgJ,GAAuC,IAApBA,EAE3CvH,KAAKsB,WAAW,sBAEZ,CACJ,MAAMO,EAAO7B,KAAKoD,mBAEbvB,GAAQA,EAAKgB,OAAS5E,EAAK6E,UAC/B9C,KAAKsB,WAAW,kBAGjBgG,EAAKjE,KAAKxB,IAQZ,OAJKmF,GACJhH,KAAKsB,WAAW,YAAcJ,OAAOC,aAAakG,IAG5CC,EAYR1B,cACC5F,KAAKG,QACL,IAAIwC,EAAQ3C,KAAK4C,kBAAkB3E,EAAKuI,aACxC,GAAIxG,KAAKI,OAASnC,EAAKuI,YAEtB,OADAxG,KAAKG,QACgB,IAAjBwC,EAAMpE,OACFoE,EAAM,KAEJA,EAAMpE,QAIR,CACNsE,KAAM5E,EAAKwJ,aACXC,YAAa/E,GAKf3C,KAAKsB,WAAW,cAUlB4D,cAGC,OAFAlF,KAAKG,QAEE,CACN0C,KAAM5E,EAAK0J,UACXC,SAAU5H,KAAKuG,gBAAgBtI,EAAKmI,eAMvC,MAAMtE,EAAQ,ICl3BC,MAmBd/C,IAAI6C,EAAMQ,EAAUyF,GACnB,GAA2B,iBAAhBvB,UAAU,GAEpB,IAAK,IAAI1E,KAAQ0E,UAAU,GAC1BtG,KAAKjB,IAAI6C,EAAM0E,UAAU,GAAG1E,GAAO0E,UAAU,SAI7CwB,MAAMC,QAAQnG,GAAQA,EAAO,CAACA,IAAOoG,SAAQ,SAAUpG,GACvD5B,KAAK4B,GAAQ5B,KAAK4B,IAAS,GAEvBQ,GACHpC,KAAK4B,GAAMiG,EAAQ,UAAY,QAAQzF,KAEtCpC,MAaLiC,IAAIL,EAAMG,GACT/B,KAAK4B,GAAQ5B,KAAK4B,IAAS,GAC3B5B,KAAK4B,GAAMoG,SAAQ,SAAU5F,GAC5BA,EAASC,KAAKN,GAAOA,EAAIC,QAAUD,EAAIC,QAAUD,EAAKA,QDk0BzDtB,OAAOwH,OAAOhK,EAAM,CACnB6D,MAAAA,EACAoG,QAAS,IEr3BK,MACd5H,YAAY6H,GACXnI,KAAKmI,KAAOA,EACZnI,KAAKoI,WAAa,GAgBnBC,YAAYH,GACXA,EAAQF,SAASM,IAChB,GAAsB,iBAAXA,IAAwBA,EAAO1G,OAAS0G,EAAOC,KACzD,MAAM,IAAI9G,MAAM,8BAEbzB,KAAKoI,WAAWE,EAAO1G,QAI3B0G,EAAOC,KAAKvI,KAAKmI,MACjBnI,KAAKoI,WAAWE,EAAO1G,MAAQ0G,QFw1BZrK,GAMrB6E,SAAiB,WACjB2E,aAAiB,qBACjBN,WAAiB,aACjBnB,WAAiB,mBACjBT,QAAiB,UACjBG,SAAiB,iBACjBW,SAAiB,iBACjBjB,UAAiB,kBACjBV,WAAiB,mBACjBiD,UAAiB,kBAEjBnF,SAAa,EACbC,QAAa,GACbC,QAAa,GACbH,WAAa,GACbqC,YAAa,GACbzB,WAAa,GACb2B,YAAa,GACbC,YAAa,GACbY,YAAa,GACba,YAAa,GACbvB,YAAa,GACbmB,YAAa,GACbN,YAAa,GACb5C,YAAa,GACbsF,WAAa,GAObhK,UAAW,CACV,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,GAMNK,WAAY,CACX,KAAM,EAAG,KAAM,EACf,KAAM,EAAG,IAAK,EAAG,IAAK,EAAG,IAAK,EAC9B,KAAM,EAAG,KAAM,EAAG,MAAO,EAAG,MAAO,EACnC,IAAK,EAAG,IAAK,EAAG,KAAM,EAAG,KAAM,EAC/B,KAAM,EAAG,KAAM,EAAG,MAAO,EACzB,IAAK,EAAG,IAAK,EACb,IAAK,GAAI,IAAK,GAAI,IAAK,GACvB,KAAM,IAIPC,kBAAmB,IAAI2J,IAAI,CAAC,OAG5BtJ,4BAA6B,IAAIsJ,IAAI,CAAC,IAAK,MAK3ClJ,SAAU,CACTmJ,MAAQ,EACRC,OAAS,EACTC,KAAQ,MAITnD,SAAU,SAEXxH,EAAKG,aAAeH,EAAKwB,aAAaxB,EAAKO,WAC3CP,EAAKW,cAAgBX,EAAKwB,aAAaxB,EAAKY,kBAGtCsJ,EAAOlI,GAAQ,IAAKhC,EAAKgC,GAAOM,QAChCsI,EAAgBpI,OAAOqI,oBAAoB,SACjDrI,OAAOqI,oBAAoB7K,GACzB8K,QAAOC,IAASH,EAAcI,SAASD,SAAwBE,IAAff,EAAKa,KACrDhB,SAASmB,IACThB,EAAKgB,GAAKlL,EAAKkL,MAEjBhB,EAAKlK,KAAOA,QG98BG,CACd2D,KAAM,UAEN2G,KAAKJ,GAEJA,EAAKrG,MAAM/C,IAAI,oBAAoB,SAAuBgD,GACzD,GAAIA,EAAIF,MAAQ7B,KAAKI,OAAS+H,EAAKrC,YAAa,CAC/C9F,KAAKG,QACL,MAAMiJ,EAAOrH,EAAIF,KACXwH,EAAarJ,KAAKoD,mBAQxB,GANKiG,GACJrJ,KAAKsB,WAAW,uBAGjBtB,KAAKsC,eAEDtC,KAAKI,OAAS+H,EAAKK,WAAY,CAClCxI,KAAKG,QACL,MAAMmJ,EAAYtJ,KAAKoD,mBAcvB,GAZKkG,GACJtJ,KAAKsB,WAAW,uBAEjBS,EAAIF,KAAO,CACVgB,KA3BkB,wBA4BlBuG,KAAAA,EACAC,WAAAA,EACAC,UAAAA,GAKGF,EAAKzE,UAAYwD,EAAKtJ,WAAWuK,EAAKzE,WAAa,GAAK,CAC3D,IAAI4E,EAAUH,EACd,KAAOG,EAAQtF,MAAMU,UAAYwD,EAAKtJ,WAAW0K,EAAQtF,MAAMU,WAAa,IAC3E4E,EAAUA,EAAQtF,MAEnBlC,EAAIF,KAAKuH,KAAOG,EAAQtF,MACxBsF,EAAQtF,MAAQlC,EAAIF,KACpBE,EAAIF,KAAOuH,QAIZpJ,KAAKsB,WAAW,2BC1CrB6G,EAAKD,QAAQG,SAASmB"}
\ No newline at end of file
diff --git a/index.html b/index.html
index 2c673e0..6cf2f76 100644
--- a/index.html
+++ b/index.html
@@ -79,7 +79,7 @@
jsep
a tiny JavaScript expression parser
@@ -209,7 +209,7 @@
Output:
-
+