diff --git a/examples/ex1.rs b/examples/ex1.rs index 5e525e58ada2aae02d2f869ae3d3a01c2156523f..e85065a0ceb187a023d3217b84d540cb55b48971 100644 --- a/examples/ex1.rs +++ b/examples/ex1.rs @@ -1,12 +1,14 @@ #![feature(proc_macro)] extern crate parsetest; -use parsetest::{app, mat}; -// use mat::traits::Matrix; +use parsetest::mylit; fn main() { println!("here"); - let v = app!(1); + let v = mylit!(99); + println!("v {}", v); + + let v = mylit!(102); println!("v {}", v); } diff --git a/src/lib.rs b/src/lib.rs index a08ec23b422691d0b87d1895e9c04dd222a0553f..66d0fe2dc726cdff226334710a6c88572965487a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -11,85 +11,31 @@ use syn::punctuated::Punctuated; use syn::spanned::Spanned; use syn::synom::Synom; use syn::{Expr, ExprArray, Ident, LitInt}; +use quote::ToTokens; -struct Mat { - rows: Punctuated<ExprArray, Token![,]>, -} +use std::convert::From; -struct App { +/// MyLit +struct MyLit { val: LitInt, } -impl Synom for Mat { +impl Synom for MyLit { named!(parse -> Self, do_parse!( - rows: call!(Punctuated::parse_terminated_nonempty) >> (Mat { rows }) + val: call!(LitInt::parse) >> (MyLit { val }) )); } -/// A macro to construct matrices #[proc_macro] -pub fn mat(input: TokenStream) -> TokenStream { - let mat: Mat = syn::parse(input).unwrap(); - - // check consistent number of columns - let nrows = mat.rows.len(); - let ncols = mat.rows.iter().next().expect("BUG: zero rows").elems.len(); - - for row in mat.rows.iter() { - for (i, expr) in row.elems.iter().enumerate() { - if i >= ncols { - expr.span() - .unstable() - .error(format!("expected {} elements", ncols,)) - .emit(); - } - } +pub fn mylit(input: TokenStream) -> TokenStream { + let v: MyLit = syn::parse(input).unwrap(); + let value: u32 = v.val.value() as u32; + if !(10 <= value && value < 100) { + v.val + .span() + .unstable() + .error(format!("expected literal 10 <= x < 100, got {}", value,)) + .emit(); } - - let size = nrows * ncols; - let elems: Vec<&Expr> = mat.rows.iter().flat_map(|row| row.elems.iter()).collect(); - - let nrows_ty = Ident::from(format!("U{}", nrows)); - let ncols_ty = Ident::from(format!("U{}", ncols)); - - quote!(unsafe { - extern crate mat; - mat::Mat::<_, [_; #size], mat::typenum::#nrows_ty, mat::typenum::#ncols_ty>::new([#(#elems,)*]) - }).into() -} - -impl Synom for App { - named!(parse -> Self, do_parse!( - val: call!(LitInt::parse) >> (App { val }) - )); -} - -/// A -#[proc_macro] -pub fn app(input: TokenStream) -> TokenStream { - let val: App = syn::parse(input).unwrap(); - - // // check consistent number of columns - // let nrows = mat.rows.len(); - // let ncols = mat.rows.iter().next().expect("BUG: zero rows").elems.len(); - - // for row in mat.rows.iter() { - // for (i, expr) in row.elems.iter().enumerate() { - // if i >= ncols { - // expr.span() - // .unstable() - // .error(format!("expected {} elements", ncols,)) - // .emit(); - // } - // } - // } - - // let size = nrows * ncols; - // let elems: Vec<&Expr> = mat.rows.iter().flat_map(|row| row.elems.iter()).collect(); - - // let nrows_ty = Ident::from(format!("U{}", nrows)); - // let ncols_ty = Ident::from(format!("U{}", ncols)); - println!("val {:?}", val); - - quote!().into() + From::from(v.val.into_tokens()) }