Parses an `ON ERROR` statement. Only `ON` has been consumed so far.
(&mut self, pos: LineCol)
| 1552 | |
| 1553 | /// Parses an `ON ERROR` statement. Only `ON` has been consumed so far. |
| 1554 | fn parse_on(&mut self, pos: LineCol) -> Result<Statement> { |
| 1555 | self.expect_and_consume(Token::Error, "Expected ERROR after ON")?; |
| 1556 | |
| 1557 | let token_span = self.lexer.read()?; |
| 1558 | match token_span.token { |
| 1559 | Token::Goto => { |
| 1560 | let token_span = self.lexer.read()?; |
| 1561 | match token_span.token { |
| 1562 | Token::Integer(0) => Ok(Statement::OnError(OnErrorSpan::Reset(pos))), |
| 1563 | Token::Integer(i) => Ok(Statement::OnError(OnErrorSpan::Goto( |
| 1564 | GotoSpan { target: format!("{}", i), target_pos: token_span.pos }, |
| 1565 | pos, |
| 1566 | ))), |
| 1567 | Token::Label(target) => Ok(Statement::OnError(OnErrorSpan::Goto( |
| 1568 | GotoSpan { target, target_pos: token_span.pos }, |
| 1569 | pos, |
| 1570 | ))), |
| 1571 | _ => Err(Error::Bad( |
| 1572 | token_span.pos, |
| 1573 | "Expected label name or 0 after ON ERROR GOTO".to_owned(), |
| 1574 | )), |
| 1575 | } |
| 1576 | } |
| 1577 | Token::Resume => { |
| 1578 | self.expect_and_consume(Token::Next, "Expected NEXT after ON ERROR RESUME")?; |
| 1579 | Ok(Statement::OnError(OnErrorSpan::ResumeNext(pos))) |
| 1580 | } |
| 1581 | _ => { |
| 1582 | Err(Error::Bad(token_span.pos, "Expected GOTO or RESUME after ON ERROR".to_owned())) |
| 1583 | } |
| 1584 | } |
| 1585 | } |
| 1586 | |
| 1587 | /// Parses the guards after a `CASE` keyword. |
| 1588 | fn parse_case_guards(&mut self) -> Result<Vec<CaseGuardSpan>> { |
no test coverage detected