Skip to main content

parze_declare/
lib.rs

1#![feature(proc_macro_def_site, proc_macro_quote, proc_macro_hygiene, trait_alias)]
2
3mod rule;
4mod expr;
5
6extern crate proc_macro;
7
8use proc_macro::{TokenStream, TokenTree};
9
10#[derive(Debug)]
11enum Error {
12    UnexpectedToken,
13    ExpectedAtom,
14    ExpectedPunct,
15}
16
17trait TokenStreamExt {
18    fn and(self, other: TokenStream) -> TokenStream;
19}
20
21impl TokenStreamExt for TokenStream {
22    fn and(mut self, other: TokenStream) -> TokenStream {
23        self.extend(Some(other));
24        self
25    }
26}
27
28impl TokenStreamExt for TokenTree {
29    fn and(self, other: TokenStream) -> TokenStream {
30        let mut this = TokenStream::from(self);
31        this.extend(Some(other));
32        this
33    }
34}
35
36trait TokenIter = Iterator<Item=TokenTree> + Clone;
37
38fn attempt<'a, 'c: 'a, I, R, E, F>(iter: &mut I, f: F) -> Result<R, E>
39    where
40        I: TokenIter,
41        F: FnOnce(&mut I) -> Result<R, E>,
42{
43    let mut iter2 = iter.clone();
44    let tok = f(&mut iter2)?;
45    *iter = iter2;
46    Ok(tok)
47}
48
49#[proc_macro]
50pub fn rule(stream: TokenStream) -> TokenStream {
51    rule::parse_rule(&mut stream.into_iter()).unwrap().into()
52}