code-product-lib 0.4.1

macro producing multiple expansions
Documentation




// pub trait MatchTokens{
//     fn match_tokens(&self, tokens: &str) -> Option<U>;
// }

    





// start = { product_entity | rust } ;
// rust = ?any_valid_rust_token? ;
// product_entity = "$" ( scope | definition | reference ) ;
// scope = product_scope | linear_scope ;
// product_scope = "{" { product_entity | rust } "}" ;
// linear_scope = "[" { product_entity | rust } "]" ;
// definition = "(" ( table_definition | normal_definition ) ")" ;
// normal_definition = [ "$"? name ":" ] ( items | item );
// table_definition = "[" headers items "]" ;
// headers = ( name ":" )+ ;
// items = ( "(" { rust } ")" )+ ;
// item = { rust } ;
// name = ?identifier? ;
// reference = ( ?number? | ?identifier? ) ;



// pub trait Parse {
//     
//     fn parse(i: Iter) -> Option<Iter>;
// }
// 
// 
// #[test]
// fn test_parse() {
//     let i = Iter::new("hello");
//     let i = i.parse();
//     assert_eq!(i, Some(Iter::new("ello")));
// }




/*
    // product_entity = "$" ( scope | definition | product_reference | rust ) ;
    // the last 'rust' catches the escaped '$$' as '$'.
    fn parse_product_entity(&self) -> bool {
        self.parse_product_char()
            && (self.parse_scope()
                || self.parse_definition()
                || self.parse_product_reference()
                || self.parse_rust())
    }
*/
// use proc_macro2::{TokenStream, TokenTree, Group, Ident, Punct, Spacing, Literal};
// 
// #[derive(Debug)]
// pub enum ParseError {
//     UnexpectedToken(String),
//     UnexpectedEndOfInput,
// }
// 
// pub struct Parser<'a> {
//     tokens: &'a [TokenTree],
//     current_index: usize,
// }
// 
// impl<'a> Parser<'a> {
//     pub fn new(tokens: &'a TokenStream) -> Self {
//         let tokens = tokens.clone().into_iter().collect::<Vec<_>>();
//         Parser {
//             tokens: &tokens,
//             current_index: 0,
//         }
//     }
// 
//     fn peek(&self) -> Option<&TokenTree> {
//         self.tokens.get(self.current_index)
//     }
// 
//     fn advance(&mut self) {
//         self.current_index += 1;
//     }
// 
//     fn consume(&mut self) -> Option<&TokenTree> {
//         let current = self.peek();
//         self.advance();
//         current
//     }
// 
//     pub fn parse(&mut self) -> Result<TokenStream, ParseError> {
//         let mut result = TokenStream::new();
//         while let Some(token) = self.peek() {
//             match token {
//                 TokenTree::Group(group) => {
//                     let parsed_group = self.parse_group(group)?;
//                     result.extend(parsed_group);
//                 }
//                 TokenTree::Ident(_) | TokenTree::Punct(_) | TokenTree::Literal(_) => {
//                     result.extend(Some(token.clone()));
//                     self.advance();
//                 }
//             }
//         }
//         Ok(result)
//     }
// 
//     fn parse_group(&mut self, group: &Group) -> Result<TokenStream, ParseError> {
//         let mut nested_parser = Parser::new(&group.stream());
//         let parsed_stream = nested_parser.parse()?;
//         Ok(parsed_stream)
//     }
// }
// 
// fn main() {
//     let input = quote::quote! {
//         some_ident "literal" + (nested_ident)
//     };
// 
//     let parsed_tokens = {
//         let tokens: TokenStream = input.into();
//         let mut parser = Parser::new(&tokens);
//         match parser.parse() {
//             Ok(parsed_stream) => parsed_stream,
//             Err(err) => {
//                 eprintln!("Error parsing: {:?}", err);
//                 TokenStream::new()
//             }
//         }
//     };
// 
//     println!("Parsed tokens: {}", parsed_tokens);
// }