Extracts the next available statement from the input stream, or `None` if none is available. On success, the stream is left in a position where the next statement can be extracted. On failure, the caller must advance the stream to the next statement by calling `reset`.
(&mut self)
| 1871 | /// On success, the stream is left in a position where the next statement can be extracted. |
| 1872 | /// On failure, the caller must advance the stream to the next statement by calling `reset`. |
| 1873 | fn parse_one(&mut self) -> Result<Option<Statement>> { |
| 1874 | loop { |
| 1875 | match self.lexer.peek()?.token { |
| 1876 | Token::Eol => { |
| 1877 | self.lexer.consume_peeked(); |
| 1878 | } |
| 1879 | Token::Eof => return Ok(None), |
| 1880 | _ => break, |
| 1881 | } |
| 1882 | } |
| 1883 | let token_span = self.lexer.read()?; |
| 1884 | let res = match token_span.token { |
| 1885 | Token::Data => Ok(Some(self.parse_data()?)), |
| 1886 | Token::Declare => Ok(Some(self.parse_declare()?)), |
| 1887 | Token::Dim => Ok(Some(self.parse_dim()?)), |
| 1888 | Token::Do => { |
| 1889 | let result = self.parse_do(token_span.pos); |
| 1890 | if result.is_err() { |
| 1891 | self.reset_do()?; |
| 1892 | } |
| 1893 | Ok(Some(result?)) |
| 1894 | } |
| 1895 | Token::End => Ok(Some(self.parse_end(token_span.pos)?)), |
| 1896 | Token::Eof => return Ok(None), |
| 1897 | Token::Eol => Ok(None), |
| 1898 | Token::Exit => Ok(Some(self.parse_exit(token_span.pos)?)), |
| 1899 | Token::If => { |
| 1900 | let result = self.parse_if(token_span.pos); |
| 1901 | if result.is_err() { |
| 1902 | self.reset_if(token_span.pos)?; |
| 1903 | } |
| 1904 | Ok(Some(result?)) |
| 1905 | } |
| 1906 | Token::For => { |
| 1907 | let result = self.parse_for(token_span.pos); |
| 1908 | if result.is_err() { |
| 1909 | self.reset_for()?; |
| 1910 | } |
| 1911 | Ok(Some(result?)) |
| 1912 | } |
| 1913 | Token::Function => { |
| 1914 | let result = self.parse_function(token_span.pos); |
| 1915 | if result.is_err() { |
| 1916 | self.reset_callable(Token::Function)?; |
| 1917 | } |
| 1918 | Ok(Some(result?)) |
| 1919 | } |
| 1920 | Token::Gosub => { |
| 1921 | let result = self.parse_gosub(); |
| 1922 | Ok(Some(result?)) |
| 1923 | } |
| 1924 | Token::Goto => { |
| 1925 | let result = self.parse_goto(); |
| 1926 | Ok(Some(result?)) |
| 1927 | } |
| 1928 | Token::Integer(i) => { |
| 1929 | let name = format!("{}", i); |
| 1930 | // When we encounter a line number, we must return early to avoid looking for a line |
no test coverage detected