From 6fbc2a086ef94878e121f602ef9bfbe1288029eb Mon Sep 17 00:00:00 2001 From: Klesti Selimaj Date: Fri, 15 May 2026 01:33:43 +0200 Subject: [PATCH] Decl using the ast macro --- parser/src/lib.rs | 4 ++ parser/src/parser/common/decl.rs | 64 +++++++++++++++++--------------- 2 files changed, 39 insertions(+), 29 deletions(-) diff --git a/parser/src/lib.rs b/parser/src/lib.rs index 429daf8..765e563 100644 --- a/parser/src/lib.rs +++ b/parser/src/lib.rs @@ -66,6 +66,10 @@ macro_rules! _ast_ti { $val::try_from($inner.next().unwrap()) }; + ($inner:ident, ? $val:ident) => { + $inner.next().map($val::try_from).transpose() + }; + ($inner:ident, ? ($rule:path)) => { $crate::parser::listen_rule(&mut $inner, $rule) }; diff --git a/parser/src/parser/common/decl.rs b/parser/src/parser/common/decl.rs index ca8d438..99cd76e 100644 --- a/parser/src/parser/common/decl.rs +++ b/parser/src/parser/common/decl.rs @@ -13,11 +13,12 @@ impl<'a> TryFrom> for VarDeclStmt { Rule::var_decl_statement => { let mut inner = pair.into_inner(); - let decl = VarDecl::try_from(inner.next().unwrap()).get()?; - - let init = inner.next().map(Expression::try_from).transpose().get()?; - - Ok(VarDeclStmt { decl, init }) + Ok(ast_expr!( + inner@VarDeclStmt { + decl: @VarDecl, + init: ?Expression + } + )) } _ => unimplemented!(), @@ -33,11 +34,12 @@ impl<'a> TryFrom> for FieldDeclStmt { Rule::class_field => { let mut inner = pair.into_inner(); - let decl = FieldDecl::try_from(inner.next().unwrap()).get()?; - - let init = inner.next().map(Expression::try_from).transpose().get()?; - - Ok(FieldDeclStmt { decl, init }) + Ok(ast_expr!( + inner@FieldDeclStmt { + decl: @FieldDecl, + init: ?Expression + } + )) } _ => unimplemented!(), @@ -53,22 +55,24 @@ impl<'a> TryFrom> for VarDecl { Rule::var_decl => { let mut inner = pair.into_inner(); - Ok(ast_expr!(inner@VarDecl { - type_: & (inner - .next() - .and_then(|pair| { - if pair.as_str().trim() == "var" { - None - } else { - Some(TypeExpr::try_from(pair)) - } - }) - .transpose()), + Ok(ast_expr!( + inner@VarDecl { + type_: & (inner + .next() + .and_then(|pair| { + if pair.as_str().trim() == "var" { + None + } else { + Some(TypeExpr::try_from(pair)) + } + }) + .transpose()), - mutable: ?(Rule::mutable), + mutable: ?(Rule::mutable), - name: @Pattern - })) + name: @Pattern + } + )) } _ => unimplemented!("{:?}", pair.as_rule()), @@ -84,11 +88,13 @@ impl<'a> TryFrom> for FieldDecl { Rule::field => { let mut inner = pair.into_inner(); - Ok(ast_expr!(inner@FieldDecl { - visibility: !Visibility, - type_: @TypeExpr, - name: @Identifier - })) + Ok(ast_expr!( + inner@FieldDecl { + visibility: !Visibility, + type_: @TypeExpr, + name: @Identifier + } + )) } _ => unimplemented!("{:?}", pair.as_rule()),