From 95c4826b5fd12ece6a220e742ce274f17fb8e346 Mon Sep 17 00:00:00 2001 From: Selimaj Dev Date: Tue, 5 May 2026 15:54:51 +0200 Subject: [PATCH] Refactor: If statement --- parser/src/grammar.pest | 6 +++++- parser/src/lib.rs | 46 +++++++++++++++++++++++------------------ 2 files changed, 31 insertions(+), 21 deletions(-) diff --git a/parser/src/grammar.pest b/parser/src/grammar.pest index 59d1490..d243ebc 100644 --- a/parser/src/grammar.pest +++ b/parser/src/grammar.pest @@ -86,8 +86,12 @@ var_decl_statement = { var_decl ~ ("=" ~ expr)? ~ ";" } assign_statement = { expr ~ "=" ~ expr ~ ";" } +else_if = { "else" ~ "if" ~ "(" ~ expr ~ ")" ~ statement } + +else_if_list = { else_if* } + if_stmt = { - "if" ~ "(" ~ expr ~ ")" ~ statement ~ ("else" ~ statement)? + "if" ~ "(" ~ expr ~ ")" ~ statement ~ else_if_list ~ ("else" ~ statement)? } while_stmt = { diff --git a/parser/src/lib.rs b/parser/src/lib.rs index 1019e98..95be8ce 100644 --- a/parser/src/lib.rs +++ b/parser/src/lib.rs @@ -196,6 +196,20 @@ impl From> for TopLevel { } } +impl From> for StatementBranch { + fn from(pair: pest::iterators::Pair<'_, Rule>) -> Self { + let mut inner = pair.into_inner(); + + let condition = Expression::from(inner.next().unwrap()); + let body = Statement::from(inner.next().unwrap()); + + StatementBranch { + condition, + body: Box::new(body), + } + } +} + impl From> for TopLevelKind { fn from(pair: pest::iterators::Pair<'_, Rule>) -> Self { let rule = pair.as_rule(); @@ -303,29 +317,21 @@ impl From> for Statement { Rule::continue_stmt => Statement::Continue, Rule::if_stmt => { - let condition = Expression::from(inner.next().unwrap()); - let then_branch = Statement::from(inner.next().unwrap()); + let mut inner = inner.skip(2); - let else_branch = inner.next().map(Statement::from); - - Statement::Break - - // Statement::If(IfStmt { - // condition, - // then_branch: Box::new(then_branch), - // else_branch: else_branch.map(Box::new), - // }) + Statement::If { + initial: pair.into(), + else_if: inner + .next() + .unwrap() + .into_inner() + .map(StatementBranch::from) + .collect(), + else_branch: inner.next().map(Statement::from).map(Box::new), + } } - Rule::while_stmt => { - let condition = Expression::from(inner.next().unwrap()); - let body = Statement::from(inner.next().unwrap()); - - Statement::While(StatementBranch { - condition, - body: Box::new(body), - }) - } + Rule::while_stmt => Statement::While(pair.into()), Rule::assign_statement => Statement::VarAssign(VarAssignStmt { target: Expression::from(inner.next().unwrap()),