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);