Repair macro for syndicate patterns involving dicts and seqs

This commit is contained in:
Tony Garnock-Jones 2023-01-30 09:38:43 +01:00
parent f3424c160d
commit 3dea29ffe4
1 changed files with 6 additions and 13 deletions

View File

@ -126,7 +126,7 @@ fn skip_commas(mut c: Cursor) -> Cursor {
}
}
fn parse_group_inner<'c, R, F: Fn(Cursor<'c>) -> Result<(R, Cursor<'c>)>>(
fn parse_group<'c, R, F: Fn(Cursor<'c>) -> Result<(R, Cursor<'c>)>>(
mut c: Cursor<'c>,
f: F,
after: Cursor<'c>,
@ -143,15 +143,6 @@ fn parse_group_inner<'c, R, F: Fn(Cursor<'c>) -> Result<(R, Cursor<'c>)>>(
}
}
fn parse_group<'c, R, F: Fn(Cursor<'c>) -> Result<(R, Cursor<'c>)>>(
d: Delimiter,
f: F,
c: Cursor<'c>,
) -> Result<(Vec<R>, Cursor<'c>)> {
let (inner, _, after) = c.group(d).unwrap();
parse_group_inner(inner, f, after)
}
fn parse_kv(c: Cursor) -> Result<((Stx, Stx), Cursor)> {
let (k, c) = parse1(c)?;
if let Some((':', c)) = punct_char(c) {
@ -208,8 +199,6 @@ fn parse1(c: Cursor) -> Result<(Stx, Cursor)> {
} else {
Ok((Stx::Rec(Box::new(q.remove(0)), q), c))
}),
'{' => parse_group(Delimiter::Brace, parse_kv, c).map(|(q,c)| (Stx::Dict(q),c)),
'[' => parse_group(Delimiter::Bracket, parse1, c).map(|(q,c)| (Stx::Seq(q),c)),
'$' => {
let (maybe_id, next) = adjacent_ident(p.span().end(), next);
let (maybe_type, next) = if let Some((':', next)) = punct_char(next) {
@ -229,7 +218,7 @@ fn parse1(c: Cursor) -> Result<(Stx, Cursor)> {
}
'#' => {
if let Some((inner, _, next)) = next.group(Delimiter::Brace) {
parse_group_inner(inner, parse1, next).map(|(q,c)| (Stx::Set(q),c))
parse_group(inner, parse1, next).map(|(q,c)| (Stx::Set(q),c))
} else if let Some((inner, _, next)) = next.group(Delimiter::Parenthesis) {
Ok((Stx::Subst(inner.token_stream()), next))
} else if let Some((tt, next)) = next.token_tree() {
@ -267,6 +256,10 @@ fn parse1(c: Cursor) -> Result<(Stx, Cursor)> {
Lit::Verbatim(_) => return Err(Error::new(c.span(), "Verbatim literals not supported")),
};
Ok((Stx::Atom(v), next))
} else if let Some((inner, _, after)) = c.group(Delimiter::Brace) {
parse_group(inner, parse_kv, after).map(|(q,c)| (Stx::Dict(q),c))
} else if let Some((inner, _, after)) = c.group(Delimiter::Bracket) {
parse_group(inner, parse1, after).map(|(q,c)| (Stx::Seq(q),c))
} else {
Err(Error::new(c.span(), "Unexpected input"))
}