ptx_parser/parser/
util.rs

1use crate::{
2    err,
3    lexer::PtxToken,
4    parser::{ParseErrorKind, PtxParseError, PtxTokenStream, Span},
5    span,
6};
7
8// Note: The c!, ok!, err! macros have been replaced with procedural macros
9// defined in crates/ptx-90-parser-construct. The old m! macro has been superseded by cclosure!.
10
11/// Macro to simplify map with cclosure!.
12///
13///
14/// Examples:
15/// mapc!(seq_n!(identifier_p(), plus_p(), Immediate::parse()),  Operand::SymbolOffset { symbol, _, offset=offset.unwrap() })
16/// expands to:
17/// map(seq_n!(identifier_p(), plus_p(), Immediate::parse()), cclosure!(Operand::SymbolOffset { symbol, _, offset=offset.unwrap() }))
18#[macro_export]
19macro_rules! mapc {
20    ($parser:expr, $ty:path { $($fields:tt)* }) => {{
21        $crate::parser::util::map($parser, $crate::cclosure!($ty { $($fields)* }))
22    }};
23}
24
25/// Similar as mapc!, but with try_map.
26#[macro_export]
27macro_rules! try_mapc {
28    ($parser:expr, $ty:path { $($fields:tt)* }) => {{
29        $crate::parser::util::try_map($parser, $crate::okmap!($ty { $($fields)* }))
30    }};
31}
32
33/* -------------------------------------------------- */
34/* -------------- Numeric Helpers ------------------- */
35/* -------------------------------------------------- */
36
37pub fn parse_unsigned_integer(
38    lit: &str,
39    span: Span,
40    min: u128,
41    max: u128,
42) -> Result<u128, PtxParseError> {
43    let trimmed = lit.trim_end_matches('U').trim_end_matches('u');
44    let (radix, digits) = if let Some(rest) = trimmed
45        .strip_prefix("0x")
46        .or_else(|| trimmed.strip_prefix("0X"))
47    {
48        (16, rest)
49    } else if let Some(rest) = trimmed
50        .strip_prefix("0b")
51        .or_else(|| trimmed.strip_prefix("0B"))
52    {
53        (2, rest)
54    } else if trimmed.starts_with('0') && trimmed.len() > 1 {
55        (8, trimmed.strip_prefix('0').unwrap_or(""))
56    } else {
57        (10, trimmed)
58    };
59    let value = u128::from_str_radix(digits, radix).map_err(|_| PtxParseError {
60        kind: ParseErrorKind::InvalidLiteral(format!("invalid integer literal: {lit}")),
61        span,
62    })?;
63    if value < min || value > max {
64        return Err(PtxParseError {
65            kind: ParseErrorKind::InvalidLiteral(format!("integer literal out of range: {lit}")),
66            span,
67        });
68    }
69    Ok(value)
70}
71
72pub fn parse_signed_integer(
73    lit: &str,
74    span: Span,
75    min: i128,
76    max: i128,
77) -> Result<i128, PtxParseError> {
78    let trimmed = lit.trim_end_matches('U').trim_end_matches('u');
79    let (sign, body) = if let Some(rest) = trimmed.strip_prefix('-') {
80        (-1i32, rest)
81    } else if let Some(rest) = trimmed.strip_prefix('+') {
82        (1i32, rest)
83    } else {
84        (1i32, trimmed)
85    };
86    let limit = if sign < 0 {
87        abs_limit(min)
88    } else {
89        max as u128
90    };
91    let magnitude = parse_unsigned_integer(body, span, 0, limit)? as i128;
92    let value = if sign < 0 { -magnitude } else { magnitude };
93    if value < min || value > max {
94        return Err(PtxParseError {
95            kind: ParseErrorKind::InvalidLiteral(format!("integer literal out of range: {lit}")),
96            span,
97        });
98    }
99    Ok(value)
100}
101
102pub fn parse_u32_literal(lit: &str, span: Span) -> Result<u32, PtxParseError> {
103    parse_unsigned_integer(lit, span, 0, u32::MAX as u128).map(|v| v as u32)
104}
105
106pub fn parse_u64_literal(lit: &str, span: Span) -> Result<u64, PtxParseError> {
107    parse_unsigned_integer(lit, span, 0, u64::MAX as u128).map(|v| v as u64)
108}
109
110pub fn parse_index_suffix(
111    digits: &str,
112    max: u8,
113    label: &str,
114    span: Span,
115) -> Result<u8, PtxParseError> {
116    if digits.is_empty() {
117        return err!(ParseErrorKind::InvalidLiteral(format!(
118            "missing index for {label}"
119        )));
120    }
121    let value = digits.parse::<u8>().map_err(|_| PtxParseError {
122        kind: ParseErrorKind::InvalidLiteral(format!("invalid index for {label}: {digits}")),
123        span,
124    })?;
125    if value > max {
126        return err!(ParseErrorKind::InvalidLiteral(format!(
127            "{label} index out of range: {value}"
128        )));
129    }
130    Ok(value)
131}
132
133fn abs_limit(min: i128) -> u128 {
134    if min == i128::MIN {
135        (i128::MAX as u128) + 1
136    } else {
137        (-min) as u128
138    }
139}
140
141/* -------------------------------------------------- */
142/* -------------- Primitive Parsers ----------------- */
143/* -------------------------------------------------- */
144
145/// Parser that expects a specific string token (simple version).
146pub fn string_p(
147    expected: impl Into<String>,
148) -> impl Fn(&mut PtxTokenStream) -> Result<((), Span), PtxParseError> {
149    let expected = expected.into();
150    move |stream| {
151        stream.try_with_span(|stream| {
152            stream.with_partial_token_mode(|stream| stream.expect_string(&expected))?;
153            Ok(())
154        })
155    }
156}
157
158/// Macro to generate simple token parsers.
159macro_rules! define_token_parser {
160    ($name:ident, $token:expr, $doc:expr) => {
161        #[doc = $doc]
162        pub fn $name() -> impl Fn(&mut PtxTokenStream) -> Result<((), Span), PtxParseError> {
163            move |stream| {
164                stream.try_with_span(|stream| {
165                    stream.expect(&$token)?;
166                    Ok(())
167                })
168            }
169        }
170    };
171}
172
173// Generate token parsers - these return parser functions (Layer 1 primitives)
174define_token_parser!(
175    comma_p,
176    PtxToken::Comma,
177    "Parser that expects a comma token."
178);
179define_token_parser!(
180    semicolon_p,
181    PtxToken::Semicolon,
182    "Parser that expects a semicolon token."
183);
184define_token_parser!(
185    colon_p,
186    PtxToken::Colon,
187    "Parser that expects a colon token."
188);
189define_token_parser!(plus_p, PtxToken::Plus, "Parser that expects a plus token.");
190define_token_parser!(
191    minus_p,
192    PtxToken::Minus,
193    "Parser that expects a minus token."
194);
195define_token_parser!(
196    lparen_p,
197    PtxToken::LParen,
198    "Parser that expects a left parenthesis token."
199);
200define_token_parser!(
201    rparen_p,
202    PtxToken::RParen,
203    "Parser that expects a right parenthesis token."
204);
205define_token_parser!(
206    lbracket_p,
207    PtxToken::LBracket,
208    "Parser that expects a left bracket token."
209);
210define_token_parser!(
211    rbracket_p,
212    PtxToken::RBracket,
213    "Parser that expects a right bracket token."
214);
215define_token_parser!(
216    lbrace_p,
217    PtxToken::LBrace,
218    "Parser that expects a left brace token."
219);
220define_token_parser!(
221    rbrace_p,
222    PtxToken::RBrace,
223    "Parser that expects a right brace token."
224);
225define_token_parser!(
226    langle_p,
227    PtxToken::LAngle,
228    "Parser that expects a left angle bracket token."
229);
230define_token_parser!(
231    rangle_p,
232    PtxToken::RAngle,
233    "Parser that expects a right angle bracket token."
234);
235define_token_parser!(
236    equals_p,
237    PtxToken::Equals,
238    "Parser that expects an equals token."
239);
240define_token_parser!(at_p, PtxToken::At, "Parser that expects an @ token.");
241define_token_parser!(
242    exclamation_p,
243    PtxToken::Exclaim,
244    "Parser that expects an exclamation mark token."
245);
246define_token_parser!(pipe_p, PtxToken::Pipe, "Parser that expects a pipe token.");
247
248/// Parser that expects an integer literal token and returns the string value.
249pub fn integer_p() -> impl Fn(&mut PtxTokenStream) -> Result<(String, Span), PtxParseError> {
250    move |stream| {
251        stream.try_with_span(|stream| {
252            let (token, token_span) = stream.consume()?;
253
254            match token {
255                PtxToken::DecimalInteger(s)
256                | PtxToken::HexInteger(s)
257                | PtxToken::BinaryInteger(s)
258                | PtxToken::OctalInteger(s) => Ok(s.clone()),
259                _ => Err(crate::unexpected_token!(
260                    *token_span,
261                    &["integer literal".to_string()],
262                    format!("{:?}", token)
263                )),
264            }
265        })
266    }
267}
268
269/// Parser that expects an integer literal token and returns it as `u32`.
270pub fn u32_p() -> impl Fn(&mut PtxTokenStream) -> Result<(u32, Span), PtxParseError> {
271    try_map(integer_p(), |literal, span| {
272        parse_u32_literal(&literal, span)
273    })
274}
275
276/// Parser that expects an integer literal token and returns it as `u64`.
277pub fn u64_p() -> impl Fn(&mut PtxTokenStream) -> Result<(u64, Span), PtxParseError> {
278    try_map(integer_p(), |literal, span| {
279        parse_u64_literal(&literal, span)
280    })
281}
282
283/// Parser that expects an identifier token and returns (name, span).
284pub fn identifier_p() -> impl Fn(&mut PtxTokenStream) -> Result<(String, Span), PtxParseError> {
285    move |stream| {
286        stream.try_with_span(|stream| {
287            let (name, _) = stream.expect_identifier()?;
288            Ok(name)
289        })
290    }
291}
292
293/// Parser that expects a directive token and returns (directive, span).
294pub fn directive_p() -> impl Fn(&mut PtxTokenStream) -> Result<(String, Span), PtxParseError> {
295    move |stream| {
296        stream.try_with_span(|stream| {
297            let (dir, _) = stream.expect_directive()?;
298            Ok(dir)
299        })
300    }
301}
302
303/// Expect a specific directive name (e.g., `.align`).
304pub fn directive_exact_p(
305    expected: impl Into<String>,
306) -> impl Fn(&mut PtxTokenStream) -> Result<((), Span), PtxParseError> {
307    let expected = expected.into();
308    move |stream| {
309        let (dir, span) = directive_p()(stream)?;
310        if dir == expected {
311            Ok(((), span))
312        } else {
313            Err(crate::unexpected_value!(
314                span,
315                &[&format!(".{expected}")],
316                format!(".{dir}")
317            ))
318        }
319    }
320}
321
322/// Parser that expects a register token and returns (name, span).
323pub fn register_p() -> impl Fn(&mut PtxTokenStream) -> Result<(String, Span), PtxParseError> {
324    move |stream| {
325        stream.try_with_span(|stream| {
326            let (mut name, _) = stream.expect_register()?;
327            loop {
328                let has_dot = matches!(stream.peek(), Ok((PtxToken::Dot, _)));
329                if !has_dot {
330                    break;
331                }
332
333                // Peek ahead to ensure this is a valid single-character component (e.g., .x, .y)
334                let is_component = match stream.peek_n(1) {
335                    Ok((PtxToken::Identifier(component_name), _)) => matches!(
336                        component_name.as_str(),
337                        "x" | "y" | "z" | "w" | "r" | "g" | "b" | "a"
338                    ),
339                    _ => false,
340                };
341
342                if !is_component {
343                    break;
344                }
345
346                // Consume '.' and the component identifier
347                let _ = stream.consume()?;
348                let (suffix, _) = stream.expect_identifier()?;
349                name.push('.');
350                name.push_str(&suffix);
351            }
352            Ok(name)
353        })
354    }
355}
356
357/// Parser that expects a string literal token and returns its string contents.
358pub fn string_literal_p() -> impl Fn(&mut PtxTokenStream) -> Result<(String, Span), PtxParseError> {
359    move |stream| {
360        stream.try_with_span(|stream| {
361            let (token, token_span) = stream.consume()?;
362            match token {
363                PtxToken::StringLiteral(value) => Ok(value.clone()),
364                _ => Err(crate::unexpected_token!(
365                    *token_span,
366                    &["string literal".to_string()],
367                    format!("{:?}", token)
368                )),
369            }
370        })
371    }
372}
373
374/// Parser that expects any literal token (integer or float) and returns its string form.
375pub fn literal_p() -> impl Fn(&mut PtxTokenStream) -> Result<(String, Span), PtxParseError> {
376    move |stream| {
377        stream.try_with_span(|stream| {
378            let (token, token_span) = stream.consume()?;
379            match token {
380                PtxToken::DecimalInteger(s)
381                | PtxToken::HexInteger(s)
382                | PtxToken::BinaryInteger(s)
383                | PtxToken::OctalInteger(s)
384                | PtxToken::Float(s)
385                | PtxToken::FloatExponent(s)
386                | PtxToken::HexFloatSingle(s)
387                | PtxToken::HexFloatDouble(s) => Ok(s.clone()),
388                _ => Err(crate::unexpected_token!(
389                    *token_span,
390                    &["literal".to_string()],
391                    format!("{:?}", token)
392                )),
393            }
394        })
395    }
396}
397
398/* -------------------------------------------------- */
399/* --------------- Sequence Combinators ------------- */
400/* -------------------------------------------------- */
401
402// Macro to generate seqN functions
403macro_rules! define_seq {
404    ($name:ident, $count:expr, $($ty:ident),+; $($param:ident),+; $($var:ident),+) => {
405        #[allow(non_camel_case_types)]
406        #[allow(dead_code)]
407        #[doc = concat!("Sequence ", $count, " parsers, keeping all results.")]
408        pub fn $name<$($ty),+, $($param),+>(
409            $($param: $param),+
410        ) -> impl Fn(&mut PtxTokenStream) -> Result<(($($ty),+), Span), PtxParseError>
411        where
412            $($param: Fn(&mut PtxTokenStream) -> Result<($ty, Span), PtxParseError>),+
413        {
414            move |stream| stream.try_with_span(|stream| {
415                $(let ($var, _) = $param(stream)?;)+
416                Ok(($($var),+))
417            })
418        }
419    };
420}
421
422// Generate seq2 through seq64
423define_seq!(seq, "2", A, B; parser_a, parser_b; a, b);
424define_seq!(seq3, "3", A, B, C; parser_a, parser_b, parser_c; a, b, c);
425define_seq!(seq4, "4", A, B, C, D; parser_a, parser_b, parser_c, parser_d; a, b, c, d);
426define_seq!(seq5, "5", A, B, C, D, E; parser_a, parser_b, parser_c, parser_d, parser_e; a, b, c, d, e);
427define_seq!(seq6, "6", A, B, C, D, E, F; parser_a, parser_b, parser_c, parser_d, parser_e, parser_f; a, b, c, d, e, f);
428define_seq!(seq7, "7", A, B, C, D, E, F, G; parser_a, parser_b, parser_c, parser_d, parser_e, parser_f, parser_g; a, b, c, d, e, f, g);
429define_seq!(seq8, "8", A, B, C, D, E, F, G, H; parser_a, parser_b, parser_c, parser_d, parser_e, parser_f, parser_g, parser_h; a, b, c, d, e, f, g, h);
430define_seq!(seq9, "9", A, B, C, D, E, F, G, H, I; parser_a, parser_b, parser_c, parser_d, parser_e, parser_f, parser_g, parser_h, parser_i; a, b, c, d, e, f, g, h, i);
431define_seq!(seq10, "10", A, B, C, D, E, F, G, H, I, J; parser_a, parser_b, parser_c, parser_d, parser_e, parser_f, parser_g, parser_h, parser_i, parser_j; a, b, c, d, e, f, g, h, i, j);
432define_seq!(seq11, "11", A, B, C, D, E, F, G, H, I, J, K; parser_a, parser_b, parser_c, parser_d, parser_e, parser_f, parser_g, parser_h, parser_i, parser_j, parser_k; a, b, c, d, e, f, g, h, i, j, k);
433define_seq!(seq12, "12", A, B, C, D, E, F, G, H, I, J, K, L; parser_a, parser_b, parser_c, parser_d, parser_e, parser_f, parser_g, parser_h, parser_i, parser_j, parser_k, parser_l; a, b, c, d, e, f, g, h, i, j, k, l);
434define_seq!(seq13, "13", A, B, C, D, E, F, G, H, I, J, K, L, M; parser_a, parser_b, parser_c, parser_d, parser_e, parser_f, parser_g, parser_h, parser_i, parser_j, parser_k, parser_l, parser_m; a, b, c, d, e, f, g, h, i, j, k, l, m);
435define_seq!(seq14, "14", A, B, C, D, E, F, G, H, I, J, K, L, M, N; parser_a, parser_b, parser_c, parser_d, parser_e, parser_f, parser_g, parser_h, parser_i, parser_j, parser_k, parser_l, parser_m, parser_n; a, b, c, d, e, f, g, h, i, j, k, l, m, n);
436define_seq!(seq15, "15", A, B, C, D, E, F, G, H, I, J, K, L, M, N, O; parser_a, parser_b, parser_c, parser_d, parser_e, parser_f, parser_g, parser_h, parser_i, parser_j, parser_k, parser_l, parser_m, parser_n, parser_o; a, b, c, d, e, f, g, h, i, j, k, l, m, n, o);
437define_seq!(seq16, "16", A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P; parser_a, parser_b, parser_c, parser_d, parser_e, parser_f, parser_g, parser_h, parser_i, parser_j, parser_k, parser_l, parser_m, parser_n, parser_o, parser_p; a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p);
438define_seq!(seq17, "17", A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q; parser_a, parser_b, parser_c, parser_d, parser_e, parser_f, parser_g, parser_h, parser_i, parser_j, parser_k, parser_l, parser_m, parser_n, parser_o, parser_p, parser_q; a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q);
439define_seq!(seq18, "18", A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R; parser_a, parser_b, parser_c, parser_d, parser_e, parser_f, parser_g, parser_h, parser_i, parser_j, parser_k, parser_l, parser_m, parser_n, parser_o, parser_p, parser_q, parser_r; a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r);
440define_seq!(seq19, "19", A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S; parser_a, parser_b, parser_c, parser_d, parser_e, parser_f, parser_g, parser_h, parser_i, parser_j, parser_k, parser_l, parser_m, parser_n, parser_o, parser_p, parser_q, parser_r, parser_s; a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s);
441define_seq!(seq20, "20", A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T; parser_a, parser_b, parser_c, parser_d, parser_e, parser_f, parser_g, parser_h, parser_i, parser_j, parser_k, parser_l, parser_m, parser_n, parser_o, parser_p, parser_q, parser_r, parser_s, parser_t; a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t);
442define_seq!(seq21, "21", A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U; parser_a, parser_b, parser_c, parser_d, parser_e, parser_f, parser_g, parser_h, parser_i, parser_j, parser_k, parser_l, parser_m, parser_n, parser_o, parser_p, parser_q, parser_r, parser_s, parser_t, parser_u; a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u);
443define_seq!(seq22, "22", A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V; parser_a, parser_b, parser_c, parser_d, parser_e, parser_f, parser_g, parser_h, parser_i, parser_j, parser_k, parser_l, parser_m, parser_n, parser_o, parser_p, parser_q, parser_r, parser_s, parser_t, parser_u, parser_v; a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v);
444define_seq!(seq23, "23", A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W; parser_a, parser_b, parser_c, parser_d, parser_e, parser_f, parser_g, parser_h, parser_i, parser_j, parser_k, parser_l, parser_m, parser_n, parser_o, parser_p, parser_q, parser_r, parser_s, parser_t, parser_u, parser_v, parser_w; a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w);
445define_seq!(seq24, "24", A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X; parser_a, parser_b, parser_c, parser_d, parser_e, parser_f, parser_g, parser_h, parser_i, parser_j, parser_k, parser_l, parser_m, parser_n, parser_o, parser_p, parser_q, parser_r, parser_s, parser_t, parser_u, parser_v, parser_w, parser_x; a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x);
446define_seq!(seq25, "25", A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y; parser_a, parser_b, parser_c, parser_d, parser_e, parser_f, parser_g, parser_h, parser_i, parser_j, parser_k, parser_l, parser_m, parser_n, parser_o, parser_p, parser_q, parser_r, parser_s, parser_t, parser_u, parser_v, parser_w, parser_x, parser_y; a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y);
447define_seq!(seq26, "26", A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z; parser_a, parser_b, parser_c, parser_d, parser_e, parser_f, parser_g, parser_h, parser_i, parser_j, parser_k, parser_l, parser_m, parser_n, parser_o, parser_p, parser_q, parser_r, parser_s, parser_t, parser_u, parser_v, parser_w, parser_x, parser_y, parser_z; a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z);
448define_seq!(seq27, "27", A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, AA; parser_a, parser_b, parser_c, parser_d, parser_e, parser_f, parser_g, parser_h, parser_i, parser_j, parser_k, parser_l, parser_m, parser_n, parser_o, parser_p, parser_q, parser_r, parser_s, parser_t, parser_u, parser_v, parser_w, parser_x, parser_y, parser_z, parser_aa; a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, aa);
449define_seq!(seq28, "28", A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, AA, AB; parser_a, parser_b, parser_c, parser_d, parser_e, parser_f, parser_g, parser_h, parser_i, parser_j, parser_k, parser_l, parser_m, parser_n, parser_o, parser_p, parser_q, parser_r, parser_s, parser_t, parser_u, parser_v, parser_w, parser_x, parser_y, parser_z, parser_aa, parser_ab; a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, aa, ab);
450define_seq!(seq29, "29", A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, AA, AB, AC; parser_a, parser_b, parser_c, parser_d, parser_e, parser_f, parser_g, parser_h, parser_i, parser_j, parser_k, parser_l, parser_m, parser_n, parser_o, parser_p, parser_q, parser_r, parser_s, parser_t, parser_u, parser_v, parser_w, parser_x, parser_y, parser_z, parser_aa, parser_ab, parser_ac; a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, aa, ab, ac);
451define_seq!(seq30, "30", A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, AA, AB, AC, AD; parser_a, parser_b, parser_c, parser_d, parser_e, parser_f, parser_g, parser_h, parser_i, parser_j, parser_k, parser_l, parser_m, parser_n, parser_o, parser_p, parser_q, parser_r, parser_s, parser_t, parser_u, parser_v, parser_w, parser_x, parser_y, parser_z, parser_aa, parser_ab, parser_ac, parser_ad; a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, aa, ab, ac, ad);
452define_seq!(seq31, "31", A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, AA, AB, AC, AD, AE; parser_a, parser_b, parser_c, parser_d, parser_e, parser_f, parser_g, parser_h, parser_i, parser_j, parser_k, parser_l, parser_m, parser_n, parser_o, parser_p, parser_q, parser_r, parser_s, parser_t, parser_u, parser_v, parser_w, parser_x, parser_y, parser_z, parser_aa, parser_ab, parser_ac, parser_ad, parser_ae; a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, aa, ab, ac, ad, ae);
453define_seq!(seq32, "32", A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, AA, AB, AC, AD, AE, AF; parser_a, parser_b, parser_c, parser_d, parser_e, parser_f, parser_g, parser_h, parser_i, parser_j, parser_k, parser_l, parser_m, parser_n, parser_o, parser_p, parser_q, parser_r, parser_s, parser_t, parser_u, parser_v, parser_w, parser_x, parser_y, parser_z, parser_aa, parser_ab, parser_ac, parser_ad, parser_ae, parser_af; a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, aa, ab, ac, ad, ae, af);
454define_seq!(seq33, "33", A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, AA, AB, AC, AD, AE, AF, AG; parser_a, parser_b, parser_c, parser_d, parser_e, parser_f, parser_g, parser_h, parser_i, parser_j, parser_k, parser_l, parser_m, parser_n, parser_o, parser_p, parser_q, parser_r, parser_s, parser_t, parser_u, parser_v, parser_w, parser_x, parser_y, parser_z, parser_aa, parser_ab, parser_ac, parser_ad, parser_ae, parser_af, parser_ag; a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, aa, ab, ac, ad, ae, af, ag);
455define_seq!(seq34, "34", A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, AA, AB, AC, AD, AE, AF, AG, AH; parser_a, parser_b, parser_c, parser_d, parser_e, parser_f, parser_g, parser_h, parser_i, parser_j, parser_k, parser_l, parser_m, parser_n, parser_o, parser_p, parser_q, parser_r, parser_s, parser_t, parser_u, parser_v, parser_w, parser_x, parser_y, parser_z, parser_aa, parser_ab, parser_ac, parser_ad, parser_ae, parser_af, parser_ag, parser_ah; a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, aa, ab, ac, ad, ae, af, ag, ah);
456define_seq!(seq35, "35", A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, AA, AB, AC, AD, AE, AF, AG, AH, AI; parser_a, parser_b, parser_c, parser_d, parser_e, parser_f, parser_g, parser_h, parser_i, parser_j, parser_k, parser_l, parser_m, parser_n, parser_o, parser_p, parser_q, parser_r, parser_s, parser_t, parser_u, parser_v, parser_w, parser_x, parser_y, parser_z, parser_aa, parser_ab, parser_ac, parser_ad, parser_ae, parser_af, parser_ag, parser_ah, parser_ai; a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, aa, ab, ac, ad, ae, af, ag, ah, ai);
457define_seq!(seq36, "36", A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, AA, AB, AC, AD, AE, AF, AG, AH, AI, AJ; parser_a, parser_b, parser_c, parser_d, parser_e, parser_f, parser_g, parser_h, parser_i, parser_j, parser_k, parser_l, parser_m, parser_n, parser_o, parser_p, parser_q, parser_r, parser_s, parser_t, parser_u, parser_v, parser_w, parser_x, parser_y, parser_z, parser_aa, parser_ab, parser_ac, parser_ad, parser_ae, parser_af, parser_ag, parser_ah, parser_ai, parser_aj; a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, aa, ab, ac, ad, ae, af, ag, ah, ai, aj);
458define_seq!(seq37, "37", A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, AA, AB, AC, AD, AE, AF, AG, AH, AI, AJ, AK; parser_a, parser_b, parser_c, parser_d, parser_e, parser_f, parser_g, parser_h, parser_i, parser_j, parser_k, parser_l, parser_m, parser_n, parser_o, parser_p, parser_q, parser_r, parser_s, parser_t, parser_u, parser_v, parser_w, parser_x, parser_y, parser_z, parser_aa, parser_ab, parser_ac, parser_ad, parser_ae, parser_af, parser_ag, parser_ah, parser_ai, parser_aj, parser_ak; a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, aa, ab, ac, ad, ae, af, ag, ah, ai, aj, ak);
459define_seq!(seq38, "38", A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, AA, AB, AC, AD, AE, AF, AG, AH, AI, AJ, AK, AL; parser_a, parser_b, parser_c, parser_d, parser_e, parser_f, parser_g, parser_h, parser_i, parser_j, parser_k, parser_l, parser_m, parser_n, parser_o, parser_p, parser_q, parser_r, parser_s, parser_t, parser_u, parser_v, parser_w, parser_x, parser_y, parser_z, parser_aa, parser_ab, parser_ac, parser_ad, parser_ae, parser_af, parser_ag, parser_ah, parser_ai, parser_aj, parser_ak, parser_al; a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, aa, ab, ac, ad, ae, af, ag, ah, ai, aj, ak, al);
460define_seq!(seq39, "39", A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, AA, AB, AC, AD, AE, AF, AG, AH, AI, AJ, AK, AL, AM; parser_a, parser_b, parser_c, parser_d, parser_e, parser_f, parser_g, parser_h, parser_i, parser_j, parser_k, parser_l, parser_m, parser_n, parser_o, parser_p, parser_q, parser_r, parser_s, parser_t, parser_u, parser_v, parser_w, parser_x, parser_y, parser_z, parser_aa, parser_ab, parser_ac, parser_ad, parser_ae, parser_af, parser_ag, parser_ah, parser_ai, parser_aj, parser_ak, parser_al, parser_am; a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, aa, ab, ac, ad, ae, af, ag, ah, ai, aj, ak, al, am);
461define_seq!(seq40, "40", A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, AA, AB, AC, AD, AE, AF, AG, AH, AI, AJ, AK, AL, AM, AN; parser_a, parser_b, parser_c, parser_d, parser_e, parser_f, parser_g, parser_h, parser_i, parser_j, parser_k, parser_l, parser_m, parser_n, parser_o, parser_p, parser_q, parser_r, parser_s, parser_t, parser_u, parser_v, parser_w, parser_x, parser_y, parser_z, parser_aa, parser_ab, parser_ac, parser_ad, parser_ae, parser_af, parser_ag, parser_ah, parser_ai, parser_aj, parser_ak, parser_al, parser_am, parser_an; a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, aa, ab, ac, ad, ae, af, ag, ah, ai, aj, ak, al, am, an);
462define_seq!(seq41, "41", A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, AA, AB, AC, AD, AE, AF, AG, AH, AI, AJ, AK, AL, AM, AN, AO; parser_a, parser_b, parser_c, parser_d, parser_e, parser_f, parser_g, parser_h, parser_i, parser_j, parser_k, parser_l, parser_m, parser_n, parser_o, parser_p, parser_q, parser_r, parser_s, parser_t, parser_u, parser_v, parser_w, parser_x, parser_y, parser_z, parser_aa, parser_ab, parser_ac, parser_ad, parser_ae, parser_af, parser_ag, parser_ah, parser_ai, parser_aj, parser_ak, parser_al, parser_am, parser_an, parser_ao; a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, aa, ab, ac, ad, ae, af, ag, ah, ai, aj, ak, al, am, an, ao);
463define_seq!(seq42, "42", A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, AA, AB, AC, AD, AE, AF, AG, AH, AI, AJ, AK, AL, AM, AN, AO, AP; parser_a, parser_b, parser_c, parser_d, parser_e, parser_f, parser_g, parser_h, parser_i, parser_j, parser_k, parser_l, parser_m, parser_n, parser_o, parser_p, parser_q, parser_r, parser_s, parser_t, parser_u, parser_v, parser_w, parser_x, parser_y, parser_z, parser_aa, parser_ab, parser_ac, parser_ad, parser_ae, parser_af, parser_ag, parser_ah, parser_ai, parser_aj, parser_ak, parser_al, parser_am, parser_an, parser_ao, parser_ap; a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, aa, ab, ac, ad, ae, af, ag, ah, ai, aj, ak, al, am, an, ao, ap);
464define_seq!(seq43, "43", A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, AA, AB, AC, AD, AE, AF, AG, AH, AI, AJ, AK, AL, AM, AN, AO, AP, AQ; parser_a, parser_b, parser_c, parser_d, parser_e, parser_f, parser_g, parser_h, parser_i, parser_j, parser_k, parser_l, parser_m, parser_n, parser_o, parser_p, parser_q, parser_r, parser_s, parser_t, parser_u, parser_v, parser_w, parser_x, parser_y, parser_z, parser_aa, parser_ab, parser_ac, parser_ad, parser_ae, parser_af, parser_ag, parser_ah, parser_ai, parser_aj, parser_ak, parser_al, parser_am, parser_an, parser_ao, parser_ap, parser_aq; a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, aa, ab, ac, ad, ae, af, ag, ah, ai, aj, ak, al, am, an, ao, ap, aq);
465define_seq!(seq44, "44", A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, AA, AB, AC, AD, AE, AF, AG, AH, AI, AJ, AK, AL, AM, AN, AO, AP, AQ, AR; parser_a, parser_b, parser_c, parser_d, parser_e, parser_f, parser_g, parser_h, parser_i, parser_j, parser_k, parser_l, parser_m, parser_n, parser_o, parser_p, parser_q, parser_r, parser_s, parser_t, parser_u, parser_v, parser_w, parser_x, parser_y, parser_z, parser_aa, parser_ab, parser_ac, parser_ad, parser_ae, parser_af, parser_ag, parser_ah, parser_ai, parser_aj, parser_ak, parser_al, parser_am, parser_an, parser_ao, parser_ap, parser_aq, parser_ar; a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, aa, ab, ac, ad, ae, af, ag, ah, ai, aj, ak, al, am, an, ao, ap, aq, ar);
466define_seq!(seq45, "45", A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, AA, AB, AC, AD, AE, AF, AG, AH, AI, AJ, AK, AL, AM, AN, AO, AP, AQ, AR, AS; parser_a, parser_b, parser_c, parser_d, parser_e, parser_f, parser_g, parser_h, parser_i, parser_j, parser_k, parser_l, parser_m, parser_n, parser_o, parser_p, parser_q, parser_r, parser_s, parser_t, parser_u, parser_v, parser_w, parser_x, parser_y, parser_z, parser_aa, parser_ab, parser_ac, parser_ad, parser_ae, parser_af, parser_ag, parser_ah, parser_ai, parser_aj, parser_ak, parser_al, parser_am, parser_an, parser_ao, parser_ap, parser_aq, parser_ar, parser_as; a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, aa, ab, ac, ad, ae, af, ag, ah, ai, aj, ak, al, am, an, ao, ap, aq, ar, r#as);
467define_seq!(seq46, "46", A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, AA, AB, AC, AD, AE, AF, AG, AH, AI, AJ, AK, AL, AM, AN, AO, AP, AQ, AR, AS, AT; parser_a, parser_b, parser_c, parser_d, parser_e, parser_f, parser_g, parser_h, parser_i, parser_j, parser_k, parser_l, parser_m, parser_n, parser_o, parser_p, parser_q, parser_r, parser_s, parser_t, parser_u, parser_v, parser_w, parser_x, parser_y, parser_z, parser_aa, parser_ab, parser_ac, parser_ad, parser_ae, parser_af, parser_ag, parser_ah, parser_ai, parser_aj, parser_ak, parser_al, parser_am, parser_an, parser_ao, parser_ap, parser_aq, parser_ar, parser_as, parser_at; a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, aa, ab, ac, ad, ae, af, ag, ah, ai, aj, ak, al, am, an, ao, ap, aq, ar, r#as, at);
468define_seq!(seq47, "47", A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, AA, AB, AC, AD, AE, AF, AG, AH, AI, AJ, AK, AL, AM, AN, AO, AP, AQ, AR, AS, AT, AU; parser_a, parser_b, parser_c, parser_d, parser_e, parser_f, parser_g, parser_h, parser_i, parser_j, parser_k, parser_l, parser_m, parser_n, parser_o, parser_p, parser_q, parser_r, parser_s, parser_t, parser_u, parser_v, parser_w, parser_x, parser_y, parser_z, parser_aa, parser_ab, parser_ac, parser_ad, parser_ae, parser_af, parser_ag, parser_ah, parser_ai, parser_aj, parser_ak, parser_al, parser_am, parser_an, parser_ao, parser_ap, parser_aq, parser_ar, parser_as, parser_at, parser_au; a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, aa, ab, ac, ad, ae, af, ag, ah, ai, aj, ak, al, am, an, ao, ap, aq, ar, r#as, at, au);
469define_seq!(seq48, "48", A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, AA, AB, AC, AD, AE, AF, AG, AH, AI, AJ, AK, AL, AM, AN, AO, AP, AQ, AR, AS, AT, AU, AV; parser_a, parser_b, parser_c, parser_d, parser_e, parser_f, parser_g, parser_h, parser_i, parser_j, parser_k, parser_l, parser_m, parser_n, parser_o, parser_p, parser_q, parser_r, parser_s, parser_t, parser_u, parser_v, parser_w, parser_x, parser_y, parser_z, parser_aa, parser_ab, parser_ac, parser_ad, parser_ae, parser_af, parser_ag, parser_ah, parser_ai, parser_aj, parser_ak, parser_al, parser_am, parser_an, parser_ao, parser_ap, parser_aq, parser_ar, parser_as, parser_at, parser_au, parser_av; a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, aa, ab, ac, ad, ae, af, ag, ah, ai, aj, ak, al, am, an, ao, ap, aq, ar, r#as, at, au, av);
470define_seq!(seq49, "49", A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, AA, AB, AC, AD, AE, AF, AG, AH, AI, AJ, AK, AL, AM, AN, AO, AP, AQ, AR, AS, AT, AU, AV, AW; parser_a, parser_b, parser_c, parser_d, parser_e, parser_f, parser_g, parser_h, parser_i, parser_j, parser_k, parser_l, parser_m, parser_n, parser_o, parser_p, parser_q, parser_r, parser_s, parser_t, parser_u, parser_v, parser_w, parser_x, parser_y, parser_z, parser_aa, parser_ab, parser_ac, parser_ad, parser_ae, parser_af, parser_ag, parser_ah, parser_ai, parser_aj, parser_ak, parser_al, parser_am, parser_an, parser_ao, parser_ap, parser_aq, parser_ar, parser_as, parser_at, parser_au, parser_av, parser_aw; a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, aa, ab, ac, ad, ae, af, ag, ah, ai, aj, ak, al, am, an, ao, ap, aq, ar, r#as, at, au, av, aw);
471define_seq!(seq50, "50", A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, AA, AB, AC, AD, AE, AF, AG, AH, AI, AJ, AK, AL, AM, AN, AO, AP, AQ, AR, AS, AT, AU, AV, AW, AX; parser_a, parser_b, parser_c, parser_d, parser_e, parser_f, parser_g, parser_h, parser_i, parser_j, parser_k, parser_l, parser_m, parser_n, parser_o, parser_p, parser_q, parser_r, parser_s, parser_t, parser_u, parser_v, parser_w, parser_x, parser_y, parser_z, parser_aa, parser_ab, parser_ac, parser_ad, parser_ae, parser_af, parser_ag, parser_ah, parser_ai, parser_aj, parser_ak, parser_al, parser_am, parser_an, parser_ao, parser_ap, parser_aq, parser_ar, parser_as, parser_at, parser_au, parser_av, parser_aw, parser_ax; a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, aa, ab, ac, ad, ae, af, ag, ah, ai, aj, ak, al, am, an, ao, ap, aq, ar, r#as, at, au, av, aw, ax);
472define_seq!(seq51, "51", A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, AA, AB, AC, AD, AE, AF, AG, AH, AI, AJ, AK, AL, AM, AN, AO, AP, AQ, AR, AS, AT, AU, AV, AW, AX, AY; parser_a, parser_b, parser_c, parser_d, parser_e, parser_f, parser_g, parser_h, parser_i, parser_j, parser_k, parser_l, parser_m, parser_n, parser_o, parser_p, parser_q, parser_r, parser_s, parser_t, parser_u, parser_v, parser_w, parser_x, parser_y, parser_z, parser_aa, parser_ab, parser_ac, parser_ad, parser_ae, parser_af, parser_ag, parser_ah, parser_ai, parser_aj, parser_ak, parser_al, parser_am, parser_an, parser_ao, parser_ap, parser_aq, parser_ar, parser_as, parser_at, parser_au, parser_av, parser_aw, parser_ax, parser_ay; a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, aa, ab, ac, ad, ae, af, ag, ah, ai, aj, ak, al, am, an, ao, ap, aq, ar, r#as, at, au, av, aw, ax, ay);
473define_seq!(seq52, "52", A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, AA, AB, AC, AD, AE, AF, AG, AH, AI, AJ, AK, AL, AM, AN, AO, AP, AQ, AR, AS, AT, AU, AV, AW, AX, AY, AZ; parser_a, parser_b, parser_c, parser_d, parser_e, parser_f, parser_g, parser_h, parser_i, parser_j, parser_k, parser_l, parser_m, parser_n, parser_o, parser_p, parser_q, parser_r, parser_s, parser_t, parser_u, parser_v, parser_w, parser_x, parser_y, parser_z, parser_aa, parser_ab, parser_ac, parser_ad, parser_ae, parser_af, parser_ag, parser_ah, parser_ai, parser_aj, parser_ak, parser_al, parser_am, parser_an, parser_ao, parser_ap, parser_aq, parser_ar, parser_as, parser_at, parser_au, parser_av, parser_aw, parser_ax, parser_ay, parser_az; a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, aa, ab, ac, ad, ae, af, ag, ah, ai, aj, ak, al, am, an, ao, ap, aq, ar, r#as, at, au, av, aw, ax, ay, az);
474define_seq!(seq53, "53", A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, AA, AB, AC, AD, AE, AF, AG, AH, AI, AJ, AK, AL, AM, AN, AO, AP, AQ, AR, AS, AT, AU, AV, AW, AX, AY, AZ, BA; parser_a, parser_b, parser_c, parser_d, parser_e, parser_f, parser_g, parser_h, parser_i, parser_j, parser_k, parser_l, parser_m, parser_n, parser_o, parser_p, parser_q, parser_r, parser_s, parser_t, parser_u, parser_v, parser_w, parser_x, parser_y, parser_z, parser_aa, parser_ab, parser_ac, parser_ad, parser_ae, parser_af, parser_ag, parser_ah, parser_ai, parser_aj, parser_ak, parser_al, parser_am, parser_an, parser_ao, parser_ap, parser_aq, parser_ar, parser_as, parser_at, parser_au, parser_av, parser_aw, parser_ax, parser_ay, parser_az, parser_ba; a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, aa, ab, ac, ad, ae, af, ag, ah, ai, aj, ak, al, am, an, ao, ap, aq, ar, r#as, at, au, av, aw, ax, ay, az, ba);
475define_seq!(seq54, "54", A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, AA, AB, AC, AD, AE, AF, AG, AH, AI, AJ, AK, AL, AM, AN, AO, AP, AQ, AR, AS, AT, AU, AV, AW, AX, AY, AZ, BA, BB; parser_a, parser_b, parser_c, parser_d, parser_e, parser_f, parser_g, parser_h, parser_i, parser_j, parser_k, parser_l, parser_m, parser_n, parser_o, parser_p, parser_q, parser_r, parser_s, parser_t, parser_u, parser_v, parser_w, parser_x, parser_y, parser_z, parser_aa, parser_ab, parser_ac, parser_ad, parser_ae, parser_af, parser_ag, parser_ah, parser_ai, parser_aj, parser_ak, parser_al, parser_am, parser_an, parser_ao, parser_ap, parser_aq, parser_ar, parser_as, parser_at, parser_au, parser_av, parser_aw, parser_ax, parser_ay, parser_az, parser_ba, parser_bb; a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, aa, ab, ac, ad, ae, af, ag, ah, ai, aj, ak, al, am, an, ao, ap, aq, ar, r#as, at, au, av, aw, ax, ay, az, ba, bb);
476define_seq!(seq55, "55", A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, AA, AB, AC, AD, AE, AF, AG, AH, AI, AJ, AK, AL, AM, AN, AO, AP, AQ, AR, AS, AT, AU, AV, AW, AX, AY, AZ, BA, BB, BC; parser_a, parser_b, parser_c, parser_d, parser_e, parser_f, parser_g, parser_h, parser_i, parser_j, parser_k, parser_l, parser_m, parser_n, parser_o, parser_p, parser_q, parser_r, parser_s, parser_t, parser_u, parser_v, parser_w, parser_x, parser_y, parser_z, parser_aa, parser_ab, parser_ac, parser_ad, parser_ae, parser_af, parser_ag, parser_ah, parser_ai, parser_aj, parser_ak, parser_al, parser_am, parser_an, parser_ao, parser_ap, parser_aq, parser_ar, parser_as, parser_at, parser_au, parser_av, parser_aw, parser_ax, parser_ay, parser_az, parser_ba, parser_bb, parser_bc; a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, aa, ab, ac, ad, ae, af, ag, ah, ai, aj, ak, al, am, an, ao, ap, aq, ar, r#as, at, au, av, aw, ax, ay, az, ba, bb, bc);
477define_seq!(seq56, "56", A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, AA, AB, AC, AD, AE, AF, AG, AH, AI, AJ, AK, AL, AM, AN, AO, AP, AQ, AR, AS, AT, AU, AV, AW, AX, AY, AZ, BA, BB, BC, BD; parser_a, parser_b, parser_c, parser_d, parser_e, parser_f, parser_g, parser_h, parser_i, parser_j, parser_k, parser_l, parser_m, parser_n, parser_o, parser_p, parser_q, parser_r, parser_s, parser_t, parser_u, parser_v, parser_w, parser_x, parser_y, parser_z, parser_aa, parser_ab, parser_ac, parser_ad, parser_ae, parser_af, parser_ag, parser_ah, parser_ai, parser_aj, parser_ak, parser_al, parser_am, parser_an, parser_ao, parser_ap, parser_aq, parser_ar, parser_as, parser_at, parser_au, parser_av, parser_aw, parser_ax, parser_ay, parser_az, parser_ba, parser_bb, parser_bc, parser_bd; a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, aa, ab, ac, ad, ae, af, ag, ah, ai, aj, ak, al, am, an, ao, ap, aq, ar, r#as, at, au, av, aw, ax, ay, az, ba, bb, bc, bd);
478define_seq!(seq57, "57", A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, AA, AB, AC, AD, AE, AF, AG, AH, AI, AJ, AK, AL, AM, AN, AO, AP, AQ, AR, AS, AT, AU, AV, AW, AX, AY, AZ, BA, BB, BC, BD, BE; parser_a, parser_b, parser_c, parser_d, parser_e, parser_f, parser_g, parser_h, parser_i, parser_j, parser_k, parser_l, parser_m, parser_n, parser_o, parser_p, parser_q, parser_r, parser_s, parser_t, parser_u, parser_v, parser_w, parser_x, parser_y, parser_z, parser_aa, parser_ab, parser_ac, parser_ad, parser_ae, parser_af, parser_ag, parser_ah, parser_ai, parser_aj, parser_ak, parser_al, parser_am, parser_an, parser_ao, parser_ap, parser_aq, parser_ar, parser_as, parser_at, parser_au, parser_av, parser_aw, parser_ax, parser_ay, parser_az, parser_ba, parser_bb, parser_bc, parser_bd, parser_be; a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, aa, ab, ac, ad, ae, af, ag, ah, ai, aj, ak, al, am, an, ao, ap, aq, ar, r#as, at, au, av, aw, ax, ay, az, ba, bb, bc, bd, be);
479define_seq!(seq58, "58", A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, AA, AB, AC, AD, AE, AF, AG, AH, AI, AJ, AK, AL, AM, AN, AO, AP, AQ, AR, AS, AT, AU, AV, AW, AX, AY, AZ, BA, BB, BC, BD, BE, BF; parser_a, parser_b, parser_c, parser_d, parser_e, parser_f, parser_g, parser_h, parser_i, parser_j, parser_k, parser_l, parser_m, parser_n, parser_o, parser_p, parser_q, parser_r, parser_s, parser_t, parser_u, parser_v, parser_w, parser_x, parser_y, parser_z, parser_aa, parser_ab, parser_ac, parser_ad, parser_ae, parser_af, parser_ag, parser_ah, parser_ai, parser_aj, parser_ak, parser_al, parser_am, parser_an, parser_ao, parser_ap, parser_aq, parser_ar, parser_as, parser_at, parser_au, parser_av, parser_aw, parser_ax, parser_ay, parser_az, parser_ba, parser_bb, parser_bc, parser_bd, parser_be, parser_bf; a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, aa, ab, ac, ad, ae, af, ag, ah, ai, aj, ak, al, am, an, ao, ap, aq, ar, r#as, at, au, av, aw, ax, ay, az, ba, bb, bc, bd, be, bf);
480define_seq!(seq59, "59", A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, AA, AB, AC, AD, AE, AF, AG, AH, AI, AJ, AK, AL, AM, AN, AO, AP, AQ, AR, AS, AT, AU, AV, AW, AX, AY, AZ, BA, BB, BC, BD, BE, BF, BG; parser_a, parser_b, parser_c, parser_d, parser_e, parser_f, parser_g, parser_h, parser_i, parser_j, parser_k, parser_l, parser_m, parser_n, parser_o, parser_p, parser_q, parser_r, parser_s, parser_t, parser_u, parser_v, parser_w, parser_x, parser_y, parser_z, parser_aa, parser_ab, parser_ac, parser_ad, parser_ae, parser_af, parser_ag, parser_ah, parser_ai, parser_aj, parser_ak, parser_al, parser_am, parser_an, parser_ao, parser_ap, parser_aq, parser_ar, parser_as, parser_at, parser_au, parser_av, parser_aw, parser_ax, parser_ay, parser_az, parser_ba, parser_bb, parser_bc, parser_bd, parser_be, parser_bf, parser_bg; a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, aa, ab, ac, ad, ae, af, ag, ah, ai, aj, ak, al, am, an, ao, ap, aq, ar, r#as, at, au, av, aw, ax, ay, az, ba, bb, bc, bd, be, bf, bg);
481define_seq!(seq60, "60", A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, AA, AB, AC, AD, AE, AF, AG, AH, AI, AJ, AK, AL, AM, AN, AO, AP, AQ, AR, AS, AT, AU, AV, AW, AX, AY, AZ, BA, BB, BC, BD, BE, BF, BG, BH; parser_a, parser_b, parser_c, parser_d, parser_e, parser_f, parser_g, parser_h, parser_i, parser_j, parser_k, parser_l, parser_m, parser_n, parser_o, parser_p, parser_q, parser_r, parser_s, parser_t, parser_u, parser_v, parser_w, parser_x, parser_y, parser_z, parser_aa, parser_ab, parser_ac, parser_ad, parser_ae, parser_af, parser_ag, parser_ah, parser_ai, parser_aj, parser_ak, parser_al, parser_am, parser_an, parser_ao, parser_ap, parser_aq, parser_ar, parser_as, parser_at, parser_au, parser_av, parser_aw, parser_ax, parser_ay, parser_az, parser_ba, parser_bb, parser_bc, parser_bd, parser_be, parser_bf, parser_bg, parser_bh; a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, aa, ab, ac, ad, ae, af, ag, ah, ai, aj, ak, al, am, an, ao, ap, aq, ar, r#as, at, au, av, aw, ax, ay, az, ba, bb, bc, bd, be, bf, bg, bh);
482define_seq!(seq61, "61", A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, AA, AB, AC, AD, AE, AF, AG, AH, AI, AJ, AK, AL, AM, AN, AO, AP, AQ, AR, AS, AT, AU, AV, AW, AX, AY, AZ, BA, BB, BC, BD, BE, BF, BG, BH, BI; parser_a, parser_b, parser_c, parser_d, parser_e, parser_f, parser_g, parser_h, parser_i, parser_j, parser_k, parser_l, parser_m, parser_n, parser_o, parser_p, parser_q, parser_r, parser_s, parser_t, parser_u, parser_v, parser_w, parser_x, parser_y, parser_z, parser_aa, parser_ab, parser_ac, parser_ad, parser_ae, parser_af, parser_ag, parser_ah, parser_ai, parser_aj, parser_ak, parser_al, parser_am, parser_an, parser_ao, parser_ap, parser_aq, parser_ar, parser_as, parser_at, parser_au, parser_av, parser_aw, parser_ax, parser_ay, parser_az, parser_ba, parser_bb, parser_bc, parser_bd, parser_be, parser_bf, parser_bg, parser_bh, parser_bi; a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, aa, ab, ac, ad, ae, af, ag, ah, ai, aj, ak, al, am, an, ao, ap, aq, ar, r#as, at, au, av, aw, ax, ay, az, ba, bb, bc, bd, be, bf, bg, bh, bi);
483define_seq!(seq62, "62", A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, AA, AB, AC, AD, AE, AF, AG, AH, AI, AJ, AK, AL, AM, AN, AO, AP, AQ, AR, AS, AT, AU, AV, AW, AX, AY, AZ, BA, BB, BC, BD, BE, BF, BG, BH, BI, BJ; parser_a, parser_b, parser_c, parser_d, parser_e, parser_f, parser_g, parser_h, parser_i, parser_j, parser_k, parser_l, parser_m, parser_n, parser_o, parser_p, parser_q, parser_r, parser_s, parser_t, parser_u, parser_v, parser_w, parser_x, parser_y, parser_z, parser_aa, parser_ab, parser_ac, parser_ad, parser_ae, parser_af, parser_ag, parser_ah, parser_ai, parser_aj, parser_ak, parser_al, parser_am, parser_an, parser_ao, parser_ap, parser_aq, parser_ar, parser_as, parser_at, parser_au, parser_av, parser_aw, parser_ax, parser_ay, parser_az, parser_ba, parser_bb, parser_bc, parser_bd, parser_be, parser_bf, parser_bg, parser_bh, parser_bi, parser_bj; a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, aa, ab, ac, ad, ae, af, ag, ah, ai, aj, ak, al, am, an, ao, ap, aq, ar, r#as, at, au, av, aw, ax, ay, az, ba, bb, bc, bd, be, bf, bg, bh, bi, bj);
484define_seq!(seq63, "63", A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, AA, AB, AC, AD, AE, AF, AG, AH, AI, AJ, AK, AL, AM, AN, AO, AP, AQ, AR, AS, AT, AU, AV, AW, AX, AY, AZ, BA, BB, BC, BD, BE, BF, BG, BH, BI, BJ, BK; parser_a, parser_b, parser_c, parser_d, parser_e, parser_f, parser_g, parser_h, parser_i, parser_j, parser_k, parser_l, parser_m, parser_n, parser_o, parser_p, parser_q, parser_r, parser_s, parser_t, parser_u, parser_v, parser_w, parser_x, parser_y, parser_z, parser_aa, parser_ab, parser_ac, parser_ad, parser_ae, parser_af, parser_ag, parser_ah, parser_ai, parser_aj, parser_ak, parser_al, parser_am, parser_an, parser_ao, parser_ap, parser_aq, parser_ar, parser_as, parser_at, parser_au, parser_av, parser_aw, parser_ax, parser_ay, parser_az, parser_ba, parser_bb, parser_bc, parser_bd, parser_be, parser_bf, parser_bg, parser_bh, parser_bi, parser_bj, parser_bk; a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, aa, ab, ac, ad, ae, af, ag, ah, ai, aj, ak, al, am, an, ao, ap, aq, ar, r#as, at, au, av, aw, ax, ay, az, ba, bb, bc, bd, be, bf, bg, bh, bi, bj, bk);
485define_seq!(seq64, "64", A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, AA, AB, AC, AD, AE, AF, AG, AH, AI, AJ, AK, AL, AM, AN, AO, AP, AQ, AR, AS, AT, AU, AV, AW, AX, AY, AZ, BA, BB, BC, BD, BE, BF, BG, BH, BI, BJ, BK, BL; parser_a, parser_b, parser_c, parser_d, parser_e, parser_f, parser_g, parser_h, parser_i, parser_j, parser_k, parser_l, parser_m, parser_n, parser_o, parser_p, parser_q, parser_r, parser_s, parser_t, parser_u, parser_v, parser_w, parser_x, parser_y, parser_z, parser_aa, parser_ab, parser_ac, parser_ad, parser_ae, parser_af, parser_ag, parser_ah, parser_ai, parser_aj, parser_ak, parser_al, parser_am, parser_an, parser_ao, parser_ap, parser_aq, parser_ar, parser_as, parser_at, parser_au, parser_av, parser_aw, parser_ax, parser_ay, parser_az, parser_ba, parser_bb, parser_bc, parser_bd, parser_be, parser_bf, parser_bg, parser_bh, parser_bi, parser_bj, parser_bk, parser_bl; a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, aa, ab, ac, ad, ae, af, ag, ah, ai, aj, ak, al, am, an, ao, ap, aq, ar, r#as, at, au, av, aw, ax, ay, az, ba, bb, bc, bd, be, bf, bg, bh, bi, bj, bk, bl);
486
487/// Compose multiple parsers at once by selecting the appropriate `seqN` combinator.
488#[macro_export]
489macro_rules! seq_n {
490    () => {
491        compile_error!("seq_n! requires at least two parsers");
492    };
493    ($parser_a:expr $(,)?) => {
494        compile_error!("seq_n! requires at least two parsers");
495    };
496    ($parser_0:expr, $parser_1:expr $(,)?) => {
497        $crate::parser::util::seq($parser_0, $parser_1)
498    };
499    ($parser_0:expr, $parser_1:expr, $parser_2:expr $(,)?) => {
500        $crate::parser::util::seq3($parser_0, $parser_1, $parser_2)
501    };
502    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr $(,)?) => {
503        $crate::parser::util::seq4($parser_0, $parser_1, $parser_2, $parser_3)
504    };
505    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr, $parser_4:expr $(,)?) => {
506        $crate::parser::util::seq5($parser_0, $parser_1, $parser_2, $parser_3, $parser_4)
507    };
508    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr, $parser_4:expr, $parser_5:expr $(,)?) => {
509        $crate::parser::util::seq6(
510            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5,
511        )
512    };
513    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr, $parser_4:expr, $parser_5:expr, $parser_6:expr $(,)?) => {
514        $crate::parser::util::seq7(
515            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6,
516        )
517    };
518    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr, $parser_4:expr, $parser_5:expr, $parser_6:expr, $parser_7:expr $(,)?) => {
519        $crate::parser::util::seq8(
520            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
521        )
522    };
523    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr, $parser_4:expr, $parser_5:expr, $parser_6:expr, $parser_7:expr, $parser_8:expr $(,)?) => {
524        $crate::parser::util::seq9(
525            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
526            $parser_8,
527        )
528    };
529    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr, $parser_4:expr, $parser_5:expr, $parser_6:expr, $parser_7:expr, $parser_8:expr, $parser_9:expr $(,)?) => {
530        $crate::parser::util::seq10(
531            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
532            $parser_8, $parser_9,
533        )
534    };
535    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr, $parser_4:expr, $parser_5:expr, $parser_6:expr, $parser_7:expr, $parser_8:expr, $parser_9:expr, $parser_10:expr $(,)?) => {
536        $crate::parser::util::seq11(
537            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
538            $parser_8, $parser_9, $parser_10,
539        )
540    };
541    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr, $parser_4:expr, $parser_5:expr, $parser_6:expr, $parser_7:expr, $parser_8:expr, $parser_9:expr, $parser_10:expr, $parser_11:expr $(,)?) => {
542        $crate::parser::util::seq12(
543            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
544            $parser_8, $parser_9, $parser_10, $parser_11,
545        )
546    };
547    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr, $parser_4:expr, $parser_5:expr, $parser_6:expr, $parser_7:expr, $parser_8:expr, $parser_9:expr, $parser_10:expr, $parser_11:expr, $parser_12:expr $(,)?) => {
548        $crate::parser::util::seq13(
549            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
550            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12,
551        )
552    };
553    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr, $parser_4:expr, $parser_5:expr, $parser_6:expr, $parser_7:expr, $parser_8:expr, $parser_9:expr, $parser_10:expr, $parser_11:expr, $parser_12:expr, $parser_13:expr $(,)?) => {
554        $crate::parser::util::seq14(
555            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
556            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13,
557        )
558    };
559    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr, $parser_4:expr, $parser_5:expr, $parser_6:expr, $parser_7:expr, $parser_8:expr, $parser_9:expr, $parser_10:expr, $parser_11:expr, $parser_12:expr, $parser_13:expr, $parser_14:expr $(,)?) => {
560        $crate::parser::util::seq15(
561            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
562            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
563        )
564    };
565    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr, $parser_4:expr, $parser_5:expr, $parser_6:expr, $parser_7:expr, $parser_8:expr, $parser_9:expr, $parser_10:expr, $parser_11:expr, $parser_12:expr, $parser_13:expr, $parser_14:expr, $parser_15:expr $(,)?) => {
566        $crate::parser::util::seq16(
567            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
568            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
569            $parser_15,
570        )
571    };
572    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr, $parser_4:expr, $parser_5:expr, $parser_6:expr, $parser_7:expr, $parser_8:expr, $parser_9:expr, $parser_10:expr, $parser_11:expr, $parser_12:expr, $parser_13:expr, $parser_14:expr, $parser_15:expr, $parser_16:expr $(,)?) => {
573        $crate::parser::util::seq17(
574            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
575            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
576            $parser_15, $parser_16,
577        )
578    };
579    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr, $parser_4:expr, $parser_5:expr, $parser_6:expr, $parser_7:expr, $parser_8:expr, $parser_9:expr, $parser_10:expr, $parser_11:expr, $parser_12:expr, $parser_13:expr, $parser_14:expr, $parser_15:expr, $parser_16:expr, $parser_17:expr $(,)?) => {
580        $crate::parser::util::seq18(
581            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
582            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
583            $parser_15, $parser_16, $parser_17,
584        )
585    };
586    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr, $parser_4:expr, $parser_5:expr, $parser_6:expr, $parser_7:expr, $parser_8:expr, $parser_9:expr, $parser_10:expr, $parser_11:expr, $parser_12:expr, $parser_13:expr, $parser_14:expr, $parser_15:expr, $parser_16:expr, $parser_17:expr, $parser_18:expr $(,)?) => {
587        $crate::parser::util::seq19(
588            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
589            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
590            $parser_15, $parser_16, $parser_17, $parser_18,
591        )
592    };
593    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr, $parser_4:expr, $parser_5:expr, $parser_6:expr, $parser_7:expr, $parser_8:expr, $parser_9:expr, $parser_10:expr, $parser_11:expr, $parser_12:expr, $parser_13:expr, $parser_14:expr, $parser_15:expr, $parser_16:expr, $parser_17:expr, $parser_18:expr, $parser_19:expr $(,)?) => {
594        $crate::parser::util::seq20(
595            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
596            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
597            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19,
598        )
599    };
600    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr, $parser_4:expr, $parser_5:expr, $parser_6:expr, $parser_7:expr, $parser_8:expr, $parser_9:expr, $parser_10:expr, $parser_11:expr, $parser_12:expr, $parser_13:expr, $parser_14:expr, $parser_15:expr, $parser_16:expr, $parser_17:expr, $parser_18:expr, $parser_19:expr, $parser_20:expr $(,)?) => {
601        $crate::parser::util::seq21(
602            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
603            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
604            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20,
605        )
606    };
607    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr, $parser_4:expr, $parser_5:expr, $parser_6:expr, $parser_7:expr, $parser_8:expr, $parser_9:expr, $parser_10:expr, $parser_11:expr, $parser_12:expr, $parser_13:expr, $parser_14:expr, $parser_15:expr, $parser_16:expr, $parser_17:expr, $parser_18:expr, $parser_19:expr, $parser_20:expr, $parser_21:expr $(,)?) => {
608        $crate::parser::util::seq22(
609            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
610            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
611            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
612        )
613    };
614    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr, $parser_4:expr, $parser_5:expr, $parser_6:expr, $parser_7:expr, $parser_8:expr, $parser_9:expr, $parser_10:expr, $parser_11:expr, $parser_12:expr, $parser_13:expr, $parser_14:expr, $parser_15:expr, $parser_16:expr, $parser_17:expr, $parser_18:expr, $parser_19:expr, $parser_20:expr, $parser_21:expr, $parser_22:expr $(,)?) => {
615        $crate::parser::util::seq23(
616            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
617            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
618            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
619            $parser_22,
620        )
621    };
622    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr, $parser_4:expr, $parser_5:expr, $parser_6:expr, $parser_7:expr, $parser_8:expr, $parser_9:expr, $parser_10:expr, $parser_11:expr, $parser_12:expr, $parser_13:expr, $parser_14:expr, $parser_15:expr, $parser_16:expr, $parser_17:expr, $parser_18:expr, $parser_19:expr, $parser_20:expr, $parser_21:expr, $parser_22:expr, $parser_23:expr $(,)?) => {
623        $crate::parser::util::seq24(
624            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
625            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
626            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
627            $parser_22, $parser_23,
628        )
629    };
630    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr, $parser_4:expr, $parser_5:expr, $parser_6:expr, $parser_7:expr, $parser_8:expr, $parser_9:expr, $parser_10:expr, $parser_11:expr, $parser_12:expr, $parser_13:expr, $parser_14:expr, $parser_15:expr, $parser_16:expr, $parser_17:expr, $parser_18:expr, $parser_19:expr, $parser_20:expr, $parser_21:expr, $parser_22:expr, $parser_23:expr, $parser_24:expr $(,)?) => {
631        $crate::parser::util::seq25(
632            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
633            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
634            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
635            $parser_22, $parser_23, $parser_24,
636        )
637    };
638    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr, $parser_4:expr, $parser_5:expr, $parser_6:expr, $parser_7:expr, $parser_8:expr, $parser_9:expr, $parser_10:expr, $parser_11:expr, $parser_12:expr, $parser_13:expr, $parser_14:expr, $parser_15:expr, $parser_16:expr, $parser_17:expr, $parser_18:expr, $parser_19:expr, $parser_20:expr, $parser_21:expr, $parser_22:expr, $parser_23:expr, $parser_24:expr, $parser_25:expr $(,)?) => {
639        $crate::parser::util::seq26(
640            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
641            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
642            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
643            $parser_22, $parser_23, $parser_24, $parser_25,
644        )
645    };
646    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr, $parser_4:expr, $parser_5:expr, $parser_6:expr, $parser_7:expr, $parser_8:expr, $parser_9:expr, $parser_10:expr, $parser_11:expr, $parser_12:expr, $parser_13:expr, $parser_14:expr, $parser_15:expr, $parser_16:expr, $parser_17:expr, $parser_18:expr, $parser_19:expr, $parser_20:expr, $parser_21:expr, $parser_22:expr, $parser_23:expr, $parser_24:expr, $parser_25:expr, $parser_26:expr $(,)?) => {
647        $crate::parser::util::seq27(
648            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
649            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
650            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
651            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26,
652        )
653    };
654    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr, $parser_4:expr, $parser_5:expr, $parser_6:expr, $parser_7:expr, $parser_8:expr, $parser_9:expr, $parser_10:expr, $parser_11:expr, $parser_12:expr, $parser_13:expr, $parser_14:expr, $parser_15:expr, $parser_16:expr, $parser_17:expr, $parser_18:expr, $parser_19:expr, $parser_20:expr, $parser_21:expr, $parser_22:expr, $parser_23:expr, $parser_24:expr, $parser_25:expr, $parser_26:expr, $parser_27:expr $(,)?) => {
655        $crate::parser::util::seq28(
656            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
657            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
658            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
659            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27,
660        )
661    };
662    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr, $parser_4:expr, $parser_5:expr, $parser_6:expr, $parser_7:expr, $parser_8:expr, $parser_9:expr, $parser_10:expr, $parser_11:expr, $parser_12:expr, $parser_13:expr, $parser_14:expr, $parser_15:expr, $parser_16:expr, $parser_17:expr, $parser_18:expr, $parser_19:expr, $parser_20:expr, $parser_21:expr, $parser_22:expr, $parser_23:expr, $parser_24:expr, $parser_25:expr, $parser_26:expr, $parser_27:expr, $parser_28:expr $(,)?) => {
663        $crate::parser::util::seq29(
664            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
665            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
666            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
667            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
668        )
669    };
670    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr, $parser_4:expr, $parser_5:expr, $parser_6:expr, $parser_7:expr, $parser_8:expr, $parser_9:expr, $parser_10:expr, $parser_11:expr, $parser_12:expr, $parser_13:expr, $parser_14:expr, $parser_15:expr, $parser_16:expr, $parser_17:expr, $parser_18:expr, $parser_19:expr, $parser_20:expr, $parser_21:expr, $parser_22:expr, $parser_23:expr, $parser_24:expr, $parser_25:expr, $parser_26:expr, $parser_27:expr, $parser_28:expr, $parser_29:expr $(,)?) => {
671        $crate::parser::util::seq30(
672            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
673            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
674            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
675            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
676            $parser_29,
677        )
678    };
679    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr, $parser_4:expr, $parser_5:expr, $parser_6:expr, $parser_7:expr, $parser_8:expr, $parser_9:expr, $parser_10:expr, $parser_11:expr, $parser_12:expr, $parser_13:expr, $parser_14:expr, $parser_15:expr, $parser_16:expr, $parser_17:expr, $parser_18:expr, $parser_19:expr, $parser_20:expr, $parser_21:expr, $parser_22:expr, $parser_23:expr, $parser_24:expr, $parser_25:expr, $parser_26:expr, $parser_27:expr, $parser_28:expr, $parser_29:expr, $parser_30:expr $(,)?) => {
680        $crate::parser::util::seq31(
681            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
682            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
683            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
684            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
685            $parser_29, $parser_30,
686        )
687    };
688    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr, $parser_4:expr, $parser_5:expr, $parser_6:expr, $parser_7:expr, $parser_8:expr, $parser_9:expr, $parser_10:expr, $parser_11:expr, $parser_12:expr, $parser_13:expr, $parser_14:expr, $parser_15:expr, $parser_16:expr, $parser_17:expr, $parser_18:expr, $parser_19:expr, $parser_20:expr, $parser_21:expr, $parser_22:expr, $parser_23:expr, $parser_24:expr, $parser_25:expr, $parser_26:expr, $parser_27:expr, $parser_28:expr, $parser_29:expr, $parser_30:expr, $parser_31:expr $(,)?) => {
689        $crate::parser::util::seq32(
690            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
691            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
692            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
693            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
694            $parser_29, $parser_30, $parser_31,
695        )
696    };
697    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr, $parser_4:expr, $parser_5:expr, $parser_6:expr, $parser_7:expr, $parser_8:expr, $parser_9:expr, $parser_10:expr, $parser_11:expr, $parser_12:expr, $parser_13:expr, $parser_14:expr, $parser_15:expr, $parser_16:expr, $parser_17:expr, $parser_18:expr, $parser_19:expr, $parser_20:expr, $parser_21:expr, $parser_22:expr, $parser_23:expr, $parser_24:expr, $parser_25:expr, $parser_26:expr, $parser_27:expr, $parser_28:expr, $parser_29:expr, $parser_30:expr, $parser_31:expr, $parser_32:expr $(,)?) => {
698        $crate::parser::util::seq33(
699            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
700            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
701            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
702            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
703            $parser_29, $parser_30, $parser_31, $parser_32,
704        )
705    };
706    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr, $parser_4:expr, $parser_5:expr, $parser_6:expr, $parser_7:expr, $parser_8:expr, $parser_9:expr, $parser_10:expr, $parser_11:expr, $parser_12:expr, $parser_13:expr, $parser_14:expr, $parser_15:expr, $parser_16:expr, $parser_17:expr, $parser_18:expr, $parser_19:expr, $parser_20:expr, $parser_21:expr, $parser_22:expr, $parser_23:expr, $parser_24:expr, $parser_25:expr, $parser_26:expr, $parser_27:expr, $parser_28:expr, $parser_29:expr, $parser_30:expr, $parser_31:expr, $parser_32:expr, $parser_33:expr $(,)?) => {
707        $crate::parser::util::seq34(
708            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
709            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
710            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
711            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
712            $parser_29, $parser_30, $parser_31, $parser_32, $parser_33,
713        )
714    };
715    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr, $parser_4:expr, $parser_5:expr, $parser_6:expr, $parser_7:expr, $parser_8:expr, $parser_9:expr, $parser_10:expr, $parser_11:expr, $parser_12:expr, $parser_13:expr, $parser_14:expr, $parser_15:expr, $parser_16:expr, $parser_17:expr, $parser_18:expr, $parser_19:expr, $parser_20:expr, $parser_21:expr, $parser_22:expr, $parser_23:expr, $parser_24:expr, $parser_25:expr, $parser_26:expr, $parser_27:expr, $parser_28:expr, $parser_29:expr, $parser_30:expr, $parser_31:expr, $parser_32:expr, $parser_33:expr, $parser_34:expr $(,)?) => {
716        $crate::parser::util::seq35(
717            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
718            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
719            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
720            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
721            $parser_29, $parser_30, $parser_31, $parser_32, $parser_33, $parser_34,
722        )
723    };
724    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr, $parser_4:expr, $parser_5:expr, $parser_6:expr, $parser_7:expr, $parser_8:expr, $parser_9:expr, $parser_10:expr, $parser_11:expr, $parser_12:expr, $parser_13:expr, $parser_14:expr, $parser_15:expr, $parser_16:expr, $parser_17:expr, $parser_18:expr, $parser_19:expr, $parser_20:expr, $parser_21:expr, $parser_22:expr, $parser_23:expr, $parser_24:expr, $parser_25:expr, $parser_26:expr, $parser_27:expr, $parser_28:expr, $parser_29:expr, $parser_30:expr, $parser_31:expr, $parser_32:expr, $parser_33:expr, $parser_34:expr, $parser_35:expr $(,)?) => {
725        $crate::parser::util::seq36(
726            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
727            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
728            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
729            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
730            $parser_29, $parser_30, $parser_31, $parser_32, $parser_33, $parser_34, $parser_35,
731        )
732    };
733    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr, $parser_4:expr, $parser_5:expr, $parser_6:expr, $parser_7:expr, $parser_8:expr, $parser_9:expr, $parser_10:expr, $parser_11:expr, $parser_12:expr, $parser_13:expr, $parser_14:expr, $parser_15:expr, $parser_16:expr, $parser_17:expr, $parser_18:expr, $parser_19:expr, $parser_20:expr, $parser_21:expr, $parser_22:expr, $parser_23:expr, $parser_24:expr, $parser_25:expr, $parser_26:expr, $parser_27:expr, $parser_28:expr, $parser_29:expr, $parser_30:expr, $parser_31:expr, $parser_32:expr, $parser_33:expr, $parser_34:expr, $parser_35:expr, $parser_36:expr $(,)?) => {
734        $crate::parser::util::seq37(
735            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
736            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
737            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
738            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
739            $parser_29, $parser_30, $parser_31, $parser_32, $parser_33, $parser_34, $parser_35,
740            $parser_36,
741        )
742    };
743    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr, $parser_4:expr, $parser_5:expr, $parser_6:expr, $parser_7:expr, $parser_8:expr, $parser_9:expr, $parser_10:expr, $parser_11:expr, $parser_12:expr, $parser_13:expr, $parser_14:expr, $parser_15:expr, $parser_16:expr, $parser_17:expr, $parser_18:expr, $parser_19:expr, $parser_20:expr, $parser_21:expr, $parser_22:expr, $parser_23:expr, $parser_24:expr, $parser_25:expr, $parser_26:expr, $parser_27:expr, $parser_28:expr, $parser_29:expr, $parser_30:expr, $parser_31:expr, $parser_32:expr, $parser_33:expr, $parser_34:expr, $parser_35:expr, $parser_36:expr, $parser_37:expr $(,)?) => {
744        $crate::parser::util::seq38(
745            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
746            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
747            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
748            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
749            $parser_29, $parser_30, $parser_31, $parser_32, $parser_33, $parser_34, $parser_35,
750            $parser_36, $parser_37,
751        )
752    };
753    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr, $parser_4:expr, $parser_5:expr, $parser_6:expr, $parser_7:expr, $parser_8:expr, $parser_9:expr, $parser_10:expr, $parser_11:expr, $parser_12:expr, $parser_13:expr, $parser_14:expr, $parser_15:expr, $parser_16:expr, $parser_17:expr, $parser_18:expr, $parser_19:expr, $parser_20:expr, $parser_21:expr, $parser_22:expr, $parser_23:expr, $parser_24:expr, $parser_25:expr, $parser_26:expr, $parser_27:expr, $parser_28:expr, $parser_29:expr, $parser_30:expr, $parser_31:expr, $parser_32:expr, $parser_33:expr, $parser_34:expr, $parser_35:expr, $parser_36:expr, $parser_37:expr, $parser_38:expr $(,)?) => {
754        $crate::parser::util::seq39(
755            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
756            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
757            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
758            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
759            $parser_29, $parser_30, $parser_31, $parser_32, $parser_33, $parser_34, $parser_35,
760            $parser_36, $parser_37, $parser_38,
761        )
762    };
763    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr, $parser_4:expr, $parser_5:expr, $parser_6:expr, $parser_7:expr, $parser_8:expr, $parser_9:expr, $parser_10:expr, $parser_11:expr, $parser_12:expr, $parser_13:expr, $parser_14:expr, $parser_15:expr, $parser_16:expr, $parser_17:expr, $parser_18:expr, $parser_19:expr, $parser_20:expr, $parser_21:expr, $parser_22:expr, $parser_23:expr, $parser_24:expr, $parser_25:expr, $parser_26:expr, $parser_27:expr, $parser_28:expr, $parser_29:expr, $parser_30:expr, $parser_31:expr, $parser_32:expr, $parser_33:expr, $parser_34:expr, $parser_35:expr, $parser_36:expr, $parser_37:expr, $parser_38:expr, $parser_39:expr $(,)?) => {
764        $crate::parser::util::seq40(
765            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
766            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
767            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
768            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
769            $parser_29, $parser_30, $parser_31, $parser_32, $parser_33, $parser_34, $parser_35,
770            $parser_36, $parser_37, $parser_38, $parser_39,
771        )
772    };
773    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr, $parser_4:expr, $parser_5:expr, $parser_6:expr, $parser_7:expr, $parser_8:expr, $parser_9:expr, $parser_10:expr, $parser_11:expr, $parser_12:expr, $parser_13:expr, $parser_14:expr, $parser_15:expr, $parser_16:expr, $parser_17:expr, $parser_18:expr, $parser_19:expr, $parser_20:expr, $parser_21:expr, $parser_22:expr, $parser_23:expr, $parser_24:expr, $parser_25:expr, $parser_26:expr, $parser_27:expr, $parser_28:expr, $parser_29:expr, $parser_30:expr, $parser_31:expr, $parser_32:expr, $parser_33:expr, $parser_34:expr, $parser_35:expr, $parser_36:expr, $parser_37:expr, $parser_38:expr, $parser_39:expr, $parser_40:expr $(,)?) => {
774        $crate::parser::util::seq41(
775            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
776            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
777            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
778            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
779            $parser_29, $parser_30, $parser_31, $parser_32, $parser_33, $parser_34, $parser_35,
780            $parser_36, $parser_37, $parser_38, $parser_39, $parser_40,
781        )
782    };
783    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr, $parser_4:expr, $parser_5:expr, $parser_6:expr, $parser_7:expr, $parser_8:expr, $parser_9:expr, $parser_10:expr, $parser_11:expr, $parser_12:expr, $parser_13:expr, $parser_14:expr, $parser_15:expr, $parser_16:expr, $parser_17:expr, $parser_18:expr, $parser_19:expr, $parser_20:expr, $parser_21:expr, $parser_22:expr, $parser_23:expr, $parser_24:expr, $parser_25:expr, $parser_26:expr, $parser_27:expr, $parser_28:expr, $parser_29:expr, $parser_30:expr, $parser_31:expr, $parser_32:expr, $parser_33:expr, $parser_34:expr, $parser_35:expr, $parser_36:expr, $parser_37:expr, $parser_38:expr, $parser_39:expr, $parser_40:expr, $parser_41:expr $(,)?) => {
784        $crate::parser::util::seq42(
785            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
786            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
787            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
788            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
789            $parser_29, $parser_30, $parser_31, $parser_32, $parser_33, $parser_34, $parser_35,
790            $parser_36, $parser_37, $parser_38, $parser_39, $parser_40, $parser_41,
791        )
792    };
793    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr, $parser_4:expr, $parser_5:expr, $parser_6:expr, $parser_7:expr, $parser_8:expr, $parser_9:expr, $parser_10:expr, $parser_11:expr, $parser_12:expr, $parser_13:expr, $parser_14:expr, $parser_15:expr, $parser_16:expr, $parser_17:expr, $parser_18:expr, $parser_19:expr, $parser_20:expr, $parser_21:expr, $parser_22:expr, $parser_23:expr, $parser_24:expr, $parser_25:expr, $parser_26:expr, $parser_27:expr, $parser_28:expr, $parser_29:expr, $parser_30:expr, $parser_31:expr, $parser_32:expr, $parser_33:expr, $parser_34:expr, $parser_35:expr, $parser_36:expr, $parser_37:expr, $parser_38:expr, $parser_39:expr, $parser_40:expr, $parser_41:expr, $parser_42:expr $(,)?) => {
794        $crate::parser::util::seq43(
795            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
796            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
797            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
798            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
799            $parser_29, $parser_30, $parser_31, $parser_32, $parser_33, $parser_34, $parser_35,
800            $parser_36, $parser_37, $parser_38, $parser_39, $parser_40, $parser_41, $parser_42,
801        )
802    };
803    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr, $parser_4:expr, $parser_5:expr, $parser_6:expr, $parser_7:expr, $parser_8:expr, $parser_9:expr, $parser_10:expr, $parser_11:expr, $parser_12:expr, $parser_13:expr, $parser_14:expr, $parser_15:expr, $parser_16:expr, $parser_17:expr, $parser_18:expr, $parser_19:expr, $parser_20:expr, $parser_21:expr, $parser_22:expr, $parser_23:expr, $parser_24:expr, $parser_25:expr, $parser_26:expr, $parser_27:expr, $parser_28:expr, $parser_29:expr, $parser_30:expr, $parser_31:expr, $parser_32:expr, $parser_33:expr, $parser_34:expr, $parser_35:expr, $parser_36:expr, $parser_37:expr, $parser_38:expr, $parser_39:expr, $parser_40:expr, $parser_41:expr, $parser_42:expr, $parser_43:expr $(,)?) => {
804        $crate::parser::util::seq44(
805            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
806            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
807            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
808            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
809            $parser_29, $parser_30, $parser_31, $parser_32, $parser_33, $parser_34, $parser_35,
810            $parser_36, $parser_37, $parser_38, $parser_39, $parser_40, $parser_41, $parser_42,
811            $parser_43,
812        )
813    };
814    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr, $parser_4:expr, $parser_5:expr, $parser_6:expr, $parser_7:expr, $parser_8:expr, $parser_9:expr, $parser_10:expr, $parser_11:expr, $parser_12:expr, $parser_13:expr, $parser_14:expr, $parser_15:expr, $parser_16:expr, $parser_17:expr, $parser_18:expr, $parser_19:expr, $parser_20:expr, $parser_21:expr, $parser_22:expr, $parser_23:expr, $parser_24:expr, $parser_25:expr, $parser_26:expr, $parser_27:expr, $parser_28:expr, $parser_29:expr, $parser_30:expr, $parser_31:expr, $parser_32:expr, $parser_33:expr, $parser_34:expr, $parser_35:expr, $parser_36:expr, $parser_37:expr, $parser_38:expr, $parser_39:expr, $parser_40:expr, $parser_41:expr, $parser_42:expr, $parser_43:expr, $parser_44:expr $(,)?) => {
815        $crate::parser::util::seq45(
816            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
817            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
818            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
819            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
820            $parser_29, $parser_30, $parser_31, $parser_32, $parser_33, $parser_34, $parser_35,
821            $parser_36, $parser_37, $parser_38, $parser_39, $parser_40, $parser_41, $parser_42,
822            $parser_43, $parser_44,
823        )
824    };
825    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr, $parser_4:expr, $parser_5:expr, $parser_6:expr, $parser_7:expr, $parser_8:expr, $parser_9:expr, $parser_10:expr, $parser_11:expr, $parser_12:expr, $parser_13:expr, $parser_14:expr, $parser_15:expr, $parser_16:expr, $parser_17:expr, $parser_18:expr, $parser_19:expr, $parser_20:expr, $parser_21:expr, $parser_22:expr, $parser_23:expr, $parser_24:expr, $parser_25:expr, $parser_26:expr, $parser_27:expr, $parser_28:expr, $parser_29:expr, $parser_30:expr, $parser_31:expr, $parser_32:expr, $parser_33:expr, $parser_34:expr, $parser_35:expr, $parser_36:expr, $parser_37:expr, $parser_38:expr, $parser_39:expr, $parser_40:expr, $parser_41:expr, $parser_42:expr, $parser_43:expr, $parser_44:expr, $parser_45:expr $(,)?) => {
826        $crate::parser::util::seq46(
827            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
828            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
829            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
830            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
831            $parser_29, $parser_30, $parser_31, $parser_32, $parser_33, $parser_34, $parser_35,
832            $parser_36, $parser_37, $parser_38, $parser_39, $parser_40, $parser_41, $parser_42,
833            $parser_43, $parser_44, $parser_45,
834        )
835    };
836    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr, $parser_4:expr, $parser_5:expr, $parser_6:expr, $parser_7:expr, $parser_8:expr, $parser_9:expr, $parser_10:expr, $parser_11:expr, $parser_12:expr, $parser_13:expr, $parser_14:expr, $parser_15:expr, $parser_16:expr, $parser_17:expr, $parser_18:expr, $parser_19:expr, $parser_20:expr, $parser_21:expr, $parser_22:expr, $parser_23:expr, $parser_24:expr, $parser_25:expr, $parser_26:expr, $parser_27:expr, $parser_28:expr, $parser_29:expr, $parser_30:expr, $parser_31:expr, $parser_32:expr, $parser_33:expr, $parser_34:expr, $parser_35:expr, $parser_36:expr, $parser_37:expr, $parser_38:expr, $parser_39:expr, $parser_40:expr, $parser_41:expr, $parser_42:expr, $parser_43:expr, $parser_44:expr, $parser_45:expr, $parser_46:expr $(,)?) => {
837        $crate::parser::util::seq47(
838            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
839            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
840            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
841            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
842            $parser_29, $parser_30, $parser_31, $parser_32, $parser_33, $parser_34, $parser_35,
843            $parser_36, $parser_37, $parser_38, $parser_39, $parser_40, $parser_41, $parser_42,
844            $parser_43, $parser_44, $parser_45, $parser_46,
845        )
846    };
847    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr, $parser_4:expr, $parser_5:expr, $parser_6:expr, $parser_7:expr, $parser_8:expr, $parser_9:expr, $parser_10:expr, $parser_11:expr, $parser_12:expr, $parser_13:expr, $parser_14:expr, $parser_15:expr, $parser_16:expr, $parser_17:expr, $parser_18:expr, $parser_19:expr, $parser_20:expr, $parser_21:expr, $parser_22:expr, $parser_23:expr, $parser_24:expr, $parser_25:expr, $parser_26:expr, $parser_27:expr, $parser_28:expr, $parser_29:expr, $parser_30:expr, $parser_31:expr, $parser_32:expr, $parser_33:expr, $parser_34:expr, $parser_35:expr, $parser_36:expr, $parser_37:expr, $parser_38:expr, $parser_39:expr, $parser_40:expr, $parser_41:expr, $parser_42:expr, $parser_43:expr, $parser_44:expr, $parser_45:expr, $parser_46:expr, $parser_47:expr $(,)?) => {
848        $crate::parser::util::seq48(
849            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
850            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
851            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
852            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
853            $parser_29, $parser_30, $parser_31, $parser_32, $parser_33, $parser_34, $parser_35,
854            $parser_36, $parser_37, $parser_38, $parser_39, $parser_40, $parser_41, $parser_42,
855            $parser_43, $parser_44, $parser_45, $parser_46, $parser_47,
856        )
857    };
858    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr, $parser_4:expr, $parser_5:expr, $parser_6:expr, $parser_7:expr, $parser_8:expr, $parser_9:expr, $parser_10:expr, $parser_11:expr, $parser_12:expr, $parser_13:expr, $parser_14:expr, $parser_15:expr, $parser_16:expr, $parser_17:expr, $parser_18:expr, $parser_19:expr, $parser_20:expr, $parser_21:expr, $parser_22:expr, $parser_23:expr, $parser_24:expr, $parser_25:expr, $parser_26:expr, $parser_27:expr, $parser_28:expr, $parser_29:expr, $parser_30:expr, $parser_31:expr, $parser_32:expr, $parser_33:expr, $parser_34:expr, $parser_35:expr, $parser_36:expr, $parser_37:expr, $parser_38:expr, $parser_39:expr, $parser_40:expr, $parser_41:expr, $parser_42:expr, $parser_43:expr, $parser_44:expr, $parser_45:expr, $parser_46:expr, $parser_47:expr, $parser_48:expr $(,)?) => {
859        $crate::parser::util::seq49(
860            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
861            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
862            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
863            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
864            $parser_29, $parser_30, $parser_31, $parser_32, $parser_33, $parser_34, $parser_35,
865            $parser_36, $parser_37, $parser_38, $parser_39, $parser_40, $parser_41, $parser_42,
866            $parser_43, $parser_44, $parser_45, $parser_46, $parser_47, $parser_48,
867        )
868    };
869    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr, $parser_4:expr, $parser_5:expr, $parser_6:expr, $parser_7:expr, $parser_8:expr, $parser_9:expr, $parser_10:expr, $parser_11:expr, $parser_12:expr, $parser_13:expr, $parser_14:expr, $parser_15:expr, $parser_16:expr, $parser_17:expr, $parser_18:expr, $parser_19:expr, $parser_20:expr, $parser_21:expr, $parser_22:expr, $parser_23:expr, $parser_24:expr, $parser_25:expr, $parser_26:expr, $parser_27:expr, $parser_28:expr, $parser_29:expr, $parser_30:expr, $parser_31:expr, $parser_32:expr, $parser_33:expr, $parser_34:expr, $parser_35:expr, $parser_36:expr, $parser_37:expr, $parser_38:expr, $parser_39:expr, $parser_40:expr, $parser_41:expr, $parser_42:expr, $parser_43:expr, $parser_44:expr, $parser_45:expr, $parser_46:expr, $parser_47:expr, $parser_48:expr, $parser_49:expr $(,)?) => {
870        $crate::parser::util::seq50(
871            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
872            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
873            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
874            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
875            $parser_29, $parser_30, $parser_31, $parser_32, $parser_33, $parser_34, $parser_35,
876            $parser_36, $parser_37, $parser_38, $parser_39, $parser_40, $parser_41, $parser_42,
877            $parser_43, $parser_44, $parser_45, $parser_46, $parser_47, $parser_48, $parser_49,
878        )
879    };
880    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr, $parser_4:expr, $parser_5:expr, $parser_6:expr, $parser_7:expr, $parser_8:expr, $parser_9:expr, $parser_10:expr, $parser_11:expr, $parser_12:expr, $parser_13:expr, $parser_14:expr, $parser_15:expr, $parser_16:expr, $parser_17:expr, $parser_18:expr, $parser_19:expr, $parser_20:expr, $parser_21:expr, $parser_22:expr, $parser_23:expr, $parser_24:expr, $parser_25:expr, $parser_26:expr, $parser_27:expr, $parser_28:expr, $parser_29:expr, $parser_30:expr, $parser_31:expr, $parser_32:expr, $parser_33:expr, $parser_34:expr, $parser_35:expr, $parser_36:expr, $parser_37:expr, $parser_38:expr, $parser_39:expr, $parser_40:expr, $parser_41:expr, $parser_42:expr, $parser_43:expr, $parser_44:expr, $parser_45:expr, $parser_46:expr, $parser_47:expr, $parser_48:expr, $parser_49:expr, $parser_50:expr $(,)?) => {
881        $crate::parser::util::seq51(
882            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
883            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
884            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
885            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
886            $parser_29, $parser_30, $parser_31, $parser_32, $parser_33, $parser_34, $parser_35,
887            $parser_36, $parser_37, $parser_38, $parser_39, $parser_40, $parser_41, $parser_42,
888            $parser_43, $parser_44, $parser_45, $parser_46, $parser_47, $parser_48, $parser_49,
889            $parser_50,
890        )
891    };
892    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr, $parser_4:expr, $parser_5:expr, $parser_6:expr, $parser_7:expr, $parser_8:expr, $parser_9:expr, $parser_10:expr, $parser_11:expr, $parser_12:expr, $parser_13:expr, $parser_14:expr, $parser_15:expr, $parser_16:expr, $parser_17:expr, $parser_18:expr, $parser_19:expr, $parser_20:expr, $parser_21:expr, $parser_22:expr, $parser_23:expr, $parser_24:expr, $parser_25:expr, $parser_26:expr, $parser_27:expr, $parser_28:expr, $parser_29:expr, $parser_30:expr, $parser_31:expr, $parser_32:expr, $parser_33:expr, $parser_34:expr, $parser_35:expr, $parser_36:expr, $parser_37:expr, $parser_38:expr, $parser_39:expr, $parser_40:expr, $parser_41:expr, $parser_42:expr, $parser_43:expr, $parser_44:expr, $parser_45:expr, $parser_46:expr, $parser_47:expr, $parser_48:expr, $parser_49:expr, $parser_50:expr, $parser_51:expr $(,)?) => {
893        $crate::parser::util::seq52(
894            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
895            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
896            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
897            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
898            $parser_29, $parser_30, $parser_31, $parser_32, $parser_33, $parser_34, $parser_35,
899            $parser_36, $parser_37, $parser_38, $parser_39, $parser_40, $parser_41, $parser_42,
900            $parser_43, $parser_44, $parser_45, $parser_46, $parser_47, $parser_48, $parser_49,
901            $parser_50, $parser_51,
902        )
903    };
904    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr, $parser_4:expr, $parser_5:expr, $parser_6:expr, $parser_7:expr, $parser_8:expr, $parser_9:expr, $parser_10:expr, $parser_11:expr, $parser_12:expr, $parser_13:expr, $parser_14:expr, $parser_15:expr, $parser_16:expr, $parser_17:expr, $parser_18:expr, $parser_19:expr, $parser_20:expr, $parser_21:expr, $parser_22:expr, $parser_23:expr, $parser_24:expr, $parser_25:expr, $parser_26:expr, $parser_27:expr, $parser_28:expr, $parser_29:expr, $parser_30:expr, $parser_31:expr, $parser_32:expr, $parser_33:expr, $parser_34:expr, $parser_35:expr, $parser_36:expr, $parser_37:expr, $parser_38:expr, $parser_39:expr, $parser_40:expr, $parser_41:expr, $parser_42:expr, $parser_43:expr, $parser_44:expr, $parser_45:expr, $parser_46:expr, $parser_47:expr, $parser_48:expr, $parser_49:expr, $parser_50:expr, $parser_51:expr, $parser_52:expr $(,)?) => {
905        $crate::parser::util::seq53(
906            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
907            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
908            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
909            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
910            $parser_29, $parser_30, $parser_31, $parser_32, $parser_33, $parser_34, $parser_35,
911            $parser_36, $parser_37, $parser_38, $parser_39, $parser_40, $parser_41, $parser_42,
912            $parser_43, $parser_44, $parser_45, $parser_46, $parser_47, $parser_48, $parser_49,
913            $parser_50, $parser_51, $parser_52,
914        )
915    };
916    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr, $parser_4:expr, $parser_5:expr, $parser_6:expr, $parser_7:expr, $parser_8:expr, $parser_9:expr, $parser_10:expr, $parser_11:expr, $parser_12:expr, $parser_13:expr, $parser_14:expr, $parser_15:expr, $parser_16:expr, $parser_17:expr, $parser_18:expr, $parser_19:expr, $parser_20:expr, $parser_21:expr, $parser_22:expr, $parser_23:expr, $parser_24:expr, $parser_25:expr, $parser_26:expr, $parser_27:expr, $parser_28:expr, $parser_29:expr, $parser_30:expr, $parser_31:expr, $parser_32:expr, $parser_33:expr, $parser_34:expr, $parser_35:expr, $parser_36:expr, $parser_37:expr, $parser_38:expr, $parser_39:expr, $parser_40:expr, $parser_41:expr, $parser_42:expr, $parser_43:expr, $parser_44:expr, $parser_45:expr, $parser_46:expr, $parser_47:expr, $parser_48:expr, $parser_49:expr, $parser_50:expr, $parser_51:expr, $parser_52:expr, $parser_53:expr $(,)?) => {
917        $crate::parser::util::seq54(
918            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
919            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
920            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
921            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
922            $parser_29, $parser_30, $parser_31, $parser_32, $parser_33, $parser_34, $parser_35,
923            $parser_36, $parser_37, $parser_38, $parser_39, $parser_40, $parser_41, $parser_42,
924            $parser_43, $parser_44, $parser_45, $parser_46, $parser_47, $parser_48, $parser_49,
925            $parser_50, $parser_51, $parser_52, $parser_53,
926        )
927    };
928    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr, $parser_4:expr, $parser_5:expr, $parser_6:expr, $parser_7:expr, $parser_8:expr, $parser_9:expr, $parser_10:expr, $parser_11:expr, $parser_12:expr, $parser_13:expr, $parser_14:expr, $parser_15:expr, $parser_16:expr, $parser_17:expr, $parser_18:expr, $parser_19:expr, $parser_20:expr, $parser_21:expr, $parser_22:expr, $parser_23:expr, $parser_24:expr, $parser_25:expr, $parser_26:expr, $parser_27:expr, $parser_28:expr, $parser_29:expr, $parser_30:expr, $parser_31:expr, $parser_32:expr, $parser_33:expr, $parser_34:expr, $parser_35:expr, $parser_36:expr, $parser_37:expr, $parser_38:expr, $parser_39:expr, $parser_40:expr, $parser_41:expr, $parser_42:expr, $parser_43:expr, $parser_44:expr, $parser_45:expr, $parser_46:expr, $parser_47:expr, $parser_48:expr, $parser_49:expr, $parser_50:expr, $parser_51:expr, $parser_52:expr, $parser_53:expr, $parser_54:expr $(,)?) => {
929        $crate::parser::util::seq55(
930            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
931            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
932            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
933            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
934            $parser_29, $parser_30, $parser_31, $parser_32, $parser_33, $parser_34, $parser_35,
935            $parser_36, $parser_37, $parser_38, $parser_39, $parser_40, $parser_41, $parser_42,
936            $parser_43, $parser_44, $parser_45, $parser_46, $parser_47, $parser_48, $parser_49,
937            $parser_50, $parser_51, $parser_52, $parser_53, $parser_54,
938        )
939    };
940    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr, $parser_4:expr, $parser_5:expr, $parser_6:expr, $parser_7:expr, $parser_8:expr, $parser_9:expr, $parser_10:expr, $parser_11:expr, $parser_12:expr, $parser_13:expr, $parser_14:expr, $parser_15:expr, $parser_16:expr, $parser_17:expr, $parser_18:expr, $parser_19:expr, $parser_20:expr, $parser_21:expr, $parser_22:expr, $parser_23:expr, $parser_24:expr, $parser_25:expr, $parser_26:expr, $parser_27:expr, $parser_28:expr, $parser_29:expr, $parser_30:expr, $parser_31:expr, $parser_32:expr, $parser_33:expr, $parser_34:expr, $parser_35:expr, $parser_36:expr, $parser_37:expr, $parser_38:expr, $parser_39:expr, $parser_40:expr, $parser_41:expr, $parser_42:expr, $parser_43:expr, $parser_44:expr, $parser_45:expr, $parser_46:expr, $parser_47:expr, $parser_48:expr, $parser_49:expr, $parser_50:expr, $parser_51:expr, $parser_52:expr, $parser_53:expr, $parser_54:expr, $parser_55:expr $(,)?) => {
941        $crate::parser::util::seq56(
942            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
943            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
944            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
945            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
946            $parser_29, $parser_30, $parser_31, $parser_32, $parser_33, $parser_34, $parser_35,
947            $parser_36, $parser_37, $parser_38, $parser_39, $parser_40, $parser_41, $parser_42,
948            $parser_43, $parser_44, $parser_45, $parser_46, $parser_47, $parser_48, $parser_49,
949            $parser_50, $parser_51, $parser_52, $parser_53, $parser_54, $parser_55,
950        )
951    };
952    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr, $parser_4:expr, $parser_5:expr, $parser_6:expr, $parser_7:expr, $parser_8:expr, $parser_9:expr, $parser_10:expr, $parser_11:expr, $parser_12:expr, $parser_13:expr, $parser_14:expr, $parser_15:expr, $parser_16:expr, $parser_17:expr, $parser_18:expr, $parser_19:expr, $parser_20:expr, $parser_21:expr, $parser_22:expr, $parser_23:expr, $parser_24:expr, $parser_25:expr, $parser_26:expr, $parser_27:expr, $parser_28:expr, $parser_29:expr, $parser_30:expr, $parser_31:expr, $parser_32:expr, $parser_33:expr, $parser_34:expr, $parser_35:expr, $parser_36:expr, $parser_37:expr, $parser_38:expr, $parser_39:expr, $parser_40:expr, $parser_41:expr, $parser_42:expr, $parser_43:expr, $parser_44:expr, $parser_45:expr, $parser_46:expr, $parser_47:expr, $parser_48:expr, $parser_49:expr, $parser_50:expr, $parser_51:expr, $parser_52:expr, $parser_53:expr, $parser_54:expr, $parser_55:expr, $parser_56:expr $(,)?) => {
953        $crate::parser::util::seq57(
954            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
955            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
956            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
957            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
958            $parser_29, $parser_30, $parser_31, $parser_32, $parser_33, $parser_34, $parser_35,
959            $parser_36, $parser_37, $parser_38, $parser_39, $parser_40, $parser_41, $parser_42,
960            $parser_43, $parser_44, $parser_45, $parser_46, $parser_47, $parser_48, $parser_49,
961            $parser_50, $parser_51, $parser_52, $parser_53, $parser_54, $parser_55, $parser_56,
962        )
963    };
964    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr, $parser_4:expr, $parser_5:expr, $parser_6:expr, $parser_7:expr, $parser_8:expr, $parser_9:expr, $parser_10:expr, $parser_11:expr, $parser_12:expr, $parser_13:expr, $parser_14:expr, $parser_15:expr, $parser_16:expr, $parser_17:expr, $parser_18:expr, $parser_19:expr, $parser_20:expr, $parser_21:expr, $parser_22:expr, $parser_23:expr, $parser_24:expr, $parser_25:expr, $parser_26:expr, $parser_27:expr, $parser_28:expr, $parser_29:expr, $parser_30:expr, $parser_31:expr, $parser_32:expr, $parser_33:expr, $parser_34:expr, $parser_35:expr, $parser_36:expr, $parser_37:expr, $parser_38:expr, $parser_39:expr, $parser_40:expr, $parser_41:expr, $parser_42:expr, $parser_43:expr, $parser_44:expr, $parser_45:expr, $parser_46:expr, $parser_47:expr, $parser_48:expr, $parser_49:expr, $parser_50:expr, $parser_51:expr, $parser_52:expr, $parser_53:expr, $parser_54:expr, $parser_55:expr, $parser_56:expr, $parser_57:expr $(,)?) => {
965        $crate::parser::util::seq58(
966            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
967            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
968            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
969            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
970            $parser_29, $parser_30, $parser_31, $parser_32, $parser_33, $parser_34, $parser_35,
971            $parser_36, $parser_37, $parser_38, $parser_39, $parser_40, $parser_41, $parser_42,
972            $parser_43, $parser_44, $parser_45, $parser_46, $parser_47, $parser_48, $parser_49,
973            $parser_50, $parser_51, $parser_52, $parser_53, $parser_54, $parser_55, $parser_56,
974            $parser_57,
975        )
976    };
977    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr, $parser_4:expr, $parser_5:expr, $parser_6:expr, $parser_7:expr, $parser_8:expr, $parser_9:expr, $parser_10:expr, $parser_11:expr, $parser_12:expr, $parser_13:expr, $parser_14:expr, $parser_15:expr, $parser_16:expr, $parser_17:expr, $parser_18:expr, $parser_19:expr, $parser_20:expr, $parser_21:expr, $parser_22:expr, $parser_23:expr, $parser_24:expr, $parser_25:expr, $parser_26:expr, $parser_27:expr, $parser_28:expr, $parser_29:expr, $parser_30:expr, $parser_31:expr, $parser_32:expr, $parser_33:expr, $parser_34:expr, $parser_35:expr, $parser_36:expr, $parser_37:expr, $parser_38:expr, $parser_39:expr, $parser_40:expr, $parser_41:expr, $parser_42:expr, $parser_43:expr, $parser_44:expr, $parser_45:expr, $parser_46:expr, $parser_47:expr, $parser_48:expr, $parser_49:expr, $parser_50:expr, $parser_51:expr, $parser_52:expr, $parser_53:expr, $parser_54:expr, $parser_55:expr, $parser_56:expr, $parser_57:expr, $parser_58:expr $(,)?) => {
978        $crate::parser::util::seq59(
979            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
980            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
981            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
982            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
983            $parser_29, $parser_30, $parser_31, $parser_32, $parser_33, $parser_34, $parser_35,
984            $parser_36, $parser_37, $parser_38, $parser_39, $parser_40, $parser_41, $parser_42,
985            $parser_43, $parser_44, $parser_45, $parser_46, $parser_47, $parser_48, $parser_49,
986            $parser_50, $parser_51, $parser_52, $parser_53, $parser_54, $parser_55, $parser_56,
987            $parser_57, $parser_58,
988        )
989    };
990    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr, $parser_4:expr, $parser_5:expr, $parser_6:expr, $parser_7:expr, $parser_8:expr, $parser_9:expr, $parser_10:expr, $parser_11:expr, $parser_12:expr, $parser_13:expr, $parser_14:expr, $parser_15:expr, $parser_16:expr, $parser_17:expr, $parser_18:expr, $parser_19:expr, $parser_20:expr, $parser_21:expr, $parser_22:expr, $parser_23:expr, $parser_24:expr, $parser_25:expr, $parser_26:expr, $parser_27:expr, $parser_28:expr, $parser_29:expr, $parser_30:expr, $parser_31:expr, $parser_32:expr, $parser_33:expr, $parser_34:expr, $parser_35:expr, $parser_36:expr, $parser_37:expr, $parser_38:expr, $parser_39:expr, $parser_40:expr, $parser_41:expr, $parser_42:expr, $parser_43:expr, $parser_44:expr, $parser_45:expr, $parser_46:expr, $parser_47:expr, $parser_48:expr, $parser_49:expr, $parser_50:expr, $parser_51:expr, $parser_52:expr, $parser_53:expr, $parser_54:expr, $parser_55:expr, $parser_56:expr, $parser_57:expr, $parser_58:expr, $parser_59:expr $(,)?) => {
991        $crate::parser::util::seq60(
992            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
993            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
994            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
995            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
996            $parser_29, $parser_30, $parser_31, $parser_32, $parser_33, $parser_34, $parser_35,
997            $parser_36, $parser_37, $parser_38, $parser_39, $parser_40, $parser_41, $parser_42,
998            $parser_43, $parser_44, $parser_45, $parser_46, $parser_47, $parser_48, $parser_49,
999            $parser_50, $parser_51, $parser_52, $parser_53, $parser_54, $parser_55, $parser_56,
1000            $parser_57, $parser_58, $parser_59,
1001        )
1002    };
1003    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr, $parser_4:expr, $parser_5:expr, $parser_6:expr, $parser_7:expr, $parser_8:expr, $parser_9:expr, $parser_10:expr, $parser_11:expr, $parser_12:expr, $parser_13:expr, $parser_14:expr, $parser_15:expr, $parser_16:expr, $parser_17:expr, $parser_18:expr, $parser_19:expr, $parser_20:expr, $parser_21:expr, $parser_22:expr, $parser_23:expr, $parser_24:expr, $parser_25:expr, $parser_26:expr, $parser_27:expr, $parser_28:expr, $parser_29:expr, $parser_30:expr, $parser_31:expr, $parser_32:expr, $parser_33:expr, $parser_34:expr, $parser_35:expr, $parser_36:expr, $parser_37:expr, $parser_38:expr, $parser_39:expr, $parser_40:expr, $parser_41:expr, $parser_42:expr, $parser_43:expr, $parser_44:expr, $parser_45:expr, $parser_46:expr, $parser_47:expr, $parser_48:expr, $parser_49:expr, $parser_50:expr, $parser_51:expr, $parser_52:expr, $parser_53:expr, $parser_54:expr, $parser_55:expr, $parser_56:expr, $parser_57:expr, $parser_58:expr, $parser_59:expr, $parser_60:expr $(,)?) => {
1004        $crate::parser::util::seq61(
1005            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
1006            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
1007            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
1008            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
1009            $parser_29, $parser_30, $parser_31, $parser_32, $parser_33, $parser_34, $parser_35,
1010            $parser_36, $parser_37, $parser_38, $parser_39, $parser_40, $parser_41, $parser_42,
1011            $parser_43, $parser_44, $parser_45, $parser_46, $parser_47, $parser_48, $parser_49,
1012            $parser_50, $parser_51, $parser_52, $parser_53, $parser_54, $parser_55, $parser_56,
1013            $parser_57, $parser_58, $parser_59, $parser_60,
1014        )
1015    };
1016    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr, $parser_4:expr, $parser_5:expr, $parser_6:expr, $parser_7:expr, $parser_8:expr, $parser_9:expr, $parser_10:expr, $parser_11:expr, $parser_12:expr, $parser_13:expr, $parser_14:expr, $parser_15:expr, $parser_16:expr, $parser_17:expr, $parser_18:expr, $parser_19:expr, $parser_20:expr, $parser_21:expr, $parser_22:expr, $parser_23:expr, $parser_24:expr, $parser_25:expr, $parser_26:expr, $parser_27:expr, $parser_28:expr, $parser_29:expr, $parser_30:expr, $parser_31:expr, $parser_32:expr, $parser_33:expr, $parser_34:expr, $parser_35:expr, $parser_36:expr, $parser_37:expr, $parser_38:expr, $parser_39:expr, $parser_40:expr, $parser_41:expr, $parser_42:expr, $parser_43:expr, $parser_44:expr, $parser_45:expr, $parser_46:expr, $parser_47:expr, $parser_48:expr, $parser_49:expr, $parser_50:expr, $parser_51:expr, $parser_52:expr, $parser_53:expr, $parser_54:expr, $parser_55:expr, $parser_56:expr, $parser_57:expr, $parser_58:expr, $parser_59:expr, $parser_60:expr, $parser_61:expr $(,)?) => {
1017        $crate::parser::util::seq62(
1018            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
1019            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
1020            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
1021            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
1022            $parser_29, $parser_30, $parser_31, $parser_32, $parser_33, $parser_34, $parser_35,
1023            $parser_36, $parser_37, $parser_38, $parser_39, $parser_40, $parser_41, $parser_42,
1024            $parser_43, $parser_44, $parser_45, $parser_46, $parser_47, $parser_48, $parser_49,
1025            $parser_50, $parser_51, $parser_52, $parser_53, $parser_54, $parser_55, $parser_56,
1026            $parser_57, $parser_58, $parser_59, $parser_60, $parser_61,
1027        )
1028    };
1029    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr, $parser_4:expr, $parser_5:expr, $parser_6:expr, $parser_7:expr, $parser_8:expr, $parser_9:expr, $parser_10:expr, $parser_11:expr, $parser_12:expr, $parser_13:expr, $parser_14:expr, $parser_15:expr, $parser_16:expr, $parser_17:expr, $parser_18:expr, $parser_19:expr, $parser_20:expr, $parser_21:expr, $parser_22:expr, $parser_23:expr, $parser_24:expr, $parser_25:expr, $parser_26:expr, $parser_27:expr, $parser_28:expr, $parser_29:expr, $parser_30:expr, $parser_31:expr, $parser_32:expr, $parser_33:expr, $parser_34:expr, $parser_35:expr, $parser_36:expr, $parser_37:expr, $parser_38:expr, $parser_39:expr, $parser_40:expr, $parser_41:expr, $parser_42:expr, $parser_43:expr, $parser_44:expr, $parser_45:expr, $parser_46:expr, $parser_47:expr, $parser_48:expr, $parser_49:expr, $parser_50:expr, $parser_51:expr, $parser_52:expr, $parser_53:expr, $parser_54:expr, $parser_55:expr, $parser_56:expr, $parser_57:expr, $parser_58:expr, $parser_59:expr, $parser_60:expr, $parser_61:expr, $parser_62:expr $(,)?) => {
1030        $crate::parser::util::seq63(
1031            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
1032            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
1033            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
1034            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
1035            $parser_29, $parser_30, $parser_31, $parser_32, $parser_33, $parser_34, $parser_35,
1036            $parser_36, $parser_37, $parser_38, $parser_39, $parser_40, $parser_41, $parser_42,
1037            $parser_43, $parser_44, $parser_45, $parser_46, $parser_47, $parser_48, $parser_49,
1038            $parser_50, $parser_51, $parser_52, $parser_53, $parser_54, $parser_55, $parser_56,
1039            $parser_57, $parser_58, $parser_59, $parser_60, $parser_61, $parser_62,
1040        )
1041    };
1042    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr, $parser_4:expr, $parser_5:expr, $parser_6:expr, $parser_7:expr, $parser_8:expr, $parser_9:expr, $parser_10:expr, $parser_11:expr, $parser_12:expr, $parser_13:expr, $parser_14:expr, $parser_15:expr, $parser_16:expr, $parser_17:expr, $parser_18:expr, $parser_19:expr, $parser_20:expr, $parser_21:expr, $parser_22:expr, $parser_23:expr, $parser_24:expr, $parser_25:expr, $parser_26:expr, $parser_27:expr, $parser_28:expr, $parser_29:expr, $parser_30:expr, $parser_31:expr, $parser_32:expr, $parser_33:expr, $parser_34:expr, $parser_35:expr, $parser_36:expr, $parser_37:expr, $parser_38:expr, $parser_39:expr, $parser_40:expr, $parser_41:expr, $parser_42:expr, $parser_43:expr, $parser_44:expr, $parser_45:expr, $parser_46:expr, $parser_47:expr, $parser_48:expr, $parser_49:expr, $parser_50:expr, $parser_51:expr, $parser_52:expr, $parser_53:expr, $parser_54:expr, $parser_55:expr, $parser_56:expr, $parser_57:expr, $parser_58:expr, $parser_59:expr, $parser_60:expr, $parser_61:expr, $parser_62:expr, $parser_63:expr $(,)?) => {
1043        $crate::parser::util::seq64(
1044            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
1045            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
1046            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
1047            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
1048            $parser_29, $parser_30, $parser_31, $parser_32, $parser_33, $parser_34, $parser_35,
1049            $parser_36, $parser_37, $parser_38, $parser_39, $parser_40, $parser_41, $parser_42,
1050            $parser_43, $parser_44, $parser_45, $parser_46, $parser_47, $parser_48, $parser_49,
1051            $parser_50, $parser_51, $parser_52, $parser_53, $parser_54, $parser_55, $parser_56,
1052            $parser_57, $parser_58, $parser_59, $parser_60, $parser_61, $parser_62, $parser_63,
1053        )
1054    };
1055    ($($parser:expr),+ $(,)?) => {
1056        compile_error!("seq_n! currently supports up to 64 parsers");
1057    };
1058}
1059
1060/// Sequence two parsers, keeping only the second result.
1061pub fn skip_first<A, B, PA, PB>(
1062    parser_a: PA,
1063    parser_b: PB,
1064) -> impl Fn(&mut PtxTokenStream) -> Result<(B, Span), PtxParseError>
1065where
1066    PA: Fn(&mut PtxTokenStream) -> Result<(A, Span), PtxParseError>,
1067    PB: Fn(&mut PtxTokenStream) -> Result<(B, Span), PtxParseError>,
1068{
1069    move |stream| {
1070        stream.try_with_span(|stream| {
1071            let _ = parser_a(stream)?;
1072            let (b, _) = parser_b(stream)?;
1073            Ok(b)
1074        })
1075    }
1076}
1077
1078/// Sequence a parser and consume a trailing semicolon.
1079pub fn skip_semicolon<T, P>(
1080    parser: P,
1081) -> impl Fn(&mut PtxTokenStream) -> Result<(T, Span), PtxParseError>
1082where
1083    P: Fn(&mut PtxTokenStream) -> Result<(T, Span), PtxParseError>,
1084{
1085    move |stream| {
1086        let (value, span) = parser(stream)?;
1087        let _ = semicolon_p()(stream)?;
1088        Ok((value, span))
1089    }
1090}
1091
1092/// Sequence two parsers, keeping only the second result.
1093#[allow(dead_code)]
1094pub fn skip_second<A, B, PA, PB>(
1095    parser_a: PA,
1096    parser_b: PB,
1097) -> impl Fn(&mut PtxTokenStream) -> Result<(A, Span), PtxParseError>
1098where
1099    PA: Fn(&mut PtxTokenStream) -> Result<(A, Span), PtxParseError>,
1100    PB: Fn(&mut PtxTokenStream) -> Result<(B, Span), PtxParseError>,
1101{
1102    move |stream| {
1103        stream.try_with_span(|stream| {
1104            let (a, _) = parser_a(stream)?;
1105            let (_, _) = parser_b(stream)?;
1106            Ok(a)
1107        })
1108    }
1109}
1110
1111/* -------------------------------------------------- */
1112/* ----------------- Mapping Combinators ------------ */
1113/* -------------------------------------------------- */
1114
1115/// Pure (return) - creates a parser that succeeds without consuming input.
1116///
1117/// This is the monadic return/pure operation.
1118#[allow(dead_code)]
1119pub fn pure<T>(value: T) -> impl Fn(&mut PtxTokenStream) -> Result<(T, Span), PtxParseError>
1120where
1121    T: Clone + 'static,
1122{
1123    move |stream| stream.try_with_span(|_| Ok(value.clone()))
1124}
1125
1126/// Dispatch combinator - parse a value, then choose a parser based on the result.
1127///
1128/// This combinator first runs `parser` to extract a value and span, then calls the
1129/// dispatch function `f` with that (value, span) tuple to determine which parser to run next.
1130///
1131/// This is useful for parsers that need to peek at a token (like a directive or identifier)
1132/// and then dispatch to different parsers based on the value.
1133///
1134/// Example:
1135/// ```ignore
1136/// dispatch(
1137///     directive_p(),
1138///     |(dir, span)| match dir.as_str() {
1139///         "visible" => Box::new(pure(CodeLinkage::Visible { span })),
1140///         "extern" => Box::new(pure(CodeLinkage::Extern { span })),
1141///         _ => Box::new(|_| Err(error))
1142///     }
1143/// )
1144/// ```
1145#[allow(dead_code)]
1146pub fn dispatch<A, B, P, F, Next>(
1147    parser: P,
1148    f: F,
1149) -> impl Fn(&mut PtxTokenStream) -> Result<(B, Span), PtxParseError>
1150where
1151    P: Fn(&mut PtxTokenStream) -> Result<(A, Span), PtxParseError>,
1152    F: Fn(A, Span) -> Next,
1153    Next: Fn(&mut PtxTokenStream) -> Result<(B, Span), PtxParseError>,
1154{
1155    move |stream| {
1156        stream.try_with_span(|stream| {
1157            let (value, span) = parser(stream)?;
1158            let next_parser = f(value, span);
1159            let (result, _) = next_parser(stream)?;
1160            Ok(result)
1161        })
1162    }
1163}
1164
1165/// Map over a parser result and assign the span to the mapped value.
1166pub fn map<A, B, P, F>(
1167    parser: P,
1168    f: F,
1169) -> impl Fn(&mut PtxTokenStream) -> Result<(B, Span), PtxParseError>
1170where
1171    P: Fn(&mut PtxTokenStream) -> Result<(A, Span), PtxParseError>,
1172    F: Fn(A, Span) -> B,
1173{
1174    move |stream| {
1175        let (value, span) = parser(stream)?;
1176        Ok((f(value, span), span))
1177    }
1178}
1179
1180/// Map over a parser result with a fallible transformation while assigning spans.
1181pub fn try_map<A, B, P, F>(
1182    parser: P,
1183    f: F,
1184) -> impl Fn(&mut PtxTokenStream) -> Result<(B, Span), PtxParseError>
1185where
1186    P: Fn(&mut PtxTokenStream) -> Result<(A, Span), PtxParseError>,
1187    F: Fn(A, Span) -> Result<B, PtxParseError>,
1188{
1189    move |stream| {
1190        stream.try_with_span(|stream| {
1191            let (value, span) = parser(stream)?;
1192            match f(value, span) {
1193                Ok(node) => Ok(node),
1194                Err(mut err) => {
1195                    err.span = span;
1196                    Err(err)
1197                }
1198            }
1199        })
1200    }
1201}
1202
1203/* -------------------------------------------------- */
1204/* ------------------- Choice Combinators ----------- */
1205/* -------------------------------------------------- */
1206
1207/// Chain together multiple alternative parsers using the binary `alt` combinator.
1208#[macro_export]
1209macro_rules! alt {
1210    () => {
1211        compile_error!("alt! requires at least one parser")
1212    };
1213    // Single parser - just return it.
1214    ($parser:expr $(,)?) => {
1215        $parser
1216    };
1217    // Two or more parsers - expand to an iterative dispatcher to avoid deep recursion.
1218    ($parser_head:expr, $($parser_tail:expr),+ $(,)?) => {{
1219        move |stream: &mut $crate::parser::PtxTokenStream| {
1220            $crate::alt!(@attempt stream $parser_head, $($parser_tail),+)
1221        }
1222    }};
1223    (@attempt $stream:ident $last:expr) => {{
1224        let parser_ref = &$last;
1225        match $stream.try_with_span(|s| parser_ref(s)) {
1226            Ok((result, _)) => Ok(result),
1227            Err(e) => Err(e),
1228        }
1229    }};
1230    (@attempt $stream:ident $parser_curr:expr, $($parser_rest:expr),+) => {{
1231        let parser_ref = &$parser_curr;
1232        match $stream.try_with_span(|s| parser_ref(s)) {
1233            Ok((result, _)) => Ok(result),
1234            Err(_) => $crate::alt!(@attempt $stream $($parser_rest),+),
1235        }
1236    }};
1237}
1238
1239/// Alternative combinator - try first parser, if it fails try second.
1240///
1241/// This is the fundamental choice combinator for building parsers with alternatives.
1242/// Uses backtracking - the stream is rewound if the first parser fails.
1243///
1244/// Example:
1245/// ```ignore
1246/// let parser = alt(
1247///     string_value_p(".s16".to_string(), Type::S16),
1248///     string_value_p(".s32".to_string(), Type::S32)
1249/// );
1250/// ```
1251pub fn alt<T, P1, P2>(
1252    parser1: P1,
1253    parser2: P2,
1254) -> impl Fn(&mut PtxTokenStream) -> Result<(T, Span), PtxParseError>
1255where
1256    P1: Fn(&mut PtxTokenStream) -> Result<(T, Span), PtxParseError>,
1257    P2: Fn(&mut PtxTokenStream) -> Result<(T, Span), PtxParseError>,
1258{
1259    move |stream| match stream.try_with_span(|stream| parser1(stream)) {
1260        Ok((result, _)) => Ok(result),
1261        Err(_) => parser2(stream),
1262    }
1263}
1264
1265/// Choice combinator for multiple alternatives.
1266///
1267/// Tries each parser in order until one succeeds. Uses backtracking.
1268#[allow(dead_code)]
1269pub fn choice<T>(
1270    parsers: Vec<impl Fn(&mut PtxTokenStream) -> Result<(T, Span), PtxParseError>>,
1271) -> impl Fn(&mut PtxTokenStream) -> Result<(T, Span), PtxParseError> {
1272    move |stream| {
1273        let mut last_error = None;
1274        for parser in &parsers {
1275            match stream.try_with_span(|stream| parser(stream)) {
1276                Ok((result, _)) => return Ok(result),
1277                Err(err) => {
1278                    last_error = Some(err);
1279                }
1280            }
1281        }
1282
1283        Err(last_error.unwrap_or_else(|| PtxParseError {
1284            kind: ParseErrorKind::UnexpectedEof,
1285            span: span!(0..0),
1286        }))
1287    }
1288}
1289
1290/// Attempt combinator - run parser and rewind on failure.
1291#[allow(dead_code)]
1292pub fn attempt<T, P>(parser: P) -> impl Fn(&mut PtxTokenStream) -> Result<(T, Span), PtxParseError>
1293where
1294    P: Fn(&mut PtxTokenStream) -> Result<(T, Span), PtxParseError>,
1295{
1296    move |stream| match stream.try_with_span(|stream| parser(stream)) {
1297        Ok((result, _)) => Ok(result),
1298        Err(err) => Err(err),
1299    }
1300}
1301
1302/// Optional parser - try to parse, return None if it fails.
1303pub fn optional<T, P>(
1304    parser: P,
1305) -> impl Fn(&mut PtxTokenStream) -> Result<(Option<T>, Span), PtxParseError>
1306where
1307    P: Fn(&mut PtxTokenStream) -> Result<(T, Span), PtxParseError>,
1308{
1309    move |stream| match stream.try_with_span(|stream| parser(stream)) {
1310        Ok(((value, _), span)) => Ok((Some(value), span)),
1311        Err(_) => Ok((None, stream.current_span())),
1312    }
1313}
1314
1315/* -------------------------------------------------- */
1316/* -------------------- List Combinators ------------ */
1317/* -------------------------------------------------- */
1318
1319/// Parse zero or more occurrences (greedy).
1320///
1321/// Always succeeds, returning an empty vector if no matches.
1322pub fn many<T, P>(
1323    parser: P,
1324) -> impl Fn(&mut PtxTokenStream) -> Result<(Vec<T>, Span), PtxParseError>
1325where
1326    P: Fn(&mut PtxTokenStream) -> Result<(T, Span), PtxParseError>,
1327{
1328    move |stream| {
1329        stream.try_with_span(|stream| {
1330            let mut values = Vec::new();
1331
1332            loop {
1333                match stream.try_with_span(|stream| parser(stream)) {
1334                    Ok(((value, _), _)) => values.push(value),
1335                    Err(_) => break,
1336                }
1337            }
1338
1339            Ok(values)
1340        })
1341    }
1342}
1343
1344/// Parse one or more occurrences (greedy).
1345///
1346/// Pattern: T+
1347#[allow(dead_code)]
1348pub fn many1<T, P>(
1349    parser: P,
1350) -> impl Fn(&mut PtxTokenStream) -> Result<(Vec<T>, Span), PtxParseError>
1351where
1352    P: Fn(&mut PtxTokenStream) -> Result<(T, Span), PtxParseError>,
1353{
1354    move |stream| {
1355        stream.try_with_span(|stream| {
1356            let (first, _) = parser(stream)?;
1357            let mut values = vec![first];
1358
1359            loop {
1360                match stream.try_with_span(|stream| parser(stream)) {
1361                    Ok(((value, _), _)) => values.push(value),
1362                    Err(_) => break,
1363                }
1364            }
1365
1366            Ok(values)
1367        })
1368    }
1369}
1370
1371/* -------------------------------------------------- */
1372/* ------------- Separated List Combinators --------- */
1373/* -------------------------------------------------- */
1374
1375/// Parse separator-separated list allowing trailing separator.
1376/// Returns empty vector on zero matches.
1377pub fn sep_by<T, S, P, PS>(
1378    parser: P,
1379    separator: PS,
1380) -> impl Fn(&mut PtxTokenStream) -> Result<(Vec<T>, Span), PtxParseError>
1381where
1382    P: Fn(&mut PtxTokenStream) -> Result<(T, Span), PtxParseError>,
1383    PS: Fn(&mut PtxTokenStream) -> Result<(S, Span), PtxParseError>,
1384{
1385    move |stream| {
1386        stream.try_with_span(|stream| {
1387            let mut values = Vec::new();
1388
1389            match stream.try_with_span(|stream| parser(stream)) {
1390                Ok(((value, _), _)) => values.push(value),
1391                Err(_) => return Ok(values),
1392            }
1393
1394            loop {
1395                match stream.try_with_span(|stream| separator(stream)) {
1396                    Ok((_, _)) => match stream.try_with_span(|stream| parser(stream)) {
1397                        Ok(((value, _), _)) => values.push(value),
1398                        Err(_) => break,
1399                    },
1400                    Err(_) => break,
1401                }
1402            }
1403
1404            Ok(values)
1405        })
1406    }
1407}
1408
1409/// Parse separator-separated list requiring at least one element.
1410pub fn sep_by1<T, S, P, PS>(
1411    parser: P,
1412    separator: PS,
1413) -> impl Fn(&mut PtxTokenStream) -> Result<(Vec<T>, Span), PtxParseError>
1414where
1415    P: Fn(&mut PtxTokenStream) -> Result<(T, Span), PtxParseError>,
1416    PS: Fn(&mut PtxTokenStream) -> Result<(S, Span), PtxParseError>,
1417{
1418    move |stream| {
1419        stream.try_with_span(|stream| {
1420            let (first, _) = parser(stream)?;
1421            let mut values = vec![first];
1422
1423            loop {
1424                let mut separator_failed = false;
1425                match stream.try_with_span(|stream| {
1426                    separator(stream).map_err(|err| {
1427                        separator_failed = true;
1428                        err
1429                    })?;
1430                    parser(stream)
1431                }) {
1432                    Ok(((value, _), _)) => values.push(value),
1433                    Err(err) => {
1434                        if separator_failed {
1435                            break;
1436                        } else {
1437                            return Err(err);
1438                        }
1439                    }
1440                }
1441            }
1442
1443            Ok(values)
1444        })
1445    }
1446}
1447
1448/* -------------------------------------------------- */
1449/* -------------------- Look Ahead ------------------ */
1450/* -------------------------------------------------- */
1451
1452/// Peek - runs a parser without consuming input.
1453///
1454/// Saves the stream position, runs the parser, then restores the position.
1455#[allow(dead_code)]
1456pub fn peek<T, P>(parser: P) -> impl Fn(&mut PtxTokenStream) -> Result<(T, Span), PtxParseError>
1457where
1458    P: Fn(&mut PtxTokenStream) -> Result<(T, Span), PtxParseError>,
1459{
1460    move |stream| {
1461        let saved_pos = stream.position();
1462        let result = parser(stream);
1463        stream.set_position(saved_pos);
1464        result
1465    }
1466}
1467
1468/// Combinator that checks if a predicate matches without consuming.
1469#[allow(dead_code)]
1470pub fn check<F>(predicate: F) -> impl Fn(&mut PtxTokenStream) -> Result<bool, PtxParseError>
1471where
1472    F: Fn(&PtxToken) -> bool,
1473{
1474    move |stream| {
1475        Ok(stream
1476            .peek()
1477            .map(|(token, _)| predicate(&token))
1478            .unwrap_or(false))
1479    }
1480}
1481
1482/// Combinator that peeks at the next directive (Dot + Identifier pattern).
1483/// Returns Some((directive_name, span)) if a directive is found, None otherwise.
1484#[allow(dead_code)]
1485pub fn peek_directive() -> impl Fn(&mut PtxTokenStream) -> Result<Option<String>, PtxParseError> {
1486    |stream| {
1487        let directive = match (stream.peek(), stream.peek_n(1)) {
1488            (Ok((PtxToken::Dot, _dot_span)), Ok((PtxToken::Identifier(name), _id_span))) => {
1489                Some(name.clone())
1490            }
1491            _ => None,
1492        };
1493        Ok(directive)
1494    }
1495}
1496
1497/* -------------------------------------------------- */
1498/* -------------------- Utility Helpers ------------- */
1499/* -------------------------------------------------- */
1500
1501/// Combinator that parses a token satisfying a predicate.
1502/// Returns the token and its span.
1503#[allow(dead_code)]
1504pub fn satisfy<F>(
1505    predicate: F,
1506    expected_msg: &'static str,
1507) -> impl Fn(&mut PtxTokenStream) -> Result<((PtxToken, Span), Span), PtxParseError>
1508where
1509    F: Fn(&PtxToken) -> bool + Clone + 'static,
1510{
1511    move |stream| {
1512        let eof_span = stream.current_span();
1513        stream.try_with_span(|stream| {
1514            let (token, span) = stream.peek().map_err(|_| PtxParseError {
1515                kind: ParseErrorKind::UnexpectedEof,
1516                span: eof_span,
1517            })?;
1518
1519            if predicate(&token) {
1520                stream.consume()?;
1521                Ok((token.clone(), *span))
1522            } else {
1523                Err(crate::unexpected_token!(
1524                    *span,
1525                    &[expected_msg.to_string()],
1526                    format!("{:?}", token)
1527                ))
1528            }
1529        })
1530    }
1531}
1532
1533/// Parse elements enclosed by delimiters.
1534///
1535/// Example: between(lparen_p(), rparen_p(), identifier_p())
1536pub fn between<O, C, T, PO, PC, PT>(
1537    open: PO,
1538    close: PC,
1539    parser: PT,
1540) -> impl Fn(&mut PtxTokenStream) -> Result<(T, Span), PtxParseError>
1541where
1542    PO: Fn(&mut PtxTokenStream) -> Result<(O, Span), PtxParseError>,
1543    PC: Fn(&mut PtxTokenStream) -> Result<(C, Span), PtxParseError>,
1544    PT: Fn(&mut PtxTokenStream) -> Result<(T, Span), PtxParseError>,
1545{
1546    move |stream| {
1547        stream.try_with_span(|stream| {
1548            let _ = open(stream)?;
1549            let (result, _) = parser(stream)?;
1550            let _ = close(stream)?;
1551            Ok(result)
1552        })
1553    }
1554}