()
| 958 | } |
| 959 | |
| 960 | func (self *_parser) parseBreakStatement() ast.Statement { |
| 961 | idx := self.expect(token.BREAK) |
| 962 | semicolon := self.implicitSemicolon |
| 963 | if self.token == token.SEMICOLON { |
| 964 | semicolon = true |
| 965 | self.next() |
| 966 | } |
| 967 | |
| 968 | if semicolon || self.token == token.RIGHT_BRACE { |
| 969 | self.implicitSemicolon = false |
| 970 | if !self.scope.inIteration && !self.scope.inSwitch { |
| 971 | goto illegal |
| 972 | } |
| 973 | return &ast.BranchStatement{ |
| 974 | Idx: idx, |
| 975 | Token: token.BREAK, |
| 976 | } |
| 977 | } |
| 978 | |
| 979 | self.tokenToBindingId() |
| 980 | if self.token == token.IDENTIFIER { |
| 981 | identifier := self.parseIdentifier() |
| 982 | if !self.scope.hasLabel(identifier.Name) { |
| 983 | self.error(idx, "Undefined label '%s'", identifier.Name) |
| 984 | return &ast.BadStatement{From: idx, To: identifier.Idx1()} |
| 985 | } |
| 986 | self.semicolon() |
| 987 | return &ast.BranchStatement{ |
| 988 | Idx: idx, |
| 989 | Token: token.BREAK, |
| 990 | Label: identifier, |
| 991 | } |
| 992 | } |
| 993 | |
| 994 | self.expect(token.IDENTIFIER) |
| 995 | |
| 996 | illegal: |
| 997 | self.error(idx, "Illegal break statement") |
| 998 | self.nextStatement() |
| 999 | return &ast.BadStatement{From: idx, To: self.idx} |
| 1000 | } |
| 1001 | |
| 1002 | func (self *_parser) parseContinueStatement() ast.Statement { |
| 1003 | idx := self.expect(token.CONTINUE) |
no test coverage detected