MCPcopy Create free account
hub / github.com/davidkingzyb/SCAST / parseExprOp

Function parseExprOp

lib/filbert.js:2024–2068  ·  view source on GitHub ↗
(left, minPrec, noIn)

Source from the content-addressed store, hash-verified

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.

Callers 2

parseExprOpsFunction · 0.85
parseMaybeUnaryFunction · 0.85

Calls 6

startNodeFromFunction · 0.85
parseMaybeUnaryFunction · 0.85
finishNodeFunction · 0.85
eatFunction · 0.85
raiseFunction · 0.85
nextFunction · 0.70

Tested by

no test coverage detected