mirror of
https://github.com/urinalcaketopper/fddl.git
synced 2025-06-07 05:34:47 +00:00
if/while parsing
This commit is contained in:
parent
9dbbf7741e
commit
9f594e3775
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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'.");
|
||||
|
Loading…
x
Reference in New Issue
Block a user