From f8341503c778db92f46fa9f6f368a2013e4c0c1a Mon Sep 17 00:00:00 2001 From: Nadrieril Date: Tue, 17 Sep 2019 19:59:22 +0200 Subject: Change invocation syntax of pest_consume::parser macro --- pest_consume_macros/src/make_parser.rs | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) (limited to 'pest_consume_macros/src') diff --git a/pest_consume_macros/src/make_parser.rs b/pest_consume_macros/src/make_parser.rs index c30b12f..5bf8fe3 100644 --- a/pest_consume_macros/src/make_parser.rs +++ b/pest_consume_macros/src/make_parser.rs @@ -37,6 +37,8 @@ impl VecPartitionFilterExt for Vec { mod kw { syn::custom_keyword!(shortcut); + syn::custom_keyword!(rule); + syn::custom_keyword!(parser); } struct MakeParserAttrs { @@ -72,9 +74,32 @@ struct ParsedFn<'a> { impl Parse for MakeParserAttrs { fn parse(input: ParseStream) -> Result { - let parser = input.parse()?; - let _: Token![,] = input.parse()?; - let rule_enum = input.parse()?; + // By default, the pest parser is the same type as the pest_consume one + let mut parser = parse_quote!(Self); + // By default, use the `Rule` type in scope + let mut rule_enum = parse_quote!(Rule); + + while !input.is_empty() { + let lookahead = input.lookahead1(); + if lookahead.peek(kw::parser) { + let _: kw::parser = input.parse()?; + let _: Token![=] = input.parse()?; + parser = input.parse()?; + } else if lookahead.peek(kw::rule) { + let _: kw::rule = input.parse()?; + let _: Token![=] = input.parse()?; + rule_enum = input.parse()?; + } else { + return Err(lookahead.error()); + } + + if input.peek(Token![,]) { + let _: Token![,] = input.parse()?; + } else { + break; + } + } + Ok(MakeParserAttrs { parser, rule_enum }) } } -- cgit v1.2.3