move sheet space parsing to whole string parsing, add parse until eof

This commit is contained in:
Breval Ferrari 2024-10-31 13:31:28 -04:00
parent c5a1540e0f
commit 2038ba2893
No known key found for this signature in database
GPG key ID: 6FED68D87C479A59
2 changed files with 65 additions and 57 deletions

View file

@ -6,7 +6,13 @@ use bng_macros::{QuickModifierParser, SlopeModifierParser};
use derive_new::new; use derive_new::new;
use derived_deref::Deref; use derived_deref::Deref;
use lex::lexer::flat_atom_parser; use lex::lexer::flat_atom_parser;
use nom::multi::many0; use nom::{
branch::alt,
character::complete::char,
combinator::eof,
multi::many0,
sequence::{preceded, terminated},
};
#[cfg(debug_assertions)] #[cfg(debug_assertions)]
use serde::Serialize; use serde::Serialize;
use serde::{ use serde::{
@ -98,16 +104,22 @@ impl<'de> Deserialize<'de> for Atoms {
const FIELDS: &[&str] = &["notes", "sheet"]; const FIELDS: &[&str] = &["notes", "sheet"];
let NotesSheet { notes, sheet } = let NotesSheet { notes, sheet } =
deserializer.deserialize_struct("NotesSheet", FIELDS, NotesSheetVisitor)?; deserializer.deserialize_struct("NotesSheet", FIELDS, NotesSheetVisitor)?;
let x = many0(flat_atom_parser(&notes))(&sheet) let x = terminated(
.map_err(|e| e.to_string()) many0(preceded(
.map_err(AtomsSerializeError::Parsing) many0(alt((char('\t'), char(' '), char('\n'), char('\r')))),
.map_err(de::Error::custom) flat_atom_parser(&notes),
.and_then(|(_, v)| { )),
inflate(v) eof,
.map_err(AtomsSerializeError::from) )(&sheet)
.map_err(de::Error::custom) .map_err(|e| e.to_string())
}) .map_err(AtomsSerializeError::Parsing)
.map(Atoms); .map_err(de::Error::custom)
.and_then(|(_, v)| {
inflate(v)
.map_err(AtomsSerializeError::from)
.map_err(de::Error::custom)
})
.map(Atoms);
x x
} }
} }

View file

@ -39,53 +39,49 @@ impl Parse for Modifier {
} }
pub fn flat_atom_parser(notes: &str) -> impl Parser<&str, FlatAtom, nom::error::Error<&str>> { pub fn flat_atom_parser(notes: &str) -> impl Parser<&str, FlatAtom, nom::error::Error<&str>> {
preceded( alt((
many0(alt((char('\t'), char(' '), char('\n'), char('\r')))), map_res(map_opt(one_of(notes), |c| notes.find(c)), u8::try_from).map(FlatAtom::Note),
alt(( value(FlatAtom::Rest, char(Atom::REST)),
map_res(map_opt(one_of(notes), |c| notes.find(c)), u8::try_from).map(FlatAtom::Note), value(FlatAtom::StartHere, char(Atom::START_HERE)),
value(FlatAtom::Rest, char(Atom::REST)), preceded(char(Atom::MODIFIER), Modifier::parse).map(FlatAtom::Modifier),
value(FlatAtom::StartHere, char(Atom::START_HERE)), QuickModifier::parse.map(FlatAtom::QuickModifier),
preceded(char(Atom::MODIFIER), Modifier::parse).map(FlatAtom::Modifier), preceded(
QuickModifier::parse.map(FlatAtom::QuickModifier), char(Atom::LOOP.0),
map_opt(opt(u8), |n| {
if let Some(n) = n {
NonZeroU8::new(n)
} else {
unsafe { Some(NonZeroU8::new_unchecked(2)) }
}
}),
)
.map(FlatAtom::LoopStarts),
value(FlatAtom::LoopEnds, char(Atom::LOOP.1)),
value(FlatAtom::TupleStarts, char(Atom::TUPLE.0)),
value(FlatAtom::TupleEnds, char(Atom::TUPLE.1)),
terminated(
preceded( preceded(
char(Atom::LOOP.0), char(Atom::SLOPE.0),
map_opt(opt(u8), |n| { separated_pair(
if let Some(n) = n { SlopeModifier::parse,
NonZeroU8::new(n) char(' '),
} else { map_res(take_till1(|c| c == ','), |s: &str| {
unsafe { Some(NonZeroU8::new_unchecked(2)) } s.parse()
} .map_err(|_| nom::error::Error::new(s, nom::error::ErrorKind::Verify))
}), }),
)
.map(FlatAtom::LoopStarts),
value(FlatAtom::LoopEnds, char(Atom::LOOP.1)),
value(FlatAtom::TupleStarts, char(Atom::TUPLE.0)),
value(FlatAtom::TupleEnds, char(Atom::TUPLE.1)),
terminated(
preceded(
char(Atom::SLOPE.0),
separated_pair(
SlopeModifier::parse,
char(' '),
map_res(take_till1(|c| c == ','), |s: &str| {
s.parse().map_err(|_| {
nom::error::Error::new(s, nom::error::ErrorKind::Verify)
})
}),
),
),
char(','),
)
.map(|(sm, i)| FlatAtom::SlopeStarts(sm, i)),
value(FlatAtom::SlopeEnds, char(Atom::SLOPE.1)),
value(
FlatAtom::Comment,
delimited(
char(Atom::COMMENT.0),
take_till(|c| c == Atom::COMMENT.1),
char(Atom::COMMENT.1),
), ),
), ),
)), char(','),
) )
.map(|(sm, i)| FlatAtom::SlopeStarts(sm, i)),
value(FlatAtom::SlopeEnds, char(Atom::SLOPE.1)),
value(
FlatAtom::Comment,
delimited(
char(Atom::COMMENT.0),
take_till(|c| c == Atom::COMMENT.1),
char(Atom::COMMENT.1),
),
),
))
} }