feat: 实现for循环语句的解析和执行逻辑,更新词法分析器以支持for关键字
This commit is contained in:
@@ -37,6 +37,8 @@ impl Parser {
|
||||
self.if_statement()
|
||||
} else if self.match_kind(&[TokenKind::While]) {
|
||||
self.while_statement()
|
||||
} else if self.match_kind(&[TokenKind::For]) {
|
||||
self.for_statement()
|
||||
} else if self.match_kind(&[TokenKind::Return]) {
|
||||
self.return_statement()
|
||||
} else if self.match_kind(&[TokenKind::LeftBrace]) {
|
||||
@@ -117,6 +119,40 @@ impl Parser {
|
||||
Stmt::While { condition, body }
|
||||
}
|
||||
|
||||
fn for_statement(&mut self) -> Stmt {
|
||||
self.consume(TokenKind::LeftParen, "Expected '(' after 'for'.").unwrap();
|
||||
let initializer = if self.match_kind(&[TokenKind::Semicolon]) {
|
||||
None
|
||||
} else if self.match_kind(&[TokenKind::Let]) {
|
||||
Some(self.let_declaration())
|
||||
} else {
|
||||
Some(self.expression_statement())
|
||||
};
|
||||
|
||||
let condition = if !self.check(&TokenKind::Semicolon) {
|
||||
Some(self.expression())
|
||||
} else {
|
||||
None
|
||||
};
|
||||
|
||||
self.consume(TokenKind::Semicolon, "Expected ';' after loop condition.").unwrap();
|
||||
let step = if !self.check(&TokenKind::RightParen) {
|
||||
Some(self.expression())
|
||||
} else {
|
||||
None
|
||||
};
|
||||
|
||||
self.consume(TokenKind::RightParen, "Expected ')' after for clauses.").unwrap();
|
||||
let body = Box::new(self.statement());
|
||||
|
||||
Stmt::For {
|
||||
initializer: initializer.map(Box::new),
|
||||
condition,
|
||||
step,
|
||||
body
|
||||
}
|
||||
}
|
||||
|
||||
fn return_statement(&mut self) -> Stmt {
|
||||
let value = if !self.check(&TokenKind::Semicolon) && !self.check(&TokenKind::RightBrace) {
|
||||
Some(self.expression())
|
||||
|
||||
Reference in New Issue
Block a user