* ```abnf * Object = "{" [ObjectKey ":" Expr *(SEP IDENT ":" Expr) [SEP]] "}" * ```
(s: ITokenStream, isStatic: boolean)
| 581 | * ``` |
| 582 | */ |
| 583 | function parseObject(s: ITokenStream, isStatic: boolean): Ast.Obj { |
| 584 | const startPos = s.getPos(); |
| 585 | |
| 586 | s.expect(TokenKind.OpenBrace); |
| 587 | s.next(); |
| 588 | |
| 589 | while (s.is(TokenKind.NewLine)) { |
| 590 | s.next(); |
| 591 | } |
| 592 | |
| 593 | const map = new Map<string, Ast.Expression>(); |
| 594 | while (!s.is(TokenKind.CloseBrace)) { |
| 595 | const k = parseObjectKey(s); |
| 596 | s.next(); |
| 597 | |
| 598 | s.expect(TokenKind.Colon); |
| 599 | s.next(); |
| 600 | |
| 601 | const v = parseExpr(s, isStatic); |
| 602 | |
| 603 | map.set(k, v); |
| 604 | |
| 605 | // separator |
| 606 | switch (s.getTokenKind()) { |
| 607 | case TokenKind.NewLine: |
| 608 | case TokenKind.Comma: { |
| 609 | s.next(); |
| 610 | while (s.is(TokenKind.NewLine)) { |
| 611 | s.next(); |
| 612 | } |
| 613 | break; |
| 614 | } |
| 615 | case TokenKind.CloseBrace: { |
| 616 | break; |
| 617 | } |
| 618 | case TokenKind.EOF: { |
| 619 | throw new AiScriptUnexpectedEOFError(s.getPos()); |
| 620 | } |
| 621 | default: { |
| 622 | throw new AiScriptSyntaxError('separator expected', s.getPos()); |
| 623 | } |
| 624 | } |
| 625 | } |
| 626 | |
| 627 | s.expect(TokenKind.CloseBrace); |
| 628 | s.next(); |
| 629 | |
| 630 | return NODE('obj', { value: map }, startPos, s.getPos()); |
| 631 | } |
| 632 | |
| 633 | /** |
| 634 | * ```abnf |
no test coverage detected