From 5c04851b48099463afbfd4fb9e015d99d28ab4b9 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sat, 4 May 2024 23:53:39 +0200 Subject: rebel-parse, rebel-lang: add support for map literals --- crates/rebel-parse/src/ast/expr.rs | 14 ++++++++++++++ crates/rebel-parse/src/grammar/recipe.rs | 8 ++++++++ 2 files changed, 22 insertions(+) (limited to 'crates/rebel-parse') diff --git a/crates/rebel-parse/src/ast/expr.rs b/crates/rebel-parse/src/ast/expr.rs index 341b8ad..0a47cb2 100644 --- a/crates/rebel-parse/src/ast/expr.rs +++ b/crates/rebel-parse/src/ast/expr.rs @@ -193,6 +193,7 @@ pub enum Literal<'a> { }, Tuple(Vec>), Array(Vec>), + Map(Vec>), Struct(Vec>), } @@ -224,6 +225,13 @@ impl<'a> Literal<'a> { } Ok(()) } + Literal::Map(entries) => { + for MapEntry { key, value } in entries { + key.validate()?; + value.validate()?; + } + Ok(()) + } Literal::Struct(entries) => { let mut fields = FxHashSet::default(); for StructField { name, value } in entries { @@ -261,6 +269,12 @@ impl<'a> TryFrom<&token::StrPiece<'a>> for StrPiece<'a> { } } +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct MapEntry<'a> { + pub key: Expr<'a>, + pub value: Expr<'a>, +} + #[derive(Debug, Clone, PartialEq, Eq)] pub struct StructField<'a> { pub name: &'a str, diff --git a/crates/rebel-parse/src/grammar/recipe.rs b/crates/rebel-parse/src/grammar/recipe.rs index 1ada80c..8181ee2 100644 --- a/crates/rebel-parse/src/grammar/recipe.rs +++ b/crates/rebel-parse/src/grammar/recipe.rs @@ -178,10 +178,18 @@ peg::parser! { / p('[') elements:delimited(, ) p(']') { expr::Literal::Array(elements) } + / [Token::Keyword(Keyword::Map)] p('{') entries:delimited(, ) p('}') { + expr::Literal::Map(entries) + } / [Token::Keyword(Keyword::Struct)] p('{') entries:delimited(, ) p('}') { expr::Literal::Struct(entries) } + rule map_entry() -> expr::MapEntry<'a> + = key:expr() p2('=', '>') value:expr() { + expr::MapEntry { key, value } + } + rule struct_field() -> expr::StructField<'a> = field:field() p('=') value:expr() { expr::StructField { name: field.name, value } -- cgit v1.2.3