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 identifier token and returns (name, span).
270pub fn identifier_p() -> impl Fn(&mut PtxTokenStream) -> Result<(String, Span), PtxParseError> {
271    move |stream| {
272        stream.try_with_span(|stream| {
273            let (name, _) = stream.expect_identifier()?;
274            Ok(name)
275        })
276    }
277}
278
279/// Parser that expects a directive token and returns (directive, span).
280pub fn directive_p() -> impl Fn(&mut PtxTokenStream) -> Result<(String, Span), PtxParseError> {
281    move |stream| {
282        stream.try_with_span(|stream| {
283            let (dir, _) = stream.expect_directive()?;
284            Ok(dir)
285        })
286    }
287}
288
289/// Expect a specific directive name (e.g., `.align`).
290pub fn directive_exact_p(
291    expected: impl Into<String>,
292) -> impl Fn(&mut PtxTokenStream) -> Result<((), Span), PtxParseError> {
293    let expected = expected.into();
294    move |stream| {
295        let (dir, span) = directive_p()(stream)?;
296        if dir == expected {
297            Ok(((), span))
298        } else {
299            Err(crate::unexpected_value!(
300                span,
301                &[&format!(".{expected}")],
302                format!(".{dir}")
303            ))
304        }
305    }
306}
307
308/// Parser that expects a register token and returns (name, span).
309pub fn register_p() -> impl Fn(&mut PtxTokenStream) -> Result<(String, Span), PtxParseError> {
310    move |stream| {
311        stream.try_with_span(|stream| {
312            let (mut name, _) = stream.expect_register()?;
313            loop {
314                let has_dot = matches!(stream.peek(), Ok((PtxToken::Dot, _)));
315                if !has_dot {
316                    break;
317                }
318
319                // Peek ahead to ensure this is a valid single-character component (e.g., .x, .y)
320                let is_component = match stream.peek_n(1) {
321                    Ok((PtxToken::Identifier(component_name), _)) => matches!(
322                        component_name.as_str(),
323                        "x" | "y" | "z" | "w" | "r" | "g" | "b" | "a"
324                    ),
325                    _ => false,
326                };
327
328                if !is_component {
329                    break;
330                }
331
332                // Consume '.' and the component identifier
333                let _ = stream.consume()?;
334                let (suffix, _) = stream.expect_identifier()?;
335                name.push('.');
336                name.push_str(&suffix);
337            }
338            Ok(name)
339        })
340    }
341}
342
343/// Parser that expects a string literal token and returns its string contents.
344pub fn string_literal_p() -> impl Fn(&mut PtxTokenStream) -> Result<(String, Span), PtxParseError> {
345    move |stream| {
346        stream.try_with_span(|stream| {
347            let (token, token_span) = stream.consume()?;
348            match token {
349                PtxToken::StringLiteral(value) => Ok(value.clone()),
350                _ => Err(crate::unexpected_token!(
351                    *token_span,
352                    &["string literal".to_string()],
353                    format!("{:?}", token)
354                )),
355            }
356        })
357    }
358}
359
360/// Parser that expects any literal token (integer or float) and returns its string form.
361pub fn literal_p() -> impl Fn(&mut PtxTokenStream) -> Result<(String, Span), PtxParseError> {
362    move |stream| {
363        stream.try_with_span(|stream| {
364            let (token, token_span) = stream.consume()?;
365            match token {
366                PtxToken::DecimalInteger(s)
367                | PtxToken::HexInteger(s)
368                | PtxToken::BinaryInteger(s)
369                | PtxToken::OctalInteger(s)
370                | PtxToken::Float(s)
371                | PtxToken::FloatExponent(s)
372                | PtxToken::HexFloatSingle(s)
373                | PtxToken::HexFloatDouble(s) => Ok(s.clone()),
374                _ => Err(crate::unexpected_token!(
375                    *token_span,
376                    &["literal".to_string()],
377                    format!("{:?}", token)
378                )),
379            }
380        })
381    }
382}
383
384/* -------------------------------------------------- */
385/* --------------- Sequence Combinators ------------- */
386/* -------------------------------------------------- */
387
388// Macro to generate seqN functions
389macro_rules! define_seq {
390    ($name:ident, $count:expr, $($ty:ident),+; $($param:ident),+; $($var:ident),+) => {
391        #[allow(non_camel_case_types)]
392        #[allow(dead_code)]
393        #[doc = concat!("Sequence ", $count, " parsers, keeping all results.")]
394        pub fn $name<$($ty),+, $($param),+>(
395            $($param: $param),+
396        ) -> impl Fn(&mut PtxTokenStream) -> Result<(($($ty),+), Span), PtxParseError>
397        where
398            $($param: Fn(&mut PtxTokenStream) -> Result<($ty, Span), PtxParseError>),+
399        {
400            move |stream| stream.try_with_span(|stream| {
401                $(let ($var, _) = $param(stream)?;)+
402                Ok(($($var),+))
403            })
404        }
405    };
406}
407
408// Generate seq2 through seq64
409define_seq!(seq, "2", A, B; parser_a, parser_b; a, b);
410define_seq!(seq3, "3", A, B, C; parser_a, parser_b, parser_c; a, b, c);
411define_seq!(seq4, "4", A, B, C, D; parser_a, parser_b, parser_c, parser_d; a, b, c, d);
412define_seq!(seq5, "5", A, B, C, D, E; parser_a, parser_b, parser_c, parser_d, parser_e; a, b, c, d, e);
413define_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);
414define_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);
415define_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);
416define_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);
417define_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);
418define_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);
419define_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);
420define_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);
421define_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);
422define_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);
423define_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);
424define_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);
425define_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);
426define_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);
427define_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);
428define_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);
429define_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);
430define_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);
431define_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);
432define_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);
433define_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);
434define_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);
435define_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);
436define_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);
437define_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);
438define_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);
439define_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);
440define_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);
441define_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);
442define_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);
443define_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);
444define_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);
445define_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);
446define_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);
447define_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);
448define_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);
449define_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);
450define_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);
451define_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);
452define_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);
453define_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);
454define_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);
455define_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);
456define_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);
457define_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);
458define_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);
459define_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);
460define_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);
461define_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);
462define_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);
463define_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);
464define_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);
465define_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);
466define_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);
467define_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);
468define_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);
469define_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);
470define_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);
471define_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);
472
473/// Compose multiple parsers at once by selecting the appropriate `seqN` combinator.
474#[macro_export]
475macro_rules! seq_n {
476    () => {
477        compile_error!("seq_n! requires at least two parsers");
478    };
479    ($parser_a:expr $(,)?) => {
480        compile_error!("seq_n! requires at least two parsers");
481    };
482    ($parser_0:expr, $parser_1:expr $(,)?) => {
483        $crate::parser::util::seq($parser_0, $parser_1)
484    };
485    ($parser_0:expr, $parser_1:expr, $parser_2:expr $(,)?) => {
486        $crate::parser::util::seq3($parser_0, $parser_1, $parser_2)
487    };
488    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr $(,)?) => {
489        $crate::parser::util::seq4($parser_0, $parser_1, $parser_2, $parser_3)
490    };
491    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr, $parser_4:expr $(,)?) => {
492        $crate::parser::util::seq5($parser_0, $parser_1, $parser_2, $parser_3, $parser_4)
493    };
494    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr, $parser_4:expr, $parser_5:expr $(,)?) => {
495        $crate::parser::util::seq6(
496            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5,
497        )
498    };
499    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr, $parser_4:expr, $parser_5:expr, $parser_6:expr $(,)?) => {
500        $crate::parser::util::seq7(
501            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6,
502        )
503    };
504    ($parser_0:expr, $parser_1:expr, $parser_2:expr, $parser_3:expr, $parser_4:expr, $parser_5:expr, $parser_6:expr, $parser_7:expr $(,)?) => {
505        $crate::parser::util::seq8(
506            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
507        )
508    };
509    ($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 $(,)?) => {
510        $crate::parser::util::seq9(
511            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
512            $parser_8,
513        )
514    };
515    ($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 $(,)?) => {
516        $crate::parser::util::seq10(
517            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
518            $parser_8, $parser_9,
519        )
520    };
521    ($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 $(,)?) => {
522        $crate::parser::util::seq11(
523            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
524            $parser_8, $parser_9, $parser_10,
525        )
526    };
527    ($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 $(,)?) => {
528        $crate::parser::util::seq12(
529            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
530            $parser_8, $parser_9, $parser_10, $parser_11,
531        )
532    };
533    ($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 $(,)?) => {
534        $crate::parser::util::seq13(
535            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
536            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12,
537        )
538    };
539    ($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 $(,)?) => {
540        $crate::parser::util::seq14(
541            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
542            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13,
543        )
544    };
545    ($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 $(,)?) => {
546        $crate::parser::util::seq15(
547            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
548            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
549        )
550    };
551    ($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 $(,)?) => {
552        $crate::parser::util::seq16(
553            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
554            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
555            $parser_15,
556        )
557    };
558    ($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 $(,)?) => {
559        $crate::parser::util::seq17(
560            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
561            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
562            $parser_15, $parser_16,
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, $parser_16:expr, $parser_17:expr $(,)?) => {
566        $crate::parser::util::seq18(
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, $parser_16, $parser_17,
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, $parser_17:expr, $parser_18:expr $(,)?) => {
573        $crate::parser::util::seq19(
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, $parser_17, $parser_18,
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, $parser_18:expr, $parser_19:expr $(,)?) => {
580        $crate::parser::util::seq20(
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, $parser_18, $parser_19,
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, $parser_19:expr, $parser_20:expr $(,)?) => {
587        $crate::parser::util::seq21(
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, $parser_19, $parser_20,
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, $parser_20:expr, $parser_21:expr $(,)?) => {
594        $crate::parser::util::seq22(
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, $parser_20, $parser_21,
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, $parser_21:expr, $parser_22:expr $(,)?) => {
601        $crate::parser::util::seq23(
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, $parser_21,
605            $parser_22,
606        )
607    };
608    ($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 $(,)?) => {
609        $crate::parser::util::seq24(
610            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
611            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
612            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
613            $parser_22, $parser_23,
614        )
615    };
616    ($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 $(,)?) => {
617        $crate::parser::util::seq25(
618            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
619            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
620            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
621            $parser_22, $parser_23, $parser_24,
622        )
623    };
624    ($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 $(,)?) => {
625        $crate::parser::util::seq26(
626            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
627            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
628            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
629            $parser_22, $parser_23, $parser_24, $parser_25,
630        )
631    };
632    ($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 $(,)?) => {
633        $crate::parser::util::seq27(
634            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
635            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
636            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
637            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26,
638        )
639    };
640    ($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 $(,)?) => {
641        $crate::parser::util::seq28(
642            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
643            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
644            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
645            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27,
646        )
647    };
648    ($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 $(,)?) => {
649        $crate::parser::util::seq29(
650            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
651            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
652            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
653            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
654        )
655    };
656    ($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 $(,)?) => {
657        $crate::parser::util::seq30(
658            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
659            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
660            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
661            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
662            $parser_29,
663        )
664    };
665    ($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 $(,)?) => {
666        $crate::parser::util::seq31(
667            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
668            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
669            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
670            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
671            $parser_29, $parser_30,
672        )
673    };
674    ($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 $(,)?) => {
675        $crate::parser::util::seq32(
676            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
677            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
678            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
679            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
680            $parser_29, $parser_30, $parser_31,
681        )
682    };
683    ($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 $(,)?) => {
684        $crate::parser::util::seq33(
685            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
686            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
687            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
688            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
689            $parser_29, $parser_30, $parser_31, $parser_32,
690        )
691    };
692    ($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 $(,)?) => {
693        $crate::parser::util::seq34(
694            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
695            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
696            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
697            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
698            $parser_29, $parser_30, $parser_31, $parser_32, $parser_33,
699        )
700    };
701    ($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 $(,)?) => {
702        $crate::parser::util::seq35(
703            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
704            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
705            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
706            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
707            $parser_29, $parser_30, $parser_31, $parser_32, $parser_33, $parser_34,
708        )
709    };
710    ($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 $(,)?) => {
711        $crate::parser::util::seq36(
712            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
713            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
714            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
715            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
716            $parser_29, $parser_30, $parser_31, $parser_32, $parser_33, $parser_34, $parser_35,
717        )
718    };
719    ($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 $(,)?) => {
720        $crate::parser::util::seq37(
721            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
722            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
723            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
724            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
725            $parser_29, $parser_30, $parser_31, $parser_32, $parser_33, $parser_34, $parser_35,
726            $parser_36,
727        )
728    };
729    ($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 $(,)?) => {
730        $crate::parser::util::seq38(
731            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
732            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
733            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
734            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
735            $parser_29, $parser_30, $parser_31, $parser_32, $parser_33, $parser_34, $parser_35,
736            $parser_36, $parser_37,
737        )
738    };
739    ($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 $(,)?) => {
740        $crate::parser::util::seq39(
741            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
742            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
743            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
744            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
745            $parser_29, $parser_30, $parser_31, $parser_32, $parser_33, $parser_34, $parser_35,
746            $parser_36, $parser_37, $parser_38,
747        )
748    };
749    ($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 $(,)?) => {
750        $crate::parser::util::seq40(
751            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
752            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
753            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
754            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
755            $parser_29, $parser_30, $parser_31, $parser_32, $parser_33, $parser_34, $parser_35,
756            $parser_36, $parser_37, $parser_38, $parser_39,
757        )
758    };
759    ($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 $(,)?) => {
760        $crate::parser::util::seq41(
761            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
762            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
763            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
764            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
765            $parser_29, $parser_30, $parser_31, $parser_32, $parser_33, $parser_34, $parser_35,
766            $parser_36, $parser_37, $parser_38, $parser_39, $parser_40,
767        )
768    };
769    ($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 $(,)?) => {
770        $crate::parser::util::seq42(
771            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
772            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
773            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
774            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
775            $parser_29, $parser_30, $parser_31, $parser_32, $parser_33, $parser_34, $parser_35,
776            $parser_36, $parser_37, $parser_38, $parser_39, $parser_40, $parser_41,
777        )
778    };
779    ($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 $(,)?) => {
780        $crate::parser::util::seq43(
781            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
782            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
783            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
784            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
785            $parser_29, $parser_30, $parser_31, $parser_32, $parser_33, $parser_34, $parser_35,
786            $parser_36, $parser_37, $parser_38, $parser_39, $parser_40, $parser_41, $parser_42,
787        )
788    };
789    ($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 $(,)?) => {
790        $crate::parser::util::seq44(
791            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
792            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
793            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
794            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
795            $parser_29, $parser_30, $parser_31, $parser_32, $parser_33, $parser_34, $parser_35,
796            $parser_36, $parser_37, $parser_38, $parser_39, $parser_40, $parser_41, $parser_42,
797            $parser_43,
798        )
799    };
800    ($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 $(,)?) => {
801        $crate::parser::util::seq45(
802            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
803            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
804            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
805            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
806            $parser_29, $parser_30, $parser_31, $parser_32, $parser_33, $parser_34, $parser_35,
807            $parser_36, $parser_37, $parser_38, $parser_39, $parser_40, $parser_41, $parser_42,
808            $parser_43, $parser_44,
809        )
810    };
811    ($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 $(,)?) => {
812        $crate::parser::util::seq46(
813            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
814            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
815            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
816            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
817            $parser_29, $parser_30, $parser_31, $parser_32, $parser_33, $parser_34, $parser_35,
818            $parser_36, $parser_37, $parser_38, $parser_39, $parser_40, $parser_41, $parser_42,
819            $parser_43, $parser_44, $parser_45,
820        )
821    };
822    ($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 $(,)?) => {
823        $crate::parser::util::seq47(
824            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
825            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
826            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
827            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
828            $parser_29, $parser_30, $parser_31, $parser_32, $parser_33, $parser_34, $parser_35,
829            $parser_36, $parser_37, $parser_38, $parser_39, $parser_40, $parser_41, $parser_42,
830            $parser_43, $parser_44, $parser_45, $parser_46,
831        )
832    };
833    ($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 $(,)?) => {
834        $crate::parser::util::seq48(
835            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
836            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
837            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
838            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
839            $parser_29, $parser_30, $parser_31, $parser_32, $parser_33, $parser_34, $parser_35,
840            $parser_36, $parser_37, $parser_38, $parser_39, $parser_40, $parser_41, $parser_42,
841            $parser_43, $parser_44, $parser_45, $parser_46, $parser_47,
842        )
843    };
844    ($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 $(,)?) => {
845        $crate::parser::util::seq49(
846            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
847            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
848            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
849            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
850            $parser_29, $parser_30, $parser_31, $parser_32, $parser_33, $parser_34, $parser_35,
851            $parser_36, $parser_37, $parser_38, $parser_39, $parser_40, $parser_41, $parser_42,
852            $parser_43, $parser_44, $parser_45, $parser_46, $parser_47, $parser_48,
853        )
854    };
855    ($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 $(,)?) => {
856        $crate::parser::util::seq50(
857            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
858            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
859            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
860            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
861            $parser_29, $parser_30, $parser_31, $parser_32, $parser_33, $parser_34, $parser_35,
862            $parser_36, $parser_37, $parser_38, $parser_39, $parser_40, $parser_41, $parser_42,
863            $parser_43, $parser_44, $parser_45, $parser_46, $parser_47, $parser_48, $parser_49,
864        )
865    };
866    ($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 $(,)?) => {
867        $crate::parser::util::seq51(
868            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
869            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
870            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
871            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
872            $parser_29, $parser_30, $parser_31, $parser_32, $parser_33, $parser_34, $parser_35,
873            $parser_36, $parser_37, $parser_38, $parser_39, $parser_40, $parser_41, $parser_42,
874            $parser_43, $parser_44, $parser_45, $parser_46, $parser_47, $parser_48, $parser_49,
875            $parser_50,
876        )
877    };
878    ($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 $(,)?) => {
879        $crate::parser::util::seq52(
880            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
881            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
882            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
883            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
884            $parser_29, $parser_30, $parser_31, $parser_32, $parser_33, $parser_34, $parser_35,
885            $parser_36, $parser_37, $parser_38, $parser_39, $parser_40, $parser_41, $parser_42,
886            $parser_43, $parser_44, $parser_45, $parser_46, $parser_47, $parser_48, $parser_49,
887            $parser_50, $parser_51,
888        )
889    };
890    ($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 $(,)?) => {
891        $crate::parser::util::seq53(
892            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
893            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
894            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
895            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
896            $parser_29, $parser_30, $parser_31, $parser_32, $parser_33, $parser_34, $parser_35,
897            $parser_36, $parser_37, $parser_38, $parser_39, $parser_40, $parser_41, $parser_42,
898            $parser_43, $parser_44, $parser_45, $parser_46, $parser_47, $parser_48, $parser_49,
899            $parser_50, $parser_51, $parser_52,
900        )
901    };
902    ($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 $(,)?) => {
903        $crate::parser::util::seq54(
904            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
905            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
906            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
907            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
908            $parser_29, $parser_30, $parser_31, $parser_32, $parser_33, $parser_34, $parser_35,
909            $parser_36, $parser_37, $parser_38, $parser_39, $parser_40, $parser_41, $parser_42,
910            $parser_43, $parser_44, $parser_45, $parser_46, $parser_47, $parser_48, $parser_49,
911            $parser_50, $parser_51, $parser_52, $parser_53,
912        )
913    };
914    ($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 $(,)?) => {
915        $crate::parser::util::seq55(
916            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
917            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
918            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
919            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
920            $parser_29, $parser_30, $parser_31, $parser_32, $parser_33, $parser_34, $parser_35,
921            $parser_36, $parser_37, $parser_38, $parser_39, $parser_40, $parser_41, $parser_42,
922            $parser_43, $parser_44, $parser_45, $parser_46, $parser_47, $parser_48, $parser_49,
923            $parser_50, $parser_51, $parser_52, $parser_53, $parser_54,
924        )
925    };
926    ($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 $(,)?) => {
927        $crate::parser::util::seq56(
928            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
929            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
930            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
931            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
932            $parser_29, $parser_30, $parser_31, $parser_32, $parser_33, $parser_34, $parser_35,
933            $parser_36, $parser_37, $parser_38, $parser_39, $parser_40, $parser_41, $parser_42,
934            $parser_43, $parser_44, $parser_45, $parser_46, $parser_47, $parser_48, $parser_49,
935            $parser_50, $parser_51, $parser_52, $parser_53, $parser_54, $parser_55,
936        )
937    };
938    ($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 $(,)?) => {
939        $crate::parser::util::seq57(
940            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
941            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
942            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
943            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
944            $parser_29, $parser_30, $parser_31, $parser_32, $parser_33, $parser_34, $parser_35,
945            $parser_36, $parser_37, $parser_38, $parser_39, $parser_40, $parser_41, $parser_42,
946            $parser_43, $parser_44, $parser_45, $parser_46, $parser_47, $parser_48, $parser_49,
947            $parser_50, $parser_51, $parser_52, $parser_53, $parser_54, $parser_55, $parser_56,
948        )
949    };
950    ($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 $(,)?) => {
951        $crate::parser::util::seq58(
952            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
953            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
954            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
955            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
956            $parser_29, $parser_30, $parser_31, $parser_32, $parser_33, $parser_34, $parser_35,
957            $parser_36, $parser_37, $parser_38, $parser_39, $parser_40, $parser_41, $parser_42,
958            $parser_43, $parser_44, $parser_45, $parser_46, $parser_47, $parser_48, $parser_49,
959            $parser_50, $parser_51, $parser_52, $parser_53, $parser_54, $parser_55, $parser_56,
960            $parser_57,
961        )
962    };
963    ($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 $(,)?) => {
964        $crate::parser::util::seq59(
965            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
966            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
967            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
968            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
969            $parser_29, $parser_30, $parser_31, $parser_32, $parser_33, $parser_34, $parser_35,
970            $parser_36, $parser_37, $parser_38, $parser_39, $parser_40, $parser_41, $parser_42,
971            $parser_43, $parser_44, $parser_45, $parser_46, $parser_47, $parser_48, $parser_49,
972            $parser_50, $parser_51, $parser_52, $parser_53, $parser_54, $parser_55, $parser_56,
973            $parser_57, $parser_58,
974        )
975    };
976    ($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 $(,)?) => {
977        $crate::parser::util::seq60(
978            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
979            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
980            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
981            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
982            $parser_29, $parser_30, $parser_31, $parser_32, $parser_33, $parser_34, $parser_35,
983            $parser_36, $parser_37, $parser_38, $parser_39, $parser_40, $parser_41, $parser_42,
984            $parser_43, $parser_44, $parser_45, $parser_46, $parser_47, $parser_48, $parser_49,
985            $parser_50, $parser_51, $parser_52, $parser_53, $parser_54, $parser_55, $parser_56,
986            $parser_57, $parser_58, $parser_59,
987        )
988    };
989    ($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 $(,)?) => {
990        $crate::parser::util::seq61(
991            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
992            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
993            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
994            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
995            $parser_29, $parser_30, $parser_31, $parser_32, $parser_33, $parser_34, $parser_35,
996            $parser_36, $parser_37, $parser_38, $parser_39, $parser_40, $parser_41, $parser_42,
997            $parser_43, $parser_44, $parser_45, $parser_46, $parser_47, $parser_48, $parser_49,
998            $parser_50, $parser_51, $parser_52, $parser_53, $parser_54, $parser_55, $parser_56,
999            $parser_57, $parser_58, $parser_59, $parser_60,
1000        )
1001    };
1002    ($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 $(,)?) => {
1003        $crate::parser::util::seq62(
1004            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
1005            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
1006            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
1007            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
1008            $parser_29, $parser_30, $parser_31, $parser_32, $parser_33, $parser_34, $parser_35,
1009            $parser_36, $parser_37, $parser_38, $parser_39, $parser_40, $parser_41, $parser_42,
1010            $parser_43, $parser_44, $parser_45, $parser_46, $parser_47, $parser_48, $parser_49,
1011            $parser_50, $parser_51, $parser_52, $parser_53, $parser_54, $parser_55, $parser_56,
1012            $parser_57, $parser_58, $parser_59, $parser_60, $parser_61,
1013        )
1014    };
1015    ($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 $(,)?) => {
1016        $crate::parser::util::seq63(
1017            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
1018            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
1019            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
1020            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
1021            $parser_29, $parser_30, $parser_31, $parser_32, $parser_33, $parser_34, $parser_35,
1022            $parser_36, $parser_37, $parser_38, $parser_39, $parser_40, $parser_41, $parser_42,
1023            $parser_43, $parser_44, $parser_45, $parser_46, $parser_47, $parser_48, $parser_49,
1024            $parser_50, $parser_51, $parser_52, $parser_53, $parser_54, $parser_55, $parser_56,
1025            $parser_57, $parser_58, $parser_59, $parser_60, $parser_61, $parser_62,
1026        )
1027    };
1028    ($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 $(,)?) => {
1029        $crate::parser::util::seq64(
1030            $parser_0, $parser_1, $parser_2, $parser_3, $parser_4, $parser_5, $parser_6, $parser_7,
1031            $parser_8, $parser_9, $parser_10, $parser_11, $parser_12, $parser_13, $parser_14,
1032            $parser_15, $parser_16, $parser_17, $parser_18, $parser_19, $parser_20, $parser_21,
1033            $parser_22, $parser_23, $parser_24, $parser_25, $parser_26, $parser_27, $parser_28,
1034            $parser_29, $parser_30, $parser_31, $parser_32, $parser_33, $parser_34, $parser_35,
1035            $parser_36, $parser_37, $parser_38, $parser_39, $parser_40, $parser_41, $parser_42,
1036            $parser_43, $parser_44, $parser_45, $parser_46, $parser_47, $parser_48, $parser_49,
1037            $parser_50, $parser_51, $parser_52, $parser_53, $parser_54, $parser_55, $parser_56,
1038            $parser_57, $parser_58, $parser_59, $parser_60, $parser_61, $parser_62, $parser_63,
1039        )
1040    };
1041    ($($parser:expr),+ $(,)?) => {
1042        compile_error!("seq_n! currently supports up to 64 parsers");
1043    };
1044}
1045
1046/// Sequence two parsers, keeping only the second result.
1047pub fn skip_first<A, B, PA, PB>(
1048    parser_a: PA,
1049    parser_b: PB,
1050) -> impl Fn(&mut PtxTokenStream) -> Result<(B, Span), PtxParseError>
1051where
1052    PA: Fn(&mut PtxTokenStream) -> Result<(A, Span), PtxParseError>,
1053    PB: Fn(&mut PtxTokenStream) -> Result<(B, Span), PtxParseError>,
1054{
1055    move |stream| {
1056        stream.try_with_span(|stream| {
1057            let _ = parser_a(stream)?;
1058            let (b, _) = parser_b(stream)?;
1059            Ok(b)
1060        })
1061    }
1062}
1063
1064/// Sequence a parser and consume a trailing semicolon.
1065pub fn skip_semicolon<T, P>(
1066    parser: P,
1067) -> impl Fn(&mut PtxTokenStream) -> Result<(T, Span), PtxParseError>
1068where
1069    P: Fn(&mut PtxTokenStream) -> Result<(T, Span), PtxParseError>,
1070{
1071    move |stream| {
1072        let (value, span) = parser(stream)?;
1073        let _ = semicolon_p()(stream)?;
1074        Ok((value, span))
1075    }
1076}
1077
1078/// Sequence two parsers, keeping only the second result.
1079#[allow(dead_code)]
1080pub fn skip_second<A, B, PA, PB>(
1081    parser_a: PA,
1082    parser_b: PB,
1083) -> impl Fn(&mut PtxTokenStream) -> Result<(A, Span), PtxParseError>
1084where
1085    PA: Fn(&mut PtxTokenStream) -> Result<(A, Span), PtxParseError>,
1086    PB: Fn(&mut PtxTokenStream) -> Result<(B, Span), PtxParseError>,
1087{
1088    move |stream| {
1089        stream.try_with_span(|stream| {
1090            let (a, _) = parser_a(stream)?;
1091            let (_, _) = parser_b(stream)?;
1092            Ok(a)
1093        })
1094    }
1095}
1096
1097/* -------------------------------------------------- */
1098/* ----------------- Mapping Combinators ------------ */
1099/* -------------------------------------------------- */
1100
1101/// Pure (return) - creates a parser that succeeds without consuming input.
1102///
1103/// This is the monadic return/pure operation.
1104#[allow(dead_code)]
1105pub fn pure<T>(value: T) -> impl Fn(&mut PtxTokenStream) -> Result<(T, Span), PtxParseError>
1106where
1107    T: Clone + 'static,
1108{
1109    move |stream| stream.try_with_span(|_| Ok(value.clone()))
1110}
1111
1112/// Dispatch combinator - parse a value, then choose a parser based on the result.
1113///
1114/// This combinator first runs `parser` to extract a value and span, then calls the
1115/// dispatch function `f` with that (value, span) tuple to determine which parser to run next.
1116///
1117/// This is useful for parsers that need to peek at a token (like a directive or identifier)
1118/// and then dispatch to different parsers based on the value.
1119///
1120/// Example:
1121/// ```ignore
1122/// dispatch(
1123///     directive_p(),
1124///     |(dir, span)| match dir.as_str() {
1125///         "visible" => Box::new(pure(CodeLinkage::Visible { span })),
1126///         "extern" => Box::new(pure(CodeLinkage::Extern { span })),
1127///         _ => Box::new(|_| Err(error))
1128///     }
1129/// )
1130/// ```
1131#[allow(dead_code)]
1132pub fn dispatch<A, B, P, F, Next>(
1133    parser: P,
1134    f: F,
1135) -> impl Fn(&mut PtxTokenStream) -> Result<(B, Span), PtxParseError>
1136where
1137    P: Fn(&mut PtxTokenStream) -> Result<(A, Span), PtxParseError>,
1138    F: Fn(A, Span) -> Next,
1139    Next: Fn(&mut PtxTokenStream) -> Result<(B, Span), PtxParseError>,
1140{
1141    move |stream| {
1142        stream.try_with_span(|stream| {
1143            let (value, span) = parser(stream)?;
1144            let next_parser = f(value, span);
1145            let (result, _) = next_parser(stream)?;
1146            Ok(result)
1147        })
1148    }
1149}
1150
1151/// Map over a parser result and assign the span to the mapped value.
1152pub fn map<A, B, P, F>(
1153    parser: P,
1154    f: F,
1155) -> impl Fn(&mut PtxTokenStream) -> Result<(B, Span), PtxParseError>
1156where
1157    P: Fn(&mut PtxTokenStream) -> Result<(A, Span), PtxParseError>,
1158    F: Fn(A, Span) -> B,
1159{
1160    move |stream| {
1161        let (value, span) = parser(stream)?;
1162        Ok((f(value, span), span))
1163    }
1164}
1165
1166/// Map over a parser result with a fallible transformation while assigning spans.
1167pub fn try_map<A, B, P, F>(
1168    parser: P,
1169    f: F,
1170) -> impl Fn(&mut PtxTokenStream) -> Result<(B, Span), PtxParseError>
1171where
1172    P: Fn(&mut PtxTokenStream) -> Result<(A, Span), PtxParseError>,
1173    F: Fn(A, Span) -> Result<B, PtxParseError>,
1174{
1175    move |stream| {
1176        stream.try_with_span(|stream| {
1177            let (value, span) = parser(stream)?;
1178            match f(value, span) {
1179                Ok(node) => Ok(node),
1180                Err(mut err) => {
1181                    err.span = span;
1182                    Err(err)
1183                }
1184            }
1185        })
1186    }
1187}
1188
1189/* -------------------------------------------------- */
1190/* ------------------- Choice Combinators ----------- */
1191/* -------------------------------------------------- */
1192
1193/// Chain together multiple alternative parsers using the binary `alt` combinator.
1194#[macro_export]
1195macro_rules! alt {
1196    () => {
1197        compile_error!("alt! requires at least one parser")
1198    };
1199    ($parser:expr $(,)?) => {
1200        $parser
1201    };
1202    ($parser_a:expr, $parser_b:expr $(,)?) => {
1203        $crate::parser::util::alt($parser_a, $parser_b)
1204    };
1205    ($parser_a:expr, $parser_b:expr, $($rest:expr),+ $(,)?) => {
1206        $crate::parser::util::alt($parser_a, $crate::alt!($parser_b, $($rest),+))
1207    };
1208}
1209
1210/// Alternative combinator - try first parser, if it fails try second.
1211///
1212/// This is the fundamental choice combinator for building parsers with alternatives.
1213/// Uses backtracking - the stream is rewound if the first parser fails.
1214///
1215/// Example:
1216/// ```ignore
1217/// let parser = alt(
1218///     string_value_p(".s16".to_string(), Type::S16),
1219///     string_value_p(".s32".to_string(), Type::S32)
1220/// );
1221/// ```
1222pub fn alt<T, P1, P2>(
1223    parser1: P1,
1224    parser2: P2,
1225) -> impl Fn(&mut PtxTokenStream) -> Result<(T, Span), PtxParseError>
1226where
1227    P1: Fn(&mut PtxTokenStream) -> Result<(T, Span), PtxParseError>,
1228    P2: Fn(&mut PtxTokenStream) -> Result<(T, Span), PtxParseError>,
1229{
1230    move |stream| match stream.try_with_span(|stream| parser1(stream)) {
1231        Ok((result, _)) => Ok(result),
1232        Err(_) => parser2(stream),
1233    }
1234}
1235
1236/// Choice combinator for multiple alternatives.
1237///
1238/// Tries each parser in order until one succeeds. Uses backtracking.
1239#[allow(dead_code)]
1240pub fn choice<T>(
1241    parsers: Vec<impl Fn(&mut PtxTokenStream) -> Result<(T, Span), PtxParseError>>,
1242) -> impl Fn(&mut PtxTokenStream) -> Result<(T, Span), PtxParseError> {
1243    move |stream| {
1244        let mut last_error = None;
1245        for parser in &parsers {
1246            match stream.try_with_span(|stream| parser(stream)) {
1247                Ok((result, _)) => return Ok(result),
1248                Err(err) => {
1249                    last_error = Some(err);
1250                }
1251            }
1252        }
1253
1254        Err(last_error.unwrap_or_else(|| PtxParseError {
1255            kind: ParseErrorKind::UnexpectedEof,
1256            span: span!(0..0),
1257        }))
1258    }
1259}
1260
1261/// Attempt combinator - run parser and rewind on failure.
1262#[allow(dead_code)]
1263pub fn attempt<T, P>(parser: P) -> impl Fn(&mut PtxTokenStream) -> Result<(T, Span), PtxParseError>
1264where
1265    P: Fn(&mut PtxTokenStream) -> Result<(T, Span), PtxParseError>,
1266{
1267    move |stream| match stream.try_with_span(|stream| parser(stream)) {
1268        Ok((result, _)) => Ok(result),
1269        Err(err) => Err(err),
1270    }
1271}
1272
1273/// Optional parser - try to parse, return None if it fails.
1274pub fn optional<T, P>(
1275    parser: P,
1276) -> impl Fn(&mut PtxTokenStream) -> Result<(Option<T>, Span), PtxParseError>
1277where
1278    P: Fn(&mut PtxTokenStream) -> Result<(T, Span), PtxParseError>,
1279{
1280    move |stream| match stream.try_with_span(|stream| parser(stream)) {
1281        Ok(((value, _), span)) => Ok((Some(value), span)),
1282        Err(_) => Ok((None, stream.current_span())),
1283    }
1284}
1285
1286/* -------------------------------------------------- */
1287/* -------------------- List Combinators ------------ */
1288/* -------------------------------------------------- */
1289
1290/// Parse zero or more occurrences (greedy).
1291///
1292/// Always succeeds, returning an empty vector if no matches.
1293pub fn many<T, P>(
1294    parser: P,
1295) -> impl Fn(&mut PtxTokenStream) -> Result<(Vec<T>, Span), PtxParseError>
1296where
1297    P: Fn(&mut PtxTokenStream) -> Result<(T, Span), PtxParseError>,
1298{
1299    move |stream| {
1300        stream.try_with_span(|stream| {
1301            let mut values = Vec::new();
1302
1303            loop {
1304                match stream.try_with_span(|stream| parser(stream)) {
1305                    Ok(((value, _), _)) => values.push(value),
1306                    Err(_) => break,
1307                }
1308            }
1309
1310            Ok(values)
1311        })
1312    }
1313}
1314
1315/// Parse one or more occurrences (greedy).
1316///
1317/// Pattern: T+
1318#[allow(dead_code)]
1319pub fn many1<T, P>(
1320    parser: P,
1321) -> impl Fn(&mut PtxTokenStream) -> Result<(Vec<T>, Span), PtxParseError>
1322where
1323    P: Fn(&mut PtxTokenStream) -> Result<(T, Span), PtxParseError>,
1324{
1325    move |stream| {
1326        stream.try_with_span(|stream| {
1327            let (first, _) = parser(stream)?;
1328            let mut values = vec![first];
1329
1330            loop {
1331                match stream.try_with_span(|stream| parser(stream)) {
1332                    Ok(((value, _), _)) => values.push(value),
1333                    Err(_) => break,
1334                }
1335            }
1336
1337            Ok(values)
1338        })
1339    }
1340}
1341
1342/* -------------------------------------------------- */
1343/* ------------- Separated List Combinators --------- */
1344/* -------------------------------------------------- */
1345
1346/// Parse separator-separated list allowing trailing separator.
1347/// Returns empty vector on zero matches.
1348pub fn sep_by<T, S, P, PS>(
1349    parser: P,
1350    separator: PS,
1351) -> impl Fn(&mut PtxTokenStream) -> Result<(Vec<T>, Span), PtxParseError>
1352where
1353    P: Fn(&mut PtxTokenStream) -> Result<(T, Span), PtxParseError>,
1354    PS: Fn(&mut PtxTokenStream) -> Result<(S, Span), PtxParseError>,
1355{
1356    move |stream| {
1357        stream.try_with_span(|stream| {
1358            let mut values = Vec::new();
1359
1360            match stream.try_with_span(|stream| parser(stream)) {
1361                Ok(((value, _), _)) => values.push(value),
1362                Err(_) => return Ok(values),
1363            }
1364
1365            loop {
1366                match stream.try_with_span(|stream| separator(stream)) {
1367                    Ok((_, _)) => match stream.try_with_span(|stream| parser(stream)) {
1368                        Ok(((value, _), _)) => values.push(value),
1369                        Err(_) => break,
1370                    },
1371                    Err(_) => break,
1372                }
1373            }
1374
1375            Ok(values)
1376        })
1377    }
1378}
1379
1380/// Parse separator-separated list requiring at least one element.
1381pub fn sep_by1<T, S, P, PS>(
1382    parser: P,
1383    separator: PS,
1384) -> impl Fn(&mut PtxTokenStream) -> Result<(Vec<T>, Span), PtxParseError>
1385where
1386    P: Fn(&mut PtxTokenStream) -> Result<(T, Span), PtxParseError>,
1387    PS: Fn(&mut PtxTokenStream) -> Result<(S, Span), PtxParseError>,
1388{
1389    move |stream| {
1390        stream.try_with_span(|stream| {
1391            let (first, _) = parser(stream)?;
1392            let mut values = vec![first];
1393
1394            loop {
1395                let mut separator_failed = false;
1396                match stream.try_with_span(|stream| {
1397                    separator(stream).map_err(|err| {
1398                        separator_failed = true;
1399                        err
1400                    })?;
1401                    parser(stream)
1402                }) {
1403                    Ok(((value, _), _)) => values.push(value),
1404                    Err(err) => {
1405                        if separator_failed {
1406                            break;
1407                        } else {
1408                            return Err(err);
1409                        }
1410                    }
1411                }
1412            }
1413
1414            Ok(values)
1415        })
1416    }
1417}
1418
1419/* -------------------------------------------------- */
1420/* -------------------- Look Ahead ------------------ */
1421/* -------------------------------------------------- */
1422
1423/// Peek - runs a parser without consuming input.
1424///
1425/// Saves the stream position, runs the parser, then restores the position.
1426#[allow(dead_code)]
1427pub fn peek<T, P>(parser: P) -> impl Fn(&mut PtxTokenStream) -> Result<(T, Span), PtxParseError>
1428where
1429    P: Fn(&mut PtxTokenStream) -> Result<(T, Span), PtxParseError>,
1430{
1431    move |stream| {
1432        let saved_pos = stream.position();
1433        let result = parser(stream);
1434        stream.set_position(saved_pos);
1435        result
1436    }
1437}
1438
1439/// Combinator that checks if a predicate matches without consuming.
1440#[allow(dead_code)]
1441pub fn check<F>(predicate: F) -> impl Fn(&mut PtxTokenStream) -> Result<bool, PtxParseError>
1442where
1443    F: Fn(&PtxToken) -> bool,
1444{
1445    move |stream| {
1446        Ok(stream
1447            .peek()
1448            .map(|(token, _)| predicate(&token))
1449            .unwrap_or(false))
1450    }
1451}
1452
1453/// Combinator that peeks at the next directive (Dot + Identifier pattern).
1454/// Returns Some((directive_name, span)) if a directive is found, None otherwise.
1455#[allow(dead_code)]
1456pub fn peek_directive() -> impl Fn(&mut PtxTokenStream) -> Result<Option<String>, PtxParseError> {
1457    |stream| {
1458        let directive = match (stream.peek(), stream.peek_n(1)) {
1459            (Ok((PtxToken::Dot, _dot_span)), Ok((PtxToken::Identifier(name), _id_span))) => {
1460                Some(name.clone())
1461            }
1462            _ => None,
1463        };
1464        Ok(directive)
1465    }
1466}
1467
1468/* -------------------------------------------------- */
1469/* -------------------- Utility Helpers ------------- */
1470/* -------------------------------------------------- */
1471
1472/// Combinator that parses a token satisfying a predicate.
1473/// Returns the token and its span.
1474#[allow(dead_code)]
1475pub fn satisfy<F>(
1476    predicate: F,
1477    expected_msg: &'static str,
1478) -> impl Fn(&mut PtxTokenStream) -> Result<((PtxToken, Span), Span), PtxParseError>
1479where
1480    F: Fn(&PtxToken) -> bool + Clone + 'static,
1481{
1482    move |stream| {
1483        let eof_span = stream.current_span();
1484        stream.try_with_span(|stream| {
1485            let (token, span) = stream.peek().map_err(|_| PtxParseError {
1486                kind: ParseErrorKind::UnexpectedEof,
1487                span: eof_span,
1488            })?;
1489
1490            if predicate(&token) {
1491                stream.consume()?;
1492                Ok((token.clone(), *span))
1493            } else {
1494                Err(crate::unexpected_token!(
1495                    *span,
1496                    &[expected_msg.to_string()],
1497                    format!("{:?}", token)
1498                ))
1499            }
1500        })
1501    }
1502}
1503
1504/// Parse elements enclosed by delimiters.
1505///
1506/// Example: between(lparen_p(), rparen_p(), identifier_p())
1507pub fn between<O, C, T, PO, PC, PT>(
1508    open: PO,
1509    close: PC,
1510    parser: PT,
1511) -> impl Fn(&mut PtxTokenStream) -> Result<(T, Span), PtxParseError>
1512where
1513    PO: Fn(&mut PtxTokenStream) -> Result<(O, Span), PtxParseError>,
1514    PC: Fn(&mut PtxTokenStream) -> Result<(C, Span), PtxParseError>,
1515    PT: Fn(&mut PtxTokenStream) -> Result<(T, Span), PtxParseError>,
1516{
1517    move |stream| {
1518        stream.try_with_span(|stream| {
1519            let _ = open(stream)?;
1520            let (result, _) = parser(stream)?;
1521            let _ = close(stream)?;
1522            Ok(result)
1523        })
1524    }
1525}