MCPcopy Index your code
hub / github.com/endbasic/endbasic / parse_one

Method parse_one

core/src/parser.rs:1873–1990  ·  view source on GitHub ↗

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)

Source from the content-addressed store, hash-verified

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

Callers 1

parse_one_safeMethod · 0.80

Calls 15

consume_peekedMethod · 0.80
parse_dataMethod · 0.80
parse_declareMethod · 0.80
parse_dimMethod · 0.80
parse_doMethod · 0.80
reset_doMethod · 0.80
parse_endMethod · 0.80
parse_exitMethod · 0.80
parse_ifMethod · 0.80
reset_ifMethod · 0.80
parse_forMethod · 0.80
reset_forMethod · 0.80

Tested by

no test coverage detected