Track icase with booleans, not separate enum vals
This commit is contained in:
+23
-28
@@ -24,14 +24,12 @@ enum Term {
|
|||||||
AnyChar,
|
AnyChar,
|
||||||
Choice(Vec<Term>),
|
Choice(Vec<Term>),
|
||||||
EOI,
|
EOI,
|
||||||
Literal(String),
|
Literal(String, bool),
|
||||||
LiteralI(String),
|
|
||||||
NegLookahead(Box<Term>),
|
NegLookahead(Box<Term>),
|
||||||
Optional(Box<Term>),
|
Optional(Box<Term>),
|
||||||
Plus(Box<Term>),
|
Plus(Box<Term>),
|
||||||
PosLookahead(Box<Term>),
|
PosLookahead(Box<Term>),
|
||||||
Range(RangeInclusive<char>),
|
Range(RangeInclusive<char>, bool),
|
||||||
RangeI(RangeInclusive<char>),
|
|
||||||
Rule(Ident),
|
Rule(Ident),
|
||||||
Sequence(Vec<Term>),
|
Sequence(Vec<Term>),
|
||||||
Star(Box<Term>),
|
Star(Box<Term>),
|
||||||
@@ -66,11 +64,8 @@ impl Parse for Term {
|
|||||||
input.parse::<Token![..]>()?;
|
input.parse::<Token![..]>()?;
|
||||||
let end_lit = input.parse::<LitChar>()?;
|
let end_lit = input.parse::<LitChar>()?;
|
||||||
let range = start_lit.value()..=end_lit.value();
|
let range = start_lit.value()..=end_lit.value();
|
||||||
if end_lit.suffix() == "i" {
|
let icase = end_lit.suffix() == "i";
|
||||||
Ok(Term::RangeI(range))
|
Ok(Term::Range(range, icase))
|
||||||
} else {
|
|
||||||
Ok(Term::Range(range))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn parse_atom(input: ParseStream) -> syn::Result<Term> {
|
fn parse_atom(input: ParseStream) -> syn::Result<Term> {
|
||||||
@@ -85,11 +80,8 @@ impl Parse for Term {
|
|||||||
}
|
}
|
||||||
} else if look.peek(LitStr) {
|
} else if look.peek(LitStr) {
|
||||||
let lit = input.parse::<LitStr>()?;
|
let lit = input.parse::<LitStr>()?;
|
||||||
if lit.suffix() == "i" {
|
let icase = lit.suffix() == "i";
|
||||||
Ok(Term::LiteralI(lit.value()))
|
Ok(Term::Literal(lit.value(), icase))
|
||||||
} else {
|
|
||||||
Ok(Term::Literal(lit.value()))
|
|
||||||
}
|
|
||||||
} else if look.peek(LitChar) {
|
} else if look.peek(LitChar) {
|
||||||
parse_range(input)
|
parse_range(input)
|
||||||
} else if look.peek(syn::token::Paren) {
|
} else if look.peek(syn::token::Paren) {
|
||||||
@@ -168,12 +160,16 @@ impl Term {
|
|||||||
Term::Rule(ident) => quote! {
|
Term::Rule(ident) => quote! {
|
||||||
#ident(p)
|
#ident(p)
|
||||||
},
|
},
|
||||||
Term::Literal(lit_str) => quote! {
|
Term::Literal(lit_str, icase) => {
|
||||||
p.literal(#lit_str)
|
let method = if *icase {
|
||||||
},
|
quote! { literal_i }
|
||||||
Term::LiteralI(lit_str) => quote! {
|
} else {
|
||||||
p.literal_i(#lit_str)
|
quote! { literal }
|
||||||
},
|
};
|
||||||
|
quote! {
|
||||||
|
p.#method(#lit_str)
|
||||||
|
}
|
||||||
|
}
|
||||||
Term::Sequence(terms) => {
|
Term::Sequence(terms) => {
|
||||||
let expr = terms
|
let expr = terms
|
||||||
.iter()
|
.iter()
|
||||||
@@ -227,16 +223,15 @@ impl Term {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Term::Range(range) => {
|
Term::Range(range, icase) => {
|
||||||
let (lo, hi) = (range.start(), range.end());
|
let (lo, hi) = (range.start(), range.end());
|
||||||
|
let method = if *icase {
|
||||||
|
quote! { range_i }
|
||||||
|
} else {
|
||||||
|
quote! { range }
|
||||||
|
};
|
||||||
quote! {
|
quote! {
|
||||||
p.range(#lo..=#hi)
|
p.#method(#lo..=#hi)
|
||||||
}
|
|
||||||
}
|
|
||||||
Term::RangeI(range) => {
|
|
||||||
let (lo, hi) = (range.start(), range.end());
|
|
||||||
quote! {
|
|
||||||
p.range_i(#lo..=#hi)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Term::NegLookahead(term) => {
|
Term::NegLookahead(term) => {
|
||||||
|
|||||||
Reference in New Issue
Block a user