replace Token trait with consts

This commit is contained in:
Breval Ferrari 2024-10-12 16:27:27 -04:00
parent 040bb4ecb3
commit 9e0ead7605
No known key found for this signature in database
GPG key ID: 6FED68D87C479A59
3 changed files with 60 additions and 60 deletions

View file

@ -1,7 +1,8 @@
extern crate proc_macro;
use proc_macro::TokenStream;
use proc_macro2::Span;
use quote::quote;
use syn::{parse_macro_input, Data, DataEnum, DeriveInput, Fields};
use syn::{parse_macro_input, Data, DataEnum, DeriveInput, Fields, Ident};
#[proc_macro_derive(ModifierParser)]
pub fn modifier_parser(input: TokenStream) -> TokenStream {
@ -31,11 +32,12 @@ fn impl_modifier_parser(ast: DeriveInput) -> TokenStream {
} else {
panic!("Expected unnamed fields in enum variants");
};
let const_name =
Ident::new(&variant.ident.to_string().to_uppercase(), Span::call_site());
quote! {
nom::combinator::map(
nom::sequence::preceded(
nom::character::complete::char(#name::#variant_name(Default::default()).token()),
nom::character::complete::char(#name::#const_name),
nom::character::complete::#variant_type
),
#name::#variant_name
@ -63,15 +65,15 @@ fn impl_slope_modifier_parser(ast: DeriveInput) -> TokenStream {
if let Data::Enum(DataEnum { variants, .. }) = ast.data {
let match_arms = variants.iter().map(|variant| {
let variant_name = &variant.ident;
let const_name = Ident::new(&variant.ident.to_string().to_uppercase(),Span::call_site());
quote! {
tag(#name::#variant_name)
nom::combinator::value(#name::#variant_name, nom::character::complete::char(SlopeModifier::#const_name))
}
});
quote! {
impl lex::lexer::Parse for #name {
fn parse(input: &str) -> nom::IResult<&str, #name> {
let tag = |sm: SlopeModifier| nom::combinator::value(sm, nom::character::complete::char(sm.token()));
nom::branch::alt((
#(#match_arms),*
))(input)
@ -89,18 +91,19 @@ fn impl_quick_modifier_parser(ast: DeriveInput) -> TokenStream {
if let Data::Enum(DataEnum { variants, .. }) = ast.data {
let match_arms = variants.iter().map(|variant| {
let variant_name = &variant.ident;
let const_name =
Ident::new(&variant.ident.to_string().to_uppercase(), Span::call_site());
quote! {
nom::combinator::map(
nom::branch::alt(
(
nom::combinator::value(
true,
nom::character::complete::char(#name::#variant_name(Default::default()).token().0)
lex::MORE,
nom::character::complete::char(#name::#const_name.0)
),
nom::combinator::value(
false,
nom::character::complete::char(#name::#variant_name(Default::default()).token().1)
lex::LESS,
nom::character::complete::char(#name::#const_name.1)
)
)
),