(left, minPrec, noIn)
| 2022 | // 'in' and 'not in' implemented via indexOf() |
| 2023 | |
| 2024 | function parseExprOp(left, minPrec, noIn) { |
| 2025 | var node, exprNode, right, op = tokType, val = tokVal; |
| 2026 | var prec = op === _not ? _in.prec : op.prec; |
| 2027 | if (op === _exponentiation && prec >= minPrec) { |
| 2028 | node = startNodeFrom(left); |
| 2029 | next(); |
| 2030 | right = parseExprOp(parseMaybeUnary(noIn), prec, noIn); |
| 2031 | exprNode = nc.createNodeMemberCall(node, "Math", "pow", [left, right]); |
| 2032 | return parseExprOp(exprNode, minPrec, noIn); |
| 2033 | } else if (prec != null && (!noIn || op !== _in)) { |
| 2034 | if (prec > minPrec) { |
| 2035 | next(); |
| 2036 | node = startNodeFrom(left); |
| 2037 | if (op === _floorDiv) { |
| 2038 | right = parseExprOp(parseMaybeUnary(noIn), prec, noIn); |
| 2039 | finishNode(node); |
| 2040 | var binExpr = nc.createNodeSpan(node, node, "BinaryExpression", { left: left, operator: '/', right: right }); |
| 2041 | exprNode = nc.createNodeMemberCall(node, "Math", "floor", [binExpr]); |
| 2042 | } else if (op === _in || op === _not) { |
| 2043 | if (op === _in || eat(_in)) { |
| 2044 | right = parseExprOp(parseMaybeUnary(noIn), prec, noIn); |
| 2045 | finishNode(node); |
| 2046 | var notLit = nc.createNodeSpan(node, node, "Literal", { value: op === _not }); |
| 2047 | exprNode = nc.createNodeRuntimeCall(node, 'ops', 'in', [left, right, notLit]); |
| 2048 | } else raise(tokPos, "Expected 'not in' comparison operator"); |
| 2049 | } else if (op === _plusMin && val === '+' || op === _multiplyModulo && val === '*') { |
| 2050 | right = parseExprOp(parseMaybeUnary(noIn), prec, noIn); |
| 2051 | node.arguments = [left, right]; |
| 2052 | finishNode(node, "CallExpression"); |
| 2053 | node.callee = nc.createNodeOpsCallee(node, op === _plusMin ? "add" : "multiply"); |
| 2054 | exprNode = node; |
| 2055 | } else { |
| 2056 | if (op === _is) { |
| 2057 | if (eat(_not)) node.operator = "!=="; |
| 2058 | else node.operator = "==="; |
| 2059 | } else node.operator = op.rep != null ? op.rep : val; |
| 2060 | node.left = left; |
| 2061 | node.right = parseExprOp(parseMaybeUnary(noIn), prec, noIn); |
| 2062 | exprNode = finishNode(node, (op === _or || op === _and) ? "LogicalExpression" : "BinaryExpression"); |
| 2063 | } |
| 2064 | return parseExprOp(exprNode, minPrec, noIn); |
| 2065 | } |
| 2066 | } |
| 2067 | return left; |
| 2068 | } |
| 2069 | |
| 2070 | // Parse unary operators. |
| 2071 | // '-+' are prefixes here, with different precedence. |
no test coverage detected