From 4a065db1e679f249a925270a3089c9745b7f56d2 Mon Sep 17 00:00:00 2001 From: Chris Mounce Date: Sat, 31 May 2025 21:49:50 -0700 Subject: [PATCH] Track icase with booleans, not separate enum vals --- peg_macro/src/lib.rs | 51 ++++++++++++++++++++------------------------ 1 file changed, 23 insertions(+), 28 deletions(-) diff --git a/peg_macro/src/lib.rs b/peg_macro/src/lib.rs index 7a62083..9bec687 100644 --- a/peg_macro/src/lib.rs +++ b/peg_macro/src/lib.rs @@ -24,14 +24,12 @@ enum Term { AnyChar, Choice(Vec), EOI, - Literal(String), - LiteralI(String), + Literal(String, bool), NegLookahead(Box), Optional(Box), Plus(Box), PosLookahead(Box), - Range(RangeInclusive), - RangeI(RangeInclusive), + Range(RangeInclusive, bool), Rule(Ident), Sequence(Vec), Star(Box), @@ -66,11 +64,8 @@ impl Parse for Term { input.parse::()?; let end_lit = input.parse::()?; let range = start_lit.value()..=end_lit.value(); - if end_lit.suffix() == "i" { - Ok(Term::RangeI(range)) - } else { - Ok(Term::Range(range)) - } + let icase = end_lit.suffix() == "i"; + Ok(Term::Range(range, icase)) } fn parse_atom(input: ParseStream) -> syn::Result { @@ -85,11 +80,8 @@ impl Parse for Term { } } else if look.peek(LitStr) { let lit = input.parse::()?; - if lit.suffix() == "i" { - Ok(Term::LiteralI(lit.value())) - } else { - Ok(Term::Literal(lit.value())) - } + let icase = lit.suffix() == "i"; + Ok(Term::Literal(lit.value(), icase)) } else if look.peek(LitChar) { parse_range(input) } else if look.peek(syn::token::Paren) { @@ -168,12 +160,16 @@ impl Term { Term::Rule(ident) => quote! { #ident(p) }, - Term::Literal(lit_str) => quote! { - p.literal(#lit_str) - }, - Term::LiteralI(lit_str) => quote! { - p.literal_i(#lit_str) - }, + Term::Literal(lit_str, icase) => { + let method = if *icase { + quote! { literal_i } + } else { + quote! { literal } + }; + quote! { + p.#method(#lit_str) + } + } Term::Sequence(terms) => { let expr = terms .iter() @@ -227,16 +223,15 @@ impl Term { } } } - Term::Range(range) => { + Term::Range(range, icase) => { let (lo, hi) = (range.start(), range.end()); + let method = if *icase { + quote! { range_i } + } else { + quote! { range } + }; quote! { - p.range(#lo..=#hi) - } - } - Term::RangeI(range) => { - let (lo, hi) = (range.start(), range.end()); - quote! { - p.range_i(#lo..=#hi) + p.#method(#lo..=#hi) } } Term::NegLookahead(term) => {