diff --git a/crates/parser/src/grammar.pest b/crates/parser/src/grammar.pest index a486537..b7ead11 100644 --- a/crates/parser/src/grammar.pest +++ b/crates/parser/src/grammar.pest @@ -72,6 +72,10 @@ program = { SOI ~ top_level* ~ EOI } +module_program = { + SOI ~ declare_module? +} + // ====================================================== // MODIFIERS // ====================================================== diff --git a/crates/parser/src/lib.rs b/crates/parser/src/lib.rs index 77e6bde..b7aaad7 100644 --- a/crates/parser/src/lib.rs +++ b/crates/parser/src/lib.rs @@ -56,6 +56,30 @@ pub fn parse<'a>( } } +pub fn parse_module<'a>( + source: &'a str, +) -> Result, ParseError<'a, Option<(Visibility, Identifier)>>> { + let mut pairs = MistParser::parse(Rule::module_program, source)?; + + if let Some(v) = pairs + .next() + .unwrap() + .into_inner() + .next() + .map(TopLevel::try_from) + .transpose() + .get()? + { + if let TopLevelKind::DeclareModule(vis, name) = &v.0.item { + Ok(Some((vis.clone(), name.clone()))) + } else { + Ok(None) + } + } else { + Ok(None) + } +} + #[macro_export] macro_rules! ast_ensure { ($pair:expr, $rule:expr $(, $rules:expr)* => $body:block) => {