()
| 2940 | // 11.11 Binary Logical Operators |
| 2941 | |
| 2942 | function parseBinaryExpression() { |
| 2943 | var marker, markers, expr, token, prec, stack, right, operator, left, i; |
| 2944 | |
| 2945 | marker = lookahead; |
| 2946 | left = parseUnaryExpression(); |
| 2947 | |
| 2948 | token = lookahead; |
| 2949 | prec = binaryPrecedence(token, state.allowIn); |
| 2950 | if (prec === 0) { |
| 2951 | return left; |
| 2952 | } |
| 2953 | token.prec = prec; |
| 2954 | lex(); |
| 2955 | |
| 2956 | markers = [marker, lookahead]; |
| 2957 | right = parseUnaryExpression(); |
| 2958 | |
| 2959 | stack = [left, token, right]; |
| 2960 | |
| 2961 | while ((prec = binaryPrecedence(lookahead, state.allowIn)) > 0) { |
| 2962 | |
| 2963 | // Reduce: make a binary expression from the three topmost entries. |
| 2964 | while ((stack.length > 2) && (prec <= stack[stack.length - 2].prec)) { |
| 2965 | right = stack.pop(); |
| 2966 | operator = stack.pop().value; |
| 2967 | left = stack.pop(); |
| 2968 | markers.pop(); |
| 2969 | expr = new WrappingNode(markers[markers.length - 1]).finishBinaryExpression(operator, left, right); |
| 2970 | stack.push(expr); |
| 2971 | } |
| 2972 | |
| 2973 | // Shift. |
| 2974 | token = lex(); |
| 2975 | token.prec = prec; |
| 2976 | stack.push(token); |
| 2977 | markers.push(lookahead); |
| 2978 | expr = parseUnaryExpression(); |
| 2979 | stack.push(expr); |
| 2980 | } |
| 2981 | |
| 2982 | // Final reduce to clean-up the stack. |
| 2983 | i = stack.length - 1; |
| 2984 | expr = stack[i]; |
| 2985 | markers.pop(); |
| 2986 | while (i > 1) { |
| 2987 | expr = new WrappingNode(markers.pop()).finishBinaryExpression(stack[i - 1].value, stack[i - 2], expr); |
| 2988 | i -= 2; |
| 2989 | } |
| 2990 | |
| 2991 | return expr; |
| 2992 | } |
| 2993 | |
| 2994 | |
| 2995 | // 11.12 Conditional Operator |
no test coverage detected