Playing with proc macros
This commit is contained in:
@@ -0,0 +1 @@
|
||||
/target
|
||||
@@ -0,0 +1,10 @@
|
||||
[package]
|
||||
name = "peg_macro"
|
||||
version = "0.1.0"
|
||||
edition = "2024"
|
||||
|
||||
[lib]
|
||||
proc-macro = true
|
||||
|
||||
[dependencies]
|
||||
quote = "1.0.40"
|
||||
@@ -0,0 +1,27 @@
|
||||
use proc_macro::TokenStream;
|
||||
use quote::quote;
|
||||
|
||||
#[proc_macro]
|
||||
pub fn grammar(ts: TokenStream) -> TokenStream {
|
||||
let token = ts.into_iter().next().expect("must have at least one token");
|
||||
let result = match token {
|
||||
proc_macro::TokenTree::Literal(literal) => {
|
||||
let s = literal.to_string();
|
||||
let c = s.chars().next().unwrap_or('\0');
|
||||
match c {
|
||||
'0'..'9' => {
|
||||
let val: usize = s.parse().unwrap();
|
||||
quote! { Some(crate::peg::Foo::Bar(#val)) }
|
||||
}
|
||||
'"' => {
|
||||
let inner = &s[1..s.len() - 1];
|
||||
quote! { Some(crate::peg::Foo::Baz(#inner.into())) }
|
||||
}
|
||||
_ => quote! { None },
|
||||
}
|
||||
}
|
||||
_ => quote! { None },
|
||||
};
|
||||
|
||||
quote! { println!("Hello, world! {:?}", #result); }.into()
|
||||
}
|
||||
Reference in New Issue
Block a user