()
| 763 | } |
| 764 | |
| 765 | func (p *codeParser) parseIfStmt() *nodeIf { |
| 766 | var stmt nodeIf |
| 767 | start := p.peek().pos |
| 768 | maxread := start |
| 769 | lastlit := p.peek().String() |
| 770 | loop: |
| 771 | for { |
| 772 | switch p.peek().tok { |
| 773 | case token.EOF: |
| 774 | p.errorf("premature end of conditional in IF statement") |
| 775 | case token.LBRACE: |
| 776 | // conditional expression has been scanned |
| 777 | break loop |
| 778 | // TODO(paulsmith): add cases for tokens that are illegal in an expression |
| 779 | } |
| 780 | maxread = p.peek().pos |
| 781 | lastlit = p.peek().String() |
| 782 | p.advance() |
| 783 | } |
| 784 | n := (p.file.Offset(maxread) - p.file.Offset(start)) + len(lastlit) |
| 785 | offset := p.baseOffset + p.file.Offset(start) |
| 786 | stmt.cond = new(nodeGoStrExpr) |
| 787 | stmt.cond.pos.start = offset |
| 788 | stmt.cond.pos.end = offset + n |
| 789 | stmt.cond.expr = p.sourceFrom(start)[:n] |
| 790 | if _, err := goparser.ParseExpr(stmt.cond.expr); err != nil { |
| 791 | p.errorf("parsing Go expression in IF conditional: %w", err) |
| 792 | } |
| 793 | stmt.then = p.parseStmtBlock() |
| 794 | // parse ^else clause |
| 795 | if p.peek().tok == token.XOR { |
| 796 | p.advance() |
| 797 | if p.peek().tok == token.ELSE { |
| 798 | p.advance() |
| 799 | if p.peek().tok == token.XOR { |
| 800 | p.advance() |
| 801 | if p.peek().tok == token.IF { |
| 802 | p.advance() |
| 803 | stmt.alt = p.parseIfStmt() |
| 804 | } else { |
| 805 | p.errorf("expected `if' after transition character, got %v", p.peek().String()) |
| 806 | } |
| 807 | } else { |
| 808 | stmt.alt = p.parseStmtBlock() |
| 809 | } |
| 810 | } |
| 811 | } |
| 812 | return &stmt |
| 813 | } |
| 814 | |
| 815 | func (p *codeParser) parseForStmt() *nodeFor { |
| 816 | var stmt nodeFor |
no test coverage detected