()
| 6149 | // 11.11 Binary Logical Operators |
| 6150 | |
| 6151 | function parseBinaryExpression() { |
| 6152 | var expr, token, prec, previousAllowIn, stack, right, operator, left, i, |
| 6153 | marker, markers; |
| 6154 | |
| 6155 | previousAllowIn = state.allowIn; |
| 6156 | state.allowIn = true; |
| 6157 | |
| 6158 | marker = markerCreate(); |
| 6159 | left = parseUnaryExpression(); |
| 6160 | |
| 6161 | token = lookahead; |
| 6162 | prec = binaryPrecedence(token, previousAllowIn); |
| 6163 | if (prec === 0) { |
| 6164 | return left; |
| 6165 | } |
| 6166 | token.prec = prec; |
| 6167 | lex(); |
| 6168 | |
| 6169 | markers = [marker, markerCreate()]; |
| 6170 | right = parseUnaryExpression(); |
| 6171 | |
| 6172 | stack = [left, token, right]; |
| 6173 | |
| 6174 | while ((prec = binaryPrecedence(lookahead, previousAllowIn)) > 0) { |
| 6175 | |
| 6176 | // Reduce: make a binary expression from the three topmost entries. |
| 6177 | while ((stack.length > 2) && (prec <= stack[stack.length - 2].prec)) { |
| 6178 | right = stack.pop(); |
| 6179 | operator = stack.pop().value; |
| 6180 | left = stack.pop(); |
| 6181 | expr = delegate.createBinaryExpression(operator, left, right); |
| 6182 | markers.pop(); |
| 6183 | marker = markers.pop(); |
| 6184 | markerApply(marker, expr); |
| 6185 | stack.push(expr); |
| 6186 | markers.push(marker); |
| 6187 | } |
| 6188 | |
| 6189 | // Shift. |
| 6190 | token = lex(); |
| 6191 | token.prec = prec; |
| 6192 | stack.push(token); |
| 6193 | markers.push(markerCreate()); |
| 6194 | expr = parseUnaryExpression(); |
| 6195 | stack.push(expr); |
| 6196 | } |
| 6197 | |
| 6198 | state.allowIn = previousAllowIn; |
| 6199 | |
| 6200 | // Final reduce to clean-up the stack. |
| 6201 | i = stack.length - 1; |
| 6202 | expr = stack[i]; |
| 6203 | markers.pop(); |
| 6204 | while (i > 1) { |
| 6205 | expr = delegate.createBinaryExpression(stack[i - 1].value, stack[i - 2], expr); |
| 6206 | i -= 2; |
| 6207 | marker = markers.pop(); |
| 6208 | markerApply(marker, expr); |
no test coverage detected