move sheet space parsing to whole string parsing, add parse until eof
This commit is contained in:
parent
c5a1540e0f
commit
2038ba2893
2 changed files with 65 additions and 57 deletions
|
@ -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(¬es))(&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(¬es),
|
||||||
.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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
))
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue