From a6fb70eebf7557f46fa2951589a323bfbc76baa0 Mon Sep 17 00:00:00 2001 From: Klesti Selimaj Date: Thu, 7 May 2026 22:10:26 +0200 Subject: [PATCH] Pattern AST and grammar --- parser/src/ast.rs | 3 ++- parser/src/grammar.pest | 7 ++++--- parser/src/lib.rs | 27 +++++++++++++++++++++++++++ test/src/main.mist | 3 ++- 4 files changed, 35 insertions(+), 5 deletions(-) diff --git a/parser/src/ast.rs b/parser/src/ast.rs index 2e0ed0c..1750a25 100644 --- a/parser/src/ast.rs +++ b/parser/src/ast.rs @@ -94,8 +94,9 @@ pub enum TopLevelKind { #[derive(Debug, Clone, Serialize)] pub enum Pattern { - Tuple(Path, Vec), + NamedTuple(Path, Vec), Struct(Path, Vec), + Tuple(Vec), Path(Path), Id(Identifier), } diff --git a/parser/src/grammar.pest b/parser/src/grammar.pest index 5dc2706..54c3d4b 100644 --- a/parser/src/grammar.pest +++ b/parser/src/grammar.pest @@ -13,9 +13,10 @@ inner_str = @{ (!"\"" ~ ("\\\"" | ANY))* } static_path = { identifier ~ ("::" ~ identifier)* } // pattern -tuple_pattern = { static_path ~ "(" ~ (identifier ~ ("," ~ identifier)*)? ~ ")" } -struct_pattern = { static_path ~ "{" ~ (identifier ~ ("," ~ identifier)*)? ~ "}" } -pattern = _{ tuple_pattern | struct_pattern | identifier } +tuple_pattern = { "(" ~ (identifier ~ ("," ~ identifier)*)? ~ ")" } +named_tuple_pattern = { static_path ~ "(" ~ (identifier ~ ("," ~ identifier)*)? ~ ")" } +struct_pattern = { static_path ~ "{" ~ (identifier ~ ("," ~ identifier)*)? ~ "}" } +pattern = _{ named_tuple_pattern | tuple_pattern | struct_pattern | identifier } export = { "public" } mutable = { "mut" } diff --git a/parser/src/lib.rs b/parser/src/lib.rs index 5d67068..d24ddcc 100644 --- a/parser/src/lib.rs +++ b/parser/src/lib.rs @@ -518,6 +518,33 @@ impl From> for VarDeclStmt { } } +impl From> for Pattern { + fn from(pair: pest::iterators::Pair<'_, Rule>) -> Self { + let rule = pair.as_rule(); + let mut inner = pair.into_inner(); + + match rule { + Rule::tuple_pattern => Pattern::Tuple(inner.map(Identifier::from).collect()), + + Rule::named_tuple_pattern => Pattern::NamedTuple( + Path::from(inner.next().unwrap()), + inner.map(Identifier::from).collect(), + ), + + Rule::struct_pattern => Pattern::Struct( + Path::from(inner.next().unwrap()), + inner.map(Identifier::from).collect(), + ), + + Rule::identifier => Pattern::Id(Identifier::from(inner.next().unwrap())), + + Rule::static_path => Pattern::Path(Path::from(inner.next().unwrap())), + + _ => unimplemented!("{rule:?}"), + } + } +} + impl From> for VarDecl { fn from(pair: pest::iterators::Pair<'_, Rule>) -> Self { match pair.as_rule() { diff --git a/test/src/main.mist b/test/src/main.mist index 30ef530..59a3194 100644 --- a/test/src/main.mist +++ b/test/src/main.mist @@ -4,5 +4,6 @@ use ; void main() { var my_class = new MyClass("World"); my_class.greet(); - var x = 1 + 2 + 3; + + var (x, y) = (10, 20); }