Playing with proc macros

This commit is contained in:
2025-05-23 22:12:24 -07:00
parent 856f817dbe
commit 59392ccad2
8 changed files with 64 additions and 0 deletions
+1
View File
@@ -0,0 +1 @@
/target
+10
View File
@@ -0,0 +1,10 @@
[package]
name = "peg_macro"
version = "0.1.0"
edition = "2024"
[lib]
proc-macro = true
[dependencies]
quote = "1.0.40"
+27
View File
@@ -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()
}