You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
49 lines
1.2 KiB
Rust
49 lines
1.2 KiB
Rust
#![feature(proc_macro)]
|
|
#![crate_type = "proc-macro"]
|
|
extern crate proc_macro;
|
|
#[macro_use] extern crate syn;
|
|
#[macro_use] extern crate quote;
|
|
|
|
use proc_macro::TokenStream;
|
|
use syn::{Ident, Type, Expr, WhereClause, TypeSlice, Path};
|
|
use syn::synom::Synom;
|
|
|
|
struct MiscSyntax {
|
|
id: Ident,
|
|
ty: Type,
|
|
expr: Expr,
|
|
where_clause: WhereClause,
|
|
type_slice: TypeSlice,
|
|
path: Path
|
|
}
|
|
|
|
impl Synom for MiscSyntax {
|
|
named!(parse -> Self, do_parse!(
|
|
keyword!(where) >>
|
|
keyword!(while) >>
|
|
id: syn!(Ident) >>
|
|
punct!(:) >>
|
|
ty: syn!(Type) >>
|
|
punct!(>>) >>
|
|
expr: syn!(Expr) >>
|
|
punct!(;) >>
|
|
where_clause: syn!(WhereClause) >>
|
|
punct!(;) >>
|
|
type_slice: syn!(TypeSlice) >>
|
|
punct!(;) >>
|
|
path: syn!(Path) >>
|
|
(MiscSyntax { id, ty, expr, where_clause, type_slice, path })
|
|
));
|
|
}
|
|
|
|
#[proc_macro]
|
|
pub fn misc_syntax(input: TokenStream) -> TokenStream {
|
|
let m: MiscSyntax = syn::parse(input).expect("expected Miscellaneous Syntax");
|
|
let MiscSyntax { id, ty, expr, where_clause, type_slice, path } = m;
|
|
|
|
(quote! {
|
|
let #id: #ty = #expr;
|
|
println!("variable = {}", #id);
|
|
}).into()
|
|
}
|