if/while parsing

This commit is contained in:
Tristan 2025-05-17 18:49:23 -04:00
parent 9dbbf7741e
commit 9f594e3775
2 changed files with 43 additions and 34 deletions

View File

@ -71,7 +71,7 @@ fn run(source: String) {
loop {
if parser.is_at_end() { // Add is_at_end to Parser if not already public
if parser.is_at_end() {
break;
}

View File

@ -352,7 +352,10 @@ impl Parser {
}
fn parse_if_statement(&mut self) -> Option<Statement> {
if !self.match_token(Token::If) { return None; }
if !self.match_token(Token::If) {
eprintln!("Internal parser error: Expected 'if' token in parse_if_statement.");
return None;
}
if !self.match_token(Token::LeftParen) {
eprintln!("Error: Expected '(' after 'if'.");
@ -370,20 +373,26 @@ impl Parser {
}
let then_branch = Box::new(self.parse_statement()?);
let mut else_branch = None;
let mut else_branch_opt: Option<Box<Statement>> = None;
if self.match_token(Token::Else) {
if !self.check(&Token::LeftBrace) && !self.check(&Token::If) {
eprintln!("Error: Expected '{{' for else statement body or 'if' for 'else if'.");
if self.check(&Token::LeftBrace) {
else_branch_opt = Some(Box::new(self.parse_statement()?));
} else if self.check(&Token::If) {
else_branch_opt = Some(Box::new(self.parse_statement()?));
} else {
eprintln!("Error: Expected '{{' or 'if' after 'else'.");
return None;
}
else_branch = Some(Box::new(self.parse_statement()?));
}
Some(Statement::IfStatement(condition, then_branch, else_branch))
Some(Statement::IfStatement(condition, then_branch, else_branch_opt))
}
fn parse_while_statement(&mut self) -> Option<Statement> {
if !self.match_token(Token::While) { return None; }
if !self.match_token(Token::While) {
eprintln!("Internal parser error: Expected 'while' token in parse_while_statement.");
return None;
}
if !self.match_token(Token::LeftParen) {
eprintln!("Error: Expected '(' after 'while'.");
@ -407,11 +416,11 @@ impl Parser {
fn parse_print_statement(&mut self) -> Option<Statement> {
if !self.match_token(Token::Print) { return None; }
let value = self.parse_expression()?;
if self.match_token(Token::Semicolon) {
Some(Statement::PrintStatement(value))
} else {
if !self.match_token(Token::Semicolon) {
eprintln!("Error: Expected ';' after print value.");
None
} else {
Some(Statement::PrintStatement(value))
}
}
@ -426,11 +435,11 @@ impl Parser {
None
};
if self.match_token(Token::Semicolon) {
Some(Statement::VariableDeclaration(name, initializer))
} else {
if !self.match_token(Token::Semicolon) {
eprintln!("Error: Expected ';' after variable declaration.");
None
} else {
Some(Statement::VariableDeclaration(name, initializer))
}
} else {
eprintln!("Error: Expected variable name after 'let'.");