* ```abnf * Loop = "do" BlockOrStatement "while" Expr * ```
(s: ITokenStream)
| 451 | * ``` |
| 452 | */ |
| 453 | function parseDoWhile(s: ITokenStream): Ast.Loop { |
| 454 | const doStartPos = s.getPos(); |
| 455 | s.expect(TokenKind.DoKeyword); |
| 456 | s.next(); |
| 457 | const body = parseBlockOrStatement(s); |
| 458 | const whilePos = s.getPos(); |
| 459 | s.expect(TokenKind.WhileKeyword); |
| 460 | s.next(); |
| 461 | const cond = parseExpr(s, false); |
| 462 | const endPos = s.getPos(); |
| 463 | |
| 464 | return NODE('loop', { |
| 465 | statements: [ |
| 466 | body, |
| 467 | NODE('if', { |
| 468 | cond: NODE('not', { expr: cond }, whilePos, endPos), |
| 469 | then: NODE('break', {}, endPos, endPos), |
| 470 | elseif: [], |
| 471 | }, whilePos, endPos), |
| 472 | ], |
| 473 | }, doStartPos, endPos); |
| 474 | } |
| 475 | |
| 476 | /** |
| 477 | * ```abnf |
no test coverage detected