diff --git a/bng_macros/src/lib.rs b/bng_macros/src/lib.rs index 939c7d2..3bd47ff 100644 --- a/bng_macros/src/lib.rs +++ b/bng_macros/src/lib.rs @@ -96,11 +96,11 @@ fn impl_quick_modifier_parser(ast: DeriveInput) -> TokenStream { ( nom::combinator::value( true, - nom::character::complete::char(#name::#variant_name(Default::default()).token().0) + nom::character::complete::char(#name::#variant_name(Default::default()).token()[0]) ), nom::combinator::value( false, - nom::character::complete::char(#name::#variant_name(Default::default()).token().1) + nom::character::complete::char(#name::#variant_name(Default::default()).token()[1]) ) ) ), diff --git a/src/bng/score.rs b/src/bng/score.rs index 94fd3af..2eda638 100644 --- a/src/bng/score.rs +++ b/src/bng/score.rs @@ -10,10 +10,8 @@ pub(super) enum Atom { StartHere, Modifier(Modifier), QuickModifier(QuickModifier), - Loop(u8, Vec), - Tuple(Vec), - Slope(SlopeModifier, Instruction, Vec), - Comment, + Wrapper(WrapperKind, Vec), + EmptyWrapper(WrapperKind), } #[derive(ModifierParser)] @@ -32,6 +30,13 @@ pub(super) enum QuickModifier { Pizz(bool), } +pub(super) enum WrapperKind { + Loop(u8), + Tuple, + Slope(SlopeModifier, Instruction), + Comment, +} + #[derive(Clone, Copy, SlopeModifierParser)] pub(super) enum SlopeModifier { Note, diff --git a/src/bng/score/lex.rs b/src/bng/score/lex.rs index 6dce07a..53f883a 100644 --- a/src/bng/score/lex.rs +++ b/src/bng/score/lex.rs @@ -1,4 +1,4 @@ -use super::{Atom, Modifier, QuickModifier, SlopeModifier}; +use super::{Atom, Modifier, QuickModifier, SlopeModifier, WrapperKind}; pub(super) mod lexer; @@ -23,6 +23,17 @@ pub(super) trait Token { fn token(self) -> T; } +impl Token<(char, char)> for WrapperKind { + fn token(self) -> (char, char) { + match self { + Self::Loop(_) => WrappingTokens::PARENTHESES, + Self::Tuple => WrappingTokens::SQUARE_BRACKETS, + Self::Slope(_, _) => WrappingTokens::BRACKETS, + WrapperKind::Comment => WrappingTokens::SEMICOLON_COMMA, + } + } +} + impl Token<(char, char)> for QuickModifier { fn token(self) -> (char, char) { match self { diff --git a/src/bng/score/lex/lexer.rs b/src/bng/score/lex/lexer.rs index 1c9690a..2a02856 100644 --- a/src/bng/score/lex/lexer.rs +++ b/src/bng/score/lex/lexer.rs @@ -1,11 +1,7 @@ -use nom::{ - branch::alt, character::complete::char, combinator::value, sequence::delimited, IResult, Parser, -}; +use nom::{branch::alt, character::complete::char, combinator::value, IResult, Parser}; use crate::bng::score::QuickModifier; -use super::Token; - pub(crate) trait Parse: Sized { fn parse(input: &str) -> IResult<&str, Self>; }