From bffc9f073b23c4b2f4c8957ebaf24077cd412dc1 Mon Sep 17 00:00:00 2001 From: Selimaj Dev Date: Tue, 19 May 2026 12:21:20 +0200 Subject: [PATCH] Match multiple patterns --- parser/src/ast/statement.rs | 2 +- parser/src/grammar.pest | 4 +++- parser/src/parser/common/statement.rs | 2 +- src/codegen.rs | 9 ++++++++- 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/parser/src/ast/statement.rs b/parser/src/ast/statement.rs index 22375f4..7ec8ccd 100644 --- a/parser/src/ast/statement.rs +++ b/parser/src/ast/statement.rs @@ -34,7 +34,7 @@ pub enum Statement { iterator: Expression, body: Box, }, - Match(Expression, Vec<(Pattern, Block)>), + Match(Expression, Vec<(Vec, Block)>), Return(Option), Break, diff --git a/parser/src/grammar.pest b/parser/src/grammar.pest index 992e273..7e480d5 100644 --- a/parser/src/grammar.pest +++ b/parser/src/grammar.pest @@ -446,8 +446,10 @@ for_stmt = { // MATCH // ------------------------------------------------------ +pattern_list = { pattern ~ ("|" ~ pattern)* } + match_item = { - pattern ~ "=>" ~ block + pattern_list ~ "=>" ~ block } match_stmt = { diff --git a/parser/src/parser/common/statement.rs b/parser/src/parser/common/statement.rs index 860ec61..3b3f7ad 100644 --- a/parser/src/parser/common/statement.rs +++ b/parser/src/parser/common/statement.rs @@ -100,7 +100,7 @@ impl<'a> TryFrom> for Statement { .map(|match_itms| { let mut match_inner = match_itms.into_inner(); Ok(( - Pattern::try_from(match_inner.next().unwrap()).get()?, + collect_recovered(match_inner.next().unwrap().into_inner()).get()?, Block::try_from(match_inner.next().unwrap()).get()?, )) }) diff --git a/src/codegen.rs b/src/codegen.rs index 3349139..f8524f1 100644 --- a/src/codegen.rs +++ b/src/codegen.rs @@ -646,7 +646,14 @@ impl ToRust for Statement { cg.indent += 1; for itm in match_items { - cg.add_indentedln(&format!("{} =>", itm.0.get_rust())); + cg.add_indentedln(&format!( + "{} =>", + itm.0 + .into_iter() + .map(Pattern::get_rust) + .collect::>() + .join(" | ") + )); cg.add_indentedln("{"); cg.indent += 1; itm.1.to_rust(cg);