feat: Add support for loop statements.
This commit is contained in:
@@ -73,6 +73,10 @@ pub enum Statement {
|
|||||||
elze: Option<Box<Statement>>,
|
elze: Option<Box<Statement>>,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
Loop {
|
||||||
|
body: Box<Statement>,
|
||||||
|
},
|
||||||
|
|
||||||
Compound {
|
Compound {
|
||||||
body: Vec<Statement>,
|
body: Vec<Statement>,
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ pub mod parser;
|
|||||||
pub mod token;
|
pub mod token;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let mut parser = Parser::new("if a < 12 { let b = 10; } else { let c = 20; }");
|
let mut parser = Parser::new("loop {}");
|
||||||
|
|
||||||
println!("{:#?}", parser.parse_statement());
|
println!("{:#?}", parser.parse_statement());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -60,6 +60,7 @@ impl<'src> Parser<'src> {
|
|||||||
match self.peek_no_eof()?.kind {
|
match self.peek_no_eof()?.kind {
|
||||||
TokenKind::KwLet => self.parse_let_statement(),
|
TokenKind::KwLet => self.parse_let_statement(),
|
||||||
TokenKind::KwIf => self.parse_if_statement(),
|
TokenKind::KwIf => self.parse_if_statement(),
|
||||||
|
TokenKind::KwLoop => self.parse_loop_statement(),
|
||||||
|
|
||||||
_ => {
|
_ => {
|
||||||
let expr = self.parse_expression(0)?;
|
let expr = self.parse_expression(0)?;
|
||||||
@@ -69,6 +70,14 @@ impl<'src> Parser<'src> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn parse_loop_statement(&mut self) -> ParserResult<Statement> {
|
||||||
|
self.expect(&[TokenKind::KwLoop])?;
|
||||||
|
|
||||||
|
let body = Box::new(self.parse_compound_statement()?);
|
||||||
|
|
||||||
|
Ok(Statement::Loop { body })
|
||||||
|
}
|
||||||
|
|
||||||
fn parse_if_statement(&mut self) -> ParserResult<Statement> {
|
fn parse_if_statement(&mut self) -> ParserResult<Statement> {
|
||||||
self.expect(&[TokenKind::KwIf])?;
|
self.expect(&[TokenKind::KwIf])?;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user