| 1500 | } |
| 1501 | |
| 1502 | void fxForStatement(txParser* parser) |
| 1503 | { |
| 1504 | txInteger aLine = parser->states[0].line; |
| 1505 | txBoolean awaitFlag = 0; |
| 1506 | txBoolean expressionFlag = 0; |
| 1507 | txToken aToken; |
| 1508 | fxPushNULL(parser); |
| 1509 | fxMatchToken(parser, XS_TOKEN_FOR); |
| 1510 | if (parser->states[0].token == XS_TOKEN_AWAIT) { |
| 1511 | awaitFlag = 1; |
| 1512 | fxMatchToken(parser, XS_TOKEN_AWAIT); |
| 1513 | } |
| 1514 | fxMatchToken(parser, XS_TOKEN_LEFT_PARENTHESIS); |
| 1515 | fxLookAheadOnce(parser); |
| 1516 | parser->flags |= mxForFlag; |
| 1517 | if (parser->states[0].token == XS_TOKEN_SEMICOLON) { |
| 1518 | fxPushNULL(parser); |
| 1519 | } |
| 1520 | else if (parser->states[0].token == XS_TOKEN_CONST) { |
| 1521 | fxVariableStatement(parser, XS_TOKEN_CONST, 0); |
| 1522 | } |
| 1523 | else if (parser->states[0].token == XS_TOKEN_LET) { |
| 1524 | fxVariableStatement(parser, XS_TOKEN_LET, 0); |
| 1525 | } |
| 1526 | else if (fxIsKeyword(parser, parser->letSymbol) && (gxTokenFlags[parser->states[1].token] & XS_TOKEN_BEGIN_BINDING)) { |
| 1527 | parser->states[0].token = XS_TOKEN_LET; |
| 1528 | fxVariableStatement(parser, XS_TOKEN_LET, 0); |
| 1529 | } |
| 1530 | #if mxExplicitResourceManagement |
| 1531 | else if ((parser->states[0].token == XS_TOKEN_IDENTIFIER) && (parser->states[0].symbol == parser->usingSymbol) && (!parser->states[0].escaped) |
| 1532 | && (!parser->states[1].crlf) && ((parser->states[1].token == XS_TOKEN_IDENTIFIER) || (parser->states[1].token == XS_TOKEN_AWAIT) || (parser->states[1].token == XS_TOKEN_YIELD))) { |
| 1533 | fxLookAheadTwice(parser); |
| 1534 | if ((parser->states[1].symbol == parser->ofSymbol) && (!parser->states[1].escaped) && (parser->states[2].token != XS_TOKEN_ASSIGN)) { |
| 1535 | fxCommaExpression(parser); |
| 1536 | expressionFlag = 1; |
| 1537 | } |
| 1538 | else { |
| 1539 | parser->states[0].token = XS_TOKEN_USING; |
| 1540 | fxVariableStatement(parser, XS_TOKEN_USING, 0); |
| 1541 | } |
| 1542 | } |
| 1543 | else if ((parser->states[0].token == XS_TOKEN_AWAIT) |
| 1544 | && (!parser->states[1].crlf) && (parser->states[1].token == XS_TOKEN_IDENTIFIER) && (parser->states[1].symbol == parser->usingSymbol) && (!parser->states[1].escaped)) { |
| 1545 | fxLookAheadTwice(parser); |
| 1546 | if ((!parser->states[2].crlf) && ((parser->states[2].token == XS_TOKEN_IDENTIFIER) || (parser->states[2].token == XS_TOKEN_AWAIT) || (parser->states[2].token == XS_TOKEN_YIELD))) { |
| 1547 | fxGetNextToken(parser); |
| 1548 | parser->states[0].token = XS_TOKEN_USING; |
| 1549 | fxVariableStatement(parser, XS_TOKEN_USING, mxAwaitingFlag); |
| 1550 | parser->flags |= mxAwaitingFlag; |
| 1551 | } |
| 1552 | else { |
| 1553 | fxCommaExpression(parser); |
| 1554 | expressionFlag = 1; |
| 1555 | } |
| 1556 | } |
| 1557 | #endif |
| 1558 | else if (parser->states[0].token == XS_TOKEN_VAR) { |
| 1559 | fxVariableStatement(parser, XS_TOKEN_VAR, 0); |
no test coverage detected