--- /dev/null
+// Generated by rust-peg. Do not edit.
+pub mod peg {
+ #[allow(unused_imports)]
+ use super::*;
+ type Input = FlatTokenStream;
+ type PositionRepr = <Input as ::peg::Parse>::PositionRepr;
+ #[allow(unused_parens)]
+ struct ParseState<'input> {
+ _phantom: ::std::marker::PhantomData<(&'input ())>,
+ primary_cache: ::std::collections::HashMap<usize, ::peg::RuleResult<SpannedExpr>>,
+ }
+ impl<'input> ParseState<'input> {
+ fn new() -> ParseState<'input> {
+ ParseState {
+ _phantom: ::std::marker::PhantomData,
+ primary_cache: ::std::collections::HashMap::new(),
+ }
+ }
+ }
+ use crate::ast::Expr::*;
+ use crate::ast::*;
+ use crate::tokens::FlatTokenStream;
+ use proc_macro2::{Delimiter, Group, Ident, Literal, Span, TokenStream};
+ pub fn peg_grammar<'input>(
+ __input: &'input Input,
+ ) -> ::std::result::Result<Grammar, ::peg::error::ParseError<PositionRepr>> {
+ #![allow(non_snake_case, unused)]
+ let mut __err_state = ::peg::error::ErrorState::new(::peg::Parse::start(__input));
+ let mut __state = ParseState::new();
+ match __parse_peg_grammar(
+ __input,
+ &mut __state,
+ &mut __err_state,
+ ::peg::Parse::start(__input),
+ ) {
+ ::peg::RuleResult::Matched(__pos, __value) => {
+ if ::peg::Parse::is_eof(__input, __pos) {
+ return Ok(__value);
+ } else {
+ __err_state.mark_failure(__pos, "EOF");
+ }
+ }
+ _ => (),
+ }
+ __state = ParseState::new();
+ __err_state.reparse_for_error();
+ match __parse_peg_grammar(
+ __input,
+ &mut __state,
+ &mut __err_state,
+ ::peg::Parse::start(__input),
+ ) {
+ ::peg::RuleResult::<Grammar>::Matched(__pos, __value) => {
+ if ::peg::Parse::is_eof(__input, __pos) {
+ panic!(
+ "Parser is nondeterministic: succeeded when reparsing for error position"
+ );
+ } else {
+ __err_state.mark_failure(__pos, "EOF");
+ }
+ }
+ _ => (),
+ }
+ Err(__err_state.into_parse_error(__input))
+ }
+ fn __parse_peg_grammar<'input>(
+ __input: &'input Input,
+ __state: &mut ParseState<'input>,
+ __err_state: &mut ::peg::error::ErrorState,
+ __pos: usize,
+ ) -> ::peg::RuleResult<Grammar> {
+ #![allow(non_snake_case, unused, clippy::redundant_closure_call)]
+ {
+ let __seq_res = __parse_rust_doc_comment(__input, __state, __err_state, __pos);
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, doc) => {
+ let __seq_res = __parse_rust_visibility(__input, __state, __err_state, __pos);
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, visibility) => {
+ match ::peg::ParseLiteral::parse_string_literal(
+ __input, __pos, "grammar",
+ ) {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ let __seq_res =
+ __parse_IDENT(__input, __state, __err_state, __pos);
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, name) => {
+ let __seq_res = match __parse_rust_lifetime_params(
+ __input,
+ __state,
+ __err_state,
+ __pos,
+ ) {
+ ::peg::RuleResult::Matched(__newpos, __value) => {
+ ::peg::RuleResult::Matched(
+ __newpos,
+ Some(__value),
+ )
+ }
+ ::peg::RuleResult::Failed => {
+ ::peg::RuleResult::Matched(__pos, None)
+ }
+ };
+ match __seq_res {
+ ::peg::RuleResult::Matched(
+ __pos,
+ lifetime_params,
+ ) => {
+ let __seq_res = __parse_grammar_args(
+ __input,
+ __state,
+ __err_state,
+ __pos,
+ );
+ match __seq_res { :: peg :: RuleResult :: Matched (__pos , args) => { match :: peg :: ParseLiteral :: parse_string_literal (__input , __pos , "for") { :: peg :: RuleResult :: Matched (__pos , __val) => { { let __seq_res = { let str_start = __pos ; match match __parse_rust_type (__input , __state , __err_state , __pos) { :: peg :: RuleResult :: Matched (pos , _) => :: peg :: RuleResult :: Matched (pos , ()) , :: peg :: RuleResult :: Failed => :: peg :: RuleResult :: Failed , } { :: peg :: RuleResult :: Matched (__newpos , _) => { :: peg :: RuleResult :: Matched (__newpos , :: peg :: ParseSlice :: parse_slice (__input , str_start , __newpos)) } , :: peg :: RuleResult :: Failed => :: peg :: RuleResult :: Failed , } } ; match __seq_res { :: peg :: RuleResult :: Matched (__pos , input_type) => { match :: peg :: ParseLiteral :: parse_string_literal (__input , __pos , "{") { :: peg :: RuleResult :: Matched (__pos , __val) => { { let __seq_res = { let mut __repeat_pos = __pos ; let mut __repeat_value = vec ! () ; loop { let __pos = __repeat_pos ; let __step_res = __parse_item (__input , __state , __err_state , __pos) ; match __step_res { :: peg :: RuleResult :: Matched (__newpos , __value) => { __repeat_pos = __newpos ; __repeat_value . push (__value) ; } , :: peg :: RuleResult :: Failed => { break ; } } } :: peg :: RuleResult :: Matched (__repeat_pos , __repeat_value) } ; match __seq_res { :: peg :: RuleResult :: Matched (__pos , items) => { match :: peg :: ParseLiteral :: parse_string_literal (__input , __pos , "}") { :: peg :: RuleResult :: Matched (__pos , __val) => { :: peg :: RuleResult :: Matched (__pos , (|| { Grammar { doc , visibility , name , lifetime_params , args , input_type , items } }) ()) } :: peg :: RuleResult :: Failed => { __err_state . mark_failure (__pos , "\"}\"") ; :: peg :: RuleResult :: Failed } } } :: peg :: RuleResult :: Failed => :: peg :: RuleResult :: Failed , } } } :: peg :: RuleResult :: Failed => { __err_state . mark_failure (__pos , "\"{\"") ; :: peg :: RuleResult :: Failed } } } :: peg :: RuleResult :: Failed => :: peg :: RuleResult :: Failed , } } } :: peg :: RuleResult :: Failed => { __err_state . mark_failure (__pos , "\"for\"") ; :: peg :: RuleResult :: Failed } } } :: peg :: RuleResult :: Failed => :: peg :: RuleResult :: Failed , }
+ }
+ ::peg::RuleResult::Failed => {
+ ::peg::RuleResult::Failed
+ }
+ }
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\"grammar\"");
+ ::peg::RuleResult::Failed
+ }
+ }
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ }
+ }
+ fn __parse_rust_lifetime_params<'input>(
+ __input: &'input Input,
+ __state: &mut ParseState<'input>,
+ __err_state: &mut ::peg::error::ErrorState,
+ __pos: usize,
+ ) -> ::peg::RuleResult<Vec<TokenStream>> {
+ #![allow(non_snake_case, unused, clippy::redundant_closure_call)]
+ match ::peg::ParseLiteral::parse_string_literal(__input, __pos, "<") {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ let __seq_res = {
+ let mut __repeat_pos = __pos;
+ let mut __repeat_value = vec![];
+ loop {
+ let __pos = __repeat_pos;
+ let __pos = if __repeat_value.is_empty() {
+ __pos
+ } else {
+ let __sep_res = match ::peg::ParseLiteral::parse_string_literal(
+ __input, __pos, ",",
+ ) {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ ::peg::RuleResult::Matched(__pos, __val)
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\",\"");
+ ::peg::RuleResult::Failed
+ }
+ };
+ match __sep_res {
+ ::peg::RuleResult::Matched(__newpos, _) => __newpos,
+ ::peg::RuleResult::Failed => break,
+ }
+ };
+ let __step_res = {
+ let str_start = __pos;
+ match match __parse_LIFETIME(__input, __state, __err_state, __pos) {
+ ::peg::RuleResult::Matched(pos, _) => {
+ ::peg::RuleResult::Matched(pos, ())
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ } {
+ ::peg::RuleResult::Matched(__newpos, _) => {
+ ::peg::RuleResult::Matched(
+ __newpos,
+ ::peg::ParseSlice::parse_slice(
+ __input, str_start, __newpos,
+ ),
+ )
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ };
+ match __step_res {
+ ::peg::RuleResult::Matched(__newpos, __value) => {
+ __repeat_pos = __newpos;
+ __repeat_value.push(__value);
+ }
+ ::peg::RuleResult::Failed => {
+ break;
+ }
+ }
+ }
+ if __repeat_value.len() >= 1 {
+ ::peg::RuleResult::Matched(__repeat_pos, __repeat_value)
+ } else {
+ ::peg::RuleResult::Failed
+ }
+ };
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, p) => {
+ match ::peg::ParseLiteral::parse_string_literal(__input, __pos, ">") {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ ::peg::RuleResult::Matched(__pos, (|| p)())
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\">\"");
+ ::peg::RuleResult::Failed
+ }
+ }
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\"<\"");
+ ::peg::RuleResult::Failed
+ }
+ }
+ }
+ fn __parse_grammar_args<'input>(
+ __input: &'input Input,
+ __state: &mut ParseState<'input>,
+ __err_state: &mut ::peg::error::ErrorState,
+ __pos: usize,
+ ) -> ::peg::RuleResult<Vec<(Ident, TokenStream)>> {
+ #![allow(non_snake_case, unused, clippy::redundant_closure_call)]
+ match ::peg::ParseLiteral::parse_string_literal(__input, __pos, "(") {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ let __seq_res = {
+ let mut __repeat_pos = __pos;
+ let mut __repeat_value = vec![];
+ loop {
+ let __pos = __repeat_pos;
+ let __pos = if __repeat_value.is_empty() {
+ __pos
+ } else {
+ let __sep_res = match ::peg::ParseLiteral::parse_string_literal(
+ __input, __pos, ",",
+ ) {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ ::peg::RuleResult::Matched(__pos, __val)
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\",\"");
+ ::peg::RuleResult::Failed
+ }
+ };
+ match __sep_res {
+ ::peg::RuleResult::Matched(__newpos, _) => __newpos,
+ ::peg::RuleResult::Failed => break,
+ }
+ };
+ let __step_res = {
+ let __seq_res = __parse_IDENT(__input, __state, __err_state, __pos);
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, i) => {
+ match ::peg::ParseLiteral::parse_string_literal(
+ __input, __pos, ":",
+ ) {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ let __seq_res = {
+ let str_start = __pos;
+ match match __parse_rust_type(
+ __input,
+ __state,
+ __err_state,
+ __pos,
+ ) {
+ ::peg::RuleResult::Matched(pos, _) => {
+ ::peg::RuleResult::Matched(pos, ())
+ }
+ ::peg::RuleResult::Failed => {
+ ::peg::RuleResult::Failed
+ }
+ } {
+ ::peg::RuleResult::Matched(__newpos, _) => {
+ ::peg::RuleResult::Matched(
+ __newpos,
+ ::peg::ParseSlice::parse_slice(
+ __input, str_start, __newpos,
+ ),
+ )
+ }
+ ::peg::RuleResult::Failed => {
+ ::peg::RuleResult::Failed
+ }
+ }
+ };
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, t) => {
+ ::peg::RuleResult::Matched(__pos, (|| (i, t))())
+ }
+ ::peg::RuleResult::Failed => {
+ ::peg::RuleResult::Failed
+ }
+ }
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\":\"");
+ ::peg::RuleResult::Failed
+ }
+ }
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ };
+ match __step_res {
+ ::peg::RuleResult::Matched(__newpos, __value) => {
+ __repeat_pos = __newpos;
+ __repeat_value.push(__value);
+ }
+ ::peg::RuleResult::Failed => {
+ break;
+ }
+ }
+ }
+ ::peg::RuleResult::Matched(__repeat_pos, __repeat_value)
+ };
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, args) => {
+ let __seq_res = match match ::peg::ParseLiteral::parse_string_literal(
+ __input, __pos, ",",
+ ) {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ ::peg::RuleResult::Matched(__pos, __val)
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\",\"");
+ ::peg::RuleResult::Failed
+ }
+ } {
+ ::peg::RuleResult::Matched(__newpos, _) => {
+ ::peg::RuleResult::Matched(__newpos, ())
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Matched(__pos, ()),
+ };
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, _) => {
+ match ::peg::ParseLiteral::parse_string_literal(__input, __pos, ")")
+ {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ ::peg::RuleResult::Matched(__pos, (|| args)())
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\")\"");
+ ::peg::RuleResult::Failed
+ }
+ }
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\"(\"");
+ ::peg::RuleResult::Failed
+ }
+ }
+ }
+ fn __parse_peg_rule<'input>(
+ __input: &'input Input,
+ __state: &mut ParseState<'input>,
+ __err_state: &mut ::peg::error::ErrorState,
+ __pos: usize,
+ ) -> ::peg::RuleResult<Rule> {
+ #![allow(non_snake_case, unused, clippy::redundant_closure_call)]
+ {
+ let __seq_res = __parse_rust_doc_comment(__input, __state, __err_state, __pos);
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, doc) => {
+ let __seq_res = __parse_cacheflag(__input, __state, __err_state, __pos);
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, cache) => {
+ let __seq_res =
+ __parse_no_eof_flag(__input, __state, __err_state, __pos);
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, no_eof) => {
+ let __seq_res = __parse_rust_visibility(
+ __input,
+ __state,
+ __err_state,
+ __pos,
+ );
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, visibility) => {
+ let __seq_res =
+ __parse_sp(__input, __state, __err_state, __pos);
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, span) => {
+ match ::peg::ParseLiteral::parse_string_literal(
+ __input, __pos, "rule",
+ ) {
+ ::peg::RuleResult::Matched(
+ __pos,
+ __val,
+ ) => {
+ let __seq_res = {
+ let __choice_res = {
+ let __seq_res = {
+ __err_state
+ .suppress_fail += 1;
+ let __assert_res = {
+ let __choice_res = match :: peg :: ParseLiteral :: parse_string_literal (__input , __pos , "_") { :: peg :: RuleResult :: Matched (__pos , __val) => { :: peg :: RuleResult :: Matched (__pos , __val) } :: peg :: RuleResult :: Failed => { __err_state . mark_failure (__pos , "\"_\"") ; :: peg :: RuleResult :: Failed } } ;
+ match __choice_res { :: peg :: RuleResult :: Matched (__pos , __value) => :: peg :: RuleResult :: Matched (__pos , __value) , :: peg :: RuleResult :: Failed => { let __choice_res = match :: peg :: ParseLiteral :: parse_string_literal (__input , __pos , "__") { :: peg :: RuleResult :: Matched (__pos , __val) => { :: peg :: RuleResult :: Matched (__pos , __val) } :: peg :: RuleResult :: Failed => { __err_state . mark_failure (__pos , "\"__\"") ; :: peg :: RuleResult :: Failed } } ; match __choice_res { :: peg :: RuleResult :: Matched (__pos , __value) => :: peg :: RuleResult :: Matched (__pos , __value) , :: peg :: RuleResult :: Failed => match :: peg :: ParseLiteral :: parse_string_literal (__input , __pos , "___") { :: peg :: RuleResult :: Matched (__pos , __val) => { :: peg :: RuleResult :: Matched (__pos , __val) } :: peg :: RuleResult :: Failed => { __err_state . mark_failure (__pos , "\"___\"") ; :: peg :: RuleResult :: Failed } } } } }
+ };
+ __err_state
+ .suppress_fail -= 1;
+ match __assert_res { :: peg :: RuleResult :: Matched (_ , __value) => :: peg :: RuleResult :: Matched (__pos , __value) , :: peg :: RuleResult :: Failed => :: peg :: RuleResult :: Failed , }
+ };
+ match __seq_res { :: peg :: RuleResult :: Matched (__pos , _) => { { let __seq_res = __parse_IDENT (__input , __state , __err_state , __pos) ; match __seq_res { :: peg :: RuleResult :: Matched (__pos , name) => { { let __seq_res = match match :: peg :: ParseLiteral :: parse_string_literal (__input , __pos , "(") { :: peg :: RuleResult :: Matched (__pos , __val) => { match :: peg :: ParseLiteral :: parse_string_literal (__input , __pos , ")") { :: peg :: RuleResult :: Matched (__pos , __val) => { :: peg :: RuleResult :: Matched (__pos , ()) } :: peg :: RuleResult :: Failed => { __err_state . mark_failure (__pos , "\")\"") ; :: peg :: RuleResult :: Failed } } } :: peg :: RuleResult :: Failed => { __err_state . mark_failure (__pos , "\"(\"") ; :: peg :: RuleResult :: Failed } } { :: peg :: RuleResult :: Matched (__newpos , _) => { :: peg :: RuleResult :: Matched (__newpos , ()) } , :: peg :: RuleResult :: Failed => { :: peg :: RuleResult :: Matched (__pos , ()) } , } ; match __seq_res { :: peg :: RuleResult :: Matched (__pos , _) => { :: peg :: RuleResult :: Matched (__pos , (|| { (name , None , Vec :: new ()) }) ()) } :: peg :: RuleResult :: Failed => :: peg :: RuleResult :: Failed , } } } :: peg :: RuleResult :: Failed => :: peg :: RuleResult :: Failed , } } } :: peg :: RuleResult :: Failed => :: peg :: RuleResult :: Failed , }
+ };
+ match __choice_res {
+ ::peg::RuleResult::Matched(
+ __pos,
+ __value,
+ ) => {
+ ::peg::RuleResult::Matched(
+ __pos, __value,
+ )
+ }
+ ::peg::RuleResult::Failed => {
+ let __seq_res =
+ __parse_IDENT(
+ __input,
+ __state,
+ __err_state,
+ __pos,
+ );
+ match __seq_res { :: peg :: RuleResult :: Matched (__pos , name) => { { let __seq_res = match __parse_rust_ty_params (__input , __state , __err_state , __pos) { :: peg :: RuleResult :: Matched (__newpos , __value) => { :: peg :: RuleResult :: Matched (__newpos , Some (__value)) } , :: peg :: RuleResult :: Failed => { :: peg :: RuleResult :: Matched (__pos , None) } , } ; match __seq_res { :: peg :: RuleResult :: Matched (__pos , ty_params) => { { let __seq_res = __parse_rule_params (__input , __state , __err_state , __pos) ; match __seq_res { :: peg :: RuleResult :: Matched (__pos , params) => { :: peg :: RuleResult :: Matched (__pos , (|| { (name , ty_params , params) }) ()) } :: peg :: RuleResult :: Failed => :: peg :: RuleResult :: Failed , } } } :: peg :: RuleResult :: Failed => :: peg :: RuleResult :: Failed , } } } :: peg :: RuleResult :: Failed => :: peg :: RuleResult :: Failed , }
+ }
+ }
+ };
+ match __seq_res {
+ ::peg::RuleResult::Matched(
+ __pos,
+ header,
+ ) => {
+ let __seq_res = match match :: peg :: ParseLiteral :: parse_string_literal (__input , __pos , "->") { :: peg :: RuleResult :: Matched (__pos , __val) => { { let __seq_res = { let str_start = __pos ; match match __parse_rust_type (__input , __state , __err_state , __pos) { :: peg :: RuleResult :: Matched (pos , _) => :: peg :: RuleResult :: Matched (pos , ()) , :: peg :: RuleResult :: Failed => :: peg :: RuleResult :: Failed , } { :: peg :: RuleResult :: Matched (__newpos , _) => { :: peg :: RuleResult :: Matched (__newpos , :: peg :: ParseSlice :: parse_slice (__input , str_start , __newpos)) } , :: peg :: RuleResult :: Failed => :: peg :: RuleResult :: Failed , } } ; match __seq_res { :: peg :: RuleResult :: Matched (__pos , t) => { :: peg :: RuleResult :: Matched (__pos , (|| { t }) ()) } :: peg :: RuleResult :: Failed => :: peg :: RuleResult :: Failed , } } } :: peg :: RuleResult :: Failed => { __err_state . mark_failure (__pos , "\"->\"") ; :: peg :: RuleResult :: Failed } } { :: peg :: RuleResult :: Matched (__newpos , __value) => { :: peg :: RuleResult :: Matched (__newpos , Some (__value)) } , :: peg :: RuleResult :: Failed => { :: peg :: RuleResult :: Matched (__pos , None) } , } ;
+ match __seq_res { :: peg :: RuleResult :: Matched (__pos , ret_type) => { match :: peg :: ParseLiteral :: parse_string_literal (__input , __pos , "=") { :: peg :: RuleResult :: Matched (__pos , __val) => { { let __seq_res = __parse_expression (__input , __state , __err_state , __pos) ; match __seq_res { :: peg :: RuleResult :: Matched (__pos , expr) => { { let __seq_res = match match :: peg :: ParseLiteral :: parse_string_literal (__input , __pos , ";") { :: peg :: RuleResult :: Matched (__pos , __val) => { :: peg :: RuleResult :: Matched (__pos , __val) } :: peg :: RuleResult :: Failed => { __err_state . mark_failure (__pos , "\";\"") ; :: peg :: RuleResult :: Failed } } { :: peg :: RuleResult :: Matched (__newpos , _) => { :: peg :: RuleResult :: Matched (__newpos , ()) } , :: peg :: RuleResult :: Failed => { :: peg :: RuleResult :: Matched (__pos , ()) } , } ; match __seq_res { :: peg :: RuleResult :: Matched (__pos , _) => { :: peg :: RuleResult :: Matched (__pos , (|| { Rule { span , doc , name : header . 0 , ty_params : header . 1 , params : header . 2 , expr , ret_type , visibility , no_eof , cache } }) ()) } :: peg :: RuleResult :: Failed => :: peg :: RuleResult :: Failed , } } } :: peg :: RuleResult :: Failed => :: peg :: RuleResult :: Failed , } } } :: peg :: RuleResult :: Failed => { __err_state . mark_failure (__pos , "\"=\"") ; :: peg :: RuleResult :: Failed } } } :: peg :: RuleResult :: Failed => :: peg :: RuleResult :: Failed , }
+ }
+ ::peg::RuleResult::Failed => {
+ ::peg::RuleResult::Failed
+ }
+ }
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state
+ .mark_failure(__pos, "\"rule\"");
+ ::peg::RuleResult::Failed
+ }
+ }
+ }
+ ::peg::RuleResult::Failed => {
+ ::peg::RuleResult::Failed
+ }
+ }
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ }
+ }
+ fn __parse_cacheflag<'input>(
+ __input: &'input Input,
+ __state: &mut ParseState<'input>,
+ __err_state: &mut ::peg::error::ErrorState,
+ __pos: usize,
+ ) -> ::peg::RuleResult<Option<Cache>> {
+ #![allow(non_snake_case, unused, clippy::redundant_closure_call)]
+ {
+ let __choice_res = match ::peg::ParseLiteral::parse_string_literal(__input, __pos, "#")
+ {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ match ::peg::ParseLiteral::parse_string_literal(__input, __pos, "[") {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ match ::peg::ParseLiteral::parse_string_literal(__input, __pos, "cache")
+ {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ match ::peg::ParseLiteral::parse_string_literal(
+ __input, __pos, "]",
+ ) {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ ::peg::RuleResult::Matched(
+ __pos,
+ (|| Some(Cache::Simple))(),
+ )
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\"]\"");
+ ::peg::RuleResult::Failed
+ }
+ }
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\"cache\"");
+ ::peg::RuleResult::Failed
+ }
+ }
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\"[\"");
+ ::peg::RuleResult::Failed
+ }
+ }
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\"#\"");
+ ::peg::RuleResult::Failed
+ }
+ };
+ match __choice_res {
+ ::peg::RuleResult::Matched(__pos, __value) => {
+ ::peg::RuleResult::Matched(__pos, __value)
+ }
+ ::peg::RuleResult::Failed => {
+ let __choice_res =
+ match ::peg::ParseLiteral::parse_string_literal(__input, __pos, "#") {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ match ::peg::ParseLiteral::parse_string_literal(__input, __pos, "[")
+ {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ match ::peg::ParseLiteral::parse_string_literal(
+ __input,
+ __pos,
+ "cache_left_rec",
+ ) {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ match ::peg::ParseLiteral::parse_string_literal(
+ __input, __pos, "]",
+ ) {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ ::peg::RuleResult::Matched(
+ __pos,
+ (|| Some(Cache::Recursive))(),
+ )
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\"]\"");
+ ::peg::RuleResult::Failed
+ }
+ }
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state
+ .mark_failure(__pos, "\"cache_left_rec\"");
+ ::peg::RuleResult::Failed
+ }
+ }
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\"[\"");
+ ::peg::RuleResult::Failed
+ }
+ }
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\"#\"");
+ ::peg::RuleResult::Failed
+ }
+ };
+ match __choice_res {
+ ::peg::RuleResult::Matched(__pos, __value) => {
+ ::peg::RuleResult::Matched(__pos, __value)
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Matched(__pos, (|| None)()),
+ }
+ }
+ }
+ }
+ }
+ fn __parse_no_eof_flag<'input>(
+ __input: &'input Input,
+ __state: &mut ParseState<'input>,
+ __err_state: &mut ::peg::error::ErrorState,
+ __pos: usize,
+ ) -> ::peg::RuleResult<bool> {
+ #![allow(non_snake_case, unused, clippy::redundant_closure_call)]
+ {
+ let __choice_res = match ::peg::ParseLiteral::parse_string_literal(__input, __pos, "#")
+ {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ match ::peg::ParseLiteral::parse_string_literal(__input, __pos, "[") {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ match ::peg::ParseLiteral::parse_string_literal(
+ __input, __pos, "no_eof",
+ ) {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ match ::peg::ParseLiteral::parse_string_literal(
+ __input, __pos, "]",
+ ) {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ ::peg::RuleResult::Matched(__pos, (|| true)())
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\"]\"");
+ ::peg::RuleResult::Failed
+ }
+ }
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\"no_eof\"");
+ ::peg::RuleResult::Failed
+ }
+ }
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\"[\"");
+ ::peg::RuleResult::Failed
+ }
+ }
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\"#\"");
+ ::peg::RuleResult::Failed
+ }
+ };
+ match __choice_res {
+ ::peg::RuleResult::Matched(__pos, __value) => {
+ ::peg::RuleResult::Matched(__pos, __value)
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Matched(__pos, (|| false)()),
+ }
+ }
+ }
+ fn __parse_rule_param_ty<'input>(
+ __input: &'input Input,
+ __state: &mut ParseState<'input>,
+ __err_state: &mut ::peg::error::ErrorState,
+ __pos: usize,
+ ) -> ::peg::RuleResult<RuleParamTy> {
+ #![allow(non_snake_case, unused, clippy::redundant_closure_call)]
+ {
+ let __choice_res =
+ match ::peg::ParseLiteral::parse_string_literal(__input, __pos, "rule") {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ match ::peg::ParseLiteral::parse_string_literal(__input, __pos, "<") {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ let __seq_res = {
+ let str_start = __pos;
+ match match __parse_rust_type(
+ __input,
+ __state,
+ __err_state,
+ __pos,
+ ) {
+ ::peg::RuleResult::Matched(pos, _) => {
+ ::peg::RuleResult::Matched(pos, ())
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ } {
+ ::peg::RuleResult::Matched(__newpos, _) => {
+ ::peg::RuleResult::Matched(
+ __newpos,
+ ::peg::ParseSlice::parse_slice(
+ __input, str_start, __newpos,
+ ),
+ )
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ };
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, r) => {
+ match ::peg::ParseLiteral::parse_string_literal(
+ __input, __pos, ">",
+ ) {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ ::peg::RuleResult::Matched(
+ __pos,
+ (|| RuleParamTy::Rule(r))(),
+ )
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\">\"");
+ ::peg::RuleResult::Failed
+ }
+ }
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\"<\"");
+ ::peg::RuleResult::Failed
+ }
+ }
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\"rule\"");
+ ::peg::RuleResult::Failed
+ }
+ };
+ match __choice_res {
+ ::peg::RuleResult::Matched(__pos, __value) => {
+ ::peg::RuleResult::Matched(__pos, __value)
+ }
+ ::peg::RuleResult::Failed => {
+ let __seq_res = {
+ let str_start = __pos;
+ match match __parse_rust_type(__input, __state, __err_state, __pos) {
+ ::peg::RuleResult::Matched(pos, _) => {
+ ::peg::RuleResult::Matched(pos, ())
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ } {
+ ::peg::RuleResult::Matched(__newpos, _) => ::peg::RuleResult::Matched(
+ __newpos,
+ ::peg::ParseSlice::parse_slice(__input, str_start, __newpos),
+ ),
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ };
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, t) => {
+ ::peg::RuleResult::Matched(__pos, (|| RuleParamTy::Rust(t))())
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ }
+ }
+ }
+ }
+ fn __parse_rule_params<'input>(
+ __input: &'input Input,
+ __state: &mut ParseState<'input>,
+ __err_state: &mut ::peg::error::ErrorState,
+ __pos: usize,
+ ) -> ::peg::RuleResult<Vec<RuleParam>> {
+ #![allow(non_snake_case, unused, clippy::redundant_closure_call)]
+ match ::peg::ParseLiteral::parse_string_literal(__input, __pos, "(") {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ let __seq_res = {
+ let mut __repeat_pos = __pos;
+ let mut __repeat_value = vec![];
+ loop {
+ let __pos = __repeat_pos;
+ let __pos = if __repeat_value.is_empty() {
+ __pos
+ } else {
+ let __sep_res = match ::peg::ParseLiteral::parse_string_literal(
+ __input, __pos, ",",
+ ) {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ ::peg::RuleResult::Matched(__pos, __val)
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\",\"");
+ ::peg::RuleResult::Failed
+ }
+ };
+ match __sep_res {
+ ::peg::RuleResult::Matched(__newpos, _) => __newpos,
+ ::peg::RuleResult::Failed => break,
+ }
+ };
+ let __step_res = {
+ let __seq_res = __parse_IDENT(__input, __state, __err_state, __pos);
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, name) => {
+ match ::peg::ParseLiteral::parse_string_literal(
+ __input, __pos, ":",
+ ) {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ let __seq_res = __parse_rule_param_ty(
+ __input,
+ __state,
+ __err_state,
+ __pos,
+ );
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, ty) => {
+ ::peg::RuleResult::Matched(
+ __pos,
+ (|| RuleParam { name, ty })(),
+ )
+ }
+ ::peg::RuleResult::Failed => {
+ ::peg::RuleResult::Failed
+ }
+ }
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\":\"");
+ ::peg::RuleResult::Failed
+ }
+ }
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ };
+ match __step_res {
+ ::peg::RuleResult::Matched(__newpos, __value) => {
+ __repeat_pos = __newpos;
+ __repeat_value.push(__value);
+ }
+ ::peg::RuleResult::Failed => {
+ break;
+ }
+ }
+ }
+ ::peg::RuleResult::Matched(__repeat_pos, __repeat_value)
+ };
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, params) => {
+ match ::peg::ParseLiteral::parse_string_literal(__input, __pos, ")") {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ ::peg::RuleResult::Matched(__pos, (|| params)())
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\")\"");
+ ::peg::RuleResult::Failed
+ }
+ }
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\"(\"");
+ ::peg::RuleResult::Failed
+ }
+ }
+ }
+ fn __parse_item<'input>(
+ __input: &'input Input,
+ __state: &mut ParseState<'input>,
+ __err_state: &mut ::peg::error::ErrorState,
+ __pos: usize,
+ ) -> ::peg::RuleResult<Item> {
+ #![allow(non_snake_case, unused, clippy::redundant_closure_call)]
+ {
+ let __choice_res = {
+ let __seq_res = __parse_rust_use(__input, __state, __err_state, __pos);
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, u) => {
+ ::peg::RuleResult::Matched(__pos, (|| Item::Use(u))())
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ };
+ match __choice_res {
+ ::peg::RuleResult::Matched(__pos, __value) => {
+ ::peg::RuleResult::Matched(__pos, __value)
+ }
+ ::peg::RuleResult::Failed => {
+ let __seq_res = __parse_peg_rule(__input, __state, __err_state, __pos);
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, r) => {
+ ::peg::RuleResult::Matched(__pos, (|| Item::Rule(r))())
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ }
+ }
+ }
+ }
+ fn __parse_rust_doc_comment<'input>(
+ __input: &'input Input,
+ __state: &mut ParseState<'input>,
+ __err_state: &mut ::peg::error::ErrorState,
+ __pos: usize,
+ ) -> ::peg::RuleResult<Option<TokenStream>> {
+ #![allow(non_snake_case, unused, clippy::redundant_closure_call)]
+ match {
+ let str_start = __pos;
+ match {
+ let mut __repeat_pos = __pos;
+ loop {
+ let __pos = __repeat_pos;
+ let __step_res = match ::peg::ParseLiteral::parse_string_literal(
+ __input, __pos, "#",
+ ) {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ match ::peg::ParseLiteral::parse_string_literal(__input, __pos, "[") {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ match ::peg::ParseLiteral::parse_string_literal(
+ __input, __pos, "doc",
+ ) {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ match ::peg::ParseLiteral::parse_string_literal(
+ __input, __pos, "=",
+ ) {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ let __seq_res = match __parse_LITERAL(
+ __input,
+ __state,
+ __err_state,
+ __pos,
+ ) {
+ ::peg::RuleResult::Matched(pos, _) => {
+ ::peg::RuleResult::Matched(pos, ())
+ }
+ ::peg::RuleResult::Failed => {
+ ::peg::RuleResult::Failed
+ }
+ };
+ match __seq_res { :: peg :: RuleResult :: Matched (__pos , _) => { match :: peg :: ParseLiteral :: parse_string_literal (__input , __pos , "]") { :: peg :: RuleResult :: Matched (__pos , __val) => { :: peg :: RuleResult :: Matched (__pos , ()) } :: peg :: RuleResult :: Failed => { __err_state . mark_failure (__pos , "\"]\"") ; :: peg :: RuleResult :: Failed } } } :: peg :: RuleResult :: Failed => :: peg :: RuleResult :: Failed , }
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\"=\"");
+ ::peg::RuleResult::Failed
+ }
+ }
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\"doc\"");
+ ::peg::RuleResult::Failed
+ }
+ }
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\"[\"");
+ ::peg::RuleResult::Failed
+ }
+ }
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\"#\"");
+ ::peg::RuleResult::Failed
+ }
+ };
+ match __step_res {
+ ::peg::RuleResult::Matched(__newpos, __value) => {
+ __repeat_pos = __newpos;
+ }
+ ::peg::RuleResult::Failed => {
+ break;
+ }
+ }
+ }
+ ::peg::RuleResult::Matched(__repeat_pos, ())
+ } {
+ ::peg::RuleResult::Matched(__newpos, _) => ::peg::RuleResult::Matched(
+ __newpos,
+ ::peg::ParseSlice::parse_slice(__input, str_start, __newpos),
+ ),
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ } {
+ ::peg::RuleResult::Matched(__newpos, __value) => {
+ ::peg::RuleResult::Matched(__newpos, Some(__value))
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Matched(__pos, None),
+ }
+ }
+ fn __parse_rust_visibility<'input>(
+ __input: &'input Input,
+ __state: &mut ParseState<'input>,
+ __err_state: &mut ::peg::error::ErrorState,
+ __pos: usize,
+ ) -> ::peg::RuleResult<Option<TokenStream>> {
+ #![allow(non_snake_case, unused, clippy::redundant_closure_call)]
+ match {
+ let str_start = __pos;
+ match {
+ let __choice_res =
+ match ::peg::ParseLiteral::parse_string_literal(__input, __pos, "pub") {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ let __seq_res = match match __parse_PAREN_GROUP(
+ __input,
+ __state,
+ __err_state,
+ __pos,
+ ) {
+ ::peg::RuleResult::Matched(pos, _) => {
+ ::peg::RuleResult::Matched(pos, ())
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ } {
+ ::peg::RuleResult::Matched(__newpos, _) => {
+ ::peg::RuleResult::Matched(__newpos, ())
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Matched(__pos, ()),
+ };
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, _) => {
+ ::peg::RuleResult::Matched(__pos, ())
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\"pub\"");
+ ::peg::RuleResult::Failed
+ }
+ };
+ match __choice_res {
+ ::peg::RuleResult::Matched(__pos, __value) => {
+ ::peg::RuleResult::Matched(__pos, __value)
+ }
+ ::peg::RuleResult::Failed => {
+ match ::peg::ParseLiteral::parse_string_literal(__input, __pos, "crate") {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ ::peg::RuleResult::Matched(__pos, __val)
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\"crate\"");
+ ::peg::RuleResult::Failed
+ }
+ }
+ }
+ }
+ } {
+ ::peg::RuleResult::Matched(__newpos, _) => ::peg::RuleResult::Matched(
+ __newpos,
+ ::peg::ParseSlice::parse_slice(__input, str_start, __newpos),
+ ),
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ } {
+ ::peg::RuleResult::Matched(__newpos, __value) => {
+ ::peg::RuleResult::Matched(__newpos, Some(__value))
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Matched(__pos, None),
+ }
+ }
+ fn __parse_rust_use<'input>(
+ __input: &'input Input,
+ __state: &mut ParseState<'input>,
+ __err_state: &mut ::peg::error::ErrorState,
+ __pos: usize,
+ ) -> ::peg::RuleResult<TokenStream> {
+ #![allow(non_snake_case, unused, clippy::redundant_closure_call)]
+ {
+ let __seq_res = {
+ let str_start = __pos;
+ match match ::peg::ParseLiteral::parse_string_literal(__input, __pos, "use") {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ let __seq_res =
+ match __parse_rust_path(__input, __state, __err_state, __pos) {
+ ::peg::RuleResult::Matched(pos, _) => {
+ ::peg::RuleResult::Matched(pos, ())
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ };
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, _) => {
+ let __seq_res = {
+ let __choice_res =
+ match ::peg::ParseLiteral::parse_string_literal(
+ __input, __pos, "::",
+ ) {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ match ::peg::ParseLiteral::parse_string_literal(
+ __input, __pos, "*",
+ ) {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ ::peg::RuleResult::Matched(__pos, ())
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\"*\"");
+ ::peg::RuleResult::Failed
+ }
+ }
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\"::\"");
+ ::peg::RuleResult::Failed
+ }
+ };
+ match __choice_res {
+ ::peg::RuleResult::Matched(__pos, __value) => {
+ ::peg::RuleResult::Matched(__pos, __value)
+ }
+ ::peg::RuleResult::Failed => {
+ let __choice_res = match :: peg :: ParseLiteral :: parse_string_literal (__input , __pos , "::") { :: peg :: RuleResult :: Matched (__pos , __val) => { match :: peg :: ParseLiteral :: parse_string_literal (__input , __pos , "{") { :: peg :: RuleResult :: Matched (__pos , __val) => { { let __seq_res = { let mut __repeat_pos = __pos ; let mut __repeat_value = vec ! () ; loop { let __pos = __repeat_pos ; let __pos = if __repeat_value . is_empty () { __pos } else { let __sep_res = match :: peg :: ParseLiteral :: parse_string_literal (__input , __pos , ",") { :: peg :: RuleResult :: Matched (__pos , __val) => { :: peg :: RuleResult :: Matched (__pos , __val) } :: peg :: RuleResult :: Failed => { __err_state . mark_failure (__pos , "\",\"") ; :: peg :: RuleResult :: Failed } } ; match __sep_res { :: peg :: RuleResult :: Matched (__newpos , _) => { __newpos } , :: peg :: RuleResult :: Failed => break , } } ; let __step_res = { let __seq_res = match __parse_IDENT (__input , __state , __err_state , __pos) { :: peg :: RuleResult :: Matched (pos , _) => :: peg :: RuleResult :: Matched (pos , ()) , :: peg :: RuleResult :: Failed => :: peg :: RuleResult :: Failed , } ; match __seq_res { :: peg :: RuleResult :: Matched (__pos , _) => { { let __seq_res = match match :: peg :: ParseLiteral :: parse_string_literal (__input , __pos , "as") { :: peg :: RuleResult :: Matched (__pos , __val) => { { let __seq_res = match __parse_IDENT (__input , __state , __err_state , __pos) { :: peg :: RuleResult :: Matched (pos , _) => :: peg :: RuleResult :: Matched (pos , ()) , :: peg :: RuleResult :: Failed => :: peg :: RuleResult :: Failed , } ; match __seq_res { :: peg :: RuleResult :: Matched (__pos , _) => { :: peg :: RuleResult :: Matched (__pos , ()) } :: peg :: RuleResult :: Failed => :: peg :: RuleResult :: Failed , } } } :: peg :: RuleResult :: Failed => { __err_state . mark_failure (__pos , "\"as\"") ; :: peg :: RuleResult :: Failed } } { :: peg :: RuleResult :: Matched (__newpos , _) => { :: peg :: RuleResult :: Matched (__newpos , ()) } , :: peg :: RuleResult :: Failed => { :: peg :: RuleResult :: Matched (__pos , ()) } , } ; match __seq_res { :: peg :: RuleResult :: Matched (__pos , _) => { :: peg :: RuleResult :: Matched (__pos , ()) } :: peg :: RuleResult :: Failed => :: peg :: RuleResult :: Failed , } } } :: peg :: RuleResult :: Failed => :: peg :: RuleResult :: Failed , } } ; match __step_res { :: peg :: RuleResult :: Matched (__newpos , __value) => { __repeat_pos = __newpos ; __repeat_value . push (__value) ; } , :: peg :: RuleResult :: Failed => { break ; } } } if __repeat_value . len () >= 1 { :: peg :: RuleResult :: Matched (__repeat_pos , ()) } else { :: peg :: RuleResult :: Failed } } ; match __seq_res { :: peg :: RuleResult :: Matched (__pos , _) => { match :: peg :: ParseLiteral :: parse_string_literal (__input , __pos , "}") { :: peg :: RuleResult :: Matched (__pos , __val) => { :: peg :: RuleResult :: Matched (__pos , ()) } :: peg :: RuleResult :: Failed => { __err_state . mark_failure (__pos , "\"}\"") ; :: peg :: RuleResult :: Failed } } } :: peg :: RuleResult :: Failed => :: peg :: RuleResult :: Failed , } } } :: peg :: RuleResult :: Failed => { __err_state . mark_failure (__pos , "\"{\"") ; :: peg :: RuleResult :: Failed } } } :: peg :: RuleResult :: Failed => { __err_state . mark_failure (__pos , "\"::\"") ; :: peg :: RuleResult :: Failed } } ;
+ match __choice_res { :: peg :: RuleResult :: Matched (__pos , __value) => :: peg :: RuleResult :: Matched (__pos , __value) , :: peg :: RuleResult :: Failed => match match :: peg :: ParseLiteral :: parse_string_literal (__input , __pos , "as") { :: peg :: RuleResult :: Matched (__pos , __val) => { { let __seq_res = match __parse_IDENT (__input , __state , __err_state , __pos) { :: peg :: RuleResult :: Matched (pos , _) => :: peg :: RuleResult :: Matched (pos , ()) , :: peg :: RuleResult :: Failed => :: peg :: RuleResult :: Failed , } ; match __seq_res { :: peg :: RuleResult :: Matched (__pos , _) => { :: peg :: RuleResult :: Matched (__pos , ()) } :: peg :: RuleResult :: Failed => :: peg :: RuleResult :: Failed , } } } :: peg :: RuleResult :: Failed => { __err_state . mark_failure (__pos , "\"as\"") ; :: peg :: RuleResult :: Failed } } { :: peg :: RuleResult :: Matched (__newpos , _) => { :: peg :: RuleResult :: Matched (__newpos , ()) } , :: peg :: RuleResult :: Failed => { :: peg :: RuleResult :: Matched (__pos , ()) } , } }
+ }
+ }
+ };
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, _) => {
+ match ::peg::ParseLiteral::parse_string_literal(
+ __input, __pos, ";",
+ ) {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ ::peg::RuleResult::Matched(__pos, ())
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\";\"");
+ ::peg::RuleResult::Failed
+ }
+ }
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\"use\"");
+ ::peg::RuleResult::Failed
+ }
+ } {
+ ::peg::RuleResult::Matched(__newpos, _) => ::peg::RuleResult::Matched(
+ __newpos,
+ ::peg::ParseSlice::parse_slice(__input, str_start, __newpos),
+ ),
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ };
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, v) => {
+ ::peg::RuleResult::Matched(__pos, (|| v.to_owned())())
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ }
+ }
+ fn __parse_rust_path<'input>(
+ __input: &'input Input,
+ __state: &mut ParseState<'input>,
+ __err_state: &mut ::peg::error::ErrorState,
+ __pos: usize,
+ ) -> ::peg::RuleResult<()> {
+ #![allow(non_snake_case, unused, clippy::redundant_closure_call)]
+ {
+ let __seq_res =
+ match match ::peg::ParseLiteral::parse_string_literal(__input, __pos, "crate") {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ match ::peg::ParseLiteral::parse_string_literal(__input, __pos, "::") {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ ::peg::RuleResult::Matched(__pos, ())
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\"::\"");
+ ::peg::RuleResult::Failed
+ }
+ }
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\"crate\"");
+ ::peg::RuleResult::Failed
+ }
+ } {
+ ::peg::RuleResult::Matched(__newpos, _) => {
+ ::peg::RuleResult::Matched(__newpos, ())
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Matched(__pos, ()),
+ };
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, _) => {
+ let __seq_res = {
+ let mut __repeat_pos = __pos;
+ let mut __repeat_value = vec![];
+ loop {
+ let __pos = __repeat_pos;
+ let __pos = if __repeat_value.is_empty() {
+ __pos
+ } else {
+ let __sep_res = match ::peg::ParseLiteral::parse_string_literal(
+ __input, __pos, "::",
+ ) {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ ::peg::RuleResult::Matched(__pos, __val)
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\"::\"");
+ ::peg::RuleResult::Failed
+ }
+ };
+ match __sep_res {
+ ::peg::RuleResult::Matched(__newpos, _) => __newpos,
+ ::peg::RuleResult::Failed => break,
+ }
+ };
+ let __step_res =
+ match __parse_IDENT(__input, __state, __err_state, __pos) {
+ ::peg::RuleResult::Matched(pos, _) => {
+ ::peg::RuleResult::Matched(pos, ())
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ };
+ match __step_res {
+ ::peg::RuleResult::Matched(__newpos, __value) => {
+ __repeat_pos = __newpos;
+ __repeat_value.push(__value);
+ }
+ ::peg::RuleResult::Failed => {
+ break;
+ }
+ }
+ }
+ if __repeat_value.len() >= 1 {
+ ::peg::RuleResult::Matched(__repeat_pos, ())
+ } else {
+ ::peg::RuleResult::Failed
+ }
+ };
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, _) => {
+ ::peg::RuleResult::Matched(__pos, ())
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ }
+ }
+ fn __parse_rust_type<'input>(
+ __input: &'input Input,
+ __state: &mut ParseState<'input>,
+ __err_state: &mut ::peg::error::ErrorState,
+ __pos: usize,
+ ) -> ::peg::RuleResult<()> {
+ #![allow(non_snake_case, unused, clippy::redundant_closure_call)]
+ {
+ let __choice_res = match __parse_BRACKET_GROUP(__input, __state, __err_state, __pos) {
+ ::peg::RuleResult::Matched(pos, _) => ::peg::RuleResult::Matched(pos, ()),
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ };
+ match __choice_res {
+ ::peg::RuleResult::Matched(__pos, __value) => {
+ ::peg::RuleResult::Matched(__pos, __value)
+ }
+ ::peg::RuleResult::Failed => {
+ let __choice_res =
+ match ::peg::ParseLiteral::parse_string_literal(__input, __pos, "&") {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ let __seq_res = match match __parse_LIFETIME(
+ __input,
+ __state,
+ __err_state,
+ __pos,
+ ) {
+ ::peg::RuleResult::Matched(pos, _) => {
+ ::peg::RuleResult::Matched(pos, ())
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ } {
+ ::peg::RuleResult::Matched(__newpos, _) => {
+ ::peg::RuleResult::Matched(__newpos, ())
+ }
+ ::peg::RuleResult::Failed => {
+ ::peg::RuleResult::Matched(__pos, ())
+ }
+ };
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, _) => {
+ let __seq_res =
+ match match ::peg::ParseLiteral::parse_string_literal(
+ __input, __pos, "mut",
+ ) {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ ::peg::RuleResult::Matched(__pos, __val)
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\"mut\"");
+ ::peg::RuleResult::Failed
+ }
+ } {
+ ::peg::RuleResult::Matched(__newpos, _) => {
+ ::peg::RuleResult::Matched(__newpos, ())
+ }
+ ::peg::RuleResult::Failed => {
+ ::peg::RuleResult::Matched(__pos, ())
+ }
+ };
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, _) => {
+ let __seq_res = match __parse_rust_type(
+ __input,
+ __state,
+ __err_state,
+ __pos,
+ ) {
+ ::peg::RuleResult::Matched(pos, _) => {
+ ::peg::RuleResult::Matched(pos, ())
+ }
+ ::peg::RuleResult::Failed => {
+ ::peg::RuleResult::Failed
+ }
+ };
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, _) => {
+ ::peg::RuleResult::Matched(__pos, ())
+ }
+ ::peg::RuleResult::Failed => {
+ ::peg::RuleResult::Failed
+ }
+ }
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\"&\"");
+ ::peg::RuleResult::Failed
+ }
+ };
+ match __choice_res {
+ ::peg::RuleResult::Matched(__pos, __value) => {
+ ::peg::RuleResult::Matched(__pos, __value)
+ }
+ ::peg::RuleResult::Failed => {
+ let __choice_res = match ::peg::ParseLiteral::parse_string_literal(
+ __input, __pos, "dyn",
+ ) {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ let __seq_res = match __parse_rust_type(
+ __input,
+ __state,
+ __err_state,
+ __pos,
+ ) {
+ ::peg::RuleResult::Matched(pos, _) => {
+ ::peg::RuleResult::Matched(pos, ())
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ };
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, _) => {
+ ::peg::RuleResult::Matched(__pos, ())
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\"dyn\"");
+ ::peg::RuleResult::Failed
+ }
+ };
+ match __choice_res {
+ ::peg::RuleResult::Matched(__pos, __value) => {
+ ::peg::RuleResult::Matched(__pos, __value)
+ }
+ ::peg::RuleResult::Failed => {
+ let __choice_res =
+ match ::peg::ParseLiteral::parse_string_literal(
+ __input, __pos, "impl",
+ ) {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ let __seq_res = match __parse_rust_type(
+ __input,
+ __state,
+ __err_state,
+ __pos,
+ ) {
+ ::peg::RuleResult::Matched(pos, _) => {
+ ::peg::RuleResult::Matched(pos, ())
+ }
+ ::peg::RuleResult::Failed => {
+ ::peg::RuleResult::Failed
+ }
+ };
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, _) => {
+ ::peg::RuleResult::Matched(__pos, ())
+ }
+ ::peg::RuleResult::Failed => {
+ ::peg::RuleResult::Failed
+ }
+ }
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\"impl\"");
+ ::peg::RuleResult::Failed
+ }
+ };
+ match __choice_res {
+ ::peg::RuleResult::Matched(__pos, __value) => {
+ ::peg::RuleResult::Matched(__pos, __value)
+ }
+ ::peg::RuleResult::Failed => {
+ let __choice_res =
+ match ::peg::ParseLiteral::parse_string_literal(
+ __input, __pos, "(",
+ ) {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ let __seq_res = {
+ let mut __repeat_pos = __pos;
+ let mut __repeat_value = vec![];
+ loop {
+ let __pos = __repeat_pos;
+ let __pos = if __repeat_value
+ .is_empty()
+ {
+ __pos
+ } else {
+ let __sep_res = match :: peg :: ParseLiteral :: parse_string_literal (__input , __pos , ",") { :: peg :: RuleResult :: Matched (__pos , __val) => { :: peg :: RuleResult :: Matched (__pos , __val) } :: peg :: RuleResult :: Failed => { __err_state . mark_failure (__pos , "\",\"") ; :: peg :: RuleResult :: Failed } } ;
+ match __sep_res { :: peg :: RuleResult :: Matched (__newpos , _) => { __newpos } , :: peg :: RuleResult :: Failed => break , }
+ };
+ let __step_res = match __parse_rust_type (__input , __state , __err_state , __pos) { :: peg :: RuleResult :: Matched (pos , _) => :: peg :: RuleResult :: Matched (pos , ()) , :: peg :: RuleResult :: Failed => :: peg :: RuleResult :: Failed , } ;
+ match __step_res {
+ ::peg::RuleResult::Matched(
+ __newpos,
+ __value,
+ ) => {
+ __repeat_pos = __newpos;
+ __repeat_value
+ .push(__value);
+ }
+ ::peg::RuleResult::Failed => {
+ break;
+ }
+ }
+ }
+ ::peg::RuleResult::Matched(
+ __repeat_pos,
+ (),
+ )
+ };
+ match __seq_res { :: peg :: RuleResult :: Matched (__pos , _) => { match :: peg :: ParseLiteral :: parse_string_literal (__input , __pos , ")") { :: peg :: RuleResult :: Matched (__pos , __val) => { :: peg :: RuleResult :: Matched (__pos , ()) } :: peg :: RuleResult :: Failed => { __err_state . mark_failure (__pos , "\")\"") ; :: peg :: RuleResult :: Failed } } } :: peg :: RuleResult :: Failed => :: peg :: RuleResult :: Failed , }
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\"(\"");
+ ::peg::RuleResult::Failed
+ }
+ };
+ match __choice_res {
+ ::peg::RuleResult::Matched(__pos, __value) => {
+ ::peg::RuleResult::Matched(__pos, __value)
+ }
+ ::peg::RuleResult::Failed => {
+ match __parse_rust_ty_path(
+ __input,
+ __state,
+ __err_state,
+ __pos,
+ ) {
+ ::peg::RuleResult::Matched(pos, _) => {
+ ::peg::RuleResult::Matched(pos, ())
+ }
+ ::peg::RuleResult::Failed => {
+ ::peg::RuleResult::Failed
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ fn __parse_rust_ty_path<'input>(
+ __input: &'input Input,
+ __state: &mut ParseState<'input>,
+ __err_state: &mut ::peg::error::ErrorState,
+ __pos: usize,
+ ) -> ::peg::RuleResult<()> {
+ #![allow(non_snake_case, unused, clippy::redundant_closure_call)]
+ {
+ let __seq_res =
+ match match ::peg::ParseLiteral::parse_string_literal(__input, __pos, "::") {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ ::peg::RuleResult::Matched(__pos, __val)
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\"::\"");
+ ::peg::RuleResult::Failed
+ }
+ } {
+ ::peg::RuleResult::Matched(__newpos, _) => {
+ ::peg::RuleResult::Matched(__newpos, ())
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Matched(__pos, ()),
+ };
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, _) => {
+ let __seq_res = {
+ let mut __repeat_pos = __pos;
+ let mut __repeat_value = vec![];
+ loop {
+ let __pos = __repeat_pos;
+ let __pos = if __repeat_value.is_empty() {
+ __pos
+ } else {
+ let __sep_res = match ::peg::ParseLiteral::parse_string_literal(
+ __input, __pos, "::",
+ ) {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ ::peg::RuleResult::Matched(__pos, __val)
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\"::\"");
+ ::peg::RuleResult::Failed
+ }
+ };
+ match __sep_res {
+ ::peg::RuleResult::Matched(__newpos, _) => __newpos,
+ ::peg::RuleResult::Failed => break,
+ }
+ };
+ let __step_res = {
+ let __seq_res =
+ match __parse_IDENT(__input, __state, __err_state, __pos) {
+ ::peg::RuleResult::Matched(pos, _) => {
+ ::peg::RuleResult::Matched(pos, ())
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ };
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, _) => {
+ let __seq_res = match {
+ let __seq_res = match match :: peg :: ParseLiteral :: parse_string_literal (__input , __pos , "::") { :: peg :: RuleResult :: Matched (__pos , __val) => { :: peg :: RuleResult :: Matched (__pos , __val) } :: peg :: RuleResult :: Failed => { __err_state . mark_failure (__pos , "\"::\"") ; :: peg :: RuleResult :: Failed } } { :: peg :: RuleResult :: Matched (__newpos , _) => { :: peg :: RuleResult :: Matched (__newpos , ()) } , :: peg :: RuleResult :: Failed => { :: peg :: RuleResult :: Matched (__pos , ()) } , } ;
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, _) => {
+ match ::peg::ParseLiteral::parse_string_literal(
+ __input, __pos, "<",
+ ) {
+ ::peg::RuleResult::Matched(
+ __pos,
+ __val,
+ ) => {
+ let __seq_res = {
+ let mut __repeat_pos = __pos;
+ let mut __repeat_value = vec![];
+ loop {
+ let __pos = __repeat_pos;
+ let __pos = if __repeat_value
+ .is_empty()
+ {
+ __pos
+ } else {
+ let __sep_res = match :: peg :: ParseLiteral :: parse_string_literal (__input , __pos , ",") { :: peg :: RuleResult :: Matched (__pos , __val) => { :: peg :: RuleResult :: Matched (__pos , __val) } :: peg :: RuleResult :: Failed => { __err_state . mark_failure (__pos , "\",\"") ; :: peg :: RuleResult :: Failed } } ;
+ match __sep_res { :: peg :: RuleResult :: Matched (__newpos , _) => { __newpos } , :: peg :: RuleResult :: Failed => break , }
+ };
+ let __step_res = {
+ let __choice_res = match __parse_LIFETIME (__input , __state , __err_state , __pos) { :: peg :: RuleResult :: Matched (pos , _) => :: peg :: RuleResult :: Matched (pos , ()) , :: peg :: RuleResult :: Failed => :: peg :: RuleResult :: Failed , } ;
+ match __choice_res { :: peg :: RuleResult :: Matched (__pos , __value) => :: peg :: RuleResult :: Matched (__pos , __value) , :: peg :: RuleResult :: Failed => { let __choice_res = match __parse_rust_type (__input , __state , __err_state , __pos) { :: peg :: RuleResult :: Matched (pos , _) => :: peg :: RuleResult :: Matched (pos , ()) , :: peg :: RuleResult :: Failed => :: peg :: RuleResult :: Failed , } ; match __choice_res { :: peg :: RuleResult :: Matched (__pos , __value) => :: peg :: RuleResult :: Matched (__pos , __value) , :: peg :: RuleResult :: Failed => { let __choice_res = match __parse_BRACE_GROUP (__input , __state , __err_state , __pos) { :: peg :: RuleResult :: Matched (pos , _) => :: peg :: RuleResult :: Matched (pos , ()) , :: peg :: RuleResult :: Failed => :: peg :: RuleResult :: Failed , } ; match __choice_res { :: peg :: RuleResult :: Matched (__pos , __value) => :: peg :: RuleResult :: Matched (__pos , __value) , :: peg :: RuleResult :: Failed => match __parse_LITERAL (__input , __state , __err_state , __pos) { :: peg :: RuleResult :: Matched (pos , _) => :: peg :: RuleResult :: Matched (pos , ()) , :: peg :: RuleResult :: Failed => :: peg :: RuleResult :: Failed , } } } } } }
+ };
+ match __step_res { :: peg :: RuleResult :: Matched (__newpos , __value) => { __repeat_pos = __newpos ; __repeat_value . push (__value) ; } , :: peg :: RuleResult :: Failed => { break ; } }
+ }
+ if __repeat_value.len() >= 1 {
+ ::peg::RuleResult::Matched(
+ __repeat_pos,
+ (),
+ )
+ } else {
+ ::peg::RuleResult::Failed
+ }
+ };
+ match __seq_res { :: peg :: RuleResult :: Matched (__pos , _) => { match :: peg :: ParseLiteral :: parse_string_literal (__input , __pos , ">") { :: peg :: RuleResult :: Matched (__pos , __val) => { :: peg :: RuleResult :: Matched (__pos , ()) } :: peg :: RuleResult :: Failed => { __err_state . mark_failure (__pos , "\">\"") ; :: peg :: RuleResult :: Failed } } } :: peg :: RuleResult :: Failed => :: peg :: RuleResult :: Failed , }
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state
+ .mark_failure(__pos, "\"<\"");
+ ::peg::RuleResult::Failed
+ }
+ }
+ }
+ ::peg::RuleResult::Failed => {
+ ::peg::RuleResult::Failed
+ }
+ }
+ } {
+ ::peg::RuleResult::Matched(__newpos, _) => {
+ ::peg::RuleResult::Matched(__newpos, ())
+ }
+ ::peg::RuleResult::Failed => {
+ ::peg::RuleResult::Matched(__pos, ())
+ }
+ };
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, _) => {
+ ::peg::RuleResult::Matched(__pos, ())
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ };
+ match __step_res {
+ ::peg::RuleResult::Matched(__newpos, __value) => {
+ __repeat_pos = __newpos;
+ __repeat_value.push(__value);
+ }
+ ::peg::RuleResult::Failed => {
+ break;
+ }
+ }
+ }
+ if __repeat_value.len() >= 1 {
+ ::peg::RuleResult::Matched(__repeat_pos, ())
+ } else {
+ ::peg::RuleResult::Failed
+ }
+ };
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, _) => {
+ ::peg::RuleResult::Matched(__pos, ())
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ }
+ }
+ fn __parse_rust_ty_params<'input>(
+ __input: &'input Input,
+ __state: &mut ParseState<'input>,
+ __err_state: &mut ::peg::error::ErrorState,
+ __pos: usize,
+ ) -> ::peg::RuleResult<Vec<TokenStream>> {
+ #![allow(non_snake_case, unused, clippy::redundant_closure_call)]
+ match ::peg::ParseLiteral::parse_string_literal(__input, __pos, "<") {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ let __seq_res = {
+ let mut __repeat_pos = __pos;
+ let mut __repeat_value = vec![];
+ loop {
+ let __pos = __repeat_pos;
+ let __pos = if __repeat_value.is_empty() {
+ __pos
+ } else {
+ let __sep_res = match ::peg::ParseLiteral::parse_string_literal(
+ __input, __pos, ",",
+ ) {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ ::peg::RuleResult::Matched(__pos, __val)
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\",\"");
+ ::peg::RuleResult::Failed
+ }
+ };
+ match __sep_res {
+ ::peg::RuleResult::Matched(__newpos, _) => __newpos,
+ ::peg::RuleResult::Failed => break,
+ }
+ };
+ let __step_res = {
+ let str_start = __pos;
+ match match __parse_rust_generic_param(
+ __input,
+ __state,
+ __err_state,
+ __pos,
+ ) {
+ ::peg::RuleResult::Matched(pos, _) => {
+ ::peg::RuleResult::Matched(pos, ())
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ } {
+ ::peg::RuleResult::Matched(__newpos, _) => {
+ ::peg::RuleResult::Matched(
+ __newpos,
+ ::peg::ParseSlice::parse_slice(
+ __input, str_start, __newpos,
+ ),
+ )
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ };
+ match __step_res {
+ ::peg::RuleResult::Matched(__newpos, __value) => {
+ __repeat_pos = __newpos;
+ __repeat_value.push(__value);
+ }
+ ::peg::RuleResult::Failed => {
+ break;
+ }
+ }
+ }
+ if __repeat_value.len() >= 1 {
+ ::peg::RuleResult::Matched(__repeat_pos, __repeat_value)
+ } else {
+ ::peg::RuleResult::Failed
+ }
+ };
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, p) => {
+ match ::peg::ParseLiteral::parse_string_literal(__input, __pos, ">") {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ ::peg::RuleResult::Matched(__pos, (|| p)())
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\">\"");
+ ::peg::RuleResult::Failed
+ }
+ }
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\"<\"");
+ ::peg::RuleResult::Failed
+ }
+ }
+ }
+ fn __parse_rust_generic_param<'input>(
+ __input: &'input Input,
+ __state: &mut ParseState<'input>,
+ __err_state: &mut ::peg::error::ErrorState,
+ __pos: usize,
+ ) -> ::peg::RuleResult<()> {
+ #![allow(non_snake_case, unused, clippy::redundant_closure_call)]
+ {
+ let __choice_res = {
+ let __seq_res = match __parse_LIFETIME(__input, __state, __err_state, __pos) {
+ ::peg::RuleResult::Matched(pos, _) => ::peg::RuleResult::Matched(pos, ()),
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ };
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, _) => {
+ let __seq_res = match match ::peg::ParseLiteral::parse_string_literal(
+ __input, __pos, ":",
+ ) {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ let __seq_res = {
+ let mut __repeat_pos = __pos;
+ let mut __repeat_value = vec![];
+ loop {
+ let __pos = __repeat_pos;
+ let __pos = if __repeat_value.is_empty() {
+ __pos
+ } else {
+ let __sep_res =
+ match ::peg::ParseLiteral::parse_string_literal(
+ __input, __pos, "+",
+ ) {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ ::peg::RuleResult::Matched(__pos, __val)
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\"+\"");
+ ::peg::RuleResult::Failed
+ }
+ };
+ match __sep_res {
+ ::peg::RuleResult::Matched(__newpos, _) => __newpos,
+ ::peg::RuleResult::Failed => break,
+ }
+ };
+ let __step_res = match __parse_LIFETIME(
+ __input,
+ __state,
+ __err_state,
+ __pos,
+ ) {
+ ::peg::RuleResult::Matched(pos, _) => {
+ ::peg::RuleResult::Matched(pos, ())
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ };
+ match __step_res {
+ ::peg::RuleResult::Matched(__newpos, __value) => {
+ __repeat_pos = __newpos;
+ __repeat_value.push(__value);
+ }
+ ::peg::RuleResult::Failed => {
+ break;
+ }
+ }
+ }
+ if __repeat_value.len() >= 1 {
+ ::peg::RuleResult::Matched(__repeat_pos, ())
+ } else {
+ ::peg::RuleResult::Failed
+ }
+ };
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, _) => {
+ ::peg::RuleResult::Matched(__pos, ())
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\":\"");
+ ::peg::RuleResult::Failed
+ }
+ } {
+ ::peg::RuleResult::Matched(__newpos, _) => {
+ ::peg::RuleResult::Matched(__newpos, ())
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Matched(__pos, ()),
+ };
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, _) => {
+ ::peg::RuleResult::Matched(__pos, ())
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ };
+ match __choice_res {
+ ::peg::RuleResult::Matched(__pos, __value) => {
+ ::peg::RuleResult::Matched(__pos, __value)
+ }
+ ::peg::RuleResult::Failed => {
+ let __seq_res = match __parse_IDENT(__input, __state, __err_state, __pos) {
+ ::peg::RuleResult::Matched(pos, _) => ::peg::RuleResult::Matched(pos, ()),
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ };
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, _) => {
+ let __seq_res = match match ::peg::ParseLiteral::parse_string_literal(
+ __input, __pos, ":",
+ ) {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ let __seq_res = {
+ let mut __repeat_pos = __pos;
+ let mut __repeat_value = vec![];
+ loop {
+ let __pos = __repeat_pos;
+ let __pos = if __repeat_value.is_empty() {
+ __pos
+ } else {
+ let __sep_res =
+ match ::peg::ParseLiteral::parse_string_literal(
+ __input, __pos, "+",
+ ) {
+ ::peg::RuleResult::Matched(
+ __pos,
+ __val,
+ ) => {
+ ::peg::RuleResult::Matched(__pos, __val)
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state
+ .mark_failure(__pos, "\"+\"");
+ ::peg::RuleResult::Failed
+ }
+ };
+ match __sep_res {
+ ::peg::RuleResult::Matched(__newpos, _) => {
+ __newpos
+ }
+ ::peg::RuleResult::Failed => break,
+ }
+ };
+ let __step_res = {
+ let __choice_res = match __parse_LIFETIME(
+ __input,
+ __state,
+ __err_state,
+ __pos,
+ ) {
+ ::peg::RuleResult::Matched(pos, _) => {
+ ::peg::RuleResult::Matched(pos, ())
+ }
+ ::peg::RuleResult::Failed => {
+ ::peg::RuleResult::Failed
+ }
+ };
+ match __choice_res {
+ ::peg::RuleResult::Matched(__pos, __value) => {
+ ::peg::RuleResult::Matched(__pos, __value)
+ }
+ ::peg::RuleResult::Failed => {
+ let __seq_res = match match :: peg :: ParseLiteral :: parse_string_literal (__input , __pos , "?") { :: peg :: RuleResult :: Matched (__pos , __val) => { :: peg :: RuleResult :: Matched (__pos , __val) } :: peg :: RuleResult :: Failed => { __err_state . mark_failure (__pos , "\"?\"") ; :: peg :: RuleResult :: Failed } } { :: peg :: RuleResult :: Matched (__newpos , _) => { :: peg :: RuleResult :: Matched (__newpos , ()) } , :: peg :: RuleResult :: Failed => { :: peg :: RuleResult :: Matched (__pos , ()) } , } ;
+ match __seq_res {
+ ::peg::RuleResult::Matched(
+ __pos,
+ _,
+ ) => {
+ let __seq_res = match __parse_rust_ty_path (__input , __state , __err_state , __pos) { :: peg :: RuleResult :: Matched (pos , _) => :: peg :: RuleResult :: Matched (pos , ()) , :: peg :: RuleResult :: Failed => :: peg :: RuleResult :: Failed , } ;
+ match __seq_res {
+ ::peg::RuleResult::Matched(
+ __pos,
+ _,
+ ) => {
+ ::peg::RuleResult::Matched(
+ __pos,
+ (),
+ )
+ }
+ ::peg::RuleResult::Failed => {
+ ::peg::RuleResult::Failed
+ }
+ }
+ }
+ ::peg::RuleResult::Failed => {
+ ::peg::RuleResult::Failed
+ }
+ }
+ }
+ }
+ };
+ match __step_res {
+ ::peg::RuleResult::Matched(__newpos, __value) => {
+ __repeat_pos = __newpos;
+ __repeat_value.push(__value);
+ }
+ ::peg::RuleResult::Failed => {
+ break;
+ }
+ }
+ }
+ if __repeat_value.len() >= 1 {
+ ::peg::RuleResult::Matched(__repeat_pos, ())
+ } else {
+ ::peg::RuleResult::Failed
+ }
+ };
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, _) => {
+ ::peg::RuleResult::Matched(__pos, ())
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\":\"");
+ ::peg::RuleResult::Failed
+ }
+ } {
+ ::peg::RuleResult::Matched(__newpos, _) => {
+ ::peg::RuleResult::Matched(__newpos, ())
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Matched(__pos, ()),
+ };
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, _) => {
+ ::peg::RuleResult::Matched(__pos, ())
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ }
+ }
+ }
+ }
+ fn __parse_expression<'input>(
+ __input: &'input Input,
+ __state: &mut ParseState<'input>,
+ __err_state: &mut ::peg::error::ErrorState,
+ __pos: usize,
+ ) -> ::peg::RuleResult<SpannedExpr> {
+ #![allow(non_snake_case, unused, clippy::redundant_closure_call)]
+ __parse_choice(__input, __state, __err_state, __pos)
+ }
+ fn __parse_choice<'input>(
+ __input: &'input Input,
+ __state: &mut ParseState<'input>,
+ __err_state: &mut ::peg::error::ErrorState,
+ __pos: usize,
+ ) -> ::peg::RuleResult<SpannedExpr> {
+ #![allow(non_snake_case, unused, clippy::redundant_closure_call)]
+ {
+ let __seq_res = __parse_sp(__input, __state, __err_state, __pos);
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, sp) => {
+ let __seq_res = {
+ let mut __repeat_pos = __pos;
+ let mut __repeat_value = vec![];
+ loop {
+ let __pos = __repeat_pos;
+ let __pos = if __repeat_value.is_empty() {
+ __pos
+ } else {
+ let __sep_res = match ::peg::ParseLiteral::parse_string_literal(
+ __input, __pos, "/",
+ ) {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ ::peg::RuleResult::Matched(__pos, __val)
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\"/\"");
+ ::peg::RuleResult::Failed
+ }
+ };
+ match __sep_res {
+ ::peg::RuleResult::Matched(__newpos, _) => __newpos,
+ ::peg::RuleResult::Failed => break,
+ }
+ };
+ let __step_res = __parse_sequence(__input, __state, __err_state, __pos);
+ match __step_res {
+ ::peg::RuleResult::Matched(__newpos, __value) => {
+ __repeat_pos = __newpos;
+ __repeat_value.push(__value);
+ }
+ ::peg::RuleResult::Failed => {
+ break;
+ }
+ }
+ }
+ if __repeat_value.len() >= 1 {
+ ::peg::RuleResult::Matched(__repeat_pos, __repeat_value)
+ } else {
+ ::peg::RuleResult::Failed
+ }
+ };
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, s) => ::peg::RuleResult::Matched(
+ __pos,
+ (|| {
+ if s.len() == 1 {
+ s.into_iter().next().unwrap()
+ } else {
+ ChoiceExpr(s).at(sp)
+ }
+ })(),
+ ),
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ }
+ }
+ fn __parse_sequence<'input>(
+ __input: &'input Input,
+ __state: &mut ParseState<'input>,
+ __err_state: &mut ::peg::error::ErrorState,
+ __pos: usize,
+ ) -> ::peg::RuleResult<SpannedExpr> {
+ #![allow(non_snake_case, unused, clippy::redundant_closure_call)]
+ {
+ let __seq_res = __parse_sp(__input, __state, __err_state, __pos);
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, sp) => {
+ let __seq_res = {
+ let mut __repeat_pos = __pos;
+ let mut __repeat_value = vec![];
+ loop {
+ let __pos = __repeat_pos;
+ let __step_res = __parse_labeled(__input, __state, __err_state, __pos);
+ match __step_res {
+ ::peg::RuleResult::Matched(__newpos, __value) => {
+ __repeat_pos = __newpos;
+ __repeat_value.push(__value);
+ }
+ ::peg::RuleResult::Failed => {
+ break;
+ }
+ }
+ }
+ ::peg::RuleResult::Matched(__repeat_pos, __repeat_value)
+ };
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, elements) => {
+ let __seq_res =
+ match __parse_BRACE_GROUP(__input, __state, __err_state, __pos) {
+ ::peg::RuleResult::Matched(__newpos, __value) => {
+ ::peg::RuleResult::Matched(__newpos, Some(__value))
+ }
+ ::peg::RuleResult::Failed => {
+ ::peg::RuleResult::Matched(__pos, None)
+ }
+ };
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, code) => {
+ ::peg::RuleResult::Matched(
+ __pos,
+ (|| {
+ if let Some(code) = code {
+ ActionExpr(elements, Some(code)).at(sp)
+ } else if elements.len() != 1 {
+ ActionExpr(elements, None).at(sp)
+ } else {
+ elements.into_iter().next().unwrap().expr
+ }
+ })(),
+ )
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ }
+ }
+ fn __parse_labeled<'input>(
+ __input: &'input Input,
+ __state: &mut ParseState<'input>,
+ __err_state: &mut ::peg::error::ErrorState,
+ __pos: usize,
+ ) -> ::peg::RuleResult<TaggedExpr> {
+ #![allow(non_snake_case, unused, clippy::redundant_closure_call)]
+ {
+ let __seq_res = match {
+ let __seq_res = __parse_IDENT(__input, __state, __err_state, __pos);
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, l) => {
+ match ::peg::ParseLiteral::parse_string_literal(__input, __pos, ":") {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ ::peg::RuleResult::Matched(__pos, (|| l)())
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\":\"");
+ ::peg::RuleResult::Failed
+ }
+ }
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ } {
+ ::peg::RuleResult::Matched(__newpos, __value) => {
+ ::peg::RuleResult::Matched(__newpos, Some(__value))
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Matched(__pos, None),
+ };
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, label) => {
+ let __seq_res = __parse_suffixed(__input, __state, __err_state, __pos);
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, expression) => {
+ ::peg::RuleResult::Matched(
+ __pos,
+ (|| TaggedExpr {
+ name: label,
+ expr: expression,
+ })(),
+ )
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ }
+ }
+ fn __parse_suffixed<'input>(
+ __input: &'input Input,
+ __state: &mut ParseState<'input>,
+ __err_state: &mut ::peg::error::ErrorState,
+ __pos: usize,
+ ) -> ::peg::RuleResult<SpannedExpr> {
+ #![allow(non_snake_case, unused, clippy::redundant_closure_call)]
+ {
+ let __choice_res = {
+ let __seq_res = __parse_prefixed(__input, __state, __err_state, __pos);
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, e) => {
+ let __seq_res = __parse_sp(__input, __state, __err_state, __pos);
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, sp) => {
+ match ::peg::ParseLiteral::parse_string_literal(__input, __pos, "?")
+ {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ ::peg::RuleResult::Matched(
+ __pos,
+ (|| OptionalExpr(Box::new(e)).at(sp))(),
+ )
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\"?\"");
+ ::peg::RuleResult::Failed
+ }
+ }
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ };
+ match __choice_res {
+ ::peg::RuleResult::Matched(__pos, __value) => {
+ ::peg::RuleResult::Matched(__pos, __value)
+ }
+ ::peg::RuleResult::Failed => {
+ let __choice_res = {
+ let __seq_res = __parse_prefixed(__input, __state, __err_state, __pos);
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, e) => {
+ let __seq_res = __parse_sp(__input, __state, __err_state, __pos);
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, sp) => {
+ match ::peg::ParseLiteral::parse_string_literal(
+ __input, __pos, "**",
+ ) {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ let __seq_res = __parse_repeatcount(
+ __input,
+ __state,
+ __err_state,
+ __pos,
+ );
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, count) => {
+ let __seq_res = __parse_primary(
+ __input,
+ __state,
+ __err_state,
+ __pos,
+ );
+ match __seq_res {
+ ::peg::RuleResult::Matched(
+ __pos,
+ sep,
+ ) => ::peg::RuleResult::Matched(
+ __pos,
+ (|| {
+ Repeat {
+ inner: Box::new(e),
+ bound: count,
+ sep: Some(Box::new(sep)),
+ }
+ .at(sp)
+ })(
+ ),
+ ),
+ ::peg::RuleResult::Failed => {
+ ::peg::RuleResult::Failed
+ }
+ }
+ }
+ ::peg::RuleResult::Failed => {
+ ::peg::RuleResult::Failed
+ }
+ }
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\"**\"");
+ ::peg::RuleResult::Failed
+ }
+ }
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ };
+ match __choice_res {
+ ::peg::RuleResult::Matched(__pos, __value) => {
+ ::peg::RuleResult::Matched(__pos, __value)
+ }
+ ::peg::RuleResult::Failed => {
+ let __choice_res = {
+ let __seq_res =
+ __parse_prefixed(__input, __state, __err_state, __pos);
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, e) => {
+ let __seq_res =
+ __parse_sp(__input, __state, __err_state, __pos);
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, sp) => {
+ match ::peg::ParseLiteral::parse_string_literal(
+ __input, __pos, "++",
+ ) {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ let __seq_res = __parse_primary(
+ __input,
+ __state,
+ __err_state,
+ __pos,
+ );
+ match __seq_res {
+ ::peg::RuleResult::Matched(
+ __pos,
+ sep,
+ ) => ::peg::RuleResult::Matched(
+ __pos,
+ (|| {
+ Repeat {
+ inner: Box::new(e),
+ bound: BoundedRepeat::Plus,
+ sep: Some(Box::new(sep)),
+ }
+ .at(sp)
+ })(
+ ),
+ ),
+ ::peg::RuleResult::Failed => {
+ ::peg::RuleResult::Failed
+ }
+ }
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\"++\"");
+ ::peg::RuleResult::Failed
+ }
+ }
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ };
+ match __choice_res {
+ ::peg::RuleResult::Matched(__pos, __value) => {
+ ::peg::RuleResult::Matched(__pos, __value)
+ }
+ ::peg::RuleResult::Failed => {
+ let __choice_res = {
+ let __seq_res =
+ __parse_prefixed(__input, __state, __err_state, __pos);
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, e) => {
+ let __seq_res = __parse_sp(
+ __input,
+ __state,
+ __err_state,
+ __pos,
+ );
+ match __seq_res { :: peg :: RuleResult :: Matched (__pos , sp) => { match :: peg :: ParseLiteral :: parse_string_literal (__input , __pos , "*") { :: peg :: RuleResult :: Matched (__pos , __val) => { { let __seq_res = __parse_repeatcount (__input , __state , __err_state , __pos) ; match __seq_res { :: peg :: RuleResult :: Matched (__pos , count) => { :: peg :: RuleResult :: Matched (__pos , (|| { Repeat { inner : Box :: new (e) , bound : count , sep : None } . at (sp) }) ()) } :: peg :: RuleResult :: Failed => :: peg :: RuleResult :: Failed , } } } :: peg :: RuleResult :: Failed => { __err_state . mark_failure (__pos , "\"*\"") ; :: peg :: RuleResult :: Failed } } } :: peg :: RuleResult :: Failed => :: peg :: RuleResult :: Failed , }
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ };
+ match __choice_res {
+ ::peg::RuleResult::Matched(__pos, __value) => {
+ ::peg::RuleResult::Matched(__pos, __value)
+ }
+ ::peg::RuleResult::Failed => {
+ let __choice_res = {
+ let __seq_res = __parse_prefixed(
+ __input,
+ __state,
+ __err_state,
+ __pos,
+ );
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, e) => {
+ let __seq_res = __parse_sp(
+ __input,
+ __state,
+ __err_state,
+ __pos,
+ );
+ match __seq_res { :: peg :: RuleResult :: Matched (__pos , sp) => { match :: peg :: ParseLiteral :: parse_string_literal (__input , __pos , "+") { :: peg :: RuleResult :: Matched (__pos , __val) => { :: peg :: RuleResult :: Matched (__pos , (|| { Repeat { inner : Box :: new (e) , bound : BoundedRepeat :: Plus , sep : None } . at (sp) }) ()) } :: peg :: RuleResult :: Failed => { __err_state . mark_failure (__pos , "\"+\"") ; :: peg :: RuleResult :: Failed } } } :: peg :: RuleResult :: Failed => :: peg :: RuleResult :: Failed , }
+ }
+ ::peg::RuleResult::Failed => {
+ ::peg::RuleResult::Failed
+ }
+ }
+ };
+ match __choice_res {
+ ::peg::RuleResult::Matched(__pos, __value) => {
+ ::peg::RuleResult::Matched(__pos, __value)
+ }
+ ::peg::RuleResult::Failed => __parse_prefixed(
+ __input,
+ __state,
+ __err_state,
+ __pos,
+ ),
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ fn __parse_repeatcount<'input>(
+ __input: &'input Input,
+ __state: &mut ParseState<'input>,
+ __err_state: &mut ::peg::error::ErrorState,
+ __pos: usize,
+ ) -> ::peg::RuleResult<BoundedRepeat> {
+ #![allow(non_snake_case, unused, clippy::redundant_closure_call)]
+ {
+ let __choice_res = match ::peg::ParseLiteral::parse_string_literal(__input, __pos, "<")
+ {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ let __seq_res = __parse_repeatnum(__input, __state, __err_state, __pos);
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, n) => {
+ match ::peg::ParseLiteral::parse_string_literal(__input, __pos, ">") {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ ::peg::RuleResult::Matched(
+ __pos,
+ (|| BoundedRepeat::Exact(n))(),
+ )
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\">\"");
+ ::peg::RuleResult::Failed
+ }
+ }
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\"<\"");
+ ::peg::RuleResult::Failed
+ }
+ };
+ match __choice_res {
+ ::peg::RuleResult::Matched(__pos, __value) => {
+ ::peg::RuleResult::Matched(__pos, __value)
+ }
+ ::peg::RuleResult::Failed => {
+ let __choice_res = match ::peg::ParseLiteral::parse_string_literal(
+ __input, __pos, "<",
+ ) {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ let __seq_res =
+ match __parse_repeatnum(__input, __state, __err_state, __pos) {
+ ::peg::RuleResult::Matched(__newpos, __value) => {
+ ::peg::RuleResult::Matched(__newpos, Some(__value))
+ }
+ ::peg::RuleResult::Failed => {
+ ::peg::RuleResult::Matched(__pos, None)
+ }
+ };
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, min) => {
+ match ::peg::ParseLiteral::parse_string_literal(
+ __input, __pos, ",",
+ ) {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ let __seq_res = match __parse_repeatnum(
+ __input,
+ __state,
+ __err_state,
+ __pos,
+ ) {
+ ::peg::RuleResult::Matched(__newpos, __value) => {
+ ::peg::RuleResult::Matched(
+ __newpos,
+ Some(__value),
+ )
+ }
+ ::peg::RuleResult::Failed => {
+ ::peg::RuleResult::Matched(__pos, None)
+ }
+ };
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, max) => {
+ match ::peg::ParseLiteral::parse_string_literal(
+ __input, __pos, ">",
+ ) {
+ ::peg::RuleResult::Matched(
+ __pos,
+ __val,
+ ) => ::peg::RuleResult::Matched(
+ __pos,
+ (|| BoundedRepeat::Both(min, max))(),
+ ),
+ ::peg::RuleResult::Failed => {
+ __err_state
+ .mark_failure(__pos, "\">\"");
+ ::peg::RuleResult::Failed
+ }
+ }
+ }
+ ::peg::RuleResult::Failed => {
+ ::peg::RuleResult::Failed
+ }
+ }
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\",\"");
+ ::peg::RuleResult::Failed
+ }
+ }
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\"<\"");
+ ::peg::RuleResult::Failed
+ }
+ };
+ match __choice_res {
+ ::peg::RuleResult::Matched(__pos, __value) => {
+ ::peg::RuleResult::Matched(__pos, __value)
+ }
+ ::peg::RuleResult::Failed => {
+ ::peg::RuleResult::Matched(__pos, (|| BoundedRepeat::None)())
+ }
+ }
+ }
+ }
+ }
+ }
+ fn __parse_repeatnum<'input>(
+ __input: &'input Input,
+ __state: &mut ParseState<'input>,
+ __err_state: &mut ::peg::error::ErrorState,
+ __pos: usize,
+ ) -> ::peg::RuleResult<TokenStream> {
+ #![allow(non_snake_case, unused, clippy::redundant_closure_call)]
+ {
+ let str_start = __pos;
+ match {
+ let __choice_res = match __parse_INTEGER(__input, __state, __err_state, __pos) {
+ ::peg::RuleResult::Matched(pos, _) => ::peg::RuleResult::Matched(pos, ()),
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ };
+ match __choice_res {
+ ::peg::RuleResult::Matched(__pos, __value) => {
+ ::peg::RuleResult::Matched(__pos, __value)
+ }
+ ::peg::RuleResult::Failed => {
+ match __parse_BRACE_GROUP(__input, __state, __err_state, __pos) {
+ ::peg::RuleResult::Matched(pos, _) => {
+ ::peg::RuleResult::Matched(pos, ())
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ }
+ }
+ } {
+ ::peg::RuleResult::Matched(__newpos, _) => ::peg::RuleResult::Matched(
+ __newpos,
+ ::peg::ParseSlice::parse_slice(__input, str_start, __newpos),
+ ),
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ }
+ }
+ fn __parse_prefixed<'input>(
+ __input: &'input Input,
+ __state: &mut ParseState<'input>,
+ __err_state: &mut ::peg::error::ErrorState,
+ __pos: usize,
+ ) -> ::peg::RuleResult<SpannedExpr> {
+ #![allow(non_snake_case, unused, clippy::redundant_closure_call)]
+ {
+ let __choice_res = {
+ let __seq_res = __parse_sp(__input, __state, __err_state, __pos);
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, sp) => {
+ match ::peg::ParseLiteral::parse_string_literal(__input, __pos, "$") {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ let __seq_res =
+ __parse_primary(__input, __state, __err_state, __pos);
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, expression) => {
+ ::peg::RuleResult::Matched(
+ __pos,
+ (|| MatchStrExpr(Box::new(expression)).at(sp))(),
+ )
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\"$\"");
+ ::peg::RuleResult::Failed
+ }
+ }
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ };
+ match __choice_res {
+ ::peg::RuleResult::Matched(__pos, __value) => {
+ ::peg::RuleResult::Matched(__pos, __value)
+ }
+ ::peg::RuleResult::Failed => {
+ let __choice_res = {
+ let __seq_res = __parse_sp(__input, __state, __err_state, __pos);
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, sp) => {
+ match ::peg::ParseLiteral::parse_string_literal(__input, __pos, "&")
+ {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ let __seq_res =
+ __parse_primary(__input, __state, __err_state, __pos);
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, expression) => {
+ ::peg::RuleResult::Matched(
+ __pos,
+ (|| PosAssertExpr(Box::new(expression)).at(sp))(
+ ),
+ )
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\"&\"");
+ ::peg::RuleResult::Failed
+ }
+ }
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ };
+ match __choice_res {
+ ::peg::RuleResult::Matched(__pos, __value) => {
+ ::peg::RuleResult::Matched(__pos, __value)
+ }
+ ::peg::RuleResult::Failed => {
+ let __choice_res = {
+ let __seq_res = __parse_sp(__input, __state, __err_state, __pos);
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, sp) => {
+ match ::peg::ParseLiteral::parse_string_literal(
+ __input, __pos, "!",
+ ) {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ let __seq_res = __parse_primary(
+ __input,
+ __state,
+ __err_state,
+ __pos,
+ );
+ match __seq_res {
+ ::peg::RuleResult::Matched(
+ __pos,
+ expression,
+ ) => ::peg::RuleResult::Matched(
+ __pos,
+ (|| {
+ NegAssertExpr(Box::new(expression))
+ .at(sp)
+ })(
+ ),
+ ),
+ ::peg::RuleResult::Failed => {
+ ::peg::RuleResult::Failed
+ }
+ }
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\"!\"");
+ ::peg::RuleResult::Failed
+ }
+ }
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ };
+ match __choice_res {
+ ::peg::RuleResult::Matched(__pos, __value) => {
+ ::peg::RuleResult::Matched(__pos, __value)
+ }
+ ::peg::RuleResult::Failed => {
+ __parse_primary(__input, __state, __err_state, __pos)
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ fn __parse_primary<'input>(
+ __input: &'input Input,
+ __state: &mut ParseState<'input>,
+ __err_state: &mut ::peg::error::ErrorState,
+ __pos: usize,
+ ) -> ::peg::RuleResult<SpannedExpr> {
+ #![allow(non_snake_case, unused, clippy::redundant_closure_call)]
+ if let Some(entry) = __state.primary_cache.get(&__pos) {
+ return entry.clone();
+ }
+ let __rule_result = {
+ let __choice_res = {
+ let __seq_res = __parse_sp(__input, __state, __err_state, __pos);
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, sp) => {
+ match ::peg::ParseLiteral::parse_string_literal(
+ __input,
+ __pos,
+ "precedence",
+ ) {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ match ::peg::ParseLiteral::parse_string_literal(__input, __pos, "!")
+ {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ match ::peg::ParseLiteral::parse_string_literal(
+ __input, __pos, "{",
+ ) {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ let __seq_res = {
+ let mut __repeat_pos = __pos;
+ let mut __repeat_value = vec![];
+ loop {
+ let __pos = __repeat_pos;
+ let __pos = if __repeat_value.is_empty() {
+ __pos
+ } else {
+ let __sep_res = match :: peg :: ParseLiteral :: parse_string_literal (__input , __pos , "--") { :: peg :: RuleResult :: Matched (__pos , __val) => { :: peg :: RuleResult :: Matched (__pos , __val) } :: peg :: RuleResult :: Failed => { __err_state . mark_failure (__pos , "\"--\"") ; :: peg :: RuleResult :: Failed } } ;
+ match __sep_res {
+ ::peg::RuleResult::Matched(
+ __newpos,
+ _,
+ ) => __newpos,
+ ::peg::RuleResult::Failed => break,
+ }
+ };
+ let __step_res = __parse_precedence_level(
+ __input,
+ __state,
+ __err_state,
+ __pos,
+ );
+ match __step_res {
+ ::peg::RuleResult::Matched(
+ __newpos,
+ __value,
+ ) => {
+ __repeat_pos = __newpos;
+ __repeat_value.push(__value);
+ }
+ ::peg::RuleResult::Failed => {
+ break;
+ }
+ }
+ }
+ ::peg::RuleResult::Matched(
+ __repeat_pos,
+ __repeat_value,
+ )
+ };
+ match __seq_res { :: peg :: RuleResult :: Matched (__pos , levels) => { match :: peg :: ParseLiteral :: parse_string_literal (__input , __pos , "}") { :: peg :: RuleResult :: Matched (__pos , __val) => { :: peg :: RuleResult :: Matched (__pos , (|| { PrecedenceExpr { levels : levels } . at (sp) }) ()) } :: peg :: RuleResult :: Failed => { __err_state . mark_failure (__pos , "\"}\"") ; :: peg :: RuleResult :: Failed } } } :: peg :: RuleResult :: Failed => :: peg :: RuleResult :: Failed , }
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\"{\"");
+ ::peg::RuleResult::Failed
+ }
+ }
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\"!\"");
+ ::peg::RuleResult::Failed
+ }
+ }
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\"precedence\"");
+ ::peg::RuleResult::Failed
+ }
+ }
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ };
+ match __choice_res {
+ ::peg::RuleResult::Matched(__pos, __value) => {
+ ::peg::RuleResult::Matched(__pos, __value)
+ }
+ ::peg::RuleResult::Failed => {
+ let __choice_res = {
+ let __seq_res = __parse_sp(__input, __state, __err_state, __pos);
+ match __seq_res { :: peg :: RuleResult :: Matched (__pos , sp) => { match :: peg :: ParseLiteral :: parse_string_literal (__input , __pos , "position") { :: peg :: RuleResult :: Matched (__pos , __val) => { match :: peg :: ParseLiteral :: parse_string_literal (__input , __pos , "!") { :: peg :: RuleResult :: Matched (__pos , __val) => { match :: peg :: ParseLiteral :: parse_string_literal (__input , __pos , "(") { :: peg :: RuleResult :: Matched (__pos , __val) => { match :: peg :: ParseLiteral :: parse_string_literal (__input , __pos , ")") { :: peg :: RuleResult :: Matched (__pos , __val) => { :: peg :: RuleResult :: Matched (__pos , (|| { PositionExpr . at (sp) }) ()) } :: peg :: RuleResult :: Failed => { __err_state . mark_failure (__pos , "\")\"") ; :: peg :: RuleResult :: Failed } } } :: peg :: RuleResult :: Failed => { __err_state . mark_failure (__pos , "\"(\"") ; :: peg :: RuleResult :: Failed } } } :: peg :: RuleResult :: Failed => { __err_state . mark_failure (__pos , "\"!\"") ; :: peg :: RuleResult :: Failed } } } :: peg :: RuleResult :: Failed => { __err_state . mark_failure (__pos , "\"position\"") ; :: peg :: RuleResult :: Failed } } } :: peg :: RuleResult :: Failed => :: peg :: RuleResult :: Failed , }
+ };
+ match __choice_res {
+ ::peg::RuleResult::Matched(__pos, __value) => {
+ ::peg::RuleResult::Matched(__pos, __value)
+ }
+ ::peg::RuleResult::Failed => {
+ let __choice_res = {
+ let __seq_res = __parse_sp(__input, __state, __err_state, __pos);
+ match __seq_res { :: peg :: RuleResult :: Matched (__pos , sp) => { match :: peg :: ParseLiteral :: parse_string_literal (__input , __pos , "quiet") { :: peg :: RuleResult :: Matched (__pos , __val) => { match :: peg :: ParseLiteral :: parse_string_literal (__input , __pos , "!") { :: peg :: RuleResult :: Matched (__pos , __val) => { match :: peg :: ParseLiteral :: parse_string_literal (__input , __pos , "{") { :: peg :: RuleResult :: Matched (__pos , __val) => { { let __seq_res = __parse_expression (__input , __state , __err_state , __pos) ; match __seq_res { :: peg :: RuleResult :: Matched (__pos , e) => { match :: peg :: ParseLiteral :: parse_string_literal (__input , __pos , "}") { :: peg :: RuleResult :: Matched (__pos , __val) => { :: peg :: RuleResult :: Matched (__pos , (|| { QuietExpr (Box :: new (e)) . at (sp) }) ()) } :: peg :: RuleResult :: Failed => { __err_state . mark_failure (__pos , "\"}\"") ; :: peg :: RuleResult :: Failed } } } :: peg :: RuleResult :: Failed => :: peg :: RuleResult :: Failed , } } } :: peg :: RuleResult :: Failed => { __err_state . mark_failure (__pos , "\"{\"") ; :: peg :: RuleResult :: Failed } } } :: peg :: RuleResult :: Failed => { __err_state . mark_failure (__pos , "\"!\"") ; :: peg :: RuleResult :: Failed } } } :: peg :: RuleResult :: Failed => { __err_state . mark_failure (__pos , "\"quiet\"") ; :: peg :: RuleResult :: Failed } } } :: peg :: RuleResult :: Failed => :: peg :: RuleResult :: Failed , }
+ };
+ match __choice_res {
+ ::peg::RuleResult::Matched(__pos, __value) => {
+ ::peg::RuleResult::Matched(__pos, __value)
+ }
+ ::peg::RuleResult::Failed => {
+ let __choice_res = {
+ let __seq_res =
+ __parse_sp(__input, __state, __err_state, __pos);
+ match __seq_res { :: peg :: RuleResult :: Matched (__pos , sp) => { match :: peg :: ParseLiteral :: parse_string_literal (__input , __pos , "expected") { :: peg :: RuleResult :: Matched (__pos , __val) => { match :: peg :: ParseLiteral :: parse_string_literal (__input , __pos , "!") { :: peg :: RuleResult :: Matched (__pos , __val) => { match :: peg :: ParseLiteral :: parse_string_literal (__input , __pos , "(") { :: peg :: RuleResult :: Matched (__pos , __val) => { { let __seq_res = __parse_LITERAL (__input , __state , __err_state , __pos) ; match __seq_res { :: peg :: RuleResult :: Matched (__pos , s) => { match :: peg :: ParseLiteral :: parse_string_literal (__input , __pos , ")") { :: peg :: RuleResult :: Matched (__pos , __val) => { :: peg :: RuleResult :: Matched (__pos , (|| { FailExpr (s) . at (sp) }) ()) } :: peg :: RuleResult :: Failed => { __err_state . mark_failure (__pos , "\")\"") ; :: peg :: RuleResult :: Failed } } } :: peg :: RuleResult :: Failed => :: peg :: RuleResult :: Failed , } } } :: peg :: RuleResult :: Failed => { __err_state . mark_failure (__pos , "\"(\"") ; :: peg :: RuleResult :: Failed } } } :: peg :: RuleResult :: Failed => { __err_state . mark_failure (__pos , "\"!\"") ; :: peg :: RuleResult :: Failed } } } :: peg :: RuleResult :: Failed => { __err_state . mark_failure (__pos , "\"expected\"") ; :: peg :: RuleResult :: Failed } } } :: peg :: RuleResult :: Failed => :: peg :: RuleResult :: Failed , }
+ };
+ match __choice_res {
+ ::peg::RuleResult::Matched(__pos, __value) => {
+ ::peg::RuleResult::Matched(__pos, __value)
+ }
+ ::peg::RuleResult::Failed => {
+ let __choice_res = {
+ let __seq_res = {
+ __err_state.suppress_fail += 1;
+ let __assert_res = {
+ let __choice_res = match :: peg :: ParseLiteral :: parse_string_literal (__input , __pos , "_") { :: peg :: RuleResult :: Matched (__pos , __val) => { :: peg :: RuleResult :: Matched (__pos , __val) } :: peg :: RuleResult :: Failed => { __err_state . mark_failure (__pos , "\"_\"") ; :: peg :: RuleResult :: Failed } } ;
+ match __choice_res {
+ ::peg::RuleResult::Matched(
+ __pos,
+ __value,
+ ) => ::peg::RuleResult::Matched(
+ __pos, __value,
+ ),
+ ::peg::RuleResult::Failed => {
+ let __choice_res = match :: peg :: ParseLiteral :: parse_string_literal (__input , __pos , "__") { :: peg :: RuleResult :: Matched (__pos , __val) => { :: peg :: RuleResult :: Matched (__pos , __val) } :: peg :: RuleResult :: Failed => { __err_state . mark_failure (__pos , "\"__\"") ; :: peg :: RuleResult :: Failed } } ;
+ match __choice_res { :: peg :: RuleResult :: Matched (__pos , __value) => :: peg :: RuleResult :: Matched (__pos , __value) , :: peg :: RuleResult :: Failed => match :: peg :: ParseLiteral :: parse_string_literal (__input , __pos , "___") { :: peg :: RuleResult :: Matched (__pos , __val) => { :: peg :: RuleResult :: Matched (__pos , __val) } :: peg :: RuleResult :: Failed => { __err_state . mark_failure (__pos , "\"___\"") ; :: peg :: RuleResult :: Failed } } }
+ }
+ }
+ };
+ __err_state.suppress_fail -= 1;
+ match __assert_res {
+ ::peg::RuleResult::Matched(_, __value) => {
+ ::peg::RuleResult::Matched(
+ __pos, __value,
+ )
+ }
+ ::peg::RuleResult::Failed => {
+ ::peg::RuleResult::Failed
+ }
+ }
+ };
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, _) => {
+ let __seq_res = __parse_sp(
+ __input,
+ __state,
+ __err_state,
+ __pos,
+ );
+ match __seq_res {
+ ::peg::RuleResult::Matched(
+ __pos,
+ sp,
+ ) => {
+ let __seq_res = __parse_IDENT(
+ __input,
+ __state,
+ __err_state,
+ __pos,
+ );
+ match __seq_res {
+ ::peg::RuleResult::Matched(
+ __pos,
+ name,
+ ) => {
+ ::peg::RuleResult::Matched(
+ __pos,
+ (|| {
+ RuleExpr(
+ name,
+ Vec::new(),
+ )
+ .at(sp)
+ })(
+ ),
+ )
+ }
+ ::peg::RuleResult::Failed => {
+ ::peg::RuleResult::Failed
+ }
+ }
+ }
+ ::peg::RuleResult::Failed => {
+ ::peg::RuleResult::Failed
+ }
+ }
+ }
+ ::peg::RuleResult::Failed => {
+ ::peg::RuleResult::Failed
+ }
+ }
+ };
+ match __choice_res {
+ ::peg::RuleResult::Matched(__pos, __value) => {
+ ::peg::RuleResult::Matched(__pos, __value)
+ }
+ ::peg::RuleResult::Failed => {
+ let __choice_res = {
+ let __seq_res = __parse_sp(
+ __input,
+ __state,
+ __err_state,
+ __pos,
+ );
+ match __seq_res {
+ ::peg::RuleResult::Matched(
+ __pos,
+ sp,
+ ) => {
+ let __seq_res = __parse_IDENT(
+ __input,
+ __state,
+ __err_state,
+ __pos,
+ );
+ match __seq_res { :: peg :: RuleResult :: Matched (__pos , name) => { match :: peg :: ParseLiteral :: parse_string_literal (__input , __pos , "(") { :: peg :: RuleResult :: Matched (__pos , __val) => { { let __seq_res = { let mut __repeat_pos = __pos ; let mut __repeat_value = vec ! () ; loop { let __pos = __repeat_pos ; let __pos = if __repeat_value . is_empty () { __pos } else { let __sep_res = match :: peg :: ParseLiteral :: parse_string_literal (__input , __pos , ",") { :: peg :: RuleResult :: Matched (__pos , __val) => { :: peg :: RuleResult :: Matched (__pos , __val) } :: peg :: RuleResult :: Failed => { __err_state . mark_failure (__pos , "\",\"") ; :: peg :: RuleResult :: Failed } } ; match __sep_res { :: peg :: RuleResult :: Matched (__newpos , _) => { __newpos } , :: peg :: RuleResult :: Failed => break , } } ; let __step_res = __parse_rule_arg (__input , __state , __err_state , __pos) ; match __step_res { :: peg :: RuleResult :: Matched (__newpos , __value) => { __repeat_pos = __newpos ; __repeat_value . push (__value) ; } , :: peg :: RuleResult :: Failed => { break ; } } } :: peg :: RuleResult :: Matched (__repeat_pos , __repeat_value) } ; match __seq_res { :: peg :: RuleResult :: Matched (__pos , args) => { match :: peg :: ParseLiteral :: parse_string_literal (__input , __pos , ")") { :: peg :: RuleResult :: Matched (__pos , __val) => { :: peg :: RuleResult :: Matched (__pos , (|| { RuleExpr (name , args) . at (sp) }) ()) } :: peg :: RuleResult :: Failed => { __err_state . mark_failure (__pos , "\")\"") ; :: peg :: RuleResult :: Failed } } } :: peg :: RuleResult :: Failed => :: peg :: RuleResult :: Failed , } } } :: peg :: RuleResult :: Failed => { __err_state . mark_failure (__pos , "\"(\"") ; :: peg :: RuleResult :: Failed } } } :: peg :: RuleResult :: Failed => :: peg :: RuleResult :: Failed , }
+ }
+ ::peg::RuleResult::Failed => {
+ ::peg::RuleResult::Failed
+ }
+ }
+ };
+ match __choice_res {
+ ::peg::RuleResult::Matched(
+ __pos,
+ __value,
+ ) => ::peg::RuleResult::Matched(
+ __pos, __value,
+ ),
+ ::peg::RuleResult::Failed => {
+ let __choice_res = {
+ let __seq_res = __parse_sp(
+ __input,
+ __state,
+ __err_state,
+ __pos,
+ );
+ match __seq_res {
+ ::peg::RuleResult::Matched(
+ __pos,
+ sp,
+ ) => {
+ let __seq_res =
+ __parse_LITERAL(
+ __input,
+ __state,
+ __err_state,
+ __pos,
+ );
+ match __seq_res { :: peg :: RuleResult :: Matched (__pos , l) => { :: peg :: RuleResult :: Matched (__pos , (|| { LiteralExpr (l) . at (sp) }) ()) } :: peg :: RuleResult :: Failed => :: peg :: RuleResult :: Failed , }
+ }
+ ::peg::RuleResult::Failed => {
+ ::peg::RuleResult::Failed
+ }
+ }
+ };
+ match __choice_res {
+ ::peg::RuleResult::Matched(
+ __pos,
+ __value,
+ ) => ::peg::RuleResult::Matched(
+ __pos, __value,
+ ),
+ ::peg::RuleResult::Failed => {
+ let __choice_res = {
+ let __seq_res = __parse_sp(
+ __input,
+ __state,
+ __err_state,
+ __pos,
+ );
+ match __seq_res { :: peg :: RuleResult :: Matched (__pos , sp) => { { let __seq_res = __parse_BRACKET_GROUP (__input , __state , __err_state , __pos) ; match __seq_res { :: peg :: RuleResult :: Matched (__pos , p) => { :: peg :: RuleResult :: Matched (__pos , (|| { PatternExpr (p) . at (sp) }) ()) } :: peg :: RuleResult :: Failed => :: peg :: RuleResult :: Failed , } } } :: peg :: RuleResult :: Failed => :: peg :: RuleResult :: Failed , }
+ };
+ match __choice_res { :: peg :: RuleResult :: Matched (__pos , __value) => :: peg :: RuleResult :: Matched (__pos , __value) , :: peg :: RuleResult :: Failed => { let __choice_res = match :: peg :: ParseLiteral :: parse_string_literal (__input , __pos , "(") { :: peg :: RuleResult :: Matched (__pos , __val) => { { let __seq_res = __parse_sp (__input , __state , __err_state , __pos) ; match __seq_res { :: peg :: RuleResult :: Matched (__pos , sp) => { match :: peg :: ParseLiteral :: parse_string_literal (__input , __pos , "@") { :: peg :: RuleResult :: Matched (__pos , __val) => { match :: peg :: ParseLiteral :: parse_string_literal (__input , __pos , ")") { :: peg :: RuleResult :: Matched (__pos , __val) => { :: peg :: RuleResult :: Matched (__pos , (|| { MarkerExpr (true) . at (sp) }) ()) } :: peg :: RuleResult :: Failed => { __err_state . mark_failure (__pos , "\")\"") ; :: peg :: RuleResult :: Failed } } } :: peg :: RuleResult :: Failed => { __err_state . mark_failure (__pos , "\"@\"") ; :: peg :: RuleResult :: Failed } } } :: peg :: RuleResult :: Failed => :: peg :: RuleResult :: Failed , } } } :: peg :: RuleResult :: Failed => { __err_state . mark_failure (__pos , "\"(\"") ; :: peg :: RuleResult :: Failed } } ; match __choice_res { :: peg :: RuleResult :: Matched (__pos , __value) => :: peg :: RuleResult :: Matched (__pos , __value) , :: peg :: RuleResult :: Failed => { let __choice_res = { let __seq_res = __parse_sp (__input , __state , __err_state , __pos) ; match __seq_res { :: peg :: RuleResult :: Matched (__pos , sp) => { match :: peg :: ParseLiteral :: parse_string_literal (__input , __pos , "@") { :: peg :: RuleResult :: Matched (__pos , __val) => { :: peg :: RuleResult :: Matched (__pos , (|| { MarkerExpr (false) . at (sp) }) ()) } :: peg :: RuleResult :: Failed => { __err_state . mark_failure (__pos , "\"@\"") ; :: peg :: RuleResult :: Failed } } } :: peg :: RuleResult :: Failed => :: peg :: RuleResult :: Failed , } } ; match __choice_res { :: peg :: RuleResult :: Matched (__pos , __value) => :: peg :: RuleResult :: Matched (__pos , __value) , :: peg :: RuleResult :: Failed => { let __choice_res = { let __seq_res = __parse_sp (__input , __state , __err_state , __pos) ; match __seq_res { :: peg :: RuleResult :: Matched (__pos , sp) => { match :: peg :: ParseLiteral :: parse_string_literal (__input , __pos , "##") { :: peg :: RuleResult :: Matched (__pos , __val) => { { let __seq_res = __parse_IDENT (__input , __state , __err_state , __pos) ; match __seq_res { :: peg :: RuleResult :: Matched (__pos , method) => { { let __seq_res = __parse_PAREN_GROUP (__input , __state , __err_state , __pos) ; match __seq_res { :: peg :: RuleResult :: Matched (__pos , args) => { :: peg :: RuleResult :: Matched (__pos , (|| { MethodExpr (method , args . stream ()) . at (sp) }) ()) } :: peg :: RuleResult :: Failed => :: peg :: RuleResult :: Failed , } } } :: peg :: RuleResult :: Failed => :: peg :: RuleResult :: Failed , } } } :: peg :: RuleResult :: Failed => { __err_state . mark_failure (__pos , "\"##\"") ; :: peg :: RuleResult :: Failed } } } :: peg :: RuleResult :: Failed => :: peg :: RuleResult :: Failed , } } ; match __choice_res { :: peg :: RuleResult :: Matched (__pos , __value) => :: peg :: RuleResult :: Matched (__pos , __value) , :: peg :: RuleResult :: Failed => match :: peg :: ParseLiteral :: parse_string_literal (__input , __pos , "(") { :: peg :: RuleResult :: Matched (__pos , __val) => { { let __seq_res = __parse_expression (__input , __state , __err_state , __pos) ; match __seq_res { :: peg :: RuleResult :: Matched (__pos , expression) => { match :: peg :: ParseLiteral :: parse_string_literal (__input , __pos , ")") { :: peg :: RuleResult :: Matched (__pos , __val) => { :: peg :: RuleResult :: Matched (__pos , (|| { expression }) ()) } :: peg :: RuleResult :: Failed => { __err_state . mark_failure (__pos , "\")\"") ; :: peg :: RuleResult :: Failed } } } :: peg :: RuleResult :: Failed => :: peg :: RuleResult :: Failed , } } } :: peg :: RuleResult :: Failed => { __err_state . mark_failure (__pos , "\"(\"") ; :: peg :: RuleResult :: Failed } } } } } } } } }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ };
+ __state.primary_cache.insert(__pos, __rule_result.clone());
+ __rule_result
+ }
+ fn __parse_rule_arg<'input>(
+ __input: &'input Input,
+ __state: &mut ParseState<'input>,
+ __err_state: &mut ::peg::error::ErrorState,
+ __pos: usize,
+ ) -> ::peg::RuleResult<RuleArg> {
+ #![allow(non_snake_case, unused, clippy::redundant_closure_call)]
+ {
+ let __choice_res = match ::peg::ParseLiteral::parse_string_literal(__input, __pos, "<")
+ {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ let __seq_res = __parse_expression(__input, __state, __err_state, __pos);
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, e) => {
+ match ::peg::ParseLiteral::parse_string_literal(__input, __pos, ">") {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ ::peg::RuleResult::Matched(__pos, (|| RuleArg::Peg(e))())
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\">\"");
+ ::peg::RuleResult::Failed
+ }
+ }
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\"<\"");
+ ::peg::RuleResult::Failed
+ }
+ };
+ match __choice_res {
+ ::peg::RuleResult::Matched(__pos, __value) => {
+ ::peg::RuleResult::Matched(__pos, __value)
+ }
+ ::peg::RuleResult::Failed => {
+ let __seq_res = {
+ let str_start = __pos;
+ match {
+ let mut __repeat_pos = __pos;
+ let mut __repeat_value = vec![];
+ loop {
+ let __pos = __repeat_pos;
+ let __step_res = __input.eat_until(__pos, ',');
+ match __step_res {
+ ::peg::RuleResult::Matched(__newpos, __value) => {
+ __repeat_pos = __newpos;
+ __repeat_value.push(__value);
+ }
+ ::peg::RuleResult::Failed => {
+ break;
+ }
+ }
+ }
+ if __repeat_value.len() >= 1 {
+ ::peg::RuleResult::Matched(__repeat_pos, ())
+ } else {
+ ::peg::RuleResult::Failed
+ }
+ } {
+ ::peg::RuleResult::Matched(__newpos, _) => ::peg::RuleResult::Matched(
+ __newpos,
+ ::peg::ParseSlice::parse_slice(__input, str_start, __newpos),
+ ),
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ };
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, tt) => {
+ ::peg::RuleResult::Matched(__pos, (|| RuleArg::Rust(tt))())
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ }
+ }
+ }
+ }
+ fn __parse_precedence_level<'input>(
+ __input: &'input Input,
+ __state: &mut ParseState<'input>,
+ __err_state: &mut ::peg::error::ErrorState,
+ __pos: usize,
+ ) -> ::peg::RuleResult<PrecedenceLevel> {
+ #![allow(non_snake_case, unused, clippy::redundant_closure_call)]
+ {
+ let __seq_res = {
+ let mut __repeat_pos = __pos;
+ let mut __repeat_value = vec![];
+ loop {
+ let __pos = __repeat_pos;
+ let __step_res = __parse_precedence_op(__input, __state, __err_state, __pos);
+ match __step_res {
+ ::peg::RuleResult::Matched(__newpos, __value) => {
+ __repeat_pos = __newpos;
+ __repeat_value.push(__value);
+ }
+ ::peg::RuleResult::Failed => {
+ break;
+ }
+ }
+ }
+ if __repeat_value.len() >= 1 {
+ ::peg::RuleResult::Matched(__repeat_pos, __repeat_value)
+ } else {
+ ::peg::RuleResult::Failed
+ }
+ };
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, operators) => ::peg::RuleResult::Matched(
+ __pos,
+ (|| PrecedenceLevel {
+ operators: operators,
+ })(),
+ ),
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ }
+ }
+ fn __parse_precedence_op<'input>(
+ __input: &'input Input,
+ __state: &mut ParseState<'input>,
+ __err_state: &mut ::peg::error::ErrorState,
+ __pos: usize,
+ ) -> ::peg::RuleResult<PrecedenceOperator> {
+ #![allow(non_snake_case, unused, clippy::redundant_closure_call)]
+ {
+ let __seq_res = __parse_sp(__input, __state, __err_state, __pos);
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, span) => {
+ let __seq_res = {
+ let mut __repeat_pos = __pos;
+ let mut __repeat_value = vec![];
+ loop {
+ let __pos = __repeat_pos;
+ let __step_res = __parse_labeled(__input, __state, __err_state, __pos);
+ match __step_res {
+ ::peg::RuleResult::Matched(__newpos, __value) => {
+ __repeat_pos = __newpos;
+ __repeat_value.push(__value);
+ }
+ ::peg::RuleResult::Failed => {
+ break;
+ }
+ }
+ }
+ ::peg::RuleResult::Matched(__repeat_pos, __repeat_value)
+ };
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, elements) => {
+ let __seq_res =
+ __parse_BRACE_GROUP(__input, __state, __err_state, __pos);
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, action) => {
+ ::peg::RuleResult::Matched(
+ __pos,
+ (|| PrecedenceOperator {
+ span,
+ elements,
+ action,
+ })(),
+ )
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ }
+ }
+ fn __parse_sp<'input>(
+ __input: &'input Input,
+ __state: &mut ParseState<'input>,
+ __err_state: &mut ::peg::error::ErrorState,
+ __pos: usize,
+ ) -> ::peg::RuleResult<Span> {
+ #![allow(non_snake_case, unused, clippy::redundant_closure_call)]
+ __input.next_span(__pos)
+ }
+ fn __parse_KEYWORD<'input>(
+ __input: &'input Input,
+ __state: &mut ParseState<'input>,
+ __err_state: &mut ::peg::error::ErrorState,
+ __pos: usize,
+ ) -> ::peg::RuleResult<()> {
+ #![allow(non_snake_case, unused, clippy::redundant_closure_call)]
+ {
+ let __choice_res =
+ match ::peg::ParseLiteral::parse_string_literal(__input, __pos, "pub") {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ ::peg::RuleResult::Matched(__pos, __val)
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\"pub\"");
+ ::peg::RuleResult::Failed
+ }
+ };
+ match __choice_res {
+ ::peg::RuleResult::Matched(__pos, __value) => {
+ ::peg::RuleResult::Matched(__pos, __value)
+ }
+ ::peg::RuleResult::Failed => {
+ let __choice_res =
+ match ::peg::ParseLiteral::parse_string_literal(__input, __pos, "crate") {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ ::peg::RuleResult::Matched(__pos, __val)
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\"crate\"");
+ ::peg::RuleResult::Failed
+ }
+ };
+ match __choice_res {
+ ::peg::RuleResult::Matched(__pos, __value) => {
+ ::peg::RuleResult::Matched(__pos, __value)
+ }
+ ::peg::RuleResult::Failed => {
+ let __choice_res = match ::peg::ParseLiteral::parse_string_literal(
+ __input, __pos, "rule",
+ ) {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ ::peg::RuleResult::Matched(__pos, __val)
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\"rule\"");
+ ::peg::RuleResult::Failed
+ }
+ };
+ match __choice_res {
+ ::peg::RuleResult::Matched(__pos, __value) => {
+ ::peg::RuleResult::Matched(__pos, __value)
+ }
+ ::peg::RuleResult::Failed => {
+ let __choice_res =
+ match ::peg::ParseLiteral::parse_string_literal(
+ __input, __pos, "use",
+ ) {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ ::peg::RuleResult::Matched(__pos, __val)
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\"use\"");
+ ::peg::RuleResult::Failed
+ }
+ };
+ match __choice_res {
+ ::peg::RuleResult::Matched(__pos, __value) => {
+ ::peg::RuleResult::Matched(__pos, __value)
+ }
+ ::peg::RuleResult::Failed => {
+ match ::peg::ParseLiteral::parse_string_literal(
+ __input, __pos, "type",
+ ) {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ ::peg::RuleResult::Matched(__pos, __val)
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\"type\"");
+ ::peg::RuleResult::Failed
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ fn __parse_IDENT<'input>(
+ __input: &'input Input,
+ __state: &mut ParseState<'input>,
+ __err_state: &mut ::peg::error::ErrorState,
+ __pos: usize,
+ ) -> ::peg::RuleResult<Ident> {
+ #![allow(non_snake_case, unused, clippy::redundant_closure_call)]
+ {
+ let __seq_res = {
+ __err_state.suppress_fail += 1;
+ let __assert_res = match __parse_KEYWORD(__input, __state, __err_state, __pos) {
+ ::peg::RuleResult::Matched(pos, _) => ::peg::RuleResult::Matched(pos, ()),
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ };
+ __err_state.suppress_fail -= 1;
+ match __assert_res {
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Matched(__pos, ()),
+ ::peg::RuleResult::Matched(..) => ::peg::RuleResult::Failed,
+ }
+ };
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, _) => {
+ let __seq_res = __input.ident(__pos);
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, i) => {
+ ::peg::RuleResult::Matched(__pos, (|| i)())
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ }
+ }
+ fn __parse_LITERAL<'input>(
+ __input: &'input Input,
+ __state: &mut ParseState<'input>,
+ __err_state: &mut ::peg::error::ErrorState,
+ __pos: usize,
+ ) -> ::peg::RuleResult<Literal> {
+ #![allow(non_snake_case, unused, clippy::redundant_closure_call)]
+ __input.literal(__pos)
+ }
+ fn __parse_PAREN_GROUP<'input>(
+ __input: &'input Input,
+ __state: &mut ParseState<'input>,
+ __err_state: &mut ::peg::error::ErrorState,
+ __pos: usize,
+ ) -> ::peg::RuleResult<Group> {
+ #![allow(non_snake_case, unused, clippy::redundant_closure_call)]
+ __input.group(__pos, Delimiter::Parenthesis)
+ }
+ fn __parse_BRACE_GROUP<'input>(
+ __input: &'input Input,
+ __state: &mut ParseState<'input>,
+ __err_state: &mut ::peg::error::ErrorState,
+ __pos: usize,
+ ) -> ::peg::RuleResult<Group> {
+ #![allow(non_snake_case, unused, clippy::redundant_closure_call)]
+ __input.group(__pos, Delimiter::Brace)
+ }
+ fn __parse_BRACKET_GROUP<'input>(
+ __input: &'input Input,
+ __state: &mut ParseState<'input>,
+ __err_state: &mut ::peg::error::ErrorState,
+ __pos: usize,
+ ) -> ::peg::RuleResult<Group> {
+ #![allow(non_snake_case, unused, clippy::redundant_closure_call)]
+ __input.group(__pos, Delimiter::Bracket)
+ }
+ fn __parse_LIFETIME<'input>(
+ __input: &'input Input,
+ __state: &mut ParseState<'input>,
+ __err_state: &mut ::peg::error::ErrorState,
+ __pos: usize,
+ ) -> ::peg::RuleResult<()> {
+ #![allow(non_snake_case, unused, clippy::redundant_closure_call)]
+ match ::peg::ParseLiteral::parse_string_literal(__input, __pos, "'") {
+ ::peg::RuleResult::Matched(__pos, __val) => {
+ let __seq_res = match __parse_IDENT(__input, __state, __err_state, __pos) {
+ ::peg::RuleResult::Matched(pos, _) => ::peg::RuleResult::Matched(pos, ()),
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ };
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, _) => ::peg::RuleResult::Matched(__pos, ()),
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ }
+ ::peg::RuleResult::Failed => {
+ __err_state.mark_failure(__pos, "\"'\"");
+ ::peg::RuleResult::Failed
+ }
+ }
+ }
+ fn __parse_INTEGER<'input>(
+ __input: &'input Input,
+ __state: &mut ParseState<'input>,
+ __err_state: &mut ::peg::error::ErrorState,
+ __pos: usize,
+ ) -> ::peg::RuleResult<()> {
+ #![allow(non_snake_case, unused, clippy::redundant_closure_call)]
+ match __parse_LITERAL(__input, __state, __err_state, __pos) {
+ ::peg::RuleResult::Matched(pos, _) => ::peg::RuleResult::Matched(pos, ()),
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ }
+}
--- /dev/null
+use proc_macro2::{Group, Ident, Literal, Span, TokenStream, TokenTree};
+use std::collections::{HashMap, HashSet};
+
+use quote::{format_ident, quote, quote_spanned};
+
+pub use self::Expr::*;
+use crate::analysis;
+use crate::ast::*;
+
+pub fn report_error(span: Span, msg: String) -> TokenStream {
+ quote_spanned!(span=>compile_error!(#msg);)
+}
+
+pub fn report_error_expr(span: Span, msg: String) -> TokenStream {
+ // panic!() to avoid "Mismatched types" error
+ quote_spanned!(span=> { compile_error!(#msg); panic!() })
+}
+
+/// Test if the group begins with a specific marker character, and if so, return the remaining tokens.
+fn group_check_prefix(group: &Group, prefix: char) -> Option<TokenStream> {
+ let mut iter = group.stream().into_iter();
+ match iter.next() {
+ Some(TokenTree::Punct(p)) if p.as_char() == prefix => Some(iter.collect()),
+ _ => None,
+ }
+}
+
+fn extra_args_def(grammar: &Grammar) -> TokenStream {
+ let args: Vec<TokenStream> = grammar
+ .args
+ .iter()
+ .map(|&(ref name, ref tp)| quote!(, #name: #tp))
+ .collect();
+ quote!(#(#args)*)
+}
+
+fn extra_args_call(grammar: &Grammar) -> TokenStream {
+ let args: Vec<TokenStream> = grammar
+ .args
+ .iter()
+ .map(|&(ref name, _)| quote!(, #name))
+ .collect();
+ quote!(#(#args)*)
+}
+
+#[derive(Clone)]
+struct Context<'a> {
+ rules: &'a HashMap<String, &'a Rule>,
+ rules_from_args: HashSet<String>,
+ grammar_lifetime_params: &'a [TokenStream],
+ input_ty: TokenStream,
+ parse_state_ty: TokenStream,
+ extra_args_call: TokenStream,
+ extra_args_def: TokenStream,
+}
+
+pub(crate) fn compile_grammar(grammar: &Grammar) -> TokenStream {
+ let analysis = analysis::check(grammar);
+
+ let grammar_lifetime_params = ty_params_slice(&grammar.lifetime_params);
+
+ let context = &Context {
+ rules: &analysis.rules,
+ rules_from_args: HashSet::new(),
+ grammar_lifetime_params,
+ input_ty: quote!(&'input Input<#(#grammar_lifetime_params),*>),
+ parse_state_ty: quote!(&mut ParseState<'input #(, #grammar_lifetime_params)*>),
+ extra_args_call: extra_args_call(grammar),
+ extra_args_def: extra_args_def(grammar),
+ };
+
+ let mut seen_rule_names = HashSet::new();
+
+ let mut items = vec![];
+ for item in &grammar.items {
+ match item {
+ Item::Use(tt) => items.push(tt.clone()),
+ Item::Rule(rule) => {
+ if !seen_rule_names.insert(rule.name.to_string()) {
+ items.push(report_error(
+ rule.name.span(),
+ format!("duplicate rule `{}`", rule.name),
+ ));
+ continue;
+ }
+
+ if rule.cache.is_some() && !(rule.params.is_empty() && rule.ty_params.is_none()) {
+ items.push(report_error(
+ rule.name.span(),
+ "rules with generics or parameters cannot use #[cache] or #[cache_left_rec]".to_string(),
+ ));
+ continue;
+ }
+
+ if rule.visibility.is_some() {
+ for param in &rule.params {
+ if let RuleParamTy::Rule(..) = ¶m.ty {
+ items.push(report_error(
+ param.name.span(),
+ "parameters on `pub rule` must be Rust types".to_string(),
+ ))
+ }
+ }
+
+ items.push(compile_rule_export(context, rule));
+ } else if rule.no_eof {
+ items.push(report_error(
+ rule.name.span(),
+ "#[no_eof] is only meaningful for `pub rule`".to_string(),
+ ));
+ }
+
+ items.push(compile_rule(context, rule));
+ }
+ }
+ }
+
+ let parse_state = make_parse_state(grammar);
+ let Grammar {
+ name,
+ doc,
+ input_type,
+ visibility,
+ ..
+ } = grammar;
+
+ let mut errors: Vec<TokenStream> = analysis
+ .left_recursion
+ .iter()
+ .map(|rec| report_error(rec.span, rec.msg()))
+ .collect();
+
+ errors.extend(
+ analysis
+ .loop_nullability
+ .iter()
+ .map(|nl| report_error(nl.span, nl.msg())),
+ );
+
+ quote_spanned! { Span::mixed_site() =>
+ #doc
+ #visibility mod #name {
+ #[allow(unused_imports)]
+ use super::*;
+ type Input<#(#grammar_lifetime_params),*> = #input_type;
+ type PositionRepr<#(#grammar_lifetime_params),*> = <Input<#(#grammar_lifetime_params),*> as ::peg::Parse>::PositionRepr;
+
+ #(#errors)*
+ #parse_state
+ #(#items)*
+ }
+ }
+}
+
+fn make_parse_state(grammar: &Grammar) -> TokenStream {
+ let span = Span::mixed_site();
+ let grammar_lifetime_params = ty_params_slice(&grammar.lifetime_params);
+ let mut cache_fields_def: Vec<TokenStream> = Vec::new();
+ let mut cache_fields: Vec<Ident> = Vec::new();
+ for rule in grammar.iter_rules() {
+ if rule.cache.is_some() && rule.params.is_empty() && rule.ty_params.is_none() {
+ let name = format_ident!("{}_cache", rule.name);
+ let ret_ty = rule.ret_type.clone().unwrap_or_else(|| quote!(()));
+ cache_fields_def.push(
+ quote_spanned! { span => #name: ::std::collections::HashMap<usize, ::peg::RuleResult<#ret_ty>> },
+ );
+ cache_fields.push(name);
+ }
+ }
+
+ quote_spanned! { span =>
+ #[allow(unused_parens)]
+ struct ParseState<'input #(, #grammar_lifetime_params)*> {
+ _phantom: ::std::marker::PhantomData<(&'input () #(, &#grammar_lifetime_params ())*)>,
+ #(#cache_fields_def),*
+ }
+
+ impl<'input #(, #grammar_lifetime_params)*> ParseState<'input #(, #grammar_lifetime_params)*> {
+ fn new() -> ParseState<'input #(, #grammar_lifetime_params)*> {
+ ParseState {
+ _phantom: ::std::marker::PhantomData,
+ #(#cache_fields: ::std::collections::HashMap::new()),*
+ }
+ }
+ }
+ }
+}
+
+fn ty_params_slice(ty_params: &Option<Vec<TokenStream>>) -> &[TokenStream] {
+ ty_params.as_ref().map(|x| &x[..]).unwrap_or(&[])
+}
+
+fn rule_params_list(context: &Context, rule: &Rule) -> Vec<TokenStream> {
+ let Context {
+ input_ty,
+ parse_state_ty,
+ ..
+ } = context;
+ let span = rule.span.resolved_at(Span::mixed_site());
+ rule.params.iter().map(|param| {
+ let name = ¶m.name;
+ match ¶m.ty {
+ RuleParamTy::Rust(ty) => quote_spanned!{ span => #name: #ty },
+ RuleParamTy::Rule(ty) => quote_spanned!{ span =>
+ #name: impl Fn(#input_ty, #parse_state_ty, &mut ::peg::error::ErrorState, usize) -> ::peg::RuleResult<#ty>
+ },
+ }
+ }).collect()
+}
+
+/// Compile a rule to a function for use internal to the grammar.
+/// Returns `RuleResult<T>`.
+fn compile_rule(context: &Context, rule: &Rule) -> TokenStream {
+ let span = rule.span.resolved_at(Span::mixed_site());
+ let name = format_ident!("__parse_{}", rule.name, span = span);
+ let ret_ty = rule.ret_type.clone().unwrap_or_else(|| quote!(()));
+ let ty_params = ty_params_slice(&rule.ty_params);
+
+ let Context {
+ input_ty,
+ parse_state_ty,
+ grammar_lifetime_params,
+ extra_args_def,
+ ..
+ } = context;
+
+ let mut context = context.clone();
+ context
+ .rules_from_args
+ .extend(rule.params.iter().map(|param| param.name.to_string()));
+
+ let body = compile_expr(&context, &rule.expr, rule.ret_type.is_some());
+
+ let wrapped_body = if cfg!(feature = "trace") {
+ let str_rule_name = rule.name.to_string();
+ quote_spanned! { span => {
+ let loc = ::peg::Parse::position_repr(__input, __pos);
+ println!("[PEG_TRACE] Attempting to match rule `{}` at {}", #str_rule_name, loc);
+ let __peg_result: ::peg::RuleResult<#ret_ty> = {#body};
+ match __peg_result {
+ ::peg::RuleResult::Matched(epos, _) => {
+ let eloc = ::peg::Parse::position_repr(__input, epos);
+ println!("[PEG_TRACE] Matched rule `{}` at {} to {}", #str_rule_name, loc, eloc);
+ }
+ ::peg::RuleResult::Failed => {
+ println!("[PEG_TRACE] Failed to match rule `{}` at {}", #str_rule_name, loc);
+ }
+ }
+
+ __peg_result
+ }}
+ } else {
+ body
+ };
+
+ let rule_params = rule_params_list(&context, rule);
+
+ let fn_body = match &rule.cache {
+ None => wrapped_body,
+ Some(cache_type) => {
+ let cache_field = format_ident!("{}_cache", rule.name);
+
+ let cache_trace = if cfg!(feature = "trace") {
+ let str_rule_name = rule.name.to_string();
+ quote_spanned! { span =>
+ let loc = ::peg::Parse::position_repr(__input, __pos);
+ match &entry {
+ &::peg::RuleResult::Matched(..) => println!("[PEG_TRACE] Cached match of rule {} at {}", #str_rule_name, loc),
+ &Failed => println!("[PEG_TRACE] Cached fail of rule {} at {}", #str_rule_name, loc),
+ };
+ }
+ } else {
+ quote!()
+ };
+
+ match cache_type {
+ Cache::Simple => quote_spanned! { span =>
+ if let Some(entry) = __state.#cache_field.get(&__pos) {
+ #cache_trace
+ return entry.clone();
+ }
+
+ let __rule_result = #wrapped_body;
+ __state.#cache_field.insert(__pos, __rule_result.clone());
+ __rule_result
+ },
+ Cache::Recursive =>
+ // `#[cache_left_rec] support for recursive rules using the technique described here:
+ // <https://medium.com/@gvanrossum_83706/left-recursive-peg-grammars-65dab3c580e1>
+ {
+ quote_spanned! { span =>
+ if let Some(entry) = __state.#cache_field.get(&__pos) {
+ #cache_trace
+ return entry.clone();
+ }
+
+ __state.#cache_field.insert(__pos, ::peg::RuleResult::Failed);
+ let mut __last_result = ::peg::RuleResult::Failed;
+ loop {
+ let __current_result = { #wrapped_body };
+ match __current_result {
+ ::peg::RuleResult::Failed => break,
+ ::peg::RuleResult::Matched(__current_endpos, _) =>
+ match __last_result {
+ ::peg::RuleResult::Matched(__last_endpos, _) if __current_endpos <= __last_endpos => break,
+ _ => {
+ __state.#cache_field.insert(__pos, __current_result.clone());
+ __last_result = __current_result;
+ },
+ }
+ }
+ }
+
+ return __last_result;
+ }
+ }
+ }
+ }
+ };
+
+ quote_spanned! { span =>
+ fn #name<'input #(, #grammar_lifetime_params)* #(, #ty_params)*>(__input: #input_ty, __state: #parse_state_ty, __err_state: &mut ::peg::error::ErrorState, __pos: usize #extra_args_def #(, #rule_params)*) -> ::peg::RuleResult<#ret_ty> {
+ #![allow(non_snake_case, unused, clippy::redundant_closure_call)]
+ #fn_body
+ }
+ }
+}
+
+/// Compile a rule into the parsing function which will be exported.
+/// Returns `Result<T, ParseError>`.
+fn compile_rule_export(context: &Context, rule: &Rule) -> TokenStream {
+ let span = rule.span.resolved_at(Span::mixed_site());
+
+ let Rule {
+ doc,
+ name,
+ visibility,
+ ..
+ } = rule;
+ let ret_ty = rule.ret_type.clone().unwrap_or_else(|| quote!(()));
+ let parse_fn = format_ident!("__parse_{}", rule.name.to_string(), span = name.span());
+ let ty_params = ty_params_slice(&rule.ty_params);
+ let rule_params = rule_params_list(context, rule);
+ let rule_params_call: Vec<TokenStream> = rule
+ .params
+ .iter()
+ .map(|param| {
+ let param_name = ¶m.name;
+ quote!(#param_name)
+ })
+ .collect();
+
+ let Context {
+ input_ty,
+ extra_args_call,
+ extra_args_def,
+ grammar_lifetime_params,
+ ..
+ } = context;
+ let eof_check = if rule.no_eof {
+ quote_spanned! { span => true }
+ } else {
+ quote_spanned! { span => ::peg::Parse::is_eof(__input, __pos) }
+ };
+
+ // Parse once. If it succeeds or throws an error, return that.
+ // If it fails, parse again to determine the set of all tokens
+ // that were expected at the failure position.
+
+ quote_spanned! { span =>
+ #doc
+ #visibility fn #name<'input #(, #grammar_lifetime_params)* #(, #ty_params)*>(__input: #input_ty #extra_args_def #(, #rule_params)*) -> ::std::result::Result<#ret_ty, ::peg::error::ParseError<PositionRepr<#(#grammar_lifetime_params),*>>> {
+ #![allow(non_snake_case, unused)]
+
+ let mut __err_state = ::peg::error::ErrorState::new(::peg::Parse::start(__input));
+ let mut __state = ParseState::new();
+ match #parse_fn(__input, &mut __state, &mut __err_state, ::peg::Parse::start(__input) #extra_args_call #(, #rule_params_call)*) {
+ ::peg::RuleResult::Matched(__pos, __value) => {
+ if #eof_check {
+ return Ok(__value)
+ } else {
+ __err_state.mark_failure(__pos, "EOF");
+ }
+ }
+ _ => ()
+ }
+
+ __state = ParseState::new();
+ __err_state.reparse_for_error();
+
+ match #parse_fn(__input, &mut __state, &mut __err_state, ::peg::Parse::start(__input) #extra_args_call #(, #rule_params_call)*) {
+ ::peg::RuleResult::<#ret_ty>::Matched(__pos, __value) => {
+ if #eof_check {
+ panic!("Parser is nondeterministic: succeeded when reparsing for error position");
+ } else {
+ __err_state.mark_failure(__pos, "EOF");
+ }
+ }
+ _ => ()
+ }
+
+ Err(__err_state.into_parse_error(__input))
+ }
+ }
+}
+
+fn name_or_ignore(n: Option<&Ident>) -> TokenStream {
+ match n {
+ Some(n) => quote!(#n),
+ None => quote!(_),
+ }
+}
+
+fn ordered_choice(span: Span, mut rs: impl DoubleEndedIterator<Item = TokenStream>) -> TokenStream {
+ rs.next_back().map(|last| rs.rfold(last, |fallback, preferred| {
+ quote_spanned! { span => {
+ let __choice_res = #preferred;
+ match __choice_res {
+ ::peg::RuleResult::Matched(__pos, __value) => ::peg::RuleResult::Matched(__pos, __value),
+ ::peg::RuleResult::Failed => #fallback
+ }
+ }}
+ })).expect("ordered choice must not be empty")
+}
+
+fn labeled_seq(context: &Context, exprs: &[TaggedExpr], inner: TokenStream) -> TokenStream {
+ exprs.iter().rfold(inner, |then, expr| {
+ compile_expr_continuation(context, &expr.expr, expr.name.as_ref(), then)
+ })
+}
+
+fn compile_expr_continuation(
+ context: &Context,
+ e: &SpannedExpr,
+ result_name: Option<&Ident>,
+ continuation: TokenStream,
+) -> TokenStream {
+ let span = e.span.resolved_at(Span::mixed_site());
+
+ let result_pat = name_or_ignore(result_name);
+ match e.expr {
+ LiteralExpr(ref s) => compile_literal_expr(s, continuation),
+
+ PatternExpr(ref pattern) => {
+ let result_name = result_name
+ .cloned()
+ .unwrap_or_else(|| Ident::new("__ch", span));
+ compile_pattern_expr(
+ pattern,
+ result_name,
+ quote_spanned! { span =>
+ { let __pos = __next; { #continuation } }
+ },
+ )
+ }
+
+ _ => {
+ let seq_res = compile_expr(context, e, result_name.is_some());
+ quote_spanned! { span => {
+ let __seq_res = #seq_res;
+ match __seq_res {
+ ::peg::RuleResult::Matched(__pos, #result_pat) => { #continuation }
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ }}
+ }
+ }
+}
+
+fn compile_literal_expr(s: &Literal, continuation: TokenStream) -> TokenStream {
+ let span = s.span().resolved_at(Span::mixed_site());
+ let escaped_str = s.to_string();
+ quote_spanned! { span =>
+ match ::peg::ParseLiteral::parse_string_literal(__input, __pos, #s) {
+ ::peg::RuleResult::Matched(__pos, __val) => { #continuation }
+ ::peg::RuleResult::Failed => { __err_state.mark_failure(__pos, #escaped_str); ::peg::RuleResult::Failed }
+ }
+ }
+}
+
+fn compile_pattern_expr(
+ pattern_group: &Group,
+ result_name: Ident,
+ success_res: TokenStream,
+) -> TokenStream {
+ let span = pattern_group.span().resolved_at(Span::mixed_site());
+ let pat_str = pattern_group.to_string();
+ let failure_res = quote_spanned! { span => { __err_state.mark_failure(__pos, #pat_str); ::peg::RuleResult::Failed } };
+
+ let (pattern, in_set, not_in_set) =
+ if let Some(pattern) = group_check_prefix(pattern_group, '^') {
+ (pattern, failure_res, success_res)
+ } else {
+ (pattern_group.stream(), success_res, failure_res)
+ };
+
+ quote_spanned! { span =>
+ match ::peg::ParseElem::parse_elem(__input, __pos) {
+ ::peg::RuleResult::Matched(__next, #result_name) => match #result_name {
+ #pattern => #in_set,
+ _ => #not_in_set,
+ }
+ ::peg::RuleResult::Failed => { __err_state.mark_failure(__pos, #pat_str); ::peg::RuleResult::Failed }
+ }
+ }
+}
+
+fn compile_expr(context: &Context, e: &SpannedExpr, result_used: bool) -> TokenStream {
+ let span = e.span.resolved_at(Span::mixed_site());
+
+ match e.expr {
+ LiteralExpr(ref s) => compile_literal_expr(
+ s,
+ quote_spanned! { span =>
+ ::peg::RuleResult::Matched(__pos, __val)
+ },
+ ),
+
+ PatternExpr(ref pattern_group) => {
+ let res_name = Ident::new("__ch", span);
+ let res = if result_used {
+ quote!(#res_name)
+ } else {
+ quote_spanned! { span => () }
+ };
+ compile_pattern_expr(
+ pattern_group,
+ res_name,
+ quote_spanned! { span =>
+ ::peg::RuleResult::Matched(__next, #res)
+ },
+ )
+ }
+
+ RuleExpr(ref rule_name, ref rule_args)
+ if context.rules_from_args.contains(&rule_name.to_string()) =>
+ {
+ if !rule_args.is_empty() {
+ return report_error_expr(
+ rule_name.span(),
+ "rule closure does not accept arguments".to_string(),
+ );
+ }
+
+ quote_spanned! { span=> #rule_name(__input, __state, __err_state, __pos) }
+ }
+
+ RuleExpr(ref rule_name, ref rule_args) => {
+ let rule_name_str = rule_name.to_string();
+
+ let rule_def = if let Some(rule_def) = context.rules.get(&rule_name_str) {
+ rule_def
+ } else {
+ return report_error_expr(
+ rule_name.span(),
+ format!("undefined rule `{}`", rule_name_str),
+ );
+ };
+
+ if result_used && rule_def.ret_type.is_none() {
+ let msg = format!(
+ "using result of rule `{}`, which does not return a value",
+ rule_name_str
+ );
+ return report_error_expr(rule_name.span(), msg);
+ }
+
+ if rule_def.params.len() != rule_args.len() {
+ return report_error_expr(
+ rule_name.span(),
+ format!(
+ "this rule takes {} parameters but {} parameters were supplied",
+ rule_def.params.len(),
+ rule_args.len()
+ ),
+ );
+ }
+
+ let func = format_ident!("__parse_{}", rule_name, span = rule_name.span());
+ let extra_args_call = &context.extra_args_call;
+
+ let rule_args_call: Vec<TokenStream> = rule_args
+ .iter()
+ .map(|arg| match arg {
+ RuleArg::Peg(e) => {
+ let expr = compile_expr(context, e, true);
+ quote_spanned! { span=> |__input, __state, __err_state, __pos| { #expr } }
+ }
+ RuleArg::Rust(e) => e.clone(),
+ })
+ .collect();
+
+ if result_used {
+ quote_spanned! { span=> #func(__input, __state, __err_state, __pos #extra_args_call #(, #rule_args_call)*) }
+ } else {
+ quote_spanned! { span=>
+ match #func(__input, __state, __err_state, __pos #extra_args_call #(, #rule_args_call)*){
+ ::peg::RuleResult::Matched(pos, _) => ::peg::RuleResult::Matched(pos, ()),
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ }
+ }
+ }
+
+ MethodExpr(ref method, ref args) => {
+ quote_spanned! { span=> __input.#method(__pos, #args) }
+ }
+
+ ChoiceExpr(ref exprs) => ordered_choice(
+ span,
+ exprs
+ .iter()
+ .map(|expr| compile_expr(context, expr, result_used)),
+ ),
+
+ OptionalExpr(ref e) => {
+ let optional_res = compile_expr(context, e, result_used);
+
+ if result_used {
+ quote_spanned! { span=>
+ match #optional_res {
+ ::peg::RuleResult::Matched(__newpos, __value) => { ::peg::RuleResult::Matched(__newpos, Some(__value)) },
+ ::peg::RuleResult::Failed => { ::peg::RuleResult::Matched(__pos, None) },
+ }
+ }
+ } else {
+ quote_spanned! { span=>
+ match #optional_res {
+ ::peg::RuleResult::Matched(__newpos, _) => { ::peg::RuleResult::Matched(__newpos, ()) },
+ ::peg::RuleResult::Failed => { ::peg::RuleResult::Matched(__pos, ()) },
+ }
+ }
+ }
+ }
+
+ Repeat {
+ ref inner,
+ ref bound,
+ ref sep,
+ } => {
+ let inner = compile_expr(context, inner, result_used);
+
+ let (min, max) = match bound {
+ BoundedRepeat::None => (None, None),
+ BoundedRepeat::Plus => (Some(quote!(1)), None),
+ BoundedRepeat::Exact(ref code) => (Some(code.clone()), Some(code.clone())),
+ BoundedRepeat::Both(ref min, ref max) => (min.clone(), max.clone()),
+ };
+
+ let match_sep = if let Some(sep) = sep {
+ let sep_inner = compile_expr(context, sep, false);
+ quote_spanned! { span=>
+ let __pos = if __repeat_value.is_empty() { __pos } else {
+ let __sep_res = #sep_inner;
+ match __sep_res {
+ ::peg::RuleResult::Matched(__newpos, _) => { __newpos },
+ ::peg::RuleResult::Failed => break,
+ }
+ };
+ }
+ } else {
+ quote!()
+ };
+
+ let result = if result_used {
+ quote_spanned! { span=> __repeat_value }
+ } else {
+ quote!(())
+ };
+
+ let (repeat_vec, repeat_step) =
+ if result_used || min.is_some() || max.is_some() || sep.is_some() {
+ (
+ Some(quote_spanned! { span => let mut __repeat_value = vec!(); }),
+ Some(quote_spanned! { span => __repeat_value.push(__value); }),
+ )
+ } else {
+ (None, None)
+ };
+
+ let max_check = max.map(|max| {
+ quote_spanned! { span=> if __repeat_value.len() >= #max { break } }
+ });
+
+ let result_check = if let Some(min) = min {
+ quote_spanned! { span=>
+ if __repeat_value.len() >= #min {
+ ::peg::RuleResult::Matched(__repeat_pos, #result)
+ } else {
+ ::peg::RuleResult::Failed
+ }
+ }
+ } else {
+ quote_spanned! { span=> ::peg::RuleResult::Matched(__repeat_pos, #result) }
+ };
+
+ quote_spanned! { span=> {
+ let mut __repeat_pos = __pos;
+ #repeat_vec
+
+ loop {
+ let __pos = __repeat_pos;
+
+ #match_sep
+ #max_check
+
+ let __step_res = #inner;
+ match __step_res {
+ ::peg::RuleResult::Matched(__newpos, __value) => {
+ __repeat_pos = __newpos;
+ #repeat_step
+ },
+ ::peg::RuleResult::Failed => {
+ break;
+ }
+ }
+ }
+
+ #result_check
+ }}
+ }
+
+ PosAssertExpr(ref e) => {
+ let assert_res = compile_expr(context, e, result_used);
+ quote_spanned! { span=> {
+ __err_state.suppress_fail += 1;
+ let __assert_res = #assert_res;
+ __err_state.suppress_fail -= 1;
+ match __assert_res {
+ ::peg::RuleResult::Matched(_, __value) => ::peg::RuleResult::Matched(__pos, __value),
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ }}
+ }
+
+ NegAssertExpr(ref e) => {
+ let assert_res = compile_expr(context, e, false);
+ quote_spanned! { span=> {
+ __err_state.suppress_fail += 1;
+ let __assert_res = #assert_res;
+ __err_state.suppress_fail -= 1;
+ match __assert_res {
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Matched(__pos, ()),
+ ::peg::RuleResult::Matched(..) => ::peg::RuleResult::Failed,
+ }
+ }}
+ }
+
+ ActionExpr(ref exprs, ref code) => labeled_seq(context, exprs, {
+ if let Some(code) = code {
+ let code_span = code.span().resolved_at(Span::mixed_site());
+
+ // Peek and see if the first token in the block is '?'. If so, it's a conditional block
+ if let Some(body) = group_check_prefix(code, '?') {
+ quote_spanned! {code_span =>
+ match (||{ #body })() {
+ Ok(res) => ::peg::RuleResult::Matched(__pos, res),
+ Err(expected) => {
+ __err_state.mark_failure(__pos, expected);
+ ::peg::RuleResult::Failed
+ },
+ }
+ }
+ } else {
+ quote_spanned! {code_span => ::peg::RuleResult::Matched(__pos, (||#code)()) }
+ }
+ } else {
+ quote_spanned! { span => ::peg::RuleResult::Matched(__pos, ()) }
+ }
+ }),
+ MatchStrExpr(ref expr) => {
+ let inner = compile_expr(context, expr, false);
+ quote_spanned! { span => {
+ let str_start = __pos;
+ match #inner {
+ ::peg::RuleResult::Matched(__newpos, _) => { ::peg::RuleResult::Matched(__newpos, ::peg::ParseSlice::parse_slice(__input, str_start, __newpos)) },
+ ::peg::RuleResult::Failed => ::peg::RuleResult::Failed,
+ }
+ }}
+ }
+ PositionExpr => {
+ quote_spanned! { span => ::peg::RuleResult::Matched(__pos, __pos) }
+ }
+ QuietExpr(ref expr) => {
+ let inner = compile_expr(context, expr, result_used);
+ quote_spanned! { span => {
+ __err_state.suppress_fail += 1;
+ let res = #inner;
+ __err_state.suppress_fail -= 1;
+ res
+ }}
+ }
+ FailExpr(ref expected) => {
+ quote_spanned! { span => { __err_state.mark_failure(__pos, #expected); ::peg::RuleResult::Failed }}
+ }
+
+ PrecedenceExpr { ref levels } => {
+ let mut pre_rules = Vec::new();
+ let mut level_code = Vec::new();
+ let mut span_capture: Option<(TokenStream, TokenStream, TokenStream, &Group)> = None;
+
+ for (prec, level) in levels.iter().enumerate() {
+ let prec = prec as i32;
+
+ let mut post_rules = Vec::new();
+
+ for op in &level.operators {
+ let op_span = op.span.resolved_at(Span::mixed_site());
+
+ if op.elements.is_empty() {
+ return report_error(op_span, "incomplete rule".to_string());
+ }
+
+ let left_arg = &op.elements[0];
+ let l_arg = name_or_ignore(left_arg.name.as_ref());
+
+ let right_arg = &op.elements[op.elements.len() - 1];
+ let r_arg = name_or_ignore(right_arg.name.as_ref());
+
+ let action = &op.action;
+ let action = quote_spanned!(op.action.span()=>(||#action)());
+
+ let action = if let Some((lpos_name, val_name, rpos_name, wrap_action)) =
+ &span_capture
+ {
+ let wrap_action_span = wrap_action.span().resolved_at(Span::mixed_site());
+ quote_spanned!(wrap_action_span => (|#lpos_name, #val_name, #rpos_name|#wrap_action)(__lpos, #action, __pos))
+ } else {
+ action
+ };
+
+ match (&left_arg.expr.expr, &right_arg.expr.expr) {
+ (&PositionExpr, &PositionExpr) if op.elements.len() == 3 => {
+ // wrapper rule to capture expression span
+ match &op.elements[1].expr.expr {
+ &MarkerExpr(..) => (),
+ _ => {
+ return report_error(op_span, "span capture rule must be `l:position!() n:@ r:position!()".to_string());
+ }
+ }
+
+ span_capture = Some((
+ name_or_ignore(op.elements[0].name.as_ref()),
+ name_or_ignore(op.elements[1].name.as_ref()),
+ name_or_ignore(op.elements[2].name.as_ref()),
+ &op.action,
+ ));
+ }
+ (&MarkerExpr(la), &MarkerExpr(ra)) if op.elements.len() >= 3 => {
+ //infix
+ let new_prec = match (la, ra) {
+ (true, false) => prec + 1, // left associative
+ (false, true) => prec, // right associative
+ _ => return report_error(op_span, "precedence rules must use `@` and `(@)` to indicate associativity".to_string())
+ };
+
+ post_rules.push(
+ labeled_seq(context, &op.elements[1..op.elements.len()-1], {
+ quote_spanned!{ op_span =>
+ if let ::peg::RuleResult::Matched(__pos, #r_arg) = __recurse(__pos, #new_prec, __state, __err_state) {
+ let #l_arg = __infix_result;
+ __infix_result = #action;
+ ::peg::RuleResult::Matched(__pos, ())
+ } else { ::peg::RuleResult::Failed }
+ }
+ })
+ );
+ }
+ (&MarkerExpr(_), _) if op.elements.len() >= 2 => {
+ // postfix
+ post_rules.push(labeled_seq(
+ context,
+ &op.elements[1..op.elements.len()],
+ {
+ quote_spanned! { op_span =>
+ let #l_arg = __infix_result;
+ __infix_result = #action;
+ ::peg::RuleResult::Matched(__pos, ())
+ }
+ },
+ ));
+ }
+ (_, &MarkerExpr(a)) if op.elements.len() >= 2 => {
+ // prefix
+ let new_prec = match a {
+ true => prec,
+ false => prec + 1,
+ };
+ pre_rules.push(
+ labeled_seq(context, &op.elements[..op.elements.len()-1], {
+ quote_spanned!{ op_span =>
+ if let ::peg::RuleResult::Matched(__pos, #r_arg) = __recurse(__pos, #new_prec, __state, __err_state) {
+ ::peg::RuleResult::Matched(__pos, #action)
+ } else { ::peg::RuleResult::Failed }
+ }
+ })
+ );
+ }
+ _ => {
+ // atom
+ pre_rules.push(labeled_seq(context, &op.elements, {
+ quote_spanned! { op_span => ::peg::RuleResult::Matched(__pos, #action) }
+ }));
+ }
+ };
+ }
+
+ if !post_rules.is_empty() {
+ level_code.push(quote_spanned! { span =>
+ if #prec >= __min_prec {
+ #(
+ if let ::peg::RuleResult::Matched(__pos, ()) = #post_rules {
+ return (__infix_result, ::peg::RuleResult::Matched(__pos, ()));
+ }
+ )*
+ }
+ });
+ }
+ }
+
+ let (enter, leave) = if cfg!(feature = "trace") {
+ (
+ quote_spanned! {span => println!("[PEG_TRACE] Entering level {}", min_prec);},
+ quote_spanned! {span => println!("[PEG_TRACE] Leaving level {}", min_prec);},
+ )
+ } else {
+ (quote!(), quote!())
+ };
+
+ // The closures below must be defined within the function call to which they are passed
+ // due to https://github.com/rust-lang/rust/issues/41078
+
+ quote_spanned! { span => {
+ fn __infix_parse<T, S>(
+ state: &mut S,
+ err_state: &mut ::peg::error::ErrorState,
+ min_prec: i32,
+ lpos: usize,
+ prefix_atom: &Fn(usize, &mut S, &mut ::peg::error::ErrorState, &Fn(usize, i32, &mut S, &mut ::peg::error::ErrorState) -> ::peg::RuleResult<T>) -> ::peg::RuleResult<T>,
+ level_code: &Fn(usize, usize, i32, T, &mut S, &mut ::peg::error::ErrorState, &Fn(usize, i32, &mut S, &mut ::peg::error::ErrorState) -> ::peg::RuleResult<T>) -> (T, ::peg::RuleResult<()>),
+ ) -> ::peg::RuleResult<T> {
+ let initial = {
+ prefix_atom(lpos, state, err_state, &|pos, min_prec, state, err_state| {
+ __infix_parse(state, err_state, min_prec, pos, prefix_atom, level_code)
+ })
+ };
+
+ if let ::peg::RuleResult::Matched(pos, mut infix_result) = initial {
+ #enter
+ let mut repeat_pos = pos;
+ loop {
+ let (val, res) = level_code(
+ repeat_pos,
+ lpos,
+ min_prec,
+ infix_result,
+ state,
+ err_state,
+ &|pos, min_prec, state, err_state| {
+ __infix_parse(state, err_state, min_prec, pos, prefix_atom, level_code)
+ }
+ );
+ infix_result = val;
+
+ if let ::peg::RuleResult::Matched(pos, ()) = res {
+ repeat_pos = pos;
+ continue;
+ }
+
+ break;
+ }
+ #leave
+ ::peg::RuleResult::Matched(repeat_pos, infix_result)
+ } else {
+ ::peg::RuleResult::Failed
+ }
+ }
+
+ __infix_parse(__state, __err_state, 0, __pos,
+ &|__pos, __state, __err_state, __recurse| {
+ let __lpos = __pos;
+ #(
+ if let ::peg::RuleResult::Matched(__pos, __v) = #pre_rules {
+ return ::peg::RuleResult::Matched(__pos, __v);
+ }
+ )*
+
+ ::peg::RuleResult::Failed
+ },
+ &|__pos, __lpos, __min_prec, mut __infix_result, __state, __err_state, __recurse| {
+ #(#level_code)*
+ (__infix_result, ::peg::RuleResult::Failed)
+ }
+ )
+ }}
+ }
+ MarkerExpr { .. } => {
+ report_error(span, "`@` is only allowed in `precedence!{}`".to_string())
+ }
+ }
+}