[
  {
    "path": ".github/workflows/ci.yml",
    "content": "on: \n  push:\n  pull_request:\n  schedule: [cron: \"40 6 10 1/2 *\"]\n\nname: Tests\n\njobs:\n  test:\n    name: test\n    runs-on: ubuntu-latest\n    strategy:\n      matrix:\n        rust:\n          - stable\n          - nightly\n          - 1.4.0\n    steps:\n      - uses: actions/checkout@v3\n      - uses: actions-rs/toolchain@v1\n        with:\n          profile: minimal\n          toolchain: ${{ matrix.rust }}\n          override: true\n      - uses: actions-rs/cargo@v1\n        with:\n          command: test\n\n"
  },
  {
    "path": ".gitignore",
    "content": "/Cargo.lock\n/target/\n**/*.rs.bk\n"
  },
  {
    "path": "Cargo.toml",
    "content": "[package]\nname = \"lang-c\"\nversion = \"0.15.1\"\nauthors = [\"Vickenty Fesunov <kent@setattr.net>\"]\nlicense = \"MIT/Apache-2.0\"\ndescription = \"Lightweight C parser\"\ninclude = [ \"/src/**/*.rs\", \"Cargo.toml\", \"/LICENSE*\", \"/README.md\" ]\ndocumentation = \"https://docs.rs/lang-c\"\nhomepage = \"https://github.com/vickenty/lang-c\"\nrepository = \"https://github.com/vickenty/lang-c\"\nkeywords = [ \"ast\", \"c\", \"parser\", \"c-language\" ]\ncategories = [ \"parser-implementations\" ]\n\n[features]\ndev-pegviz = [] # tests only: emit extra output for pegviz\n"
  },
  {
    "path": "LICENSE-APACHE",
    "content": "                              Apache License\n                        Version 2.0, January 2004\n                     http://www.apache.org/licenses/\n\nTERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n1. Definitions.\n\n   \"License\" shall mean the terms and conditions for use, reproduction,\n   and distribution as defined by Sections 1 through 9 of this document.\n\n   \"Licensor\" shall mean the copyright owner or entity authorized by\n   the copyright owner that is granting the License.\n\n   \"Legal Entity\" shall mean the union of the acting entity and all\n   other entities that control, are controlled by, or are under common\n   control with that entity. For the purposes of this definition,\n   \"control\" means (i) the power, direct or indirect, to cause the\n   direction or management of such entity, whether by contract or\n   otherwise, or (ii) ownership of fifty percent (50%) or more of the\n   outstanding shares, or (iii) beneficial ownership of such entity.\n\n   \"You\" (or \"Your\") shall mean an individual or Legal Entity\n   exercising permissions granted by this License.\n\n   \"Source\" form shall mean the preferred form for making modifications,\n   including but not limited to software source code, documentation\n   source, and configuration files.\n\n   \"Object\" form shall mean any form resulting from mechanical\n   transformation or translation of a Source form, including but\n   not limited to compiled object code, generated documentation,\n   and conversions to other media types.\n\n   \"Work\" shall mean the work of authorship, whether in Source or\n   Object form, made available under the License, as indicated by a\n   copyright notice that is included in or attached to the work\n   (an example is provided in the Appendix below).\n\n   \"Derivative Works\" shall mean any work, whether in Source or Object\n   form, that is based on (or derived from) the Work and for which the\n   editorial revisions, annotations, elaborations, or other modifications\n   represent, as a whole, an original work of authorship. For the purposes\n   of this License, Derivative Works shall not include works that remain\n   separable from, or merely link (or bind by name) to the interfaces of,\n   the Work and Derivative Works thereof.\n\n   \"Contribution\" shall mean any work of authorship, including\n   the original version of the Work and any modifications or additions\n   to that Work or Derivative Works thereof, that is intentionally\n   submitted to Licensor for inclusion in the Work by the copyright owner\n   or by an individual or Legal Entity authorized to submit on behalf of\n   the copyright owner. For the purposes of this definition, \"submitted\"\n   means any form of electronic, verbal, or written communication sent\n   to the Licensor or its representatives, including but not limited to\n   communication on electronic mailing lists, source code control systems,\n   and issue tracking systems that are managed by, or on behalf of, the\n   Licensor for the purpose of discussing and improving the Work, but\n   excluding communication that is conspicuously marked or otherwise\n   designated in writing by the copyright owner as \"Not a Contribution.\"\n\n   \"Contributor\" shall mean Licensor and any individual or Legal Entity\n   on behalf of whom a Contribution has been received by Licensor and\n   subsequently incorporated within the Work.\n\n2. Grant of Copyright License. Subject to the terms and conditions of\n   this License, each Contributor hereby grants to You a perpetual,\n   worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n   copyright license to reproduce, prepare Derivative Works of,\n   publicly display, publicly perform, sublicense, and distribute the\n   Work and such Derivative Works in Source or Object form.\n\n3. Grant of Patent License. Subject to the terms and conditions of\n   this License, each Contributor hereby grants to You a perpetual,\n   worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n   (except as stated in this section) patent license to make, have made,\n   use, offer to sell, sell, import, and otherwise transfer the Work,\n   where such license applies only to those patent claims licensable\n   by such Contributor that are necessarily infringed by their\n   Contribution(s) alone or by combination of their Contribution(s)\n   with the Work to which such Contribution(s) was submitted. If You\n   institute patent litigation against any entity (including a\n   cross-claim or counterclaim in a lawsuit) alleging that the Work\n   or a Contribution incorporated within the Work constitutes direct\n   or contributory patent infringement, then any patent licenses\n   granted to You under this License for that Work shall terminate\n   as of the date such litigation is filed.\n\n4. Redistribution. You may reproduce and distribute copies of the\n   Work or Derivative Works thereof in any medium, with or without\n   modifications, and in Source or Object form, provided that You\n   meet the following conditions:\n\n   (a) You must give any other recipients of the Work or\n       Derivative Works a copy of this License; and\n\n   (b) You must cause any modified files to carry prominent notices\n       stating that You changed the files; and\n\n   (c) You must retain, in the Source form of any Derivative Works\n       that You distribute, all copyright, patent, trademark, and\n       attribution notices from the Source form of the Work,\n       excluding those notices that do not pertain to any part of\n       the Derivative Works; and\n\n   (d) If the Work includes a \"NOTICE\" text file as part of its\n       distribution, then any Derivative Works that You distribute must\n       include a readable copy of the attribution notices contained\n       within such NOTICE file, excluding those notices that do not\n       pertain to any part of the Derivative Works, in at least one\n       of the following places: within a NOTICE text file distributed\n       as part of the Derivative Works; within the Source form or\n       documentation, if provided along with the Derivative Works; or,\n       within a display generated by the Derivative Works, if and\n       wherever such third-party notices normally appear. The contents\n       of the NOTICE file are for informational purposes only and\n       do not modify the License. You may add Your own attribution\n       notices within Derivative Works that You distribute, alongside\n       or as an addendum to the NOTICE text from the Work, provided\n       that such additional attribution notices cannot be construed\n       as modifying the License.\n\n   You may add Your own copyright statement to Your modifications and\n   may provide additional or different license terms and conditions\n   for use, reproduction, or distribution of Your modifications, or\n   for any such Derivative Works as a whole, provided Your use,\n   reproduction, and distribution of the Work otherwise complies with\n   the conditions stated in this License.\n\n5. Submission of Contributions. Unless You explicitly state otherwise,\n   any Contribution intentionally submitted for inclusion in the Work\n   by You to the Licensor shall be under the terms and conditions of\n   this License, without any additional terms or conditions.\n   Notwithstanding the above, nothing herein shall supersede or modify\n   the terms of any separate license agreement you may have executed\n   with Licensor regarding such Contributions.\n\n6. Trademarks. This License does not grant permission to use the trade\n   names, trademarks, service marks, or product names of the Licensor,\n   except as required for reasonable and customary use in describing the\n   origin of the Work and reproducing the content of the NOTICE file.\n\n7. Disclaimer of Warranty. Unless required by applicable law or\n   agreed to in writing, Licensor provides the Work (and each\n   Contributor provides its Contributions) on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n   implied, including, without limitation, any warranties or conditions\n   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n   PARTICULAR PURPOSE. You are solely responsible for determining the\n   appropriateness of using or redistributing the Work and assume any\n   risks associated with Your exercise of permissions under this License.\n\n8. Limitation of Liability. In no event and under no legal theory,\n   whether in tort (including negligence), contract, or otherwise,\n   unless required by applicable law (such as deliberate and grossly\n   negligent acts) or agreed to in writing, shall any Contributor be\n   liable to You for damages, including any direct, indirect, special,\n   incidental, or consequential damages of any character arising as a\n   result of this License or out of the use or inability to use the\n   Work (including but not limited to damages for loss of goodwill,\n   work stoppage, computer failure or malfunction, or any and all\n   other commercial damages or losses), even if such Contributor\n   has been advised of the possibility of such damages.\n\n9. Accepting Warranty or Additional Liability. While redistributing\n   the Work or Derivative Works thereof, You may choose to offer,\n   and charge a fee for, acceptance of support, warranty, indemnity,\n   or other liability obligations and/or rights consistent with this\n   License. However, in accepting such obligations, You may act only\n   on Your own behalf and on Your sole responsibility, not on behalf\n   of any other Contributor, and only if You agree to indemnify,\n   defend, and hold each Contributor harmless for any liability\n   incurred by, or claims asserted against, such Contributor by reason\n   of your accepting any such warranty or additional liability.\n\nEND OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\n   To apply the Apache License to your work, attach the following\n   boilerplate notice, with the fields enclosed by brackets \"[]\"\n   replaced with your own identifying information. (Don't include\n   the brackets!)  The text should be enclosed in the appropriate\n   comment syntax for the file format. We also recommend that a\n   file or class name and description of purpose be included on the\n   same \"printed page\" as the copyright notice for easier\n   identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n\thttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n"
  },
  {
    "path": "LICENSE-MIT",
    "content": "Permission is hereby granted, free of charge, to any\nperson obtaining a copy of this software and associated\ndocumentation files (the \"Software\"), to deal in the\nSoftware without restriction, including without\nlimitation the rights to use, copy, modify, merge,\npublish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software\nis furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice\nshall be included in all copies or substantial portions\nof the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF\nANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED\nTO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\nPARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT\nSHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR\nIN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\nDEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "Makefile",
    "content": ".PHONY: all lib\n\npeg?=rust-peg\n\nall: src/parser.rs\n\tcargo b --lib --features '$(features)'\n\tcargo t --features '$(features)'\n\ntrace:\n\trm -f src/parser.rs\n\tmake peg=rust-peg-trace features=dev-pegviz\n\n.INTERMEDIATE: src/parser.rs.raw src/parser.rs.fmt\n\nsrc/parser.rs.raw: grammar.rustpeg grammar.rustfmt grammar.header\n\t$(peg) $< > $@\n\nsrc/parser.rs.fmt: src/parser.rs.raw\n\trustfmt --config-path grammar.rustfmt < $< > $@\n\nsrc/parser.rs: src/parser.rs.fmt\n\tcat grammar.header $< > $@\n\ncheck:\n\ttest src/parser.rs -nt grammar.rustpeg\n"
  },
  {
    "path": "README.md",
    "content": "# Lang-C\n\n[![Documentation](https://docs.rs/lang-c/badge.svg)](https://docs.rs/lang-c)\n\nLigtweight parser of C language for Rust users. Almost full support for C11 revision of the language.\nSeveral GCC and Clang extensions are also supported as an option.\n\n```rust\nextern crate lang_c;\nuse lang_c::driver::{Config, parse}; \n\nfn main() {\n    let config = Config::default();\n    println!(\"{:?}\", parse(&config, \"example.c\"));\n}\n```\n\n# Bugs\n\nJust open an issue, bug reports and patches are most welcome. \n\n## License\n\nDual-licenced under Apache 2.0 or MIT licenses (see `LICENSE-APACHE` and `LICENSE-MIT` for legal terms).\n\n## Development\n\nA number of external tools are used during development:\n\n- GNU make\n- rustfmt\n- [rust-peg](https://github.com/kevinmehall/rust-peg) 0.5.4\n\nParser (`src/parser.rs`) is built from a PEG grammar in `grammar.rustpeg`. It is updated manually and then \ncommitted, not generated on every build, thus no `rust-peg` in the list of dependencies.\n\nFor debugging purposes, it is handy to have a version rust-peg built with tracing enabled.\n\nA makefile is used to script the development process:\n\n- `make` update parser, build the library and run the tests;\n- `make trace` rebuilds parser using `rust-peg-trace`, which is expected to be a version of `rust-peg` command with `trace` feature enabled\n- `make check` can be used as pre-commit git hook to make sure parser is up to date\n"
  },
  {
    "path": "grammar.header",
    "content": "#![cfg_attr(rustfmt, rustfmt_skip)]\n#![allow(unknown_lints)]\n#![allow(ellipsis_inclusive_range_patterns)]\n"
  },
  {
    "path": "grammar.rustfmt",
    "content": "max_width = 10000\ntab_spaces = 4\n"
  },
  {
    "path": "grammar.rustpeg",
    "content": "// Written for peg 0.5.4\n\n#![arguments(env: &mut Env)]\n\nuse ast::*;\nuse astutil::*;\nuse env::{Env, Symbol};\nuse span::{Node, Span};\n\n////\n// Prologue\n////\n\nbox<ex> = e:ex { Box::new(e) }\n\nnode<ex> = l:#position e:ex r:#position { Node::new(e, Span::span(l, r)) }\n\n// Lists of elements.\nlist0<ex> = e:ex ** _ { e }\nlist1<ex> = e:ex ++ _ { e }\ncs0<ex> = e:ex ** (_ \",\" _) { e }\ncs1<ex> = e:ex ++ (_ \",\" _) { e }\n\n// A list containing 0+ before's, 1 single, and 0+ after's.\nlist_010<before, single, after> =\n    before:list0<before> _ single:single _ after:list0<after> {\n        let mut before = before;\n        before.push(single);\n        before.extend(after);\n        before\n    }\n// A list containing *exactly* one element of a, and any of b.\nlist_eq1_n<a, b> = list_010<b, a, b>\n// A list containing *at least* one element of a, and any of b.\nlist_ge1_n<a, b> = list_010<b, a, a / b>\n\n////\n// Whitespace\n////\n\n_ = #quiet<(\"\\r\"? \"\\n\" directive? / [ \\t])*>\n\ndirective = \"#\" [^\\n]*\n\n////\n// 6.4.1 Keywords\n////\n\nK<E> = #quiet<e:E ![_a-zA-Z0-9] { e }>\n\n////\n// 6.4.2 Identifiers\n////\n\n// Identifiers.\nidentifier -> Node<Identifier> = node<identifier0>\n\nidentifier0 -> Identifier =\n    n:$([_a-zA-Z] [_a-zA-Z0-9]*) {?\n        if !env.reserved.contains(n) {\n            Ok(Identifier {\n                name: n.into(),\n            })\n        } else {\n            Err(\"identifier\")\n        }\n    }\n\n////\n// 6.4.3 Universal character names\n////\n\n// TODO\n\n////\n// 6.4.4 Constants\n////\n\nohx = \"0\" [xX]\nobb = \"0\" [bB]\ndec = [0-9]\noct = [0-7]\nhex = [0-9a-fA-F]\nbin = [0-1]\n\npub constant -> Constant =\n    &[0-9.] c:numeric_constant { c } /\n    &['uUL] c:character_constant { Constant::Character(c) }\n\nnumeric_constant -> Constant =\n    c:float_constant { Constant::Float(c) } /\n    c:integer_constant { Constant::Integer(c) }\n\ninteger_constant -> Integer =\n    n:integer_number suffix:integer_suffix {\n        let (base, number) = n;\n        Integer {\n            base: base,\n            number: number.to_owned().into_boxed_str(),\n            suffix: suffix,\n        }\n    }\n\ninteger_number -> (IntegerBase, &'input str) =\n    n:$([1-9] dec*) { (IntegerBase::Decimal, n) } /\n    ohx n:$(hex+) { (IntegerBase::Hexadecimal, n) } /\n    \"0\" n:$(oct+) { (IntegerBase::Octal, n) } /\n    gnu<obb n:$(bin+) { (IntegerBase::Binary, n) }> /\n    n:$(\"0\") { (IntegerBase::Decimal, n) }\n\ninteger_suffix -> IntegerSuffix =\n    #quiet<integer_suffix_inner> / #expected(\"integer suffix\")\n\ninteger_suffix_inner -> IntegerSuffix =\n    s:$(([uUlL] / gnu<[iIjJ]>)*) {? int_suffix(s) }\n\nfloat_constant -> Float =\n    n:float_number suffix:float_suffix {\n        let (base, number) = n;\n        Float {\n            base: base,\n            number: number.to_string().into_boxed_str(),\n            suffix: suffix,\n        }\n    }\n\nfloat_number -> (FloatBase, &'input str) =\n    n:$(float_decimal) { (FloatBase::Decimal, n) } /\n    ohx n:$(float_hexadecimal) { (FloatBase::Hexadecimal, n) }\n\nfloat_decimal =\n    dec* \".\" dec+ float_decimal_exp? /\n    dec+ \".\" float_decimal_exp? /\n    dec+ float_decimal_exp\n\nfloat_decimal_exp = [eE][+-]?dec+\n\nfloat_hexadecimal =\n    hex* \".\" hex+ float_binary_exp /\n    hex+ \".\" float_binary_exp /\n    hex+ float_binary_exp\n\nfloat_binary_exp = [pP][+-]?dec+\n\nfloat_suffix -> FloatSuffix = #quiet<float_suffix_inner> / #expected(\"float literal suffix\")\n\nfloat_suffix_inner -> FloatSuffix =\n    gnu<[iIjJ]> fmt:float_format {\n        FloatSuffix {\n            format: fmt,\n            imaginary: true,\n        }\n    } /\n    fmt:float_format imag:gnu<[iIjJ]>? {\n        FloatSuffix {\n            format: fmt,\n            imaginary: imag.is_some(),\n        }\n    }\n\nfloat_format -> FloatFormat =\n    f:ts18661_float_suffix { FloatFormat::TS18661Format(f) } /\n    [fF] { FloatFormat::Float } /\n    [lL] { FloatFormat::LongDouble } /\n    { FloatFormat::Double }\n\ncharacter_constant -> String =\n    c:$([LuU]? \"'\" character+ \"'\") { String::from(c) }\n\ncharacter = [^'\\\\\\n] / escape_sequence\n\nescape_sequence = \"\\\\\" (['\"?\\\\abfnrtv] / oct*<1,3> / \"x\" hex+)\n\n////\n// 6.4.5 String literal\n////\n\npub string_literal -> Node<Vec<String>> = s:node<list1<string_literal0>> { s }\n\nstring_literal0 -> String =\n    s:$(encoding_prefix? \"\\\"\" string_char* \"\\\"\") { String::from(s) }\n\nencoding_prefix = \"u8\" / [uUL]\n\nstring_char = [^\"\\\\\\n] / escape_sequence\n\n////\n// 6.5.1 Primary expression\n////\n\nprimary_expression -> Box<Node<Expression>> = box<node<primary_expression0>>\n\nprimary_expression0 -> Expression =\n    a:string_literal { Expression::StringLiteral(Box::new(a)) } /\n    a:node<constant> { Expression::Constant(Box::new(a)) } /\n    a:identifier { Expression::Identifier(Box::new(a)) } /\n    \"(\" _ a:expression0 _ \")\" { a } /\n    a:node<generic_selection> { Expression::GenericSelection(Box::new(a)) } /\n    gnu<gnu_primary_expression>\n\ngeneric_selection -> GenericSelection =\n    K<\"_Generic\"> _ \"(\" _ e:assignment_expression _ \",\" _ a:cs1<node<generic_association>> _ \")\" {\n        GenericSelection {\n            expression: e,\n            associations: a,\n        }\n    }\n\ngeneric_association -> GenericAssociation =\n    t:type_name _ \":\" _ e:assignment_expression {\n        let span = Span::span(t.span.start, e.span.end);\n        GenericAssociation::Type(Node::new(GenericAssociationType {\n            type_name: t,\n            expression: e,\n        }, span))\n    } /\n    K<\"default\"> _ \":\" _ e:assignment_expression {\n        GenericAssociation::Default(e)\n    }\n\n//// 6.5.2 Postfix operators\n\npostfix_expression -> Box<Node<Expression>> = box<node<postfix_expression0>>\n\n#[cache]\npostfix_expression0 -> Expression =\n    e:node<postfix_expression1> _ t:list0<node<postfix_expressionT>> { apply_ops(t, e).node }\n\npostfix_expression1 -> Expression =\n    compound_literal /\n    primary_expression0\n\npostfix_expressionT -> Operation =\n    index_operator /\n    \"(\" _ e:cs0<node<assignment_expression0>> _ \")\" { Operation::Call(e) } /\n    o:node<member_operator> _ i:identifier { Operation::Member(o, i) } /\n    o:node<postfix_operator> { Operation::Unary(o) }\n\nindex_operator -> Operation =\n    i:node<index_operator0> { Operation::Binary(Node::new(BinaryOperator::Index, i.span), i.node) }\n\nindex_operator0 -> Node<Expression> =\n    \"[\" _ e:node<expression0> _ \"]\" { e }\n\nmember_operator -> MemberOperator =\n    \".\" { MemberOperator::Direct } /\n    \"->\" { MemberOperator::Indirect }\n\npostfix_operator -> UnaryOperator =\n    \"++\" { UnaryOperator::PostIncrement } /\n    \"--\" { UnaryOperator::PostDecrement }\n\ncompound_literal -> Expression =\n    n:node<compound_literal_inner> { Expression::CompoundLiteral(Box::new(n)) }\n\ncompound_literal_inner -> CompoundLiteral =\n    \"(\" _ t:type_name _ \")\" _ \"{\" _ i:cs1<node<initializer_list_item>> _ \",\"? _ \"}\" {\n        CompoundLiteral {\n            type_name: t,\n            initializer_list: i,\n        }\n    }\n\n////\n// 6.5.3 Unary operators\n////\n\nunary_expression -> Box<Node<Expression>> = box<node<unary_expression0>>\n\nunary_expression0 -> Expression =\n    postfix_expression0 /\n    unary_prefix /\n    unary_cast /\n    sizeof_expression /\n    alignof_expression /\n    gnu<K<\"__extension__\">> _ e:unary_expression0 { e }\n\nunary_prefix -> Expression =\n    n:node<unary_prefix_inner> { Expression::UnaryOperator(Box::new(n)) }\n\nunary_prefix_inner -> UnaryOperatorExpression =\n    op:node<prefix_operator> _ e:unary_expression {\n        UnaryOperatorExpression {\n            operator: op,\n            operand: e,\n        }\n    }\n\nprefix_operator -> UnaryOperator =\n    \"++\" { UnaryOperator::PreIncrement } /\n    \"--\" { UnaryOperator::PreDecrement }\n\nunary_cast -> Expression =\n    n:node<unary_cast_inner> { Expression::UnaryOperator(Box::new(n)) }\n\nunary_cast_inner -> UnaryOperatorExpression =\n    op:node<unary_operator> _ e:cast_expression {\n        UnaryOperatorExpression {\n            operator: op,\n            operand: e,\n        }\n    }\n\nunary_operator -> UnaryOperator =\n    \"&\"!\"&\" { UnaryOperator::Address } /\n    \"*\" { UnaryOperator::Indirection } /\n    \"+\" { UnaryOperator::Plus } /\n    \"-\" { UnaryOperator::Minus } /\n    \"~\" { UnaryOperator::Complement } /\n    \"!\" { UnaryOperator::Negate }\n\nsizeof_expression -> Expression =\n    n:sizeof_ty_expression { Expression::SizeOfTy(n) } /\n    n:sizeof_val_expression { Expression::SizeOfVal(n) }\n\nsizeof_ty_expression -> Box<Node<SizeOfTy>> = box<node<sizeof_ty_expression0>>\n\nsizeof_ty_expression0 -> SizeOfTy =\n    K<\"sizeof\"> _ \"(\" _ t:type_name _ \")\" {\n        SizeOfTy(t)\n    }\n\nsizeof_val_expression -> Box<Node<SizeOfVal>> = box<node<sizeof_val_expression0>>\n\nsizeof_val_expression0 -> SizeOfVal =\n    K<\"sizeof\"> _ e:unary_expression {\n        SizeOfVal(e)\n    }\n\nalignof_expression -> Expression =\n    e:alignof { Expression::AlignOf(e) }\n\nalignof -> Box<Node<AlignOf>> = box<node<alignof0>>\n\nalignof0 -> AlignOf =\n    K<\"_Alignof\" / gnu<\"__alignof\" \"__\"?>> _ \"(\" _ t:type_name _ \")\" {\n        AlignOf(Box::new(t))\n    }\n\n////\n// 6.5.4 Cast expressions\n////\n\ncast_expression -> Box<Node<Expression>> = box<node<cast_expression0>>\n\ncast_expression0 -> Expression =\n    c:node<cast_expression_inner> { Expression::Cast(Box::new(c)) } /\n    unary_expression0\n\ncast_expression_inner -> CastExpression =\n    \"(\" _ t:type_name _ \")\" _ e:cast_expression {\n        CastExpression {\n            type_name: t,\n            expression: e,\n        }\n    }\n\n////\n// 6.5.5 -- 6.5.14 Binary operators\n////\n\nbinary_expression -> Box<Node<Expression>> = box<binary_expression0>\n\nbinary_expression0 -> Node<Expression> = #infix<binary_operand> {\n#L  x o:infix<\"||\"> y { infix(o, BinaryOperator::LogicalOr, x, y) }\n#L  x o:infix<\"&&\"> y { infix(o, BinaryOperator::LogicalAnd, x, y) }\n#L  x o:infix<\"|\"> y { infix(o, BinaryOperator::BitwiseOr, x, y) }\n#L  x o:infix<\"^\"> y { infix(o, BinaryOperator::BitwiseXor, x, y) }\n#L  x o:infix<\"&\"!\"&\"> y { infix(o, BinaryOperator::BitwiseAnd, x, y) }\n#L  x o:infix<\"==\"> y { infix(o, BinaryOperator::Equals, x, y) }\n    x o:infix<\"!=\"> y { infix(o, BinaryOperator::NotEquals, x, y) }\n#L  x o:infix<\"<\"> y { infix(o, BinaryOperator::Less, x, y) }\n    x o:infix<\">\"> y { infix(o, BinaryOperator::Greater, x, y) }\n    x o:infix<\"<=\"> y { infix(o, BinaryOperator::LessOrEqual, x, y) }\n    x o:infix<\">=\"> y { infix(o, BinaryOperator::GreaterOrEqual, x, y) }\n#L  x o:infix<\"<<\"> y { infix(o, BinaryOperator::ShiftLeft, x, y) }\n    x o:infix<\">>\"> y { infix(o, BinaryOperator::ShiftRight, x, y) }\n#L  x o:infix<\"+\"> y { infix(o, BinaryOperator::Plus, x, y) }\n    x o:infix<\"-\"> y { infix(o, BinaryOperator::Minus, x, y) }\n#L  x o:infix<\"*\"> y { infix(o, BinaryOperator::Multiply, x, y) }\n    x o:infix<\"/\"> y { infix(o, BinaryOperator::Divide, x, y) }\n    x o:infix<\"%\"> y { infix(o, BinaryOperator::Modulo, x, y) }\n}\n\ninfix<ex> = _ n:node<ex> _ { n }\n\nbinary_operand -> Node<Expression> = node<cast_expression0>\n\n////\n// 6.5.15 Conditional operator\n////\n\nconditional_expression -> Box<Node<Expression>> = box<node<conditional_expression0>>\n\nconditional_expression0 -> Expression =\n    a:binary_expression0 _ t:conditional_expressionT? {\n        if let Some((b, c)) = t {\n            let span = Span::span(a.span.start, c.span.end);\n            Expression::Conditional(Box::new(Node::new(ConditionalExpression {\n                condition: Box::new(a),\n                then_expression: b,\n                else_expression: c,\n            }, span)))\n        } else {\n            a.node\n        }\n    }\n\nconditional_expressionT -> (Box<Node<Expression>>, Box<Node<Expression>>) =\n    \"?\" _ a:node<expression0> _ \":\" _ b:node<conditional_expression0> { (Box::new(a), Box::new(b)) }\n\n////\n// 6.5.16 Assignment operators\n////\n\nassignment_expression -> Box<Node<Expression>> = box<node<assignment_expression0>>\n\nassignment_expression0 -> Expression =\n    n:node<assignment_expression_inner> { Expression::BinaryOperator(Box::new(n)) } /\n    conditional_expression0\n\nassignment_expression_inner -> BinaryOperatorExpression =\n    a:unary_expression _ op:node<assignment_operator> _ b:assignment_expression {\n        BinaryOperatorExpression {\n            operator: op,\n            lhs: a,\n            rhs: b,\n        }\n    }\n\nassignment_operator -> BinaryOperator =\n    \"=\" { BinaryOperator::Assign } /\n    \"*=\" { BinaryOperator::AssignMultiply } /\n    \"/=\" { BinaryOperator::AssignDivide } /\n    \"%=\" { BinaryOperator::AssignModulo } /\n    \"+=\" { BinaryOperator::AssignPlus } /\n    \"-=\" { BinaryOperator::AssignMinus } /\n    \"<<=\" { BinaryOperator::AssignShiftLeft } /\n    \">>=\" { BinaryOperator::AssignShiftRight } /\n    \"&=\" { BinaryOperator::AssignBitwiseAnd } /\n    \"^=\" { BinaryOperator::AssignBitwiseXor } /\n    \"|=\" { BinaryOperator::AssignBitwiseOr }\n\n////\n// 6.5.17 Comma operator\n////\n\npub expression -> Box<Node<Expression>> = box<node<expression0>>\n\nexpression0 -> Expression =\n    e:node<assignment_expression0> _ t:list0<expressionT> {\n        if t.len() > 0 {\n            let mut t  = t;\n            t.insert(0, e);\n            Expression::Comma(Box::new(t))\n        } else {\n            e.node\n        }\n    }\n\nexpressionT -> Node<Expression> =\n    \",\" _ e:node<assignment_expression0> { e }\n\n////\n// 6.6 Constant expressions\n////\n\nconstant_expression -> Box<Node<Expression>> = conditional_expression\nconstant_expression0 -> Expression = conditional_expression0\n\n////\n// 6.7 Declarations\n////\n\npub declaration -> Node<Declaration> = node<declaration0>\n\ndeclaration0 -> Declaration =\n    gnu<K<\"__extension__\">>? _ d:declaration1 _ \";\" {\n        Declaration {\n            specifiers: d.0,\n            declarators: d.1,\n        }\n    }\n\ndeclaration_seq<h, t> = h:h _ t:t { (concat(h, t.0), t.1) }\n\ndeclaration1 -> (Vec<Node<DeclarationSpecifier>>, Vec<Node<InitDeclarator>>) =\n    declaration_seq<declaration_specifiers_unique, declaration2>\n\ndeclaration2 -> (Vec<Node<DeclarationSpecifier>>, Vec<Node<InitDeclarator>>) =\n    declaration_seq<declaration_typedef, declaration_typedef_tail> /\n    declaration_seq<declaration_unique_type, declaration_tail<declaration_specifiers_unique>> /\n    declaration_seq<declaration_nonunique_type, declaration_tail<declaration_specifiers_nonunique>>\n\n// What can follow a type specifier keyword or typename in a declaration\ndeclaration_tail<s> = declaration_seq<s, declaration_tail1<s>>\ndeclaration_tail1<s> =\n    declaration_seq<declaration_typedef, declaration_typedef_tail1<s>> /\n    d:declaration_init_declarators { (Vec::new(), d) }\n\n// What can follow a typedef keyword\ndeclaration_typedef_tail -> (Vec<Node<DeclarationSpecifier>>, Vec<Node<InitDeclarator>>) =\n    declaration_seq<declaration_specifiers_unique, declaration_typedef_tail0>\n\ndeclaration_typedef_tail0 -> (Vec<Node<DeclarationSpecifier>>, Vec<Node<InitDeclarator>>) =\n    declaration_seq<declaration_unique_type, declaration_typedef_tail1<declaration_specifiers_unique>> /\n    declaration_seq<declaration_nonunique_type, declaration_typedef_tail1<declaration_specifiers_nonunique>>\n\n// What can follow after typedef + type name\ndeclaration_typedef_tail1<s> = s:s _ d:declaration_type_declarators { (s, d) }\n\ndeclaration_unique_type -> Vec<Node<DeclarationSpecifier>> =\n    n:node<declaration_specifier_unique_type0> { vec![ n ] }\n\ndeclaration_nonunique_type -> Vec<Node<DeclarationSpecifier>> =\n    n:node<declaration_specifier_nonunique_type0> { vec![ n ] }\n\ndeclaration_specifiers -> Vec<Node<DeclarationSpecifier>> =\n    s:declaration_specifiers_unique _ t:declaration_specifiers_tail { concat(s, t) }\n\ndeclaration_specifiers_tail -> Vec<Node<DeclarationSpecifier>> =\n    t:declaration_unique_type _ s:declaration_specifiers_unique { concat(t, s) } /\n    t:declaration_nonunique_type _ s:declaration_specifiers_nonunique { concat(t, s) }\n\ndeclaration_specifiers_unique -> Vec<Node<DeclarationSpecifier>> =\n    list0<node<declaration_specifier_nontype>>\n\ndeclaration_specifiers_nonunique  -> Vec<Node<DeclarationSpecifier>> =\n    list0<node<declaration_specifier_nontype / declaration_specifier_nonunique_type0>>\n\ndeclaration_specifier_nontype -> DeclarationSpecifier =\n    s:storage_class_specifier { DeclarationSpecifier::StorageClass(s) } /\n    s:type_qualifier { DeclarationSpecifier::TypeQualifier(s) } /\n    s:function_specifier { DeclarationSpecifier::Function(s) } /\n    s:alignment_specifier { DeclarationSpecifier::Alignment(s) } /\n    s:gnu<attribute_specifier> { DeclarationSpecifier::Extension(s) }\n\ndeclaration_typedef -> Vec<Node<DeclarationSpecifier>> =\n    s:node<declaration_typedef0> { vec![ s ] }\n\ndeclaration_typedef0 -> DeclarationSpecifier =\n    s:storage_class_typedef { DeclarationSpecifier::StorageClass(s) }\n\ndeclaration_specifier_unique_type0 -> DeclarationSpecifier =\n    s:node<type_specifier_unique> { DeclarationSpecifier::TypeSpecifier(s) }\n\ndeclaration_specifier_nonunique_type0 -> DeclarationSpecifier =\n    s:node<type_specifier_nonunique> { DeclarationSpecifier::TypeSpecifier(s) }\n\ndeclaration_init_declarators -> Vec<Node<InitDeclarator>> = cs0<node<init_declarator>>\n\ndeclaration_type_declarators -> Vec<Node<InitDeclarator>> = cs0<node<type_declarator>>\n\ninit_declarator -> InitDeclarator =\n    d:init_declarator_declarator _ e:gnu<init_declarator_gnu>? _ i:node<init_declarator_init>?\n    {\n        InitDeclarator {\n            declarator: with_ext(d, e),\n            initializer: i,\n        }\n    }\n\ninit_declarator_declarator -> Node<Declarator> =\n    d:declarator {\n        env.handle_declarator(&d, Symbol::Identifier);\n        d\n    }\n\ninit_declarator_init -> Initializer =\n    \"=\" _ i:initializer { i }\n\ninit_declarator_gnu -> Vec<Node<Extension>> =\n    l:asm_label? _ a:attribute_specifier_list { l.into_iter().chain(a).collect() }\n\ntype_declarator -> InitDeclarator =\n    d:declarator _ e:gnu<init_declarator_gnu>?\n    {\n        env.handle_declarator(&d, Symbol::Typename);\n        InitDeclarator {\n            declarator: with_ext(d, e),\n            initializer: None,\n        }\n    }\n\n////\n// 6.7.1 Storage-class specifiers\n////\n\nstorage_class_specifier -> Node<StorageClassSpecifier> = node<storage_class_specifier0>\n\nstorage_class_specifier0 -> StorageClassSpecifier =\n    K<\"extern\"> { StorageClassSpecifier::Extern } /\n    K<\"static\"> { StorageClassSpecifier::Static } /\n    K<\"_Thread_local\"> { StorageClassSpecifier::ThreadLocal } /\n    K<\"auto\"> { StorageClassSpecifier::Auto } /\n    K<\"register\"> { StorageClassSpecifier::Register }\n\nstorage_class_typedef -> Node<StorageClassSpecifier> = node<storage_class_typedef0>\n\nstorage_class_typedef0 -> StorageClassSpecifier =\n    K<\"typedef\"> { StorageClassSpecifier::Typedef }\n\n////\n// 6.7.2 Type specifiers\n////\n\n// ISO 2011, 6.7.2, §2. Void, _Bool, _Atomic, typedef names, struct/unions, and enum\n// specifiers can only appear once in declaration specifiers or specifier-qualifiers.\n// This resolves the ambiguity with typedef names.\ntype_specifier_unique -> TypeSpecifier =\n    K<\"void\"> { TypeSpecifier::Void } /\n    K<\"_Bool\"> { TypeSpecifier::Bool } /\n    K<\"_Atomic\"> _ \"(\" _ t:type_name _ \")\" { TypeSpecifier::Atomic(t) } /\n    s:node<struct_or_union_specifier> { TypeSpecifier::Struct(s) } /\n    e:node<enum_specifier> { TypeSpecifier::Enum(e) } /\n    t:typedef_name { TypeSpecifier::TypedefName(t) }\n\ntype_specifier_nonunique -> TypeSpecifier =\n    K<\"char\"> { TypeSpecifier::Char } /\n    K<\"short\"> { TypeSpecifier::Short } /\n    K<\"int\"> { TypeSpecifier::Int } /\n    K<\"long\"> { TypeSpecifier::Long } /\n    K<\"float\"> { TypeSpecifier::Float } /\n    K<\"double\"> { TypeSpecifier::Double } /\n    K<\"signed\" / gnu<\"__signed\" \"__\"?>> { TypeSpecifier::Signed } /\n    K<\"unsigned\"> { TypeSpecifier::Unsigned } /\n    K<\"_Complex\" / gnu<\"__complex\" \"__\"?>> { TypeSpecifier::Complex } /\n    t:K<ts18661_float_type_specifier> { TypeSpecifier::TS18661Float(t) } /\n    gnu<typeof_specifier>\n\nstruct_or_union_specifier -> StructType =\n    t:node<struct_or_union> _ i:identifier? _ d:struct_or_union_body {\n        StructType {\n            kind: t,\n            identifier: i,\n            declarations: d,\n        }\n    } /\n    t:node<struct_or_union> _ i:identifier {\n        StructType {\n            kind: t,\n            identifier: Some(i),\n            declarations: None,\n        }\n    }\n\nstruct_or_union_body -> Option<Vec<Node<StructDeclaration>>> =\n    \"{\" _ d:list1<node<struct_declaration>> _ \"}\" { Some(d) } /\n    gnu<\"{\" _ \"}\"> { Some(Vec::new()) } /\n    { None }\n\nstruct_or_union -> StructKind =\n    K<\"struct\"> { StructKind::Struct } /\n    K<\"union\"> { StructKind::Union }\n\nstruct_declaration -> StructDeclaration =\n    f:node<struct_field> { StructDeclaration::Field(f) } /\n    s:static_assert { StructDeclaration::StaticAssert(s) } /\n    gnu<K<\"__extension__\">> _ d:struct_declaration { d }\n\nstruct_field -> StructField =\n    s:specifier_qualifiers _ d:cs0<node<struct_declarator>> _ \";\" gnu<(_ \";\")*>? {\n        StructField {\n            specifiers: s,\n            declarators: d,\n        }\n    }\n\nspecifier_qualifiers -> Vec<Node<SpecifierQualifier>> =\n    list_eq1_n<node<specifier_qualifier_unique_type0>, node<specifier_qualifier_qualifier0>> /\n    list_ge1_n<node<specifier_qualifier_nonunique_type0>, node<specifier_qualifier_qualifier0>>\n\nspecifier_qualifier_unique_type0 -> SpecifierQualifier =\n    s:node<type_specifier_unique> { SpecifierQualifier::TypeSpecifier(s) }\n\nspecifier_qualifier_nonunique_type0 -> SpecifierQualifier =\n    s:node<type_specifier_nonunique> { SpecifierQualifier::TypeSpecifier(s) }\n\nspecifier_qualifier_qualifier0 -> SpecifierQualifier =\n    q:type_qualifier { SpecifierQualifier::TypeQualifier(q) } /\n    e:gnu<attribute_specifier> { SpecifierQualifier::Extension(e) }\n\nstruct_declarator -> StructDeclarator =\n    d:declarator? _ \":\" _ e:constant_expression a:gnu<attribute_specifier_list>? {\n        StructDeclarator {\n            declarator: d.map(|d| with_ext(d, a)),\n            bit_width: Some(e),\n        }\n    } /\n    d:declarator _ a:gnu<attribute_specifier_list>? {\n        StructDeclarator {\n            declarator: Some(with_ext(d, a)),\n            bit_width: None,\n        }\n    }\n\nenum_specifier -> EnumType =\n    K<\"enum\"> _ i:identifier? _ \"{\" _ e:cs1<node<enumerator>> _ \",\"? _ \"}\" {\n        EnumType {\n            identifier: i,\n            enumerators: e,\n        }\n    } /\n    K<\"enum\"> _ i:identifier {\n        EnumType {\n            identifier: Some(i),\n            enumerators: Vec::new(),\n        }\n    }\n\nenumerator -> Enumerator =\n    i:identifier _ a:gnu<attribute_specifier_list>? _  e:enumerator_constant? {\n        env.add_symbol(&i.node.name, Symbol::Identifier);\n        Enumerator {\n            identifier: i,\n            expression: e,\n            extensions: a.unwrap_or_default(),\n        }\n    }\n\nenumerator_constant -> Box<Node<Expression>> =\n    \"=\" _ e:constant_expression { e }\n\n////\n// 6.7.3 Type qualifiers\n////\n\ntype_qualifier -> Node<TypeQualifier> = node<type_qualifier0>\n\ntype_qualifier0 -> TypeQualifier =\n    K<\"const\"    / gnu<\"__const\">> { TypeQualifier::Const } /\n    K<\"restrict\" / gnu<\"__restrict\" \"__\"?>> { TypeQualifier::Restrict } /\n    K<\"volatile\" / gnu<\"__volatile\" \"__\"?>> { TypeQualifier::Volatile } /\n    clang<K<\"_Nonnull\">> { TypeQualifier::Nonnull } /\n    clang<K<\"_Null_unspecified\">> { TypeQualifier::NullUnspecified } /\n    clang<K<\"_Nullable\">> { TypeQualifier::Nullable } /\n    // 6.7.2.4: _Atomics followed by a \"(\" are interpreted as type specifiers.\n    K<\"_Atomic\"> _ !\"(\" { TypeQualifier::Atomic }\n\n////\n// 6.7.4 Function specifiers\n////\n\nfunction_specifier -> Node<FunctionSpecifier> = node<function_specifier0>\n\nfunction_specifier0 -> FunctionSpecifier =\n    K<\"inline\" / gnu<\"__inline\" \"__\"?>> { FunctionSpecifier::Inline } /\n    K<\"_Noreturn\"> { FunctionSpecifier::Noreturn }\n\n////\n// 6.7.5 Alignment specifiers\n////\n\nalignment_specifier -> Node<AlignmentSpecifier> = node<alignment_specifier0>\n\nalignment_specifier0 -> AlignmentSpecifier =\n    K<\"_Alignas\"> _ \"(\" _ t:type_name _ \")\" { AlignmentSpecifier::Type(t) } /\n    K<\"_Alignas\"> _ \"(\" _ e:constant_expression _ \")\" { AlignmentSpecifier::Constant(e) }\n\n////\n// 6.7.6 Declarators\n////\n\ndeclarator -> Node<Declarator> = node<declarator0>\n\ndeclarator0 -> Declarator =\n    attr:gnu<attribute_specifier_list>? _\n    pointer:list0<pointer> _\n    kind:node<direct_declarator> _\n    derived:list0<node<derived_declarator>>\n    {\n        Declarator {\n            kind: kind,\n            derived: concat(pointer, derived),\n            extensions: attr.unwrap_or_default(),\n        }\n    }\n\ndirect_declarator -> DeclaratorKind =\n    i:identifier { DeclaratorKind::Identifier(i) } /\n    \"(\" _ d:declarator _ \")\" { DeclaratorKind::Declarator(Box::new(d)) }\n\nderived_declarator -> DerivedDeclarator =\n    \"[\" _ a:node<array_declarator> { DerivedDeclarator::Array(a) } /\n    \"(\" _ f:scoped<node<function_declarator>> _ \")\" { DerivedDeclarator::Function(f) } /\n    \"(\" _ p:cs0<identifier> _ \")\" { DerivedDeclarator::KRFunction(p) }\n\narray_declarator -> ArrayDeclarator =\n    q:list0<type_qualifier> _ \"]\" {\n        ArrayDeclarator {\n            qualifiers: q,\n            size: ArraySize::Unknown,\n        }\n    } /\n    q:list0<type_qualifier> _ e:assignment_expression _ \"]\" {\n        ArrayDeclarator {\n            qualifiers: q,\n            size: ArraySize::VariableExpression(e),\n        }\n    } /\n    K<\"static\"> _ q:list0<type_qualifier> _ e:assignment_expression _ \"]\" {\n        ArrayDeclarator {\n            qualifiers: q,\n            size: ArraySize::StaticExpression(e),\n        }\n    } /\n    q:list1<type_qualifier> _ K<\"static\"> _ e:assignment_expression _ \"]\" {\n        ArrayDeclarator {\n            qualifiers: q,\n            size: ArraySize::StaticExpression(e),\n        }\n    } /\n    q:list0<type_qualifier> _ \"*\" _ \"]\" {\n        ArrayDeclarator {\n            qualifiers: q,\n            size: ArraySize::VariableUnknown,\n        }\n    }\n\nfunction_declarator -> FunctionDeclarator =\n    p:cs1<parameter_declaration> _ e:ellipsis {\n        FunctionDeclarator {\n            parameters: p,\n            ellipsis: e,\n        }\n    }\n\npointer -> Node<DerivedDeclarator> = node<pointer0>\n\npointer0 -> DerivedDeclarator =\n    t:$(\"*\" / clang<\"^\">) _ q:list0<node<pointer_qualifier>> {\n        if t == \"^\" {\n            DerivedDeclarator::Block(q)\n        } else {\n            DerivedDeclarator::Pointer(q)\n        }\n    }\n\npointer_qualifier -> PointerQualifier =\n    q:type_qualifier { PointerQualifier::TypeQualifier(q) } /\n    e:gnu<attribute_specifier> { PointerQualifier::Extension(e) }\n\nellipsis -> Ellipsis =\n    \",\" _ \"...\" { Ellipsis::Some } / { Ellipsis::None }\n\nparameter_declaration -> Node<ParameterDeclaration> = node<parameter_declaration0>\n\nparameter_declaration0 -> ParameterDeclaration =\n    s:declaration_specifiers _ d:parameter_declarator _ a:gnu<attribute_specifier_list>? {\n        ParameterDeclaration {\n            specifiers: s,\n            declarator: d,\n            extensions: a.unwrap_or_default()\n        }\n    }\n\nparameter_declarator -> Option<Node<Declarator>> =\n    d:declarator {\n        env.handle_declarator(&d, Symbol::Identifier);\n        Some(d)\n    } /\n    d:abstract_declarator { Some(d) } /\n    { None }\n\n////\n// 6.7.7 Type names\n////\n\ntype_name -> Node<TypeName> = node<type_name0>\n\ntype_name0 -> TypeName =\n    s:specifier_qualifiers _ d:abstract_declarator? {\n        TypeName {\n            specifiers: s,\n            declarator: d,\n        }\n    }\n\nabstract_declarator -> Node<Declarator> = node<abstract_declarator0>\n\nabstract_declarator0 -> Declarator =\n    p:list0<pointer> _ k:node<direct_abstract_declarator> _ d:list0<derived_abstract_declarator> {\n        Declarator {\n            kind: k,\n            derived: concat(p, d),\n            extensions: Vec::new(),\n        }\n    } /\n    p:list0<pointer> k:#position _ d:list1<derived_abstract_declarator> {\n        Declarator {\n            kind: Node::new(DeclaratorKind::Abstract, Span::span(k, k)),\n            derived: concat(p, d),\n            extensions: Vec::new(),\n        }\n    } /\n    p:list1<pointer> k:#position {\n        Declarator {\n            kind: Node::new(DeclaratorKind::Abstract, Span::span(k, k)),\n            derived: p,\n            extensions: Vec::new(),\n        }\n    }\n\ndirect_abstract_declarator -> DeclaratorKind =\n    \"(\" _ d:abstract_declarator _ \")\" { DeclaratorKind::Declarator(Box::new(d)) }\n\nderived_abstract_declarator -> Node<DerivedDeclarator> = node<derived_abstract_declarator0>\n\nderived_abstract_declarator0 -> DerivedDeclarator =\n    \"[\" _ a:node<abstract_array_declarator> { DerivedDeclarator::Array(a) } /\n    \"(\" _ d:node<abstract_function_declarator> _ \")\" { DerivedDeclarator::Function(d) }\n\nabstract_array_declarator -> ArrayDeclarator =\n    q:list0<type_qualifier> _ \"]\" {\n        ArrayDeclarator {\n            qualifiers: q,\n            size: ArraySize::Unknown,\n        }\n    } /\n    q:list0<type_qualifier> _ e:assignment_expression _ \"]\" {\n        ArrayDeclarator {\n            qualifiers: q,\n            size: ArraySize::VariableExpression(e),\n        }\n    } /\n    K<\"static\"> _ q:list0<type_qualifier> _ e:assignment_expression _ \"]\" {\n        ArrayDeclarator {\n            qualifiers: q,\n            size: ArraySize::StaticExpression(e),\n        }\n    } /\n    q:list1<type_qualifier> _ K<\"static\"> _ e:assignment_expression _ \"]\" {\n        ArrayDeclarator {\n            qualifiers: q,\n            size: ArraySize::StaticExpression(e),\n        }\n    } /\n    \"*\" _ \"]\" {\n        ArrayDeclarator {\n            qualifiers: Vec::new(),\n            size: ArraySize::VariableUnknown,\n        }\n    }\n\nabstract_function_declarator -> FunctionDeclarator =\n    p:cs1<parameter_declaration> _ e:ellipsis {\n        FunctionDeclarator {\n            parameters: p,\n            ellipsis: e,\n        }\n    } /\n    {\n        FunctionDeclarator {\n            parameters: Vec::new(),\n            ellipsis: Ellipsis::None,\n        }\n    }\n\n\n////\n// 6.7.8 Type definitions\n////\n\ntypedef_name -> Node<Identifier> = #quiet<typedef_name0> / #expected(\"<typedef_name>\")\n\ntypedef_name0 -> Node<Identifier> = i:identifier {?\n    if env.is_typename(&i.node.name) {\n        Ok(i)\n    } else {\n        Err(\"<unused>\")\n    }\n}\n\n////\n// 6.7.9 Initialization\n////\n\ninitializer -> Initializer =\n    e:assignment_expression { Initializer::Expression(e) } /\n    \"{\" _ i:cs1<node<initializer_list_item>> _ \",\"? _ \"}\" { Initializer::List(i) } /\n    gnu<\"{\" _ \"}\"> { Initializer::List(Vec::new()) }\n\ninitializer_list_item -> InitializerListItem =\n    d:designation? _ i:node<initializer> {\n        InitializerListItem {\n            designation: d.unwrap_or_default(),\n            initializer: Box::new(i),\n        }\n    }\n\ndesignation -> Vec<Node<Designator>> =\n    d:list1<node<designator>> _ \"=\" { d } /\n    d:gnu<node<colon_designation>> { vec! [ d ] } /\n    d:gnu<node<array_designator>> { vec![ d ] }\n\ncolon_designation -> Designator =\n    i:identifier _ \":\" { Designator::Member(i) }\n\ndesignator -> Designator =\n    d:array_designator { d } /\n    \".\" _ i:identifier { Designator::Member(i) }\n\narray_designator -> Designator =\n    \"[\" _ a:node<constant_expression0> _ b:gnu<range_suffix>? \"]\" {\n        match b {\n            Some(b) => {\n                let span = Span::span(a.span.start, b.span.end);\n                Designator::Range(Node::new(RangeDesignator { from: a, to: b }, span))\n            }\n            None => Designator::Index(a),\n        }\n    }\n\nrange_suffix -> Node<Expression> = // shared with label\n    \"...\" _ e:node<constant_expression0> { e }\n\n////\n// 6.7.10 Static assertions\n////\n\nstatic_assert -> Node<StaticAssert> = node<static_assert0>\n\nstatic_assert0 -> StaticAssert =\n   gnu<K<\"__extension__\">>?\n   _ K<\"_Static_assert\"> _ \"(\" _ e:constant_expression _ \",\" _ s:string_literal _ \")\" _ \";\" {\n        StaticAssert {\n            expression: e,\n            message: s,\n        }\n    }\n\n////\n// 6.8 Statements and blocks\n////\n\npub statement -> Box<Node<Statement>> = box<node<statement0>>\n\nstatement0 -> Statement =\n    s:node<labeled_statement> { Statement::Labeled(s) } /\n    scoped<compound_statement> /\n    expression_statement /\n    scoped<selection_statement> /\n    scoped<iteration_statement> /\n    jump_statement /\n    gnu<asm_statement>\n\n////\n// 6.8.1 Labeled statements\n////\n\nlabeled_statement -> LabeledStatement =\n    l:node<label> _ \":\" _ s:statement {\n        LabeledStatement {\n            label: l,\n            statement: s,\n        }\n    }\n\nlabel -> Label =\n    i:identifier { Label::Identifier(i) } /\n    K<\"case\"> _ a:constant_expression _ b:gnu<range_suffix>? {\n        match b {\n            Some(b) => {\n                let span = Span::span(a.span.start, b.span.end);\n                Label::CaseRange(Node::new(CaseRange { low: a, high: Box::new(b) }, span))\n            }\n            None => Label::Case(a),\n        }\n    } /\n    K<\"default\"> { Label::Default }\n\n////\n// 6.8.2 Compound statement\n////\n\ncompound_statement -> Statement =\n    \"{\" _ b:list0<node<block_item>> _ \"}\" { Statement::Compound(b) }\n\nblock_item -> BlockItem =\n    d:declaration { BlockItem::Declaration(d) } /\n    s:static_assert { BlockItem::StaticAssert(s) } /\n    s:node<statement0> { BlockItem::Statement(s) }\n\n////\n// 6.8.3 Expression and null statements\n////\n\nexpression_statement -> Statement =\n    e:expression? _ \";\" { Statement::Expression(e) }\n\n////\n// 6.8.4 Selection statement\n////\n\nselection_statement -> Statement =\n    s:node<if_statement> { Statement::If(s) } /\n    s:node<switch_statement> { Statement::Switch(s) }\n\nif_statement -> IfStatement =\n    K<\"if\"> _ \"(\" _ e:expression _ \")\" _ a:statement _ b:else_statement? {\n        IfStatement {\n            condition: e,\n            then_statement: a,\n            else_statement: b,\n        }\n    }\n\nelse_statement -> Box<Node<Statement>> = K<\"else\"> _ s:statement { s }\n\nswitch_statement -> SwitchStatement =\n    K<\"switch\"> _ \"(\" _ e:expression _ \")\" _ s:statement {\n        SwitchStatement {\n            expression: e,\n            statement: s,\n        }\n    }\n\n////\n// 6.8.5 Iteration statement\n////\n\niteration_statement -> Statement =\n    s:node<while_statement> { Statement::While(s) } /\n    s:node<do_while_statement> { Statement::DoWhile(s) } /\n    s:node<for_statement> { Statement::For(s) }\n\nwhile_statement -> WhileStatement =\n    K<\"while\"> _ \"(\" _ e:expression _ \")\" _ s:statement {\n        WhileStatement {\n            expression: e,\n            statement: s,\n        }\n    }\n\ndo_while_statement -> DoWhileStatement =\n    K<\"do\"> _ s:statement _ K<\"while\"> _ \"(\" _ e:expression _ \")\" _ \";\" {\n        DoWhileStatement {\n            statement: s,\n            expression: e,\n        }\n    }\n\nfor_statement -> ForStatement =\n    K<\"for\"> _ \"(\" _ a:node<for_initializer> _ b:expression? _ \";\" _ c:expression? _ \")\" _ s:statement {\n        ForStatement {\n            initializer: a,\n            condition: b,\n            step: c,\n            statement: s,\n        }\n    }\n\nfor_initializer -> ForInitializer =\n    e:expression _ \";\" { ForInitializer::Expression(e) } /\n    d:declaration { ForInitializer::Declaration(d) } /\n    s:static_assert { ForInitializer::StaticAssert(s) } /\n    \";\" { ForInitializer::Empty }\n\n////\n// 6.8.6 Jump statements\n////\n\njump_statement -> Statement =\n    K<\"goto\"> _ i:identifier _ \";\" { Statement::Goto(i) } /\n    K<\"continue\"> _ \";\" { Statement::Continue } /\n    K<\"break\"> _ \";\" { Statement::Break } /\n    K<\"return\"> _ e:expression? _ \";\" { Statement::Return(e) }\n\n////\n// 6.9 External definitions\n////\n\nscoped<e> = ({ env.enter_scope(); }) e:e? {? env.leave_scope(); e.ok_or(\"\") }\n\npub translation_unit -> TranslationUnit =\n    directive? _ d:list0<node<external_declaration>> _ { TranslationUnit(d) }\n\nexternal_declaration -> ExternalDeclaration =\n    d:external_declaration0 gnu<(_ \";\")*>? { d }\n\nexternal_declaration0 -> ExternalDeclaration =\n    d:declaration { ExternalDeclaration::Declaration(d) } /\n    s:static_assert { ExternalDeclaration::StaticAssert(s) } /\n    d:scoped<node<function_definition>> { ExternalDeclaration::FunctionDefinition(d) }\n\nfunction_definition -> FunctionDefinition =\n    gnu<K<\"__extension__\">>?\n    _ a:declaration_specifiers _ b:declarator _ c:list0<declaration>\n    _ d:node<compound_statement> {\n        FunctionDefinition {\n            specifiers: a,\n            declarator: b,\n            declarations: c,\n            statement: d,\n        }\n    }\n\n////\n// GNU extensions\n////\n\ngnu<E> = &gnu_guard e:E { e }\n\ngnu_guard = {? if env.extensions_gnu { Ok(()) } else { Err(\"gnu extensions disabled\") } }\n\n////\n// GNU attributes\n////\n\nattribute_specifier_list -> Vec<Node<Extension>> =\n    a:list0<attribute_specifier> { a.into_iter().flat_map(|v| v).collect() }\n\nattribute_specifier -> Vec<Node<Extension>> =\n    K<\"__attribute\" \"__\"?> _ \"((\" _ a:cs0<node<attribute>> _ \"))\" { a }\n\nattribute -> Extension =\n    c:clang<node<attr_availability>> { Extension::AvailabilityAttribute(c) } /\n    n:node<attribute_name> _ p:attribute_parameters? {\n        Extension::Attribute(Attribute {\n            name: n,\n            arguments: p.unwrap_or_default(),\n        })\n    }\n\nattribute_name -> String =\n    n:$(#quiet<[_a-zA-Z][_a-zA-Z0-9]*>) { String::from(n) }\n\nattribute_parameters -> Vec<Node<Expression>> =\n    \"(\" _ e:cs0<node<assignment_expression0>> _ \")\" { e }\n\nattr_availability -> AvailabilityAttribute =\n    K<\"availability\"> _ \"(\" _ p:identifier _ \",\" _ c:cs1<node<attr_availability_clause>> _ \")\" {\n        AvailabilityAttribute {\n            platform: p,\n            clauses: c,\n        }\n    }\n\nattr_availability_clause -> AvailabilityClause =\n    K<\"introduced\"> _ \"=\" _ v:node<attr_availability_version> { AvailabilityClause::Introduced(v) } /\n    K<\"deprecated\"> _ \"=\" _ v:node<attr_availability_version> { AvailabilityClause::Deprecated(v) } /\n    K<\"obsoleted\"> _ \"=\" _ v:node<attr_availability_version> { AvailabilityClause::Obsoleted(v) } /\n    K<\"unavailable\"> { AvailabilityClause::Unavailable } /\n    K<\"message\"> _ \"=\" _ s:string_literal { AvailabilityClause::Message(s) } /\n    K<\"replacement\"> _ \"=\" _ s:string_literal { AvailabilityClause::Replacement(s) }\n\nattr_availability_version -> AvailabilityVersion =\n    a:$(dec+) b:(\".\" $(dec+) )? c:(\".\" $(dec+) )? {\n        AvailabilityVersion {\n            major: a.into(),\n            minor: b.map(str::to_owned),\n            subminor: c.map(str::to_owned),\n        }\n    }\n\n////\n// GNU assembler labels\n////\n\nasm_label -> Node<Extension> = node<asm_label0>\n\nasm_label0 -> Extension =\n    asm_label_keyword _ \"(\" _ s:string_literal _ \")\" { Extension::AsmLabel(s) }\n\nasm_label_keyword =\n    #quiet<K<\"asm\"> / K<\"__asm\" \"__\"?>> / #expected(\"asm\")\n\n////\n// GNU assembler statements\n////\n\nasm_statement -> Statement =\n    s:node<asm_statement0> { Statement::Asm(s) }\n\nasm_statement0 -> AsmStatement =\n    K<\"asm\" / \"__asm\" \"__\"?> _ q:type_qualifier? _ \"(\" _\n        a:string_literal _\n        o:asm_ext<asm_operand_list, asm_ext<asm_operand_list, asm_ext<cs0<string_literal>, ()>>>? _\n    \")\" _ \";\" {\n        if let Some((o, (i, (c, ())))) = o {\n            AsmStatement::GnuExtended(GnuExtendedAsmStatement {\n                qualifier: q,\n                template: a,\n                outputs: o,\n                inputs: i,\n                clobbers: c,\n            })\n        } else {\n            AsmStatement::GnuBasic(a)\n        }\n    }\n\nasm_ext<e, t> = \":\" _ e:e _ t:t? { (e, t.unwrap_or_default()) }\n\nasm_operand_list -> Vec<Node<GnuAsmOperand>> = cs0<node<asm_operand>>\n\nasm_operand -> GnuAsmOperand =\n    i:(\"[\" _ i:identifier _ \"]\" _ {i})? s:string_literal _ \"(\" _ e:node<expression0> _ \")\" {\n        GnuAsmOperand {\n            symbolic_name: i,\n            constraints: s,\n            variable_name: e,\n        }\n    }\n\n////\n// GNU expression extensions\n////\n\ngnu_primary_expression -> Expression =\n    statement_expression /\n    offsetof_expression /\n    va_arg_expression /\n    keyword_expression\n\nstatement_expression -> Expression =\n    \"(\" _ s:scoped<node<compound_statement>> _ \")\" { Expression::Statement(Box::new(s)) }\n\nva_arg_expression -> Expression =\n    n:node<va_arg_expression_inner> { Expression::VaArg(Box::new(n)) }\n\nva_arg_expression_inner -> VaArgExpression =\n    K<\"__builtin_va_arg\"> _ \"(\" _ e:assignment_expression _ \",\" _ t:type_name _ \")\" {\n        VaArgExpression {\n            va_list: e,\n            type_name: t,\n        }\n    }\n\nkeyword_expression -> Expression =\n    k:node<$(keyword_expression0)> {\n        let ident = Identifier {\n            name: k.node.to_string(),\n        };\n        Expression::Identifier(Box::new(Node::new(ident, k.span)))\n    }\n\nkeyword_expression0 =\n    K<\"__func__\"> /\n    K<\"__FUNCTION__\"> /\n    K<\"__PRETTY_FUNCTION__\">\n\noffsetof_expression -> Expression =\n    n:node<offsetof_expression_inner> { Expression::OffsetOf(Box::new(n)) }\n\noffsetof_expression_inner -> OffsetOfExpression =\n    K<\"__builtin_offsetof\"> _ \"(\" _ t:type_name _ \",\" _ d:node<offsetof_designator> _ \")\" {\n        OffsetOfExpression {\n            type_name: t,\n            designator: d,\n        }\n    }\n\noffsetof_designator -> OffsetDesignator =\n    i:identifier _ d:list0<node<offsetof_member>> {\n        OffsetDesignator {\n            base: i,\n            members: d,\n        }\n    }\n\noffsetof_member -> OffsetMember =\n    \".\" _ i:identifier { OffsetMember::Member(i) } /\n    \"->\" _ i:identifier { OffsetMember::IndirectMember(i) } /\n    \"[\" _ e:node<expression0> _ \"]\" { OffsetMember::Index(e) }\n\n////\n// GNU typeof extension\n////\n\ntypeof_specifier -> TypeSpecifier =\n    K<\"typeof\" / \"__typeof\" \"__\"?> _ \"(\" _ e:node<typeof_specifier0> _ \")\" { TypeSpecifier::TypeOf(e) }\n\ntypeof_specifier0 -> TypeOf =\n    e:node<expression0> { TypeOf::Expression(e) } /\n    t:type_name { TypeOf::Type(t) }\n\n////\n// ISO/IEC TS 18661 series floating point extensions\n////\n\nts18661_float_type_specifier -> TS18661FloatType =\n    ts18661_binary_float /\n    ts18661_decimal_float\n\nts18661_binary_float -> TS18661FloatType =\n    \"_Float\" width:ts18661_binary_width extended:\"x\"? {\n        ts18661_float(true, width, extended.is_some())\n    }\n\nts18661_binary_width -> usize =\n    n:$(\"16\" / \"32\" / \"64\" / \"128\") {\n        n.parse().unwrap()\n    }\n\nts18661_decimal_float -> TS18661FloatType =\n    \"_Decimal\" width:ts18661_decimal_width extended:\"x\"? {\n        ts18661_float(false, width, extended.is_some())\n    }\n\nts18661_decimal_width -> usize =\n    n:$(\"32\" / \"64\" / \"128\") {\n        n.parse().unwrap()\n    }\n\nts18661_float_suffix -> TS18661FloatType =\n    (\"df\" / \"DF\") { ts18661_float(false, 32, false) } /\n    (\"dd\" / \"DD\") { ts18661_float(false, 64, false) } /\n    (\"dl\" / \"DL\") { ts18661_float(false, 128, false) } /\n\n    [fF] width:ts18661_binary_width extended:\"x\"? {\n        ts18661_float(true, width, extended.is_some())\n    } /\n    [dD] width:ts18661_decimal_width extended:\"x\"? {\n        ts18661_float(false, width, extended.is_some())\n    }\n\n////\n// Clang extensions\n////\n\nclang<E> = &clang_guard e:E { e }\n\nclang_guard = {? if env.extensions_clang { Ok(()) } else { Err(\"clang extensions disabled\") } }\n"
  },
  {
    "path": "reftests/constant-322.c",
    "content": "#pragma gnu\n0\n\n/*===\nConstant\n    Integer \"0\"\n        IntegerBase Decimal\n        IntegerSuffix false false\n            IntegerSize Int\n===*/\n"
  },
  {
    "path": "reftests/constant-323.c",
    "content": "#pragma gnu\n1\n\n/*===\nConstant\n    Integer \"1\"\n        IntegerBase Decimal\n        IntegerSuffix false false\n            IntegerSize Int\n===*/\n"
  },
  {
    "path": "reftests/constant-324.c",
    "content": "#pragma gnu\n1234567890\n\n/*===\nConstant\n    Integer \"1234567890\"\n        IntegerBase Decimal\n        IntegerSuffix false false\n            IntegerSize Int\n===*/\n"
  },
  {
    "path": "reftests/constant-328.c",
    "content": "#pragma gnu\n01234567\n\n/*===\nConstant\n    Integer \"1234567\"\n        IntegerBase Octal\n        IntegerSuffix false false\n            IntegerSize Int\n===*/\n"
  },
  {
    "path": "reftests/constant-332.c",
    "content": "#pragma gnu\n0x1234567890abdefABCDEF\n\n/*===\nConstant\n    Integer \"1234567890abdefABCDEF\"\n        IntegerBase Hexadecimal\n        IntegerSuffix false false\n            IntegerSize Int\n===*/\n"
  },
  {
    "path": "reftests/constant-336.c",
    "content": "#pragma gnu\n0b0001001000110100\n\n/*===\nConstant\n    Integer \"0001001000110100\"\n        IntegerBase Binary\n        IntegerSuffix false false\n            IntegerSize Int\n===*/\n"
  },
  {
    "path": "reftests/constant-340.c",
    "content": "#pragma gnu\n042lu\n\n/*===\nConstant\n    Integer \"42\"\n        IntegerBase Octal\n        IntegerSuffix true false\n            IntegerSize Long\n===*/\n"
  },
  {
    "path": "reftests/constant-341.c",
    "content": "#pragma gnu\n042ul\n\n/*===\nConstant\n    Integer \"42\"\n        IntegerBase Octal\n        IntegerSuffix true false\n            IntegerSize Long\n===*/\n"
  },
  {
    "path": "reftests/constant-342.c",
    "content": "#pragma gnu\n042uL\n\n/*===\nConstant\n    Integer \"42\"\n        IntegerBase Octal\n        IntegerSuffix true false\n            IntegerSize Long\n===*/\n"
  },
  {
    "path": "reftests/constant-344.c",
    "content": "#pragma gnu\n1a\n\n/*===\n~ERROR\n===*/\n"
  },
  {
    "path": "reftests/constant-345.c",
    "content": "#pragma gnu\n08\n\n/*===\n~ERROR\n===*/\n"
  },
  {
    "path": "reftests/constant-346.c",
    "content": "#pragma gnu\n0xX\n\n/*===\n~ERROR\n===*/\n"
  },
  {
    "path": "reftests/constant-347.c",
    "content": "#pragma gnu\n1lul\n\n/*===\n~ERROR\n===*/\n"
  },
  {
    "path": "reftests/constant-348.c",
    "content": "#pragma gnu\n2lL\n\n/*===\n~ERROR\n===*/\n"
  },
  {
    "path": "reftests/constant-349.c",
    "content": "#pragma gnu\n0b2\n\n/*===\n~ERROR\n===*/\n"
  },
  {
    "path": "reftests/constant-370.c",
    "content": "#pragma gnu\n2.\n\n/*===\nConstant\n    Float \"2.\"\n        FloatBase Decimal\n        FloatSuffix false\n            FloatFormat Double\n===*/\n"
  },
  {
    "path": "reftests/constant-371.c",
    "content": "#pragma gnu\n2.e2\n\n/*===\nConstant\n    Float \"2.e2\"\n        FloatBase Decimal\n        FloatSuffix false\n            FloatFormat Double\n===*/\n"
  },
  {
    "path": "reftests/constant-375.c",
    "content": "#pragma gnu\n.2\n\n/*===\nConstant\n    Float \".2\"\n        FloatBase Decimal\n        FloatSuffix false\n            FloatFormat Double\n===*/\n"
  },
  {
    "path": "reftests/constant-376.c",
    "content": "#pragma gnu\n.2e2\n\n/*===\nConstant\n    Float \".2e2\"\n        FloatBase Decimal\n        FloatSuffix false\n            FloatFormat Double\n===*/\n"
  },
  {
    "path": "reftests/constant-380.c",
    "content": "#pragma gnu\n2.0\n\n/*===\nConstant\n    Float \"2.0\"\n        FloatBase Decimal\n        FloatSuffix false\n            FloatFormat Double\n===*/\n"
  },
  {
    "path": "reftests/constant-381.c",
    "content": "#pragma gnu\n2.0f\n\n/*===\nConstant\n    Float \"2.0\"\n        FloatBase Decimal\n        FloatSuffix false\n            FloatFormat Float\n===*/\n"
  },
  {
    "path": "reftests/constant-383.c",
    "content": "#pragma gnu\n24.01e100\n\n/*===\nConstant\n    Float \"24.01e100\"\n        FloatBase Decimal\n        FloatSuffix false\n            FloatFormat Double\n===*/\n"
  },
  {
    "path": "reftests/constant-387.c",
    "content": "#pragma gnu\n24.01e+100\n\n/*===\nConstant\n    Float \"24.01e+100\"\n        FloatBase Decimal\n        FloatSuffix false\n            FloatFormat Double\n===*/\n"
  },
  {
    "path": "reftests/constant-391.c",
    "content": "#pragma gnu\n24.01e-100\n\n/*===\nConstant\n    Float \"24.01e-100\"\n        FloatBase Decimal\n        FloatSuffix false\n            FloatFormat Double\n===*/\n"
  },
  {
    "path": "reftests/constant-395.c",
    "content": "#pragma gnu\n24.01e100f\n\n/*===\nConstant\n    Float \"24.01e100\"\n        FloatBase Decimal\n        FloatSuffix false\n            FloatFormat Float\n===*/\n"
  },
  {
    "path": "reftests/constant-400.c",
    "content": "#pragma gnu\n0x2Ap19L\n\n/*===\nConstant\n    Float \"2Ap19\"\n        FloatBase Hexadecimal\n        FloatSuffix false\n            FloatFormat LongDouble\n===*/\n"
  },
  {
    "path": "reftests/constant-404.c",
    "content": "#pragma gnu\n0x2A.p19L\n\n/*===\nConstant\n    Float \"2A.p19\"\n        FloatBase Hexadecimal\n        FloatSuffix false\n            FloatFormat LongDouble\n===*/\n"
  },
  {
    "path": "reftests/constant-408.c",
    "content": "#pragma gnu\n0x.DEp19L\n\n/*===\nConstant\n    Float \".DEp19\"\n        FloatBase Hexadecimal\n        FloatSuffix false\n            FloatFormat LongDouble\n===*/\n"
  },
  {
    "path": "reftests/constant-412.c",
    "content": "#pragma gnu\n0x2A.DEp19L\n\n/*===\nConstant\n    Float \"2A.DEp19\"\n        FloatBase Hexadecimal\n        FloatSuffix false\n            FloatFormat LongDouble\n===*/\n"
  },
  {
    "path": "reftests/constant-442.c",
    "content": "#pragma gnu\n1.0f64\n\n/*===\nConstant\n    Float \"1.0\"\n        FloatBase Decimal\n        FloatSuffix false\n            FloatFormat\n                TS18661FloatType 64\n                    TS18661FloatFormat BinaryInterchange\n===*/\n"
  },
  {
    "path": "reftests/constant-446.c",
    "content": "#pragma gnu\n0xAp1f16\n\n/*===\nConstant\n    Float \"Ap1\"\n        FloatBase Hexadecimal\n        FloatSuffix false\n            FloatFormat\n                TS18661FloatType 16\n                    TS18661FloatFormat BinaryInterchange\n===*/\n"
  },
  {
    "path": "reftests/constant-458.c",
    "content": "#pragma gnu\n'a'\n\n/*===\nConstant Character 'a'\n===*/\n"
  },
  {
    "path": "reftests/constant-459.c",
    "content": "#pragma gnu\n'\\n'\n\n/*===\nConstant Character '\\n'\n===*/\n"
  },
  {
    "path": "reftests/constant-460.c",
    "content": "#pragma gnu\n'\\\\'\n\n/*===\nConstant Character '\\\\'\n===*/\n"
  },
  {
    "path": "reftests/constant-461.c",
    "content": "#pragma gnu\n'\\''\n\n/*===\nConstant Character '\\''\n===*/\n"
  },
  {
    "path": "reftests/constant-462.c",
    "content": "#pragma gnu\n'\\1'\n\n/*===\nConstant Character '\\1'\n===*/\n"
  },
  {
    "path": "reftests/constant-463.c",
    "content": "#pragma gnu\n'\\02'\n\n/*===\nConstant Character '\\02'\n===*/\n"
  },
  {
    "path": "reftests/constant-464.c",
    "content": "#pragma gnu\n'\\027'\n\n/*===\nConstant Character '\\027'\n===*/\n"
  },
  {
    "path": "reftests/constant-465.c",
    "content": "#pragma gnu\n'\\xde'\n\n/*===\nConstant Character '\\xde'\n===*/\n"
  },
  {
    "path": "reftests/constant-466.c",
    "content": "'\\c'\n/*===\n~ERROR\n===*/\n"
  },
  {
    "path": "reftests/declaration-1080.c",
    "content": "#pragma gnu\n__attribute__((noreturn)) void d0 (void),\n__attribute__((format(printf, 1, 2))) d1 (const char *, ...),\nd2 (void);\n\n/*===\nDeclaration\n    DeclarationSpecifier\n        Extension\n            Attribute \"noreturn\"\n    DeclarationSpecifier\n        TypeSpecifier Void\n    InitDeclarator\n        Declarator\n            DeclaratorKind\n                Identifier \"d0\"\n            DerivedDeclarator\n                FunctionDeclarator\n                    ParameterDeclaration\n                        DeclarationSpecifier\n                            TypeSpecifier Void\n                    Ellipsis None\n    InitDeclarator\n        Declarator\n            DeclaratorKind\n                Identifier \"d1\"\n            DerivedDeclarator\n                FunctionDeclarator\n                    ParameterDeclaration\n                        DeclarationSpecifier\n                            TypeQualifier Const\n                        DeclarationSpecifier\n                            TypeSpecifier Char\n                        Declarator\n                            DeclaratorKind Abstract\n                            DerivedDeclarator Pointer\n                    Ellipsis Some\n            Extension\n                Attribute \"format\"\n                    Expression\n                        Identifier \"printf\"\n                    Expression\n                        Constant\n                            Integer \"1\"\n                                IntegerBase Decimal\n                                IntegerSuffix false false\n                                    IntegerSize Int\n                    Expression\n                        Constant\n                            Integer \"2\"\n                                IntegerBase Decimal\n                                IntegerSuffix false false\n                                    IntegerSize Int\n    InitDeclarator\n        Declarator\n            DeclaratorKind\n                Identifier \"d2\"\n            DerivedDeclarator\n                FunctionDeclarator\n                    ParameterDeclaration\n                        DeclarationSpecifier\n                            TypeSpecifier Void\n                    Ellipsis None\n===*/\n"
  },
  {
    "path": "reftests/declaration-1443.c",
    "content": "#pragma gnu\nunion { long double __l; int __i[3]; } __u = { __l: __x };\n\n/*===\nDeclaration\n    DeclarationSpecifier\n        TypeSpecifier\n            StructType\n                StructKind Union\n                StructDeclaration\n                    StructField\n                        SpecifierQualifier\n                            TypeSpecifier Long\n                        SpecifierQualifier\n                            TypeSpecifier Double\n                        StructDeclarator\n                            Declarator\n                                DeclaratorKind\n                                    Identifier \"__l\"\n                StructDeclaration\n                    StructField\n                        SpecifierQualifier\n                            TypeSpecifier Int\n                        StructDeclarator\n                            Declarator\n                                DeclaratorKind\n                                    Identifier \"__i\"\n                                DerivedDeclarator\n                                    ArrayDeclarator\n                                        ArraySize VariableExpression\n                                            Expression\n                                                Constant\n                                                    Integer \"3\"\n                                                        IntegerBase Decimal\n                                                        IntegerSuffix false false\n                                                            IntegerSize Int\n    InitDeclarator\n        Declarator\n            DeclaratorKind\n                Identifier \"__u\"\n        Initializer\n            InitializerListItem\n                Designator\n                    Identifier \"__l\"\n                Initializer\n                    Expression\n                        Identifier \"__x\"\n===*/\n"
  },
  {
    "path": "reftests/declaration-1610.c",
    "content": "#pragma gnu\n__typeof__(foo(bar, baz)) ook = foo(bar, baz);\n\n/*===\nDeclaration\n    DeclarationSpecifier\n        TypeSpecifier\n            TypeOf\n                Expression\n                    CallExpression\n                        Expression\n                            Identifier \"foo\"\n                        Expression\n                            Identifier \"bar\"\n                        Expression\n                            Identifier \"baz\"\n    InitDeclarator\n        Declarator\n            DeclaratorKind\n                Identifier \"ook\"\n        Initializer\n            Expression\n                CallExpression\n                    Expression\n                        Identifier \"foo\"\n                    Expression\n                        Identifier \"bar\"\n                    Expression\n                        Identifier \"baz\"\n===*/\n"
  },
  {
    "path": "reftests/declaration-1847.c",
    "content": "#pragma gnu\ntypedef struct {\nlong long __max_align_ll __attribute__((__aligned__(__alignof__(long long))));\nlong double __max_align_ld __attribute__((__aligned__(__alignof__(long double))));\n} max_align_t;\n\n/*===\nDeclaration\n    DeclarationSpecifier\n        StorageClassSpecifier Typedef\n    DeclarationSpecifier\n        TypeSpecifier\n            StructType\n                StructKind Struct\n                StructDeclaration\n                    StructField\n                        SpecifierQualifier\n                            TypeSpecifier Long\n                        SpecifierQualifier\n                            TypeSpecifier Long\n                        StructDeclarator\n                            Declarator\n                                DeclaratorKind\n                                    Identifier \"__max_align_ll\"\n                                Extension\n                                    Attribute \"__aligned__\"\n                                        Expression\n                                            AlignOf\n                                                TypeName\n                                                    SpecifierQualifier\n                                                        TypeSpecifier Long\n                                                    SpecifierQualifier\n                                                        TypeSpecifier Long\n                StructDeclaration\n                    StructField\n                        SpecifierQualifier\n                            TypeSpecifier Long\n                        SpecifierQualifier\n                            TypeSpecifier Double\n                        StructDeclarator\n                            Declarator\n                                DeclaratorKind\n                                    Identifier \"__max_align_ld\"\n                                Extension\n                                    Attribute \"__aligned__\"\n                                        Expression\n                                            AlignOf\n                                                TypeName\n                                                    SpecifierQualifier\n                                                        TypeSpecifier Long\n                                                    SpecifierQualifier\n                                                        TypeSpecifier Double\n    InitDeclarator\n        Declarator\n            DeclaratorKind\n                Identifier \"max_align_t\"\n===*/\n"
  },
  {
    "path": "reftests/declaration-2243.c",
    "content": "#pragma gnu\n_Float64 foo = 1.5;\n\n/*===\nDeclaration\n    DeclarationSpecifier\n        TypeSpecifier\n            TS18661FloatType 64\n                TS18661FloatFormat BinaryInterchange\n    InitDeclarator\n        Declarator\n            DeclaratorKind\n                Identifier \"foo\"\n        Initializer\n            Expression\n                Constant\n                    Float \"1.5\"\n                        FloatBase Decimal\n                        FloatSuffix false\n                            FloatFormat Double\n===*/\n"
  },
  {
    "path": "reftests/declaration-2321.c",
    "content": "// This is the first Clang-specific declaration you'll encounter in macOS\n// if you #include <stdio.h>.\n\n#pragma gnu\n#pragma clang\nint (* _Nullable _close)(void *);\n\n/*===\nDeclaration\n    DeclarationSpecifier\n        TypeSpecifier Int\n    InitDeclarator\n        Declarator\n            DeclaratorKind\n                Declarator\n                    DeclaratorKind\n                        Identifier \"_close\"\n                    DerivedDeclarator Pointer\n                        PointerQualifier\n                            TypeQualifier Nullable\n            DerivedDeclarator\n                FunctionDeclarator\n                    ParameterDeclaration\n                        DeclarationSpecifier\n                            TypeSpecifier Void\n                        Declarator\n                            DeclaratorKind Abstract\n                            DerivedDeclarator Pointer\n                    Ellipsis None\n===*/\n"
  },
  {
    "path": "reftests/declaration-2429.c",
    "content": "#pragma gnu\n#pragma clang\nint f __attribute__((availability(p1,introduced=1.2.3))) __attribute__((availability(p2,unavailable,replacement=\"f2\")));\n\n/*===\nDeclaration\n    DeclarationSpecifier\n        TypeSpecifier Int\n    InitDeclarator\n        Declarator\n            DeclaratorKind\n                Identifier \"f\"\n            Extension\n                AvailabilityAttribute\n            Extension\n                AvailabilityAttribute\n===*/\n"
  },
  {
    "path": "reftests/declaration-2477.c",
    "content": "#pragma gnu\nstruct foo S;\n\n/*===\nDeclaration\n    DeclarationSpecifier\n        TypeSpecifier\n            StructType\n                StructKind Struct\n                Identifier \"foo\"\n    InitDeclarator\n        Declarator\n            DeclaratorKind\n                Identifier \"S\"\n===*/\n"
  },
  {
    "path": "reftests/declaration-2508.c",
    "content": "struct foo { } S;\n\n/*===\n~ERROR\n===*/\n"
  },
  {
    "path": "reftests/declaration-2512.c",
    "content": "#pragma gnu\nstruct foo { } S;\n\n/*===\nDeclaration\n    DeclarationSpecifier\n        TypeSpecifier\n            StructType\n                StructKind Struct\n                Identifier \"foo\"\n    InitDeclarator\n        Declarator\n            DeclaratorKind\n                Identifier \"S\"\n===*/\n"
  },
  {
    "path": "reftests/declaration-2594.c",
    "content": "// #23\n\ntypedef const int foo;\n\n/*===\nDeclaration\n    DeclarationSpecifier\n        StorageClassSpecifier Typedef\n    DeclarationSpecifier\n        TypeQualifier Const\n    DeclarationSpecifier\n        TypeSpecifier Int\n    InitDeclarator\n        Declarator\n            DeclaratorKind\n                Identifier \"foo\"\n===*/\n"
  },
  {
    "path": "reftests/declaration-31-field-semicolon.c",
    "content": "#pragma gnu\n\nstruct s {\n    int i;;\n};\n\n\n/*===\nDeclaration\n    DeclarationSpecifier\n        TypeSpecifier\n            StructType\n                StructKind Struct\n                Identifier \"s\"\n                StructDeclaration\n                    StructField\n                        SpecifierQualifier\n                            TypeSpecifier Int\n                        StructDeclarator\n                            Declarator\n                                DeclaratorKind\n                                    Identifier \"i\"\n===*/\n"
  },
  {
    "path": "reftests/declaration-31-ty-attr1.c",
    "content": "#pragma gnu\n\n// #31\n\nstruct s {\n    struct t {\n        int i;\n    } __attribute((packed)) v;\n};\n\n/*===\nDeclaration\n    DeclarationSpecifier\n        TypeSpecifier\n            StructType\n                StructKind Struct\n                Identifier \"s\"\n                StructDeclaration\n                    StructField\n                        SpecifierQualifier\n                            TypeSpecifier\n                                StructType\n                                    StructKind Struct\n                                    Identifier \"t\"\n                                    StructDeclaration\n                                        StructField\n                                            SpecifierQualifier\n                                                TypeSpecifier Int\n                                            StructDeclarator\n                                                Declarator\n                                                    DeclaratorKind\n                                                        Identifier \"i\"\n                        SpecifierQualifier\n                            Extension\n                                Attribute \"packed\"\n                        StructDeclarator\n                            Declarator\n                                DeclaratorKind\n                                    Identifier \"v\"\n===*/\n"
  },
  {
    "path": "reftests/declaration-31-ty-attr2.c",
    "content": "#pragma gnu\n\nstruct s {\n    union { int i; } __attribute__((aligned(8)));\n};\n\n/*===\nDeclaration\n    DeclarationSpecifier\n        TypeSpecifier\n            StructType\n                StructKind Struct\n                Identifier \"s\"\n                StructDeclaration\n                    StructField\n                        SpecifierQualifier\n                            TypeSpecifier\n                                StructType\n                                    StructKind Union\n                                    StructDeclaration\n                                        StructField\n                                            SpecifierQualifier\n                                                TypeSpecifier Int\n                                            StructDeclarator\n                                                Declarator\n                                                    DeclaratorKind\n                                                        Identifier \"i\"\n                        SpecifierQualifier\n                            Extension\n                                Attribute \"aligned\"\n                                    Expression\n                                        Constant\n                                            Integer \"8\"\n                                                IntegerBase Decimal\n                                                IntegerSuffix false false\n                                                    IntegerSize Int\n===*/\n"
  },
  {
    "path": "reftests/declaration-31-ty-attr3.c",
    "content": "#pragma gnu\n\nstruct s {\n    int __attribute__((aligned(8))) *i;\n};\n\n\n/*===\nDeclaration\n    DeclarationSpecifier\n        TypeSpecifier\n            StructType\n                StructKind Struct\n                Identifier \"s\"\n                StructDeclaration\n                    StructField\n                        SpecifierQualifier\n                            TypeSpecifier Int\n                        SpecifierQualifier\n                            Extension\n                                Attribute \"aligned\"\n                                    Expression\n                                        Constant\n                                            Integer \"8\"\n                                                IntegerBase Decimal\n                                                IntegerSuffix false false\n                                                    IntegerSize Int\n                        StructDeclarator\n                            Declarator\n                                DeclaratorKind\n                                    Identifier \"i\"\n                                DerivedDeclarator Pointer\n===*/\n"
  },
  {
    "path": "reftests/declaration-659.c",
    "content": "#pragma gnu\nint typedef * foo, baz[static 10][const *];\n\n#pragma is_typename foo\n#pragma is_typename baz\n/*===\nDeclaration\n    DeclarationSpecifier\n        TypeSpecifier Int\n    DeclarationSpecifier\n        StorageClassSpecifier Typedef\n    InitDeclarator\n        Declarator\n            DeclaratorKind\n                Identifier \"foo\"\n            DerivedDeclarator Pointer\n    InitDeclarator\n        Declarator\n            DeclaratorKind\n                Identifier \"baz\"\n            DerivedDeclarator\n                ArrayDeclarator\n                    ArraySize StaticExpression\n                        Expression\n                            Constant\n                                Integer \"10\"\n                                    IntegerBase Decimal\n                                    IntegerSuffix false false\n                                        IntegerSize Int\n            DerivedDeclarator\n                ArrayDeclarator\n                    TypeQualifier Const\n                    ArraySize VariableUnknown\n===*/\n"
  },
  {
    "path": "reftests/declaration-714.c",
    "content": "#pragma gnu\ntypedef enum { FOO, BAR = 1 } * const foobar;\n\n#pragma is_typename foobar\n/*===\nDeclaration\n    DeclarationSpecifier\n        StorageClassSpecifier Typedef\n    DeclarationSpecifier\n        TypeSpecifier\n            EnumType\n                Enumerator\n                    Identifier \"FOO\"\n                Enumerator\n                    Identifier \"BAR\"\n                    Expression\n                        Constant\n                            Integer \"1\"\n                                IntegerBase Decimal\n                                IntegerSuffix false false\n                                    IntegerSize Int\n    InitDeclarator\n        Declarator\n            DeclaratorKind\n                Identifier \"foobar\"\n            DerivedDeclarator Pointer\n                PointerQualifier\n                    TypeQualifier Const\n===*/\n"
  },
  {
    "path": "reftests/declaration-760.c",
    "content": "#pragma gnu\nstruct { int a, b; float c; } S;\n\n/*===\nDeclaration\n    DeclarationSpecifier\n        TypeSpecifier\n            StructType\n                StructKind Struct\n                StructDeclaration\n                    StructField\n                        SpecifierQualifier\n                            TypeSpecifier Int\n                        StructDeclarator\n                            Declarator\n                                DeclaratorKind\n                                    Identifier \"a\"\n                        StructDeclarator\n                            Declarator\n                                DeclaratorKind\n                                    Identifier \"b\"\n                StructDeclaration\n                    StructField\n                        SpecifierQualifier\n                            TypeSpecifier Float\n                        StructDeclarator\n                            Declarator\n                                DeclaratorKind\n                                    Identifier \"c\"\n    InitDeclarator\n        Declarator\n            DeclaratorKind\n                Identifier \"S\"\n===*/\n"
  },
  {
    "path": "reftests/declaration-837.c",
    "content": "int __restrict__;\n\n/*===\nDeclaration\n    DeclarationSpecifier\n        TypeSpecifier Int\n    InitDeclarator\n        Declarator\n            DeclaratorKind\n                Identifier \"__restrict__\"\n===*/\n"
  },
  {
    "path": "reftests/declaration-855.c",
    "content": "#pragma gnu\nint __restrict__;\n\n/*===\nDeclaration\n    DeclarationSpecifier\n        TypeSpecifier Int\n    DeclarationSpecifier\n        TypeQualifier Restrict\n===*/\n"
  },
  {
    "path": "reftests/declaration-880.c",
    "content": "#pragma gnu\n#pragma typedef FILE\n#pragma typedef size_t\nchar *fparseln(FILE *, size_t *, size_t *, const char[3], int);\n\n/*===\nDeclaration\n    DeclarationSpecifier\n        TypeSpecifier Char\n    InitDeclarator\n        Declarator\n            DeclaratorKind\n                Identifier \"fparseln\"\n            DerivedDeclarator Pointer\n            DerivedDeclarator\n                FunctionDeclarator\n                    ParameterDeclaration\n                        DeclarationSpecifier\n                            TypeSpecifier TypedefName\n                                Identifier \"FILE\"\n                        Declarator\n                            DeclaratorKind Abstract\n                            DerivedDeclarator Pointer\n                    ParameterDeclaration\n                        DeclarationSpecifier\n                            TypeSpecifier TypedefName\n                                Identifier \"size_t\"\n                        Declarator\n                            DeclaratorKind Abstract\n                            DerivedDeclarator Pointer\n                    ParameterDeclaration\n                        DeclarationSpecifier\n                            TypeSpecifier TypedefName\n                                Identifier \"size_t\"\n                        Declarator\n                            DeclaratorKind Abstract\n                            DerivedDeclarator Pointer\n                    ParameterDeclaration\n                        DeclarationSpecifier\n                            TypeQualifier Const\n                        DeclarationSpecifier\n                            TypeSpecifier Char\n                        Declarator\n                            DeclaratorKind Abstract\n                            DerivedDeclarator\n                                ArrayDeclarator\n                                    ArraySize VariableExpression\n                                        Expression\n                                            Constant\n                                                Integer \"3\"\n                                                    IntegerBase Decimal\n                                                    IntegerSuffix false false\n                                                        IntegerSize Int\n                    ParameterDeclaration\n                        DeclarationSpecifier\n                            TypeSpecifier Int\n                    Ellipsis None\n===*/\n"
  },
  {
    "path": "reftests/declaration-983.c",
    "content": "#pragma gnu\n#pragma typedef size_t\nextern int strerror_r (int __errnum, char *__buf, size_t __buflen)\n__asm__  (\"\" \"__xpg_strerror_r\") __attribute__ ((__nothrow__ , __leaf__))\n__attribute__ ((__nonnull__ (2)));\n\n/*===\nDeclaration\n    DeclarationSpecifier\n        StorageClassSpecifier Extern\n    DeclarationSpecifier\n        TypeSpecifier Int\n    InitDeclarator\n        Declarator\n            DeclaratorKind\n                Identifier \"strerror_r\"\n            DerivedDeclarator\n                FunctionDeclarator\n                    ParameterDeclaration\n                        DeclarationSpecifier\n                            TypeSpecifier Int\n                        Declarator\n                            DeclaratorKind\n                                Identifier \"__errnum\"\n                    ParameterDeclaration\n                        DeclarationSpecifier\n                            TypeSpecifier Char\n                        Declarator\n                            DeclaratorKind\n                                Identifier \"__buf\"\n                            DerivedDeclarator Pointer\n                    ParameterDeclaration\n                        DeclarationSpecifier\n                            TypeSpecifier TypedefName\n                                Identifier \"size_t\"\n                        Declarator\n                            DeclaratorKind\n                                Identifier \"__buflen\"\n                    Ellipsis None\n            Extension\n                StringLiteral [\"\\\"\\\"\", \"\\\"__xpg_strerror_r\\\"\"]\n            Extension\n                Attribute \"__nothrow__\"\n            Extension\n                Attribute \"__leaf__\"\n            Extension\n                Attribute \"__nonnull__\"\n                    Expression\n                        Constant\n                            Integer \"2\"\n                                IntegerBase Decimal\n                                IntegerSuffix false false\n                                    IntegerSize Int\n===*/\n"
  },
  {
    "path": "reftests/declaration-block-2.c",
    "content": "#pragma clang\n\nvoid (^ const p)(int);\n\n/*===\nDeclaration\n    DeclarationSpecifier\n        TypeSpecifier Void\n    InitDeclarator\n        Declarator\n            DeclaratorKind\n                Declarator\n                    DeclaratorKind\n                        Identifier \"p\"\n                    DerivedDeclarator Block\n                        PointerQualifier\n                            TypeQualifier Const\n            DerivedDeclarator\n                FunctionDeclarator\n                    ParameterDeclaration\n                        DeclarationSpecifier\n                            TypeSpecifier Int\n                    Ellipsis None\n===*/\n"
  },
  {
    "path": "reftests/declaration-block-3.c",
    "content": "#pragma clang\n#pragma typedef size_t\n\nvoid *bsearch_b(const void *__key, const void *__base, size_t __nel,\n     size_t __width, int (^ _Nonnull __compar)(const void *, const void *) __attribute__((__noescape__)))\n     __attribute__((availability(macosx,introduced=10.6)));\n\n/*===\nDeclaration\n    DeclarationSpecifier\n        TypeSpecifier Void\n    InitDeclarator\n        Declarator\n            DeclaratorKind\n                Identifier \"bsearch_b\"\n            DerivedDeclarator Pointer\n            DerivedDeclarator\n                FunctionDeclarator\n                    ParameterDeclaration\n                        DeclarationSpecifier\n                            TypeQualifier Const\n                        DeclarationSpecifier\n                            TypeSpecifier Void\n                        Declarator\n                            DeclaratorKind\n                                Identifier \"__key\"\n                            DerivedDeclarator Pointer\n                    ParameterDeclaration\n                        DeclarationSpecifier\n                            TypeQualifier Const\n                        DeclarationSpecifier\n                            TypeSpecifier Void\n                        Declarator\n                            DeclaratorKind\n                                Identifier \"__base\"\n                            DerivedDeclarator Pointer\n                    ParameterDeclaration\n                        DeclarationSpecifier\n                            TypeSpecifier TypedefName\n                                Identifier \"size_t\"\n                        Declarator\n                            DeclaratorKind\n                                Identifier \"__nel\"\n                    ParameterDeclaration\n                        DeclarationSpecifier\n                            TypeSpecifier TypedefName\n                                Identifier \"size_t\"\n                        Declarator\n                            DeclaratorKind\n                                Identifier \"__width\"\n                    ParameterDeclaration\n                        DeclarationSpecifier\n                            TypeSpecifier Int\n                        Declarator\n                            DeclaratorKind\n                                Declarator\n                                    DeclaratorKind\n                                        Identifier \"__compar\"\n                                    DerivedDeclarator Block\n                                        PointerQualifier\n                                            TypeQualifier Nonnull\n                            DerivedDeclarator\n                                FunctionDeclarator\n                                    ParameterDeclaration\n                                        DeclarationSpecifier\n                                            TypeQualifier Const\n                                        DeclarationSpecifier\n                                            TypeSpecifier Void\n                                        Declarator\n                                            DeclaratorKind Abstract\n                                            DerivedDeclarator Pointer\n                                    ParameterDeclaration\n                                        DeclarationSpecifier\n                                            TypeQualifier Const\n                                        DeclarationSpecifier\n                                            TypeSpecifier Void\n                                        Declarator\n                                            DeclaratorKind Abstract\n                                            DerivedDeclarator Pointer\n                                    Ellipsis None\n                        Extension\n                            Attribute \"__noescape__\"\n                    Ellipsis None\n            Extension\n                AvailabilityAttribute\n===*/\n"
  },
  {
    "path": "reftests/declaration-block-4.c",
    "content": "int ^none;\n\n/*===\n~ERROR\n===*/\n"
  },
  {
    "path": "reftests/declaration-block-5.c",
    "content": "int (^p)(int);\n\n/*===\n~ERROR\n===*/\n"
  },
  {
    "path": "reftests/declaration-block.c",
    "content": "#pragma clang\n\nint ^block;\n\n/*===\nDeclaration\n    DeclarationSpecifier\n        TypeSpecifier Int\n    InitDeclarator\n        Declarator\n            DeclaratorKind\n                Identifier \"block\"\n            DerivedDeclarator Block\n===*/\n"
  },
  {
    "path": "reftests/declaration-enum-attr.c",
    "content": "#pragma gnu\n\nenum {\n    SOME_THING = 0,\n    OTHER_THING = 1,\n    OLD_THING __attribute__((deprecated)) = 2,\n};\n\n/*===\nDeclaration\n    DeclarationSpecifier\n        TypeSpecifier\n            EnumType\n                Enumerator\n                    Identifier \"SOME_THING\"\n                    Expression\n                        Constant\n                            Integer \"0\"\n                                IntegerBase Decimal\n                                IntegerSuffix false false\n                                    IntegerSize Int\n                Enumerator\n                    Identifier \"OTHER_THING\"\n                    Expression\n                        Constant\n                            Integer \"1\"\n                                IntegerBase Decimal\n                                IntegerSuffix false false\n                                    IntegerSize Int\n                Enumerator\n                    Identifier \"OLD_THING\"\n                    Expression\n                        Constant\n                            Integer \"2\"\n                                IntegerBase Decimal\n                                IntegerSuffix false false\n                                    IntegerSize Int\n                    Extension\n                        Attribute \"deprecated\"\n===*/\n"
  },
  {
    "path": "reftests/declaration-ptr-attr1.c",
    "content": "#pragma gnu\n\nvoid (****f)(void) __attribute__((noreturn));\n\n/*===\nDeclaration\n    DeclarationSpecifier\n        TypeSpecifier Void\n    InitDeclarator\n        Declarator\n            DeclaratorKind\n                Declarator\n                    DeclaratorKind\n                        Identifier \"f\"\n                    DerivedDeclarator Pointer\n                    DerivedDeclarator Pointer\n                    DerivedDeclarator Pointer\n                    DerivedDeclarator Pointer\n            DerivedDeclarator\n                FunctionDeclarator\n                    ParameterDeclaration\n                        DeclarationSpecifier\n                            TypeSpecifier Void\n                    Ellipsis None\n            Extension\n                Attribute \"noreturn\"\n===*/\n"
  },
  {
    "path": "reftests/declaration-ptr-attr2.c",
    "content": "#pragma gnu\n\nvoid (__attribute__((noreturn)) ****f) (void);\n\n/*===\nDeclaration\n    DeclarationSpecifier\n        TypeSpecifier Void\n    InitDeclarator\n        Declarator\n            DeclaratorKind\n                Declarator\n                    DeclaratorKind\n                        Identifier \"f\"\n                    DerivedDeclarator Pointer\n                    DerivedDeclarator Pointer\n                    DerivedDeclarator Pointer\n                    DerivedDeclarator Pointer\n                    Extension\n                        Attribute \"noreturn\"\n            DerivedDeclarator\n                FunctionDeclarator\n                    ParameterDeclaration\n                        DeclarationSpecifier\n                            TypeSpecifier Void\n                    Ellipsis None\n===*/\n"
  },
  {
    "path": "reftests/declaration-ptr-attr3.c",
    "content": "#pragma gnu\n\nchar *__attribute__((aligned(8))) *f;\n/*===\nDeclaration\n    DeclarationSpecifier\n        TypeSpecifier Char\n    InitDeclarator\n        Declarator\n            DeclaratorKind\n                Identifier \"f\"\n            DerivedDeclarator Pointer\n                PointerQualifier\n                    Extension\n                        Attribute \"aligned\"\n                            Expression\n                                Constant\n                                    Integer \"8\"\n                                        IntegerBase Decimal\n                                        IntegerSuffix false false\n                                            IntegerSize Int\n            DerivedDeclarator Pointer\n===*/\n"
  },
  {
    "path": "reftests/declaration-struct.c",
    "content": "struct foo {\nint x;\n};\n\n/*===\nDeclaration\n    DeclarationSpecifier\n        TypeSpecifier\n            StructType\n                StructKind Struct\n                Identifier \"foo\"\n                StructDeclaration\n                    StructField\n                        SpecifierQualifier\n                            TypeSpecifier Int\n                        StructDeclarator\n                            Declarator\n                                DeclaratorKind\n                                    Identifier \"x\"\n===*/\n"
  },
  {
    "path": "reftests/declaration-typedef.c",
    "content": "typedef struct foo {\nint x;\n} bar;\n\n/*===\nDeclaration\n    DeclarationSpecifier\n        StorageClassSpecifier Typedef\n    DeclarationSpecifier\n        TypeSpecifier\n            StructType\n                StructKind Struct\n                Identifier \"foo\"\n                StructDeclaration\n                    StructField\n                        SpecifierQualifier\n                            TypeSpecifier Int\n                        StructDeclarator\n                            Declarator\n                                DeclaratorKind\n                                    Identifier \"x\"\n    InitDeclarator\n        Declarator\n            DeclaratorKind\n                Identifier \"bar\"\n===*/\n"
  },
  {
    "path": "reftests/expression-1295.c",
    "content": "#pragma gnu\n_Alignof(long long)\n\n/*===\nExpression\n    AlignOf\n        TypeName\n            SpecifierQualifier\n                TypeSpecifier Long\n            SpecifierQualifier\n                TypeSpecifier Long\n===*/\n"
  },
  {
    "path": "reftests/expression-1307.c",
    "content": "#pragma gnu\n__alignof(long long)\n\n/*===\nExpression\n    AlignOf\n        TypeName\n            SpecifierQualifier\n                TypeSpecifier Long\n            SpecifierQualifier\n                TypeSpecifier Long\n===*/\n"
  },
  {
    "path": "reftests/expression-1319.c",
    "content": "#pragma gnu\n__alignof__(long long)\n\n/*===\nExpression\n    AlignOf\n        TypeName\n            SpecifierQualifier\n                TypeSpecifier Long\n            SpecifierQualifier\n                TypeSpecifier Long\n===*/\n"
  },
  {
    "path": "reftests/expression-1338.c",
    "content": "#pragma gnu\n({ int p = 0; p; })\n\n/*===\nExpression\n    Statement Compound\n        BlockItem\n            Declaration\n                DeclarationSpecifier\n                    TypeSpecifier Int\n                InitDeclarator\n                    Declarator\n                        DeclaratorKind\n                            Identifier \"p\"\n                    Initializer\n                        Expression\n                            Constant\n                                Integer \"0\"\n                                    IntegerBase Decimal\n                                    IntegerSuffix false false\n                                        IntegerSize Int\n        BlockItem\n            Statement\n                Expression\n                    Identifier \"p\"\n===*/\n"
  },
  {
    "path": "reftests/expression-1370.c",
    "content": "#pragma gnu\n#pragma typedef U64\n(U64)foo\n\n/*===\nExpression\n    CastExpression\n        TypeName\n            SpecifierQualifier\n                TypeSpecifier TypedefName\n                    Identifier \"U64\"\n        Expression\n            Identifier \"foo\"\n===*/\n"
  },
  {
    "path": "reftests/expression-1523.c",
    "content": "#pragma gnu\n__builtin_offsetof(struct { struct { int b; } a[2]; }, a->b)\n\n/*===\nExpression\n    OffsetOfExpression\n        TypeName\n            SpecifierQualifier\n                TypeSpecifier\n                    StructType\n                        StructKind Struct\n                        StructDeclaration\n                            StructField\n                                SpecifierQualifier\n                                    TypeSpecifier\n                                        StructType\n                                            StructKind Struct\n                                            StructDeclaration\n                                                StructField\n                                                    SpecifierQualifier\n                                                        TypeSpecifier Int\n                                                    StructDeclarator\n                                                        Declarator\n                                                            DeclaratorKind\n                                                                Identifier \"b\"\n                                StructDeclarator\n                                    Declarator\n                                        DeclaratorKind\n                                            Identifier \"a\"\n                                        DerivedDeclarator\n                                            ArrayDeclarator\n                                                ArraySize VariableExpression\n                                                    Expression\n                                                        Constant\n                                                            Integer \"2\"\n                                                                IntegerBase Decimal\n                                                                IntegerSuffix false false\n                                                                    IntegerSize Int\n        OffsetDesignator\n            Identifier \"a\"\n            OffsetMember IndirectMember\n                Identifier \"b\"\n===*/\n"
  },
  {
    "path": "reftests/expression-1595.c",
    "content": "#pragma gnu\nfoo(bar, baz)\n\n/*===\nExpression\n    CallExpression\n        Expression\n            Identifier \"foo\"\n        Expression\n            Identifier \"bar\"\n        Expression\n            Identifier \"baz\"\n===*/\n"
  },
  {
    "path": "reftests/expression-2224.c",
    "content": "#pragma gnu\n__func__\n\n/*===\nExpression\n    Identifier \"__func__\"\n===*/\n"
  },
  {
    "path": "reftests/expression-2229.c",
    "content": "#pragma gnu\n__FUNCTION__\n\n/*===\nExpression\n    Identifier \"__FUNCTION__\"\n===*/\n"
  },
  {
    "path": "reftests/expression-2234.c",
    "content": "#pragma gnu\n__PRETTY_FUNCTION__\n\n/*===\nExpression\n    Identifier \"__PRETTY_FUNCTION__\"\n===*/\n"
  },
  {
    "path": "reftests/expression-2546.c",
    "content": "#pragma gnu\n(struct test_struct) { 1, .x = 2, 3 }\n\n/*===\nExpression\n    CompoundLiteral\n        TypeName\n            SpecifierQualifier\n                TypeSpecifier\n                    StructType\n                        StructKind Struct\n                        Identifier \"test_struct\"\n        InitializerListItem\n            Initializer\n                Expression\n                    Constant\n                        Integer \"1\"\n                            IntegerBase Decimal\n                            IntegerSuffix false false\n                                IntegerSize Int\n        InitializerListItem\n            Designator\n                Identifier \"x\"\n            Initializer\n                Expression\n                    Constant\n                        Integer \"2\"\n                            IntegerBase Decimal\n                            IntegerSuffix false false\n                                IntegerSize Int\n        InitializerListItem\n            Initializer\n                Expression\n                    Constant\n                        Integer \"3\"\n                            IntegerBase Decimal\n                            IntegerSuffix false false\n                                IntegerSize Int\n===*/\n"
  },
  {
    "path": "reftests/expression-475.c",
    "content": "#pragma gnu\n\"foo\"\n\n/*===\nExpression\n    StringLiteral [\"\\\"foo\\\"\"]\n===*/\n"
  },
  {
    "path": "reftests/expression-476.c",
    "content": "#pragma gnu\n\"foo\\n\"\n\n/*===\nExpression\n    StringLiteral [\"\\\"foo\\\\n\\\"\"]\n===*/\n"
  },
  {
    "path": "reftests/expression-477.c",
    "content": "#pragma gnu\n\"\\'\\\"\"\n\n/*===\nExpression\n    StringLiteral [\"\\\"\\\\\\'\\\\\\\"\\\"\"]\n===*/\n"
  },
  {
    "path": "reftests/expression-478.c",
    "content": "#pragma gnu\n\"\\xaf\"\n\n/*===\nExpression\n    StringLiteral [\"\\\"\\\\xaf\\\"\"]\n===*/\n"
  },
  {
    "path": "reftests/expression-491.c",
    "content": "#pragma gnu\na  ++\n\n/*===\nExpression\n    UnaryOperatorExpression\n        Expression\n            Identifier \"a\"\n        UnaryOperator PostIncrement\n===*/\n"
  },
  {
    "path": "reftests/expression-495.c",
    "content": "#pragma gnu\na.b->c[ d[ e ] ] ++\n\n/*===\nExpression\n    UnaryOperatorExpression\n        Expression\n            BinaryOperatorExpression\n                Expression\n                    MemberExpression\n                        MemberOperator Indirect\n                        Expression\n                            MemberExpression\n                                MemberOperator Direct\n                                Expression\n                                    Identifier \"a\"\n                                Identifier \"b\"\n                        Identifier \"c\"\n                Expression\n                    BinaryOperatorExpression\n                        Expression\n                            Identifier \"d\"\n                        Expression\n                            Identifier \"e\"\n                        BinaryOperator Index\n                BinaryOperator Index\n        UnaryOperator PostIncrement\n===*/\n"
  },
  {
    "path": "reftests/expression-517.c",
    "content": "#pragma gnu\na-- * ++b / c\n\n/*===\nExpression\n    BinaryOperatorExpression\n        Expression\n            BinaryOperatorExpression\n                Expression\n                    UnaryOperatorExpression\n                        Expression\n                            Identifier \"a\"\n                        UnaryOperator PostDecrement\n                Expression\n                    UnaryOperatorExpression\n                        UnaryOperator PreIncrement\n                        Expression\n                            Identifier \"b\"\n                BinaryOperator Multiply\n        Expression\n            Identifier \"c\"\n        BinaryOperator Divide\n===*/\n"
  },
  {
    "path": "reftests/expression-538.c",
    "content": "#pragma gnu\na && b\n\n/*===\nExpression\n    BinaryOperatorExpression\n        Expression\n            Identifier \"a\"\n        Expression\n            Identifier \"b\"\n        BinaryOperator LogicalAnd\n===*/\n"
  },
  {
    "path": "reftests/expression-551.c",
    "content": "#pragma gnu\na && b && c\n\n/*===\nExpression\n    BinaryOperatorExpression\n        Expression\n            BinaryOperatorExpression\n                Expression\n                    Identifier \"a\"\n                Expression\n                    Identifier \"b\"\n                BinaryOperator LogicalAnd\n        Expression\n            Identifier \"c\"\n        BinaryOperator LogicalAnd\n===*/\n"
  },
  {
    "path": "reftests/expression-567.c",
    "content": "#pragma gnu\na || b || c\n\n/*===\nExpression\n    BinaryOperatorExpression\n        Expression\n            BinaryOperatorExpression\n                Expression\n                    Identifier \"a\"\n                Expression\n                    Identifier \"b\"\n                BinaryOperator LogicalOr\n        Expression\n            Identifier \"c\"\n        BinaryOperator LogicalOr\n===*/\n"
  },
  {
    "path": "reftests/expression-583.c",
    "content": "#pragma gnu\na << b << c\n\n/*===\nExpression\n    BinaryOperatorExpression\n        Expression\n            BinaryOperatorExpression\n                Expression\n                    Identifier \"a\"\n                Expression\n                    Identifier \"b\"\n                BinaryOperator ShiftLeft\n        Expression\n            Identifier \"c\"\n        BinaryOperator ShiftLeft\n===*/\n"
  },
  {
    "path": "reftests/expression-599.c",
    "content": "#pragma gnu\na >> b >> c\n\n/*===\nExpression\n    BinaryOperatorExpression\n        Expression\n            BinaryOperatorExpression\n                Expression\n                    Identifier \"a\"\n                Expression\n                    Identifier \"b\"\n                BinaryOperator ShiftRight\n        Expression\n            Identifier \"c\"\n        BinaryOperator ShiftRight\n===*/\n"
  },
  {
    "path": "reftests/expression-616.c",
    "content": "#pragma gnu\na\n\n/*===\nExpression\n    Identifier \"a\"\n===*/\n"
  },
  {
    "path": "reftests/expression-617.c",
    "content": "#pragma gnu\na, a, a,a\n,a\n\n/*===\nExpression\n    Expression\n        Identifier \"a\"\n    Expression\n        Identifier \"a\"\n    Expression\n        Identifier \"a\"\n    Expression\n        Identifier \"a\"\n    Expression\n        Identifier \"a\"\n===*/\n"
  },
  {
    "path": "reftests/expression-632.c",
    "content": "#pragma gnu\n(int) 1\n\n/*===\nExpression\n    CastExpression\n        TypeName\n            SpecifierQualifier\n                TypeSpecifier Int\n        Expression\n            Constant\n                Integer \"1\"\n                    IntegerBase Decimal\n                    IntegerSuffix false false\n                        IntegerSize Int\n===*/\n"
  },
  {
    "path": "reftests/expression-645.c",
    "content": "#pragma gnu\n(foo) 1\n\n/*===\n~ERROR\n===*/\n"
  },
  {
    "path": "reftests/expression-ident-const.c",
    "content": "uident, Uident, Lident, u8ident,\nu\"str\", U\"str\", L\"str\", u8\"str\",\nu'chr', U'chr', L'chr'\n\n/*===\nExpression\n    Expression\n        Identifier \"uident\"\n    Expression\n        Identifier \"Uident\"\n    Expression\n        Identifier \"Lident\"\n    Expression\n        Identifier \"u8ident\"\n    Expression\n        StringLiteral [\"u\\\"str\\\"\"]\n    Expression\n        StringLiteral [\"U\\\"str\\\"\"]\n    Expression\n        StringLiteral [\"L\\\"str\\\"\"]\n    Expression\n        StringLiteral [\"u8\\\"str\\\"\"]\n    Expression\n        Constant Character u'chr'\n    Expression\n        Constant Character U'chr'\n    Expression\n        Constant Character L'chr'\n===*/\n"
  },
  {
    "path": "reftests/expression-sizeof.c",
    "content": "#pragma typedef a\nsizeof(a) + sizeof b + sizeof(c*10)\n/*===\nExpression\n    BinaryOperatorExpression\n        Expression\n            BinaryOperatorExpression\n                Expression\n                    SizeOfTy\n                        TypeName\n                            SpecifierQualifier\n                                TypeSpecifier TypedefName\n                                    Identifier \"a\"\n                Expression\n                    SizeOfVal\n                        Expression\n                            Identifier \"b\"\n                BinaryOperator Plus\n        Expression\n            SizeOfVal\n                Expression\n                    BinaryOperatorExpression\n                        Expression\n                            Identifier \"c\"\n                        Expression\n                            Constant\n                                Integer \"10\"\n                                    IntegerBase Decimal\n                                    IntegerSuffix false false\n                                        IntegerSize Int\n                        BinaryOperator Multiply\n        BinaryOperator Plus\n===*/\n"
  },
  {
    "path": "reftests/expression-string-1.c",
    "content": "L\"..\"\n/*===\nExpression\n    StringLiteral [\"L\\\"..\\\"\"]\n===*/\n"
  },
  {
    "path": "reftests/expression-string-2.c",
    "content": "u8\"..\"\n/*===\nExpression\n    StringLiteral [\"u8\\\"..\\\"\"]\n===*/\n"
  },
  {
    "path": "reftests/statement-1408.c",
    "content": "#pragma gnu\n__asm (\"pmovmskb %1, %0\" : \"=r\" (__m) : \"x\" (__x));\n\n/*===\nStatement\n    AsmStatement\n        GnuExtendedAsmStatement\n            StringLiteral [\"\\\"pmovmskb %1, %0\\\"\"]\n            GnuAsmOperand\n                StringLiteral [\"\\\"=r\\\"\"]\n                Expression\n                    Identifier \"__m\"\n            GnuAsmOperand\n                StringLiteral [\"\\\"x\\\"\"]\n                Expression\n                    Identifier \"__x\"\n===*/\n"
  },
  {
    "path": "reftests/statement-1650.c",
    "content": "#pragma gnu\nif (x) do {} while(y); else z();\n\n/*===\nStatement\n    IfStatement\n        Expression\n            Identifier \"x\"\n        Statement\n            DoWhileStatement\n                Statement Compound\n                Expression\n                    Identifier \"y\"\n        Statement\n            Expression\n                CallExpression\n                    Expression\n                        Identifier \"z\"\n===*/\n"
  },
  {
    "path": "reftests/statement-2625.c",
    "content": "// #27\n#pragma gnu\n#pragma typedef test_t\nreturn (test_t) { 1, .x = 2, 3 };\n\n/*===\nStatement Return\n    Expression\n        CompoundLiteral\n            TypeName\n                SpecifierQualifier\n                    TypeSpecifier TypedefName\n                        Identifier \"test_t\"\n            InitializerListItem\n                Initializer\n                    Expression\n                        Constant\n                            Integer \"1\"\n                                IntegerBase Decimal\n                                IntegerSuffix false false\n                                    IntegerSize Int\n            InitializerListItem\n                Designator\n                    Identifier \"x\"\n                Initializer\n                    Expression\n                        Constant\n                            Integer \"2\"\n                                IntegerBase Decimal\n                                IntegerSuffix false false\n                                    IntegerSize Int\n            InitializerListItem\n                Initializer\n                    Expression\n                        Constant\n                            Integer \"3\"\n                                IntegerBase Decimal\n                                IntegerSuffix false false\n                                    IntegerSize Int\n===*/\n"
  },
  {
    "path": "reftests/statement-2669.c",
    "content": "// #27 - make sure expressions starting with a type name in parens still work\n#pragma gnu\n#pragma typedef test_t\nreturn (test_t) + 1;\n\n/*===\nStatement Return\n    Expression\n        CastExpression\n            TypeName\n                SpecifierQualifier\n                    TypeSpecifier TypedefName\n                        Identifier \"test_t\"\n            Expression\n                UnaryOperatorExpression\n                    UnaryOperator Plus\n                    Expression\n                        Constant\n                            Integer \"1\"\n                                IntegerBase Decimal\n                                IntegerSuffix false false\n                                    IntegerSize Int\n===*/\n"
  },
  {
    "path": "reftests/statement-case.c",
    "content": "case 1: ;\n/*===\nStatement\n    LabeledStatement\n        Label\n            Expression\n                Constant\n                    Integer \"1\"\n                        IntegerBase Decimal\n                        IntegerSuffix false false\n                            IntegerSize Int\n        Statement\n===*/\n"
  },
  {
    "path": "reftests/statement-case2.c",
    "content": "case 1+2: ;\n/*===\nStatement\n    LabeledStatement\n        Label\n            Expression\n                BinaryOperatorExpression\n                    Expression\n                        Constant\n                            Integer \"1\"\n                                IntegerBase Decimal\n                                IntegerSuffix false false\n                                    IntegerSize Int\n                    Expression\n                        Constant\n                            Integer \"2\"\n                                IntegerBase Decimal\n                                IntegerSuffix false false\n                                    IntegerSize Int\n                    BinaryOperator Plus\n        Statement\n===*/\n"
  },
  {
    "path": "reftests/statement-caserange.c",
    "content": "case 1 ... 2: ;\n/*===\n~ERROR\n===*/\n"
  },
  {
    "path": "reftests/statement-caserange2.c",
    "content": "#pragma gnu\ncase 1 ... 2: ;\n/*===\nStatement\n    LabeledStatement\n        Label\n            CaseRange\n                Expression\n                    Constant\n                        Integer \"1\"\n                            IntegerBase Decimal\n                            IntegerSuffix false false\n                                IntegerSize Int\n                Expression\n                    Constant\n                        Integer \"2\"\n                            IntegerBase Decimal\n                            IntegerSuffix false false\n                                IntegerSize Int\n        Statement\n===*/\n"
  },
  {
    "path": "reftests/statement-caserange3.c",
    "content": "#pragma gnu\ncase 'a'...'z':;\n/*===\nStatement\n    LabeledStatement\n        Label\n            CaseRange\n                Expression\n                    Constant Character 'a'\n                Expression\n                    Constant Character 'z'\n        Statement\n===*/\n"
  },
  {
    "path": "reftests/statement-caserange4.c",
    "content": "#pragma gnu\nswitch(num) {\n    for(;;) {\n\tcase 1 ... 10:\n\treturn;\n\tbreak;\n    }\n}\n/*===\nStatement\n    SwitchStatement\n        Expression\n            Identifier \"num\"\n        Statement Compound\n            BlockItem\n                Statement\n                    ForStatement\n                        ForInitializer Empty\n                        Statement Compound\n                            BlockItem\n                                Statement\n                                    LabeledStatement\n                                        Label\n                                            CaseRange\n                                                Expression\n                                                    Constant\n                                                        Integer \"1\"\n                                                            IntegerBase Decimal\n                                                            IntegerSuffix false false\n                                                                IntegerSize Int\n                                                Expression\n                                                    Constant\n                                                        Integer \"10\"\n                                                            IntegerBase Decimal\n                                                            IntegerSuffix false false\n                                                                IntegerSize Int\n                                        Statement Return\n                            BlockItem\n                                Statement Break\n===*/\n"
  },
  {
    "path": "reftests/statement-caserange5.c",
    "content": "#pragma gnu\ncase 1...3:;\n\n/*===\n~ERROR\n===*/\n"
  },
  {
    "path": "reftests/statement-default.c",
    "content": "default:;\n/*===\nStatement\n    LabeledStatement\n        Label Default\n        Statement\n===*/\n"
  },
  {
    "path": "reftests/statement-label.c",
    "content": "foo: {}\n/*===\nStatement\n    LabeledStatement\n        Label\n            Identifier \"foo\"\n        Statement Compound\n===*/\n"
  },
  {
    "path": "reftests/translation_unit-1183.c",
    "content": "#pragma gnu\nextern __inline __attribute__ ((__always_inline__)) __attribute__\n((__artificial__)) __attribute__ ((__warn_unused_result__)) char *\n__attribute__ ((__nothrow__ , __leaf__)) realpath (const char *__restrict\n__name, char *__restrict __resolved) {}\n\n/*===\nTranslationUnit\n    ExternalDeclaration\n        FunctionDefinition\n            DeclarationSpecifier\n                StorageClassSpecifier Extern\n            DeclarationSpecifier\n                FunctionSpecifier Inline\n            DeclarationSpecifier\n                Extension\n                    Attribute \"__always_inline__\"\n            DeclarationSpecifier\n                Extension\n                    Attribute \"__artificial__\"\n            DeclarationSpecifier\n                Extension\n                    Attribute \"__warn_unused_result__\"\n            DeclarationSpecifier\n                TypeSpecifier Char\n            Declarator\n                DeclaratorKind\n                    Identifier \"realpath\"\n                DerivedDeclarator Pointer\n                    PointerQualifier\n                        Extension\n                            Attribute \"__nothrow__\"\n                        Extension\n                            Attribute \"__leaf__\"\n                DerivedDeclarator\n                    FunctionDeclarator\n                        ParameterDeclaration\n                            DeclarationSpecifier\n                                TypeQualifier Const\n                            DeclarationSpecifier\n                                TypeSpecifier Char\n                            Declarator\n                                DeclaratorKind\n                                    Identifier \"__name\"\n                                DerivedDeclarator Pointer\n                                    PointerQualifier\n                                        TypeQualifier Restrict\n                        ParameterDeclaration\n                            DeclarationSpecifier\n                                TypeSpecifier Char\n                            Declarator\n                                DeclaratorKind\n                                    Identifier \"__resolved\"\n                                DerivedDeclarator Pointer\n                                    PointerQualifier\n                                        TypeQualifier Restrict\n                        Ellipsis None\n            Statement Compound\n===*/\n"
  },
  {
    "path": "reftests/translation_unit-1388.c",
    "content": "#pragma gnu\n# 1 \"<stdin>\"\n# 1 \"<built-in>\"\n# 1 \"<command-line>\"\n# 31 \"<command-line>\"\n# 1 \"/usr/include/stdc-predef.h\" 1 3 4\n# 32 \"<command-line>\" 2\n# 1 \"<stdin>\"\n\n/*===\nTranslationUnit\n===*/\n"
  },
  {
    "path": "reftests/translation_unit-1692.c",
    "content": "// Check that a typedef that can be mistaken for a K&R-style argument declaration is correctly\n// parsed as an external declaration. What went wrong: until we encounter bar, the thing looks like\n// a function definition, where the name is followed by a two declarations K&R-style, similar to:\n//\n// ```\n// int foo(i)\n// int i; // <-- __attribute__ and typedef occupy this slot, since both are valid declarations.\n// { }\n// ```\n\n#pragma gnu\n\nint foo (int) __attribute__ ((__nothrow__));\ntypedef int named;\nint bar (int f) { }\n\n\n/*===\nTranslationUnit\n    ExternalDeclaration\n        Declaration\n            DeclarationSpecifier\n                TypeSpecifier Int\n            InitDeclarator\n                Declarator\n                    DeclaratorKind\n                        Identifier \"foo\"\n                    DerivedDeclarator\n                        FunctionDeclarator\n                            ParameterDeclaration\n                                DeclarationSpecifier\n                                    TypeSpecifier Int\n                            Ellipsis None\n                    Extension\n                        Attribute \"__nothrow__\"\n    ExternalDeclaration\n        Declaration\n            DeclarationSpecifier\n                StorageClassSpecifier Typedef\n            DeclarationSpecifier\n                TypeSpecifier Int\n            InitDeclarator\n                Declarator\n                    DeclaratorKind\n                        Identifier \"named\"\n    ExternalDeclaration\n        FunctionDefinition\n            DeclarationSpecifier\n                TypeSpecifier Int\n            Declarator\n                DeclaratorKind\n                    Identifier \"bar\"\n                DerivedDeclarator\n                    FunctionDeclarator\n                        ParameterDeclaration\n                            DeclarationSpecifier\n                                TypeSpecifier Int\n                            Declarator\n                                DeclaratorKind\n                                    Identifier \"f\"\n                        Ellipsis None\n            Statement Compound\n===*/\n"
  },
  {
    "path": "reftests/translation_unit-1781.c",
    "content": "#pragma gnu\nint foo(int a __attribute__((unused)), int b __attribute__((unused))) {}\n\n/*===\nTranslationUnit\n    ExternalDeclaration\n        FunctionDefinition\n            DeclarationSpecifier\n                TypeSpecifier Int\n            Declarator\n                DeclaratorKind\n                    Identifier \"foo\"\n                DerivedDeclarator\n                    FunctionDeclarator\n                        ParameterDeclaration\n                            DeclarationSpecifier\n                                TypeSpecifier Int\n                            Declarator\n                                DeclaratorKind\n                                    Identifier \"a\"\n                            Extension\n                                Attribute \"unused\"\n                        ParameterDeclaration\n                            DeclarationSpecifier\n                                TypeSpecifier Int\n                            Declarator\n                                DeclaratorKind\n                                    Identifier \"b\"\n                            Extension\n                                Attribute \"unused\"\n                        Ellipsis None\n            Statement Compound\n===*/\n"
  },
  {
    "path": "reftests/translation_unit-1961.c",
    "content": "#pragma gnu\n\ntypedef int a;\nint foo() {\nint a;\n}\n\n/*===\nTranslationUnit\n    ExternalDeclaration\n        Declaration\n            DeclarationSpecifier\n                StorageClassSpecifier Typedef\n            DeclarationSpecifier\n                TypeSpecifier Int\n            InitDeclarator\n                Declarator\n                    DeclaratorKind\n                        Identifier \"a\"\n    ExternalDeclaration\n        FunctionDefinition\n            DeclarationSpecifier\n                TypeSpecifier Int\n            Declarator\n                DeclaratorKind\n                    Identifier \"foo\"\n                DerivedDeclarator KRFunction\n            Statement Compound\n                BlockItem\n                    Declaration\n                        DeclarationSpecifier\n                            TypeSpecifier Int\n                        InitDeclarator\n                            Declarator\n                                DeclaratorKind\n                                    Identifier \"a\"\n===*/\n"
  },
  {
    "path": "reftests/translation_unit-1993.c",
    "content": "#pragma gnu\n\ntypedef int a;\nvoid foo() {\nunsigned int;\nconst a;\na x;\nunsigned a;\na = 1;\n}\n\n/*===\nTranslationUnit\n    ExternalDeclaration\n        Declaration\n            DeclarationSpecifier\n                StorageClassSpecifier Typedef\n            DeclarationSpecifier\n                TypeSpecifier Int\n            InitDeclarator\n                Declarator\n                    DeclaratorKind\n                        Identifier \"a\"\n    ExternalDeclaration\n        FunctionDefinition\n            DeclarationSpecifier\n                TypeSpecifier Void\n            Declarator\n                DeclaratorKind\n                    Identifier \"foo\"\n                DerivedDeclarator KRFunction\n            Statement Compound\n                BlockItem\n                    Declaration\n                        DeclarationSpecifier\n                            TypeSpecifier Unsigned\n                        DeclarationSpecifier\n                            TypeSpecifier Int\n                BlockItem\n                    Declaration\n                        DeclarationSpecifier\n                            TypeQualifier Const\n                        DeclarationSpecifier\n                            TypeSpecifier TypedefName\n                                Identifier \"a\"\n                BlockItem\n                    Declaration\n                        DeclarationSpecifier\n                            TypeSpecifier TypedefName\n                                Identifier \"a\"\n                        InitDeclarator\n                            Declarator\n                                DeclaratorKind\n                                    Identifier \"x\"\n                BlockItem\n                    Declaration\n                        DeclarationSpecifier\n                            TypeSpecifier Unsigned\n                        InitDeclarator\n                            Declarator\n                                DeclaratorKind\n                                    Identifier \"a\"\n                BlockItem\n                    Statement\n                        Expression\n                            BinaryOperatorExpression\n                                Expression\n                                    Identifier \"a\"\n                                Expression\n                                    Constant\n                                        Integer \"1\"\n                                            IntegerBase Decimal\n                                            IntegerSuffix false false\n                                                IntegerSize Int\n                                BinaryOperator Assign\n===*/\n"
  },
  {
    "path": "reftests/translation_unit-2015.c",
    "content": "// If parameter list treated \"a\" as a type specifier instead of identifier, this would succeed.\n#pragma gnu\n\ntypedef int a;\nint foo(int a* b) {}\n\n/*===\n~ERROR\n===*/\n"
  },
  {
    "path": "reftests/translation_unit-2029.c",
    "content": "// If struct field treated \"a\" as a type specifier instead of identifier, this would succeed.\n\n#pragma gnu\n\ntypedef int a;\nstruct a { a a, b; };\n\n/*===\nTranslationUnit\n    ExternalDeclaration\n        Declaration\n            DeclarationSpecifier\n                StorageClassSpecifier Typedef\n            DeclarationSpecifier\n                TypeSpecifier Int\n            InitDeclarator\n                Declarator\n                    DeclaratorKind\n                        Identifier \"a\"\n    ExternalDeclaration\n        Declaration\n            DeclarationSpecifier\n                TypeSpecifier\n                    StructType\n                        StructKind Struct\n                        Identifier \"a\"\n                        StructDeclaration\n                            StructField\n                                SpecifierQualifier\n                                    TypeSpecifier TypedefName\n                                        Identifier \"a\"\n                                StructDeclarator\n                                    Declarator\n                                        DeclaratorKind\n                                            Identifier \"a\"\n                                StructDeclarator\n                                    Declarator\n                                        DeclaratorKind\n                                            Identifier \"b\"\n===*/\n"
  },
  {
    "path": "reftests/translation_unit-2045.c",
    "content": "// Struct fields maintain a separate\n\n#pragma gnu\n\ntypedef int a;\nstruct a { a a; a b; };\n\n/*===\nTranslationUnit\n    ExternalDeclaration\n        Declaration\n            DeclarationSpecifier\n                StorageClassSpecifier Typedef\n            DeclarationSpecifier\n                TypeSpecifier Int\n            InitDeclarator\n                Declarator\n                    DeclaratorKind\n                        Identifier \"a\"\n    ExternalDeclaration\n        Declaration\n            DeclarationSpecifier\n                TypeSpecifier\n                    StructType\n                        StructKind Struct\n                        Identifier \"a\"\n                        StructDeclaration\n                            StructField\n                                SpecifierQualifier\n                                    TypeSpecifier TypedefName\n                                        Identifier \"a\"\n                                StructDeclarator\n                                    Declarator\n                                        DeclaratorKind\n                                            Identifier \"a\"\n                        StructDeclaration\n                            StructField\n                                SpecifierQualifier\n                                    TypeSpecifier TypedefName\n                                        Identifier \"a\"\n                                StructDeclarator\n                                    Declarator\n                                        DeclaratorKind\n                                            Identifier \"b\"\n===*/\n"
  },
  {
    "path": "reftests/translation_unit-2060.c",
    "content": "#pragma gnu\n\ntypedef int a;\nvoid foo() {\na a;\n_Atomic (a) b;\n}\n\n/*===\n~ERROR\n===*/\n"
  },
  {
    "path": "reftests/translation_unit-2070.c",
    "content": "#pragma gnu\n\ntypedef int a;\nvoid foo(int a, _Atomic (a) b) {}\n\n/*===\n~ERROR\n===*/\n"
  },
  {
    "path": "reftests/translation_unit-2086.c",
    "content": "// Technically, \"a\" is defined as a symbol before the \"= ..\" part of the initializer is parsed.\n\n#pragma gnu\n\ntypedef int a;\nint foo() {\nint a = sizeof(_Atomic(a));\n}\n\n/*===\n~ERROR\n===*/\n"
  },
  {
    "path": "reftests/translation_unit-2103.c",
    "content": "// enum {a} defines a new variable \"a\" into the current scope. So the next _Atomic(a) must fail.\n\n#pragma gnu\n\ntypedef int a;\nint foo() {\nint x = (enum {a})1;\n_Atomic(a) b;\n}\n\n/*===\n~ERROR\n===*/\n"
  },
  {
    "path": "reftests/translation_unit-2114.c",
    "content": "// enum {a} defines a new variable \"a\" into the current scope immediately after its declaration.\n#pragma gnu\n\ntypedef int a;\nint foo() {\nint x = (enum {a, b = (a)1})1;\n}\n\n/*===\n~ERROR\n===*/\n"
  },
  {
    "path": "reftests/translation_unit-2129.c",
    "content": "#pragma gnu\n\ntypedef int a;\nint foo(a a) {}\nint bar(int a);\n_Atomic (a) b;\n\n\n/*===\nTranslationUnit\n    ExternalDeclaration\n        Declaration\n            DeclarationSpecifier\n                StorageClassSpecifier Typedef\n            DeclarationSpecifier\n                TypeSpecifier Int\n            InitDeclarator\n                Declarator\n                    DeclaratorKind\n                        Identifier \"a\"\n    ExternalDeclaration\n        FunctionDefinition\n            DeclarationSpecifier\n                TypeSpecifier Int\n            Declarator\n                DeclaratorKind\n                    Identifier \"foo\"\n                DerivedDeclarator\n                    FunctionDeclarator\n                        ParameterDeclaration\n                            DeclarationSpecifier\n                                TypeSpecifier TypedefName\n                                    Identifier \"a\"\n                            Declarator\n                                DeclaratorKind\n                                    Identifier \"a\"\n                        Ellipsis None\n            Statement Compound\n    ExternalDeclaration\n        Declaration\n            DeclarationSpecifier\n                TypeSpecifier Int\n            InitDeclarator\n                Declarator\n                    DeclaratorKind\n                        Identifier \"bar\"\n                    DerivedDeclarator\n                        FunctionDeclarator\n                            ParameterDeclaration\n                                DeclarationSpecifier\n                                    TypeSpecifier Int\n                                Declarator\n                                    DeclaratorKind\n                                        Identifier \"a\"\n                            Ellipsis None\n    ExternalDeclaration\n        Declaration\n            DeclarationSpecifier\n                TypeSpecifier Atomic\n                    TypeName\n                        SpecifierQualifier\n                            TypeSpecifier TypedefName\n                                Identifier \"a\"\n            InitDeclarator\n                Declarator\n                    DeclaratorKind\n                        Identifier \"b\"\n===*/\n"
  },
  {
    "path": "reftests/translation_unit-2147.c",
    "content": "#pragma gnu\n\nvoid foo() {\ntypedef int a;\n{\na a;\n}\n_Atomic (a) b;\n}\n\n/*===\nTranslationUnit\n    ExternalDeclaration\n        FunctionDefinition\n            DeclarationSpecifier\n                TypeSpecifier Void\n            Declarator\n                DeclaratorKind\n                    Identifier \"foo\"\n                DerivedDeclarator KRFunction\n            Statement Compound\n                BlockItem\n                    Declaration\n                        DeclarationSpecifier\n                            StorageClassSpecifier Typedef\n                        DeclarationSpecifier\n                            TypeSpecifier Int\n                        InitDeclarator\n                            Declarator\n                                DeclaratorKind\n                                    Identifier \"a\"\n                BlockItem\n                    Statement Compound\n                        BlockItem\n                            Declaration\n                                DeclarationSpecifier\n                                    TypeSpecifier TypedefName\n                                        Identifier \"a\"\n                                InitDeclarator\n                                    Declarator\n                                        DeclaratorKind\n                                            Identifier \"a\"\n                BlockItem\n                    Declaration\n                        DeclarationSpecifier\n                            TypeSpecifier Atomic\n                                TypeName\n                                    SpecifierQualifier\n                                        TypeSpecifier TypedefName\n                                            Identifier \"a\"\n                        InitDeclarator\n                            Declarator\n                                DeclaratorKind\n                                    Identifier \"b\"\n===*/\n"
  },
  {
    "path": "reftests/translation_unit-2167.c",
    "content": "#pragma gnu\n\ntypedef int a;\nvoid foo() {\nfor (a a;;)\na = a;\nwhile (true) {int a;}\ndo { int a; } while(true);\n_Atomic (a) b;\n}\n\n/*===\nTranslationUnit\n    ExternalDeclaration\n        Declaration\n            DeclarationSpecifier\n                StorageClassSpecifier Typedef\n            DeclarationSpecifier\n                TypeSpecifier Int\n            InitDeclarator\n                Declarator\n                    DeclaratorKind\n                        Identifier \"a\"\n    ExternalDeclaration\n        FunctionDefinition\n            DeclarationSpecifier\n                TypeSpecifier Void\n            Declarator\n                DeclaratorKind\n                    Identifier \"foo\"\n                DerivedDeclarator KRFunction\n            Statement Compound\n                BlockItem\n                    Statement\n                        ForStatement\n                            ForInitializer\n                                Declaration\n                                    DeclarationSpecifier\n                                        TypeSpecifier TypedefName\n                                            Identifier \"a\"\n                                    InitDeclarator\n                                        Declarator\n                                            DeclaratorKind\n                                                Identifier \"a\"\n                            Statement\n                                Expression\n                                    BinaryOperatorExpression\n                                        Expression\n                                            Identifier \"a\"\n                                        Expression\n                                            Identifier \"a\"\n                                        BinaryOperator Assign\n                BlockItem\n                    Statement\n                        WhileStatement\n                            Expression\n                                Identifier \"true\"\n                            Statement Compound\n                                BlockItem\n                                    Declaration\n                                        DeclarationSpecifier\n                                            TypeSpecifier Int\n                                        InitDeclarator\n                                            Declarator\n                                                DeclaratorKind\n                                                    Identifier \"a\"\n                BlockItem\n                    Statement\n                        DoWhileStatement\n                            Statement Compound\n                                BlockItem\n                                    Declaration\n                                        DeclarationSpecifier\n                                            TypeSpecifier Int\n                                        InitDeclarator\n                                            Declarator\n                                                DeclaratorKind\n                                                    Identifier \"a\"\n                            Expression\n                                Identifier \"true\"\n                BlockItem\n                    Declaration\n                        DeclarationSpecifier\n                            TypeSpecifier Atomic\n                                TypeName\n                                    SpecifierQualifier\n                                        TypeSpecifier TypedefName\n                                            Identifier \"a\"\n                        InitDeclarator\n                            Declarator\n                                DeclaratorKind\n                                    Identifier \"b\"\n===*/\n"
  },
  {
    "path": "reftests/translation_unit-2190.c",
    "content": "// Test that scope of \"if\" condition and statement is cleaned up.\n#pragma gnu\n\ntypedef int a, b;\nint x;\nvoid foo() {\nif (sizeof(enum {a})) x = sizeof(enum{b});\nelse x = b;\nswitch (sizeof(enum {b})) x = b;\na x, y;\nb z, w;\n}\n\n/*===\nTranslationUnit\n    ExternalDeclaration\n        Declaration\n            DeclarationSpecifier\n                StorageClassSpecifier Typedef\n            DeclarationSpecifier\n                TypeSpecifier Int\n            InitDeclarator\n                Declarator\n                    DeclaratorKind\n                        Identifier \"a\"\n            InitDeclarator\n                Declarator\n                    DeclaratorKind\n                        Identifier \"b\"\n    ExternalDeclaration\n        Declaration\n            DeclarationSpecifier\n                TypeSpecifier Int\n            InitDeclarator\n                Declarator\n                    DeclaratorKind\n                        Identifier \"x\"\n    ExternalDeclaration\n        FunctionDefinition\n            DeclarationSpecifier\n                TypeSpecifier Void\n            Declarator\n                DeclaratorKind\n                    Identifier \"foo\"\n                DerivedDeclarator KRFunction\n            Statement Compound\n                BlockItem\n                    Statement\n                        IfStatement\n                            Expression\n                                SizeOfTy\n                                    TypeName\n                                        SpecifierQualifier\n                                            TypeSpecifier\n                                                EnumType\n                                                    Enumerator\n                                                        Identifier \"a\"\n                            Statement\n                                Expression\n                                    BinaryOperatorExpression\n                                        Expression\n                                            Identifier \"x\"\n                                        Expression\n                                            SizeOfTy\n                                                TypeName\n                                                    SpecifierQualifier\n                                                        TypeSpecifier\n                                                            EnumType\n                                                                Enumerator\n                                                                    Identifier \"b\"\n                                        BinaryOperator Assign\n                            Statement\n                                Expression\n                                    BinaryOperatorExpression\n                                        Expression\n                                            Identifier \"x\"\n                                        Expression\n                                            Identifier \"b\"\n                                        BinaryOperator Assign\n                BlockItem\n                    Statement\n                        SwitchStatement\n                            Expression\n                                SizeOfTy\n                                    TypeName\n                                        SpecifierQualifier\n                                            TypeSpecifier\n                                                EnumType\n                                                    Enumerator\n                                                        Identifier \"b\"\n                            Statement\n                                Expression\n                                    BinaryOperatorExpression\n                                        Expression\n                                            Identifier \"x\"\n                                        Expression\n                                            Identifier \"b\"\n                                        BinaryOperator Assign\n                BlockItem\n                    Declaration\n                        DeclarationSpecifier\n                            TypeSpecifier TypedefName\n                                Identifier \"a\"\n                        InitDeclarator\n                            Declarator\n                                DeclaratorKind\n                                    Identifier \"x\"\n                        InitDeclarator\n                            Declarator\n                                DeclaratorKind\n                                    Identifier \"y\"\n                BlockItem\n                    Declaration\n                        DeclarationSpecifier\n                            TypeSpecifier TypedefName\n                                Identifier \"b\"\n                        InitDeclarator\n                            Declarator\n                                DeclaratorKind\n                                    Identifier \"z\"\n                        InitDeclarator\n                            Declarator\n                                DeclaratorKind\n                                    Identifier \"w\"\n===*/\n"
  },
  {
    "path": "reftests/translation_unit-2208.c",
    "content": "// Test that \"if\" condition enum constants are defined within its scope.\n\n#pragma gnu\n\ntypedef int a;\nvoid foo() {\nint x;\nif (sizeof(enum {a})) x = (_Atomic(a))1;\n}\n\n/*===\n~ERROR\n===*/\n"
  },
  {
    "path": "reftests/translation_unit-2270.c",
    "content": "#pragma gnu\n__extension__ union { long l; };\n\n/*===\nTranslationUnit\n    ExternalDeclaration\n        Declaration\n            DeclarationSpecifier\n                TypeSpecifier\n                    StructType\n                        StructKind Union\n                        StructDeclaration\n                            StructField\n                                SpecifierQualifier\n                                    TypeSpecifier Long\n                                StructDeclarator\n                                    Declarator\n                                        DeclaratorKind\n                                            Identifier \"l\"\n===*/\n"
  },
  {
    "path": "reftests/translation_unit-2300.c",
    "content": "#pragma gnu\n__extension__ _Static_assert(1,\"ERR\");\n\n/*===\nTranslationUnit\n    ExternalDeclaration\n        StaticAssert\n            Expression\n                Constant\n                    Integer \"1\"\n                        IntegerBase Decimal\n                        IntegerSuffix false false\n                            IntegerSize Int\n            StringLiteral [\"\\\"ERR\\\"\"]\n===*/\n"
  },
  {
    "path": "reftests/translation_unit-2373.c",
    "content": "#pragma gnu\nint main(argc, argv) int argc; char **argv; { }\n\n/*===\nTranslationUnit\n    ExternalDeclaration\n        FunctionDefinition\n            DeclarationSpecifier\n                TypeSpecifier Int\n            Declarator\n                DeclaratorKind\n                    Identifier \"main\"\n                DerivedDeclarator KRFunction\n                    Identifier \"argc\"\n                    Identifier \"argv\"\n            Declaration\n                DeclarationSpecifier\n                    TypeSpecifier Int\n                InitDeclarator\n                    Declarator\n                        DeclaratorKind\n                            Identifier \"argc\"\n            Declaration\n                DeclarationSpecifier\n                    TypeSpecifier Char\n                InitDeclarator\n                    Declarator\n                        DeclaratorKind\n                            Identifier \"argv\"\n                        DerivedDeclarator Pointer\n                        DerivedDeclarator Pointer\n            Statement Compound\n===*/\n"
  },
  {
    "path": "reftests/translation_unit-31-semicolon.c",
    "content": "#pragma gnu\n\nvoid f(void) {\n};\n\n\n/*===\nTranslationUnit\n    ExternalDeclaration\n        FunctionDefinition\n            DeclarationSpecifier\n                TypeSpecifier Void\n            Declarator\n                DeclaratorKind\n                    Identifier \"f\"\n                DerivedDeclarator\n                    FunctionDeclarator\n                        ParameterDeclaration\n                            DeclarationSpecifier\n                                TypeSpecifier Void\n                        Ellipsis None\n            Statement Compound\n===*/\n"
  },
  {
    "path": "src/ast.rs",
    "content": "//! Abstract syntax tree\n//!\n//! Types in this module represent various pieces a C program can\n//! contain after preprocessing phase. They mostly follow C11 grammar\n//! naming conventions.\n//!\n//! References to C11 standard given in parenthesis refer to the\n//! [ISO/IEC 9899:201x\n//! draft](http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf)\n//! published on April 12, 2011.\n//!\n//! A number of GNU extensions to the standard C are included here.\n//! Types, struct fields or enum variants specific to GNU are marked as\n//! \"GNU extension\" with a link to the relevant section of gcc\n//! documentation. Supported extensions are:\n//!\n//! - attributes in various positions\n//! - inline assembly statements and asm labels\n//! - extensions to the initializer list syntax\n//! - statement expressions\n//! - `typeof` type specifiers\n\nuse span::Node;\n\n// From 6.4 Lexical elements\n\n/// Variable, function and other names that are not type names\n///\n/// (C11 6.4.2)\n#[derive(Debug, PartialEq, Eq, Hash, Clone)]\npub struct Identifier {\n    pub name: String,\n}\n\n/// Constant literals\n///\n/// C11 places string literals under primary expressions, thus they\n/// are not included here.\n///\n/// (C11 6.4.4)\n#[derive(Debug, PartialEq, Eq, Hash, Clone)]\npub enum Constant {\n    Integer(Integer),\n    Float(Float),\n    Character(String),\n}\n\n/// Integer number literal\n///\n/// (C11 6.4.4.1)\n#[derive(Debug, PartialEq, Eq, Hash, Clone)]\npub struct Integer {\n    pub base: IntegerBase,\n    pub number: Box<str>,\n    pub suffix: IntegerSuffix,\n}\n\n/// Base of the integer literal\n///\n/// (C11 6.4.4.1)\n#[derive(Debug, PartialEq, Eq, Hash, Clone, Copy)]\npub enum IntegerBase {\n    Decimal,\n    Octal,\n    Hexadecimal,\n    /// [GNU extension](https://gcc.gnu.org/onlinedocs/gcc/Binary-constants.html)\n    Binary,\n}\n\n/// Suffix of an integer literal\n///\n/// (C11 6.4.4.1)\n#[derive(Debug, PartialEq, Eq, Hash, Clone, Copy)]\npub struct IntegerSuffix {\n    /// Minimum size of the integer literal\n    pub size: IntegerSize,\n    /// Integer literal has unsigned type\n    pub unsigned: bool,\n    /// Integer literal is an imaginary part of a complex number\n    ///\n    /// [GNU extension](https://gcc.gnu.org/onlinedocs/gcc/Complex.html) suffixes `i` and `j`.\n    pub imaginary: bool,\n}\n\n/// Size part of a integer literal suffix\n///\n/// (C11 6.4.4.1)\n#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Copy)]\npub enum IntegerSize {\n    /// no `l` or `ll`\n    Int = 0,\n    /// `l`\n    Long,\n    /// `ll`\n    LongLong,\n}\n\n/// Floating point number literal\n///\n/// (C11 6.4.4.2)\n#[derive(Debug, PartialEq, Eq, Hash, Clone)]\npub struct Float {\n    pub base: FloatBase,\n    pub number: Box<str>,\n    pub suffix: FloatSuffix,\n}\n\n/// Floating point number base\n///\n/// (C11 6.4.4.2)\n#[derive(Debug, PartialEq, Eq, Hash, Clone, Copy)]\npub enum FloatBase {\n    Decimal,\n    Hexadecimal,\n}\n\n/// Floating point number suffix\n///\n/// (C11 6.4.4.2)\n#[derive(Debug, PartialEq, Eq, Hash, Clone, Copy)]\npub struct FloatSuffix {\n    pub format: FloatFormat,\n    /// Integer literal is an imaginary part of a complex number\n    ///\n    /// [GNU extension](https://gcc.gnu.org/onlinedocs/gcc/Complex.html) suffixes `i` and `j`.\n    pub imaginary: bool,\n}\n\n/// Floating point literal format specified by the suffix\n///\n/// (C11 6.4.4.2)\n#[derive(Debug, PartialEq, Eq, Hash, Clone, Copy)]\npub enum FloatFormat {\n    /// `f` suffix\n    Float,\n    /// no suffix\n    Double,\n    /// `l` suffix\n    LongDouble,\n    /// [ISO/IEC TS 18661-2:2015](http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1912.pdf)\n    /// `df`, `dd`, `dl` suffixes\n    ///\n    /// [ISO/IEC TS 18661-3:2015](http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1945.pdf)\n    /// `fN`, `fNx`, `dN`, `dNx` suffixes\n    TS18661Format(TS18661FloatType),\n}\n\n/// String literal\n///\n/// (C11 6.4.5)\npub type StringLiteral = Vec<String>;\n\n// From 6.5 Expressions\n\n/// Expressions\n///\n/// (C11 6.5)\n#[derive(Debug, PartialEq, Clone)]\npub enum Expression {\n    /// Identifier\n    ///\n    /// May be a variable, function name or enumerator. The latter is\n    /// different from the standard, where enumerators are classified\n    /// as constants.\n    ///\n    /// (C11 6.5.1)\n    Identifier(Box<Node<Identifier>>),\n    /// Numeric and character constants\n    ///\n    /// Enumerator constants, being valid identifiers, are reprented\n    /// as `Identifier` in this enum.\n    ///\n    /// (C11 6.5.1)\n    Constant(Box<Node<Constant>>),\n\n    /// String literal\n    ///\n    /// (C11 6.5.1)\n    StringLiteral(Box<Node<StringLiteral>>),\n\n    /// Generic selection\n    ///\n    /// (C11 6.5.1.1)\n    GenericSelection(Box<Node<GenericSelection>>),\n\n    /// Structure and union members\n    ///\n    /// Both direct (`.`) and indirect (`->`) access.\n    ///\n    /// (C11 6.5.2)\n    Member(Box<Node<MemberExpression>>),\n\n    /// Function call expression\n    ///\n    /// (C11 6.5.2)\n    Call(Box<Node<CallExpression>>),\n\n    /// Compound literal\n    ///\n    /// (C11 6.5.2)\n    CompoundLiteral(Box<Node<CompoundLiteral>>),\n\n    /// Size of a type\n    ///\n    /// (C11 6.5.3)\n    SizeOfTy(Box<Node<SizeOfTy>>),\n\n    /// Size of a unary expression\n    ///\n    /// (C11 6.5.3)\n    SizeOfVal(Box<Node<SizeOfVal>>),\n\n    /// Alignment of a type\n    ///\n    /// (C11 6.5.3)\n    AlignOf(Box<Node<AlignOf>>),\n\n    /// Unary operators\n    ///\n    /// This represents both postfix and prefix unary oprators. Postfix expressions that take\n    /// additional operands are represented by a separate entry in this enum.\n    ///\n    /// (C11 6.5.2, c11 6.5.3)\n    UnaryOperator(Box<Node<UnaryOperatorExpression>>),\n\n    /// Cast expression\n    ///\n    /// `(type) expr`\n    ///\n    /// (C11 6.5.4)\n    Cast(Box<Node<CastExpression>>),\n\n    /// Binary operators\n    ///\n    /// All of C binary operators that can be applied to two expressions.\n    ///\n    /// (C11 6.5.5 -- 6.5.16)\n    BinaryOperator(Box<Node<BinaryOperatorExpression>>),\n\n    /// Conditional operator\n    ///\n    /// (C11 6.5.15)\n    Conditional(Box<Node<ConditionalExpression>>),\n\n    /// Comma operator\n    ///\n    /// (C11 6.5.17)\n    Comma(Box<Vec<Node<Expression>>>),\n\n    /// Member offset expression\n    ///\n    /// Result of expansion of `offsetof` macro.\n    ///\n    /// (C11 7.19 §3).\n    OffsetOf(Box<Node<OffsetOfExpression>>),\n\n    /// Variable argument list access\n    ///\n    /// Result of expansion of `va_arg` macro.\n    ///\n    /// (C11 7.16.1.1).\n    VaArg(Box<Node<VaArgExpression>>),\n\n    /// Statement expression\n    ///\n    /// [GNU extension](https://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html)\n    Statement(Box<Node<Statement>>),\n}\n\n/// Struct or union member access\n#[derive(Debug, PartialEq, Eq, Hash, Clone, Copy)]\npub enum MemberOperator {\n    /// `expression.identifier`\n    Direct,\n    /// `expression->identifier`\n    Indirect,\n}\n\n/// Generic selection expression\n///\n/// (C11 6.5.1.1)\n#[derive(Debug, PartialEq, Clone)]\npub struct GenericSelection {\n    pub expression: Box<Node<Expression>>,\n    pub associations: Vec<Node<GenericAssociation>>,\n}\n\n/// Single element of a generic selection expression\n///\n/// (C11 6.5.1.1)\n#[derive(Debug, PartialEq, Clone)]\npub enum GenericAssociation {\n    Type(Node<GenericAssociationType>),\n    Default(Box<Node<Expression>>),\n}\n\n/// Type match case in a generic selection expression\n///\n/// (C11 6.5.1.1)\n#[derive(Debug, PartialEq, Clone)]\npub struct GenericAssociationType {\n    pub type_name: Node<TypeName>,\n    pub expression: Box<Node<Expression>>,\n}\n\n/// Structure and union members\n///\n/// Both direct (`.`) and indirect (`->`) access.\n///\n/// (C11 6.5.2)\n#[derive(Debug, PartialEq, Clone)]\npub struct MemberExpression {\n    pub operator: Node<MemberOperator>,\n    pub expression: Box<Node<Expression>>,\n    pub identifier: Node<Identifier>,\n}\n\n/// Function call expression\n///\n/// (C11 6.5.2)\n#[derive(Debug, PartialEq, Clone)]\npub struct CallExpression {\n    pub callee: Box<Node<Expression>>,\n    pub arguments: Vec<Node<Expression>>,\n}\n\n/// Compound literal\n///\n/// (C11 6.5.2)\n#[derive(Debug, PartialEq, Clone)]\npub struct CompoundLiteral {\n    pub type_name: Node<TypeName>,\n    pub initializer_list: Vec<Node<InitializerListItem>>,\n}\n\n/// SizeOf a type\n///\n/// (C11 6.5.3)\n#[derive(Debug, PartialEq, Clone)]\npub struct SizeOfTy(pub Node<TypeName>);\n\n/// Size of an unary expression\n///\n/// (C11 6.5.3)\n#[derive(Debug, PartialEq, Clone)]\npub struct SizeOfVal(pub Box<Node<Expression>>);\n\n/// Alignment of a type\n///\n/// (C11 6.5.3)\n#[derive(Debug, PartialEq, Clone)]\npub struct AlignOf(pub Box<Node<TypeName>>);\n\n/// All operators with one operand\n///\n/// (C11 6.5)\n#[derive(Debug, PartialEq, Eq, Hash, Clone, Copy)]\npub enum UnaryOperator {\n    /// `operand++`\n    PostIncrement,\n    /// `operand--`\n    PostDecrement,\n    /// `++operand`\n    PreIncrement,\n    /// `--operand`\n    PreDecrement,\n    /// `&operand`\n    Address,\n    /// `*operand`\n    Indirection,\n    /// `+operand`\n    Plus,\n    /// `-operand`\n    Minus,\n    /// `~operand`\n    Complement,\n    /// `!operand`\n    Negate,\n}\n\n/// Unary operator expression\n///\n/// This represents both postfix and prefix unary oprators. Postfix expressions that take\n/// additional operands are represented by a separate entry in this enum.\n///\n/// (C11 6.5.2, c11 6.5.3)\n#[derive(Debug, PartialEq, Clone)]\npub struct UnaryOperatorExpression {\n    pub operator: Node<UnaryOperator>,\n    pub operand: Box<Node<Expression>>,\n}\n\n/// Cast expression\n///\n/// `(type) expr`\n///\n/// (C11 6.5.4)\n#[derive(Debug, PartialEq, Clone)]\npub struct CastExpression {\n    pub type_name: Node<TypeName>,\n    pub expression: Box<Node<Expression>>,\n}\n\n/// All operators with two operands\n///\n/// (C11 6.5)\n#[derive(Debug, PartialEq, Eq, Hash, Clone, Copy)]\npub enum BinaryOperator {\n    /// `lhs[rhs]`\n    Index,\n    /// `lhs * rhs`\n    Multiply,\n    /// `lhs / rhs`\n    Divide,\n    /// `lhs % rhs`\n    Modulo,\n    /// `lhs + rhs`\n    Plus,\n    /// `lhs - rhs`\n    Minus,\n    /// `lhs << rhs`\n    ShiftLeft,\n    /// `lhs >> rhs`\n    ShiftRight,\n    /// `lhs < rhs`\n    Less,\n    /// `lhs > rhs`\n    Greater,\n    /// `lhs <= rhs`\n    LessOrEqual,\n    /// `lhs >= rhs`\n    GreaterOrEqual,\n    /// `lhs == rhs`\n    Equals,\n    /// `lhs != rhs`\n    NotEquals,\n    /// `lhs & rhs`\n    BitwiseAnd,\n    /// `lhs ^ rhs`\n    BitwiseXor,\n    /// `lhs | rhs`\n    BitwiseOr,\n    /// `lhs && rhs`\n    LogicalAnd,\n    /// `lhs || rhs`\n    LogicalOr,\n    /// `lhs = rhs`\n    Assign,\n    /// `lhs *= rhs`\n    AssignMultiply,\n    /// `lhs /= rhs`\n    AssignDivide,\n    /// `lhs %= rhs`\n    AssignModulo,\n    /// `lhs += rhs`\n    AssignPlus,\n    /// `lhs -= rhs`\n    AssignMinus,\n    /// `lhs <<= rhs`\n    AssignShiftLeft,\n    /// `lhs >>= rhs`\n    AssignShiftRight,\n    /// `lhs &= rhs`\n    AssignBitwiseAnd,\n    /// `lhs ^= rhs`\n    AssignBitwiseXor,\n    /// `lhs |= rhs`\n    AssignBitwiseOr,\n}\n\n/// Binary operators\n///\n/// All of C binary operators that can be applied to two expressions.\n///\n/// (C11 6.5.5 -- 6.5.16)\n#[derive(Debug, PartialEq, Clone)]\npub struct BinaryOperatorExpression {\n    pub operator: Node<BinaryOperator>,\n    pub lhs: Box<Node<Expression>>,\n    pub rhs: Box<Node<Expression>>,\n}\n\n/// Conditional operator\n///\n/// (C11 6.5.15)\n#[derive(Debug, PartialEq, Clone)]\npub struct ConditionalExpression {\n    pub condition: Box<Node<Expression>>,\n    pub then_expression: Box<Node<Expression>>,\n    pub else_expression: Box<Node<Expression>>,\n}\n\n/// Variable argument list access\n///\n/// Result of expansion of `va_arg` macro.\n///\n/// (C11 7.16.1.1).\n#[derive(Debug, PartialEq, Clone)]\npub struct VaArgExpression {\n    pub va_list: Box<Node<Expression>>,\n    pub type_name: Node<TypeName>,\n}\n\n/// Member offset expression\n///\n/// Result of expansion of `offsetof` macro.\n///\n/// (C11 7.19 §3).\n#[derive(Debug, PartialEq, Clone)]\npub struct OffsetOfExpression {\n    pub type_name: Node<TypeName>,\n    pub designator: Node<OffsetDesignator>,\n}\n\n/// Offset designator in a `offsetof` macro expansion\n///\n/// (C11 7.19 §3).\n#[derive(Debug, PartialEq, Clone)]\npub struct OffsetDesignator {\n    pub base: Node<Identifier>,\n    pub members: Vec<Node<OffsetMember>>,\n}\n\n/// Single element of an offset designator\n///\n/// (C11 7.19 §3).\n#[derive(Debug, PartialEq, Clone)]\npub enum OffsetMember {\n    Member(Node<Identifier>),\n    IndirectMember(Node<Identifier>),\n    Index(Node<Expression>),\n}\n\n// From 6.7 Declarations\n\n/// Variable, function or type declaration\n///\n/// (C11 6.7)\n#[derive(Debug, PartialEq, Clone)]\npub struct Declaration {\n    pub specifiers: Vec<Node<DeclarationSpecifier>>,\n    pub declarators: Vec<Node<InitDeclarator>>,\n}\n\n/// Common part of a declaration\n///\n/// These apply to all declarators in a declaration.\n///\n/// (C11 6.7)\n#[derive(Debug, PartialEq, Clone)]\npub enum DeclarationSpecifier {\n    StorageClass(Node<StorageClassSpecifier>),\n    TypeSpecifier(Node<TypeSpecifier>),\n    TypeQualifier(Node<TypeQualifier>),\n    Function(Node<FunctionSpecifier>),\n    Alignment(Node<AlignmentSpecifier>),\n    /// Vendor-specific declaration extensions that can be mixed with standard specifiers\n    Extension(Vec<Node<Extension>>),\n}\n\n/// Defines a single name in a declaration\n///\n/// (C11 6.7.6)\n#[derive(Debug, PartialEq, Clone)]\npub struct InitDeclarator {\n    pub declarator: Node<Declarator>,\n    pub initializer: Option<Node<Initializer>>,\n}\n\n// From 6.7.1\n\n/// Storage class\n///\n/// (C11 6.7.1)\n#[derive(Debug, PartialEq, Eq, Hash, Clone, Copy)]\npub enum StorageClassSpecifier {\n    /// `typedef`\n    Typedef,\n    /// `extern`\n    Extern,\n    /// `static`\n    Static,\n    /// `_Thread_local`\n    ThreadLocal,\n    /// `auto`\n    Auto,\n    /// `register`\n    Register,\n}\n\n// From 6.7.2\n\n/// Type specifier\n///\n/// (C11 6.7.2)\n#[derive(Debug, PartialEq, Clone)]\npub enum TypeSpecifier {\n    /// `void`\n    Void,\n    /// `char`\n    Char,\n    /// `short`\n    Short,\n    /// `int`\n    Int,\n    /// `long`\n    Long,\n    /// `float`\n    Float,\n    /// `double`\n    Double,\n    /// `signed`\n    ///\n    /// `__signed`, `__signed__` (GNU extension)\n    Signed,\n    /// `unsigned`\n    Unsigned,\n    /// `_Bool`\n    Bool,\n    /// `_Complex`\n    ///\n    /// `__complex`, `__complex__` (GNU extension)\n    Complex,\n    /// `_Atomic(typename)`\n    Atomic(Node<TypeName>),\n    /// `struct identifier { … }`\n    ///\n    /// `union identifier { … }`\n    Struct(Node<StructType>),\n    /// `enum identifier { … }`\n    Enum(Node<EnumType>),\n    /// Name of a previously defined type\n    TypedefName(Node<Identifier>),\n    /// Specifies type of another type or expression\n    ///\n    /// [GNU extension](https://gcc.gnu.org/onlinedocs/gcc/Typeof.html)\n    TypeOf(Node<TypeOf>),\n    /// Floating point types with guaranteed width and representation\n    ///\n    /// `_Float16`, `_Float32`, `_Float64`, `_Float128`\n    ///\n    /// `_Float16x`, `_Float32x`, `_Float64x`, `_Float128x`\n    ///\n    /// `_Decimal16`, `_Decimal32`, `_Decimal64`, `_Decimal128`\n    ///\n    /// `_Decimal16x`, `_Decimal32x`, `_Decimal64x`, `_Decimal128x`\n    ///\n    /// [ISO/IEC TS 18661-3:2015](http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1945.pdf)\n    TS18661Float(TS18661FloatType),\n}\n\n/// Floating point type with guaranteed width and format\n///\n/// [ISO/IEC TS 18661-3:2015](http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1945.pdf)\n#[derive(Debug, PartialEq, Eq, Hash, Clone, Copy)]\npub struct TS18661FloatType {\n    pub format: TS18661FloatFormat,\n    pub width: usize,\n}\n\n/// Floating point formats\n///\n/// [ISO/IEC TS 18661-3:2015](http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1945.pdf)\n#[derive(Debug, PartialEq, Eq, Hash, Clone, Copy)]\npub enum TS18661FloatFormat {\n    BinaryInterchange,\n    BinaryExtended,\n    DecimalInterchange,\n    DecimalExtended,\n}\n\n// From 6.7.2.1\n\n/// Structure or union type specifier\n///\n/// (C11 6.7.2.1)\n#[derive(Debug, PartialEq, Clone)]\npub struct StructType {\n    pub kind: Node<StructKind>,\n    pub identifier: Option<Node<Identifier>>,\n    /// List of structure of union members, when present.\n    ///\n    /// A [GNU extension](https://gcc.gnu.org/onlinedocs/gcc-8.1.0/gcc/Empty-Structures.html) allows the list to be empty.\n    pub declarations: Option<Vec<Node<StructDeclaration>>>,\n}\n\n/// The only difference between a `struct` and a `union`\n///\n/// (C11 6.7.2.1)\n#[derive(Debug, PartialEq, Eq, Hash, Clone, Copy)]\npub enum StructKind {\n    Struct,\n    Union,\n}\n\n/// Single declaration in a struct or a union\n///\n/// (C11 6.7.2.1)\n#[derive(Debug, PartialEq, Clone)]\npub enum StructDeclaration {\n    Field(Node<StructField>),\n    StaticAssert(Node<StaticAssert>),\n}\n\n/// Struct field declaration\n#[derive(Debug, PartialEq, Clone)]\npub struct StructField {\n    pub specifiers: Vec<Node<SpecifierQualifier>>,\n    pub declarators: Vec<Node<StructDeclarator>>,\n}\n\n/// Type and qualifiers for a struct declaration\n///\n/// C11 also uses this type in a few other places.\n///\n/// (C11 6.7.2.1)\n#[derive(Debug, PartialEq, Clone)]\npub enum SpecifierQualifier {\n    TypeSpecifier(Node<TypeSpecifier>),\n    TypeQualifier(Node<TypeQualifier>),\n    Extension(Vec<Node<Extension>>),\n}\n\n/// Field declarator for a struct or a union\n///\n/// (C11 6.7.2.1)\n#[derive(Debug, PartialEq, Clone)]\npub struct StructDeclarator {\n    pub declarator: Option<Node<Declarator>>,\n    pub bit_width: Option<Box<Node<Expression>>>,\n}\n\n// From 6.7.2.2\n\n/// Enumeration type specifier\n///\n/// (C11 6.7.2.2)\n#[derive(Debug, PartialEq, Clone)]\npub struct EnumType {\n    pub identifier: Option<Node<Identifier>>,\n    pub enumerators: Vec<Node<Enumerator>>,\n}\n\n/// Single constant inside a `enum` definition\n///\n/// (C11 6.7.2.2)\n#[derive(Debug, PartialEq, Clone)]\npub struct Enumerator {\n    pub identifier: Node<Identifier>,\n    pub expression: Option<Box<Node<Expression>>>,\n    pub extensions: Vec<Node<Extension>>,\n}\n\n// From 6.7.3\n\n/// Type qualifier\n///\n/// (C11 6.7.3)\n#[derive(Debug, PartialEq, Eq, Hash, Clone, Copy)]\npub enum TypeQualifier {\n    /// `const`\n    ///\n    /// `__const` (GNU extension)\n    Const,\n    /// `restrict`\n    ///\n    /// `__restrict`, `__restrict__` (GNU extension)\n    Restrict,\n    /// `volatile`\n    ///\n    /// `__volatile`, `__volatile__` (GNU extension)\n    Volatile,\n    /// '_Nonnull' (Clang extension)\n    ///\n    /// [Clang extension](https://clang.llvm.org/docs/AttributeReference.html)\n    Nonnull,\n    /// '_Null_unspecified' (Clang extension)\n    ///\n    /// [Clang extension](https://clang.llvm.org/docs/AttributeReference.html)\n    NullUnspecified,\n    /// '_Nullable' (Clang extension)\n    ///\n    /// [Clang extension](https://clang.llvm.org/docs/AttributeReference.html)\n    Nullable,\n    /// `_Atomic`\n    Atomic,\n}\n\n// From 6.7.4\n\n/// Function specifier\n///\n/// (C11 6.7.4)\n#[derive(Debug, PartialEq, Eq, Hash, Clone, Copy)]\npub enum FunctionSpecifier {\n    /// `inline`\n    ///\n    /// `__inline`, `__inline__` (GNU extension)\n    Inline,\n    /// `_Noreturn`\n    Noreturn,\n}\n\n// From 6.7.5\n\n/// Alignment specifier\n///\n/// (C11 6.7.5)\n#[derive(Debug, PartialEq, Clone)]\npub enum AlignmentSpecifier {\n    /// `_Alignas(typename)`\n    Type(Node<TypeName>),\n    /// `_Alignas(expression)`\n    Constant(Box<Node<Expression>>),\n}\n\n// From 6.7.6 Declarators\n\n/// Single item in a declaration\n///\n/// Represents both normal and abstract declarators.\n///\n/// (C11 6.7.6, 6.7.7)\n#[derive(Debug, PartialEq, Clone)]\npub struct Declarator {\n    /// What is being declared\n    pub kind: Node<DeclaratorKind>,\n    /// Contains pointer, array and function declarator elements\n    pub derived: Vec<Node<DerivedDeclarator>>,\n    /// Vendor-specific extensions\n    pub extensions: Vec<Node<Extension>>,\n}\n\n/// Name of a declarator\n///\n/// (C11 6.7.6, 6.7.7)\n#[derive(Debug, PartialEq, Clone)]\npub enum DeclaratorKind {\n    /// Unnamed declarator\n    ///\n    /// E.g. part of a function prototype without parameter names.\n    Abstract,\n    /// Named declarator\n    ///\n    /// E.g. a variable or a named function parameter.\n    Identifier(Node<Identifier>),\n    /// Nested declarator\n    ///\n    /// Any group of parenthesis inside a declarator. E.g. pointer to\n    /// a function.\n    Declarator(Box<Node<Declarator>>),\n}\n\n/// Modifies declarator type\n///\n/// (C11 6.7.6)\n#[derive(Debug, PartialEq, Clone)]\npub enum DerivedDeclarator {\n    /// `* qualifiers …`\n    Pointer(Vec<Node<PointerQualifier>>),\n    /// `… []`\n    Array(Node<ArrayDeclarator>),\n    /// `… ( parameters )`\n    Function(Node<FunctionDeclarator>),\n    /// `… ( identifiers )`\n    KRFunction(Vec<Node<Identifier>>),\n    /// `^ qualifiers …`\n    ///\n    /// [Clang extension](https://clang.llvm.org/docs/BlockLanguageSpec.html)\n    Block(Vec<Node<PointerQualifier>>),\n}\n\n/// Array part of a declarator\n#[derive(Debug, PartialEq, Clone)]\npub struct ArrayDeclarator {\n    pub qualifiers: Vec<Node<TypeQualifier>>,\n    pub size: ArraySize,\n}\n\n/// Function parameter part of a declarator\n#[derive(Debug, PartialEq, Clone)]\npub struct FunctionDeclarator {\n    pub parameters: Vec<Node<ParameterDeclaration>>,\n    pub ellipsis: Ellipsis,\n}\n\n/// List of qualifiers that can follow a `*` in a declaration\n///\n/// (C11 6.7.6.1)\n#[derive(Debug, PartialEq, Clone)]\npub enum PointerQualifier {\n    TypeQualifier(Node<TypeQualifier>),\n    Extension(Vec<Node<Extension>>),\n}\n\n/// Size of an array in a declaration\n///\n/// (C11 6.7.6.2)\n#[derive(Debug, PartialEq, Clone)]\npub enum ArraySize {\n    /// `[]`\n    Unknown,\n    /// `[*]`\n    VariableUnknown,\n    /// `[10]`\n    VariableExpression(Box<Node<Expression>>),\n    /// `[static 10]`\n    StaticExpression(Box<Node<Expression>>),\n}\n\n/// Complete parameter declaration in a function prototype or declaration\n///\n/// This is so called \"new-style\" or \"C89\" parameter declaration that\n/// follows in parenthesis after a function name. \"Old-style\" or \"K&R\"\n/// function parameter declarations are collected in the\n/// `FunctionDefinition::declarations` field.\n///\n/// (C11 6.7.6.3)\n#[derive(Debug, PartialEq, Clone)]\npub struct ParameterDeclaration {\n    pub specifiers: Vec<Node<DeclarationSpecifier>>,\n    pub declarator: Option<Node<Declarator>>,\n    pub extensions: Vec<Node<Extension>>,\n}\n\n/// Whether function signature ends with a `...`\n#[derive(Debug, PartialEq, Eq, Hash, Clone, Copy)]\npub enum Ellipsis {\n    Some,\n    None,\n}\n\n// From 6.7.7 Type names\n\n/// References to types outside of declarations\n///\n/// Type names contain only abstract declarators.\n///\n/// (C11 6.7.7)\n#[derive(Debug, PartialEq, Clone)]\npub struct TypeName {\n    pub specifiers: Vec<Node<SpecifierQualifier>>,\n    pub declarator: Option<Node<Declarator>>,\n}\n\n// From 6.7.9 Initialization\n\n/// Value that is assigned immediately in a declaration\n///\n/// (C11 6.7.9)\n#[derive(Debug, PartialEq, Clone)]\npub enum Initializer {\n    Expression(Box<Node<Expression>>),\n    List(Vec<Node<InitializerListItem>>),\n}\n\n/// Initializes one field or array element in a initializer list\n///\n/// (C11 6.7.9)\n#[derive(Debug, PartialEq, Clone)]\npub struct InitializerListItem {\n    pub designation: Vec<Node<Designator>>,\n    pub initializer: Box<Node<Initializer>>,\n}\n\n/// Single element of an designation in an initializer\n#[derive(Debug, PartialEq, Clone)]\npub enum Designator {\n    /// Array element\n    ///\n    /// `{ [expression] = … }`\n    ///\n    /// `{ [expression] … }` (obsolete GNU extension)\n    Index(Node<Expression>),\n\n    /// Struct or union member\n    ///\n    /// `{ .identifier = … }`\n    ///\n    /// `{ identifier: … }` (obsolete GNU extension)\n    Member(Node<Identifier>),\n\n    /// Range of array elements\n    ///\n    /// `{ [from ... to] … }`\n    /// ([GNU extension](https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html#Designated-Inits))\n    Range(Node<RangeDesignator>),\n}\n\n/// Range array designator in an initializer\n///\n/// `[from ... to]`\n///\n/// ([GNU extension](https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html#Designated-Inits))\n#[derive(Debug, PartialEq, Clone)]\npub struct RangeDesignator {\n    pub from: Node<Expression>,\n    pub to: Node<Expression>,\n}\n\n// From 6.7.10 Static assertions\n\n/// Static assertion\n///\n/// (C11 6.7.10)\n#[derive(Debug, PartialEq, Clone)]\npub struct StaticAssert {\n    pub expression: Box<Node<Expression>>,\n    pub message: Node<StringLiteral>,\n}\n\n// From 6.8 Statement\n\n/// Element of a function body\n///\n/// (C11 6.8)\n#[derive(Debug, PartialEq, Clone)]\npub enum Statement {\n    Labeled(Node<LabeledStatement>),\n    Compound(Vec<Node<BlockItem>>),\n    Expression(Option<Box<Node<Expression>>>),\n    If(Node<IfStatement>),\n    Switch(Node<SwitchStatement>),\n    While(Node<WhileStatement>),\n    DoWhile(Node<DoWhileStatement>),\n    For(Node<ForStatement>),\n    Goto(Node<Identifier>),\n    Continue,\n    Break,\n    Return(Option<Box<Node<Expression>>>),\n    /// Vendor specific inline assembly extensions\n    Asm(Node<AsmStatement>),\n}\n\n/// Labeled statement\n///\n/// (C11 6.8.1)\n#[derive(Debug, PartialEq, Clone)]\npub struct LabeledStatement {\n    pub label: Node<Label>,\n    pub statement: Box<Node<Statement>>,\n}\n\n/// If statement\n///\n/// (C11 6.8.4)\n#[derive(Debug, PartialEq, Clone)]\npub struct IfStatement {\n    pub condition: Box<Node<Expression>>,\n    pub then_statement: Box<Node<Statement>>,\n    pub else_statement: Option<Box<Node<Statement>>>,\n}\n\n/// Switch statement\n///\n/// (C11 6.8.4)\n#[derive(Debug, PartialEq, Clone)]\npub struct SwitchStatement {\n    pub expression: Box<Node<Expression>>,\n    pub statement: Box<Node<Statement>>,\n}\n\n/// While statement\n///\n/// (C11 6.8.5)\n#[derive(Debug, PartialEq, Clone)]\npub struct WhileStatement {\n    pub expression: Box<Node<Expression>>,\n    pub statement: Box<Node<Statement>>,\n}\n\n/// Do statement\n///\n/// (C11 6.8.5)\n#[derive(Debug, PartialEq, Clone)]\npub struct DoWhileStatement {\n    pub statement: Box<Node<Statement>>,\n    pub expression: Box<Node<Expression>>,\n}\n\n/// For statement\n///\n/// (C11 6.8.5)\n#[derive(Debug, PartialEq, Clone)]\npub struct ForStatement {\n    pub initializer: Node<ForInitializer>,\n    pub condition: Option<Box<Node<Expression>>>,\n    pub step: Option<Box<Node<Expression>>>,\n    pub statement: Box<Node<Statement>>,\n}\n\n/// Statement labels for `goto` and `switch`\n#[derive(Debug, PartialEq, Clone)]\npub enum Label {\n    /// Goto label\n    ///\n    /// `ident: …`\n    Identifier(Node<Identifier>),\n    /// Case in a `switch` statement\n    ///\n    /// `case 'a': …`\n    Case(Box<Node<Expression>>),\n    /// Case with a range in a `switch` statement\n    ///\n    /// `case 'a' ... 'z': …`\n    ///\n    /// [GNU extension](https://gcc.gnu.org/onlinedocs/gcc/Case-Ranges.html)\n    CaseRange(Node<CaseRange>),\n    /// Default case in a `switch` statement\n    ///\n    /// `default: …`\n    Default,\n}\n\n/// Case range expression\n///\n/// `from ... to`\n///\n/// [GNU extension](https://gcc.gnu.org/onlinedocs/gcc/Case-Ranges.html)\n#[derive(Debug, PartialEq, Clone)]\npub struct CaseRange {\n    pub low: Box<Node<Expression>>,\n    pub high: Box<Node<Expression>>,\n}\n\n/// First element of a `for` statement\n#[derive(Debug, PartialEq, Clone)]\npub enum ForInitializer {\n    /// `for(; …)`\n    Empty,\n    /// `for(a = 1; …)`\n    Expression(Box<Node<Expression>>),\n    /// `for(int a = 1; …)`\n    Declaration(Node<Declaration>),\n    /// `for(_StaticAssert(…); …)`\n    StaticAssert(Node<StaticAssert>),\n}\n\n// From 6.8.2\n\n/// Element of a compound statement\n#[derive(Debug, PartialEq, Clone)]\npub enum BlockItem {\n    Declaration(Node<Declaration>),\n    StaticAssert(Node<StaticAssert>),\n    Statement(Node<Statement>),\n}\n\n// From 6.9 External definitions\n\n/// Entire C source file after preprocessing\n///\n/// (C11 6.9)\n#[derive(Debug, PartialEq, Clone)]\npub struct TranslationUnit(pub Vec<Node<ExternalDeclaration>>);\n\n/// Top-level elements of a C program\n///\n/// (C11 6.9)\n#[derive(Debug, PartialEq, Clone)]\npub enum ExternalDeclaration {\n    Declaration(Node<Declaration>),\n    StaticAssert(Node<StaticAssert>),\n    FunctionDefinition(Node<FunctionDefinition>),\n}\n\n/// Function definition\n///\n/// (C11 6.9.1)\n#[derive(Debug, PartialEq, Clone)]\npub struct FunctionDefinition {\n    /// Return type of the function, possibly mixed with other specifiers\n    pub specifiers: Vec<Node<DeclarationSpecifier>>,\n    /// Contains function name and parameter list\n    pub declarator: Node<Declarator>,\n    /// K&R style parameter type definitions (C11 6.9.1 §6)\n    pub declarations: Vec<Node<Declaration>>,\n    /// Body of the function.\n    pub statement: Node<Statement>,\n}\n\n// Syntax extensions\n\n/// Extended vendor-specific syntax that does not fit elsewhere\n#[derive(Debug, PartialEq, Clone)]\npub enum Extension {\n    /// Attributes\n    ///\n    /// [GNU extension](https://gcc.gnu.org/onlinedocs/gcc/Attribute-Syntax.html)\n    Attribute(Attribute),\n    /// Assembler name for an object\n    ///\n    /// [GNU extension](https://gcc.gnu.org/onlinedocs/gcc/Asm-Labels.html)\n    AsmLabel(Node<StringLiteral>),\n    /// Platform availability\n    ///\n    /// [Clang extension](https://clang.llvm.org/docs/AttributeReference.html#availability)\n    AvailabilityAttribute(Node<AvailabilityAttribute>),\n}\n\n/// Attributes\n///\n/// [GNU extension](https://gcc.gnu.org/onlinedocs/gcc/Attribute-Syntax.html)\n#[derive(Debug, PartialEq, Clone)]\npub struct Attribute {\n    pub name: Node<String>,\n    pub arguments: Vec<Node<Expression>>,\n}\n\n/// Platform availability attribute\n///\n/// [Clang extension](https://clang.llvm.org/docs/AttributeReference.html#availability)\n#[derive(Debug, PartialEq, Clone)]\npub struct AvailabilityAttribute {\n    pub platform: Node<Identifier>,\n    pub clauses: Vec<Node<AvailabilityClause>>,\n}\n\n/// Platfrom availability attribute clause\n///\n/// [Clang extension](https://clang.llvm.org/docs/AttributeReference.html#availability)\n#[derive(Debug, PartialEq, Clone)]\npub enum AvailabilityClause {\n    Introduced(Node<AvailabilityVersion>),\n    Deprecated(Node<AvailabilityVersion>),\n    Obsoleted(Node<AvailabilityVersion>),\n    Unavailable,\n    Message(Node<StringLiteral>),\n    Replacement(Node<StringLiteral>),\n}\n\n/// Platfrom version inside availability attribute\n///\n/// [Clang extension](https://clang.llvm.org/docs/AttributeReference.html#availability)\n#[derive(Debug, PartialEq, Eq, Hash, Clone)]\npub struct AvailabilityVersion {\n    pub major: String,\n    pub minor: Option<String>,\n    pub subminor: Option<String>,\n}\n\n/// Inline assembler\n#[derive(Debug, PartialEq, Clone)]\npub enum AsmStatement {\n    /// Basic asm statement with just source code\n    ///\n    /// [GNU extension](https://gcc.gnu.org/onlinedocs/gcc/Basic-Asm.html)\n    GnuBasic(Node<StringLiteral>),\n\n    /// Extended statement that has access to C variables\n    ///\n    /// [GNU extension](https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html)\n    GnuExtended(GnuExtendedAsmStatement),\n}\n\n/// Extended statement that has access to C variables\n///\n/// [GNU extension](https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html)\n#[derive(Debug, PartialEq, Clone)]\npub struct GnuExtendedAsmStatement {\n    pub qualifier: Option<Node<TypeQualifier>>,\n    pub template: Node<StringLiteral>,\n    pub outputs: Vec<Node<GnuAsmOperand>>,\n    pub inputs: Vec<Node<GnuAsmOperand>>,\n    pub clobbers: Vec<Node<StringLiteral>>,\n}\n\n/// Single input or output operand specifier for GNU extended asm statement\n///\n/// [GNU extension](https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html#Output-Operands)\n#[derive(Debug, PartialEq, Clone)]\npub struct GnuAsmOperand {\n    pub symbolic_name: Option<Node<Identifier>>,\n    pub constraints: Node<StringLiteral>,\n    pub variable_name: Node<Expression>,\n}\n\n/// Type of an expression or type\n///\n/// [GNU extension](https://gcc.gnu.org/onlinedocs/gcc/Typeof.html)\n#[derive(Debug, PartialEq, Clone)]\npub enum TypeOf {\n    Expression(Node<Expression>),\n    Type(Node<TypeName>),\n}\n"
  },
  {
    "path": "src/astutil.rs",
    "content": "use ast::*;\nuse span::{Node, Span};\n\n#[cfg_attr(test, derive(Debug, PartialEq, Clone))]\npub enum Operation {\n    Member(Node<MemberOperator>, Node<Identifier>),\n    Unary(Node<UnaryOperator>),\n    Binary(Node<BinaryOperator>, Node<Expression>),\n    Call(Vec<Node<Expression>>),\n}\n\nfn apply_op(a: Node<Expression>, op: Node<Operation>) -> Node<Expression> {\n    let span = Span::span(a.span.start, op.span.end);\n    let expr = match op.node {\n        Operation::Member(op, id) => Expression::Member(Box::new(Node::new(\n            MemberExpression {\n                operator: op,\n                expression: Box::new(a),\n                identifier: id,\n            },\n            span,\n        ))),\n        Operation::Unary(op) => Expression::UnaryOperator(Box::new(Node::new(\n            UnaryOperatorExpression {\n                operator: op,\n                operand: Box::new(a),\n            },\n            span,\n        ))),\n        Operation::Binary(op, b) => Expression::BinaryOperator(Box::new(Node::new(\n            BinaryOperatorExpression {\n                operator: op,\n                lhs: Box::new(a),\n                rhs: Box::new(b),\n            },\n            span,\n        ))),\n        Operation::Call(args) => Expression::Call(Box::new(Node::new(\n            CallExpression {\n                callee: Box::new(a),\n                arguments: args,\n            },\n            span,\n        ))),\n    };\n\n    Node::new(expr, span)\n}\n\npub fn apply_ops(ops: Vec<Node<Operation>>, expr: Node<Expression>) -> Node<Expression> {\n    ops.into_iter().fold(expr, apply_op)\n}\n\npub fn concat<T>(mut a: Vec<T>, b: Vec<T>) -> Vec<T> {\n    a.extend(b);\n    a\n}\n\npub fn infix(\n    node: Node<()>,\n    op: BinaryOperator,\n    lhs: Node<Expression>,\n    rhs: Node<Expression>,\n) -> Node<Expression> {\n    let span = Span::span(lhs.span.start, rhs.span.end);\n    Node::new(\n        Expression::BinaryOperator(Box::new(Node::new(\n            BinaryOperatorExpression {\n                operator: Node::new(op, node.span),\n                lhs: Box::new(lhs),\n                rhs: Box::new(rhs),\n            },\n            span,\n        ))),\n        span,\n    )\n}\n\npub fn with_ext(mut d: Node<Declarator>, e: Option<Vec<Node<Extension>>>) -> Node<Declarator> {\n    if let Some(e) = e {\n        d.node.extensions.extend(e);\n    }\n    d\n}\n\npub fn ts18661_float(binary: bool, width: usize, extended: bool) -> TS18661FloatType {\n    TS18661FloatType {\n        format: match (binary, extended) {\n            (true, false) => TS18661FloatFormat::BinaryInterchange,\n            (true, true) => TS18661FloatFormat::BinaryExtended,\n            (false, false) => TS18661FloatFormat::DecimalInterchange,\n            (false, true) => TS18661FloatFormat::DecimalExtended,\n        },\n        width: width,\n    }\n}\n\npub fn int_suffix(mut s: &str) -> Result<IntegerSuffix, &'static str> {\n    let mut l = IntegerSize::Int;\n    let mut u = false;\n    let mut i = false;\n\n    while s.len() > 0 {\n        if l == IntegerSize::Int && (s.starts_with(\"ll\") || s.starts_with(\"LL\")) {\n            l = IntegerSize::LongLong;\n            s = &s[2..];\n        } else if l == IntegerSize::Int && (s.starts_with(\"l\") || s.starts_with(\"L\")) {\n            l = IntegerSize::Long;\n            s = &s[1..];\n        } else if !u && (s.starts_with(\"u\") || s.starts_with(\"U\")) {\n            u = true;\n            s = &s[1..];\n        } else if !i\n            && (s.starts_with(\"i\")\n                || s.starts_with(\"I\")\n                || s.starts_with(\"j\")\n                || s.starts_with(\"J\"))\n        {\n            i = true;\n            s = &s[1..];\n        } else {\n            return Err(\"integer suffix\");\n        }\n    }\n\n    Ok(IntegerSuffix {\n        size: l,\n        unsigned: u,\n        imaginary: i,\n    })\n}\n"
  },
  {
    "path": "src/bin/dump.rs",
    "content": "//! Parse a C file and dump the AST.\n\nextern crate lang_c;\n\nuse std::process::exit;\n\nuse lang_c::driver::{Config, Flavor};\nuse lang_c::visit::Visit;\n\nfn main() {\n    let mut config = Config::default();\n    let mut source = None;\n    let mut quiet = false;\n\n    for opt in std::env::args().skip(1) {\n        if opt == \"-use-gcc\" {\n            config = Config::with_gcc();\n        } else if opt == \"-use-clang\" {\n            config = Config::with_clang();\n        } else if opt == \"-use-std\" {\n            config.flavor = Flavor::StdC11;\n        } else if opt == \"-q\" {\n            quiet = true;\n        } else if opt.starts_with(\"-\") {\n            config.cpp_options.push(opt);\n        } else {\n            if source.is_none() {\n                source = Some(opt);\n            } else {\n                println!(\"multiple input files given\");\n                exit(1);\n            }\n        }\n    }\n\n    let source = match source {\n        Some(s) => s,\n        None => {\n            println!(\"input file required\");\n            exit(1);\n        }\n    };\n\n    match lang_c::driver::parse(&config, &source) {\n        Ok(parse) => {\n            if !quiet {\n                let mut buf = String::new();\n                {\n                    let mut printer = lang_c::print::Printer::new(&mut buf);\n                    printer.visit_translation_unit(&parse.unit);\n                }\n                println!(\"{}\", buf);\n            }\n        }\n        Err(err) => {\n            println!(\"{}\", err);\n            exit(1);\n        }\n    }\n}\n"
  },
  {
    "path": "src/bin/meminfo.rs",
    "content": "extern crate lang_c;\nuse lang_c::ast::*;\nuse std::mem::size_of;\n\nmacro_rules! ps {\n    ($( $i:ident )+) => ({ $(println!(\"{:3}  {}\", size_of::<$i>(), stringify!($i));)+ })\n}\n\nfn main() {\n    ps! {\n        TypeOf\n        Identifier\n        Constant\n        Integer\n        Float\n        Expression\n        MemberOperator\n        GenericAssociation\n        UnaryOperator\n        BinaryOperator\n        OffsetDesignator\n        OffsetMember\n        Declaration\n        DeclarationSpecifier\n        InitDeclarator\n        StorageClassSpecifier\n        TypeSpecifier\n        StructType\n        StructDeclaration\n        SpecifierQualifier\n        StructDeclarator\n        Enumerator\n        TypeQualifier\n        FunctionSpecifier\n        AlignmentSpecifier\n        Declarator\n        DeclaratorKind\n        DerivedDeclarator\n        PointerQualifier\n        ArraySize\n        ParameterDeclaration\n        Ellipsis\n        TypeName\n        Initializer\n        InitializerListItem\n        Designator\n        StaticAssert\n        Statement\n        Label\n        ForInitializer\n        BlockItem\n        TranslationUnit\n        ExternalDeclaration\n        FunctionDefinition\n        Extension\n        AsmStatement\n        GnuAsmOperand\n        TypeOf\n    }\n}\n"
  },
  {
    "path": "src/driver.rs",
    "content": "//! Preprocess and parse C source file into an abstract syntax tree\n\nuse std::collections::HashSet;\nuse std::error;\nuse std::fmt;\nuse std::io;\nuse std::path::Path;\nuse std::process::Command;\n\nuse ast::TranslationUnit;\nuse env::Env;\nuse loc;\nuse parser::translation_unit;\n\n/// Parser configuration\n#[derive(Clone, Debug)]\npub struct Config {\n    /// Command used to invoke C preprocessor\n    pub cpp_command: String,\n    /// Options to pass to the preprocessor program\n    pub cpp_options: Vec<String>,\n    /// Language flavor to parse\n    pub flavor: Flavor,\n}\n\nimpl Config {\n    /// Use `gcc` as a pre-processor and enable gcc extensions\n    pub fn with_gcc() -> Config {\n        Config {\n            cpp_command: \"gcc\".into(),\n            cpp_options: vec![\"-E\".into()],\n            flavor: Flavor::GnuC11,\n        }\n    }\n\n    /// Use `clang` as a pre-processor and enable Clang extensions\n    pub fn with_clang() -> Config {\n        Config {\n            cpp_command: \"clang\".into(),\n            cpp_options: vec![\"-E\".into()],\n            flavor: Flavor::ClangC11,\n        }\n    }\n}\n\nimpl Default for Config {\n    #[cfg(target_os = \"macos\")]\n    fn default() -> Config {\n        Self::with_clang()\n    }\n\n    #[cfg(not(target_os = \"macos\"))]\n    fn default() -> Config {\n        Self::with_gcc()\n    }\n}\n\n/// C language flavors\n#[derive(Copy, Clone, PartialEq, Debug)]\npub enum Flavor {\n    /// Strict standard C11\n    StdC11,\n    /// Standard C11 with GNU extensions\n    GnuC11,\n    /// Standard C11 with Clang extensions\n    ClangC11,\n}\n\n/// Result of a successful parse\n#[derive(Clone, Debug)]\npub struct Parse {\n    /// Pre-processed source text\n    pub source: String,\n    /// Root of the abstract syntax tree\n    pub unit: TranslationUnit,\n}\n\n#[derive(Debug)]\n/// Error type returned from `parse`\npub enum Error {\n    PreprocessorError(io::Error),\n    SyntaxError(SyntaxError),\n}\n\nimpl From<SyntaxError> for Error {\n    fn from(e: SyntaxError) -> Error {\n        Error::SyntaxError(e)\n    }\n}\n\nimpl fmt::Display for Error {\n    fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {\n        match self {\n            &Error::PreprocessorError(ref e) => write!(fmt, \"preprocessor error: {}\", e),\n            &Error::SyntaxError(ref e) => write!(fmt, \"syntax error: {}\", e),\n        }\n    }\n}\n\nimpl error::Error for Error {\n    fn description(&self) -> &str {\n        match self {\n            &Error::PreprocessorError(_) => \"preprocessor error\",\n            &Error::SyntaxError(_) => \"syntax error\",\n        }\n    }\n}\n\n/// Syntax error during parsing\n#[derive(Debug, Clone)]\npub struct SyntaxError {\n    /// Pre-processed source text\n    pub source: String,\n    /// Line number in the preprocessed source\n    pub line: usize,\n    /// Column number in the preprocessed source\n    pub column: usize,\n    /// Byte position in the preproccessed source\n    pub offset: usize,\n    /// Tokens expected at the error location\n    pub expected: HashSet<&'static str>,\n}\n\nimpl SyntaxError {\n    /// Quoted and comma-separated list of expected tokens\n    pub fn format_expected(&self, fmt: &mut fmt::Formatter) -> fmt::Result {\n        let mut list = self.expected.iter().collect::<Vec<_>>();\n        list.sort();\n        for (i, t) in list.iter().enumerate() {\n            if i > 0 {\n                try!(write!(fmt, \", \"));\n            }\n            try!(write!(fmt, \"'{}'\", t));\n        }\n\n        Ok(())\n    }\n\n    pub fn get_location(&self) -> (loc::Location, Vec<loc::Location>) {\n        loc::get_location_for_offset(&self.source, self.offset)\n    }\n}\n\nimpl fmt::Display for SyntaxError {\n    fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {\n        let (loc, inc) = self.get_location();\n        try!(write!(\n            fmt,\n            \"unexpected token at \\\"{}\\\" line {} column {}, expected \",\n            loc.file, loc.line, self.column\n        ));\n        try!(self.format_expected(fmt));\n        for loc in inc {\n            try!(write!(fmt, \"\\n  included from {}:{}\", loc.file, loc.line));\n        }\n        Ok(())\n    }\n}\n\n/// Parse a C file\npub fn parse<P: AsRef<Path>>(config: &Config, source: P) -> Result<Parse, Error> {\n    let processed = match preprocess(config, source.as_ref()) {\n        Ok(s) => s,\n        Err(e) => return Err(Error::PreprocessorError(e)),\n    };\n\n    Ok(try!(parse_preprocessed(config, processed)))\n}\n\npub fn parse_preprocessed(config: &Config, source: String) -> Result<Parse, SyntaxError> {\n    let mut env = match config.flavor {\n        Flavor::StdC11 => Env::with_core(),\n        Flavor::GnuC11 => Env::with_gnu(),\n        Flavor::ClangC11 => Env::with_clang(),\n    };\n\n    match translation_unit(&source, &mut env) {\n        Ok(unit) => Ok(Parse {\n            source: source,\n            unit: unit,\n        }),\n        Err(err) => Err(SyntaxError {\n            source: source,\n            line: err.line,\n            column: err.column,\n            offset: err.offset,\n            expected: err.expected,\n        }),\n    }\n}\n\nfn preprocess(config: &Config, source: &Path) -> io::Result<String> {\n    let mut cmd = Command::new(&config.cpp_command);\n\n    for item in &config.cpp_options {\n        cmd.arg(item);\n    }\n\n    cmd.arg(source);\n\n    let output = try!(cmd.output());\n\n    if output.status.success() {\n        match String::from_utf8(output.stdout) {\n            Ok(s) => Ok(s),\n            Err(e) => Err(io::Error::new(io::ErrorKind::Other, e)),\n        }\n    } else {\n        match String::from_utf8(output.stderr) {\n            Ok(s) => Err(io::Error::new(io::ErrorKind::Other, s)),\n            Err(_) => Err(io::Error::new(\n                io::ErrorKind::Other,\n                \"cpp error contains invalid utf-8\",\n            )),\n        }\n    }\n}\n"
  },
  {
    "path": "src/env.rs",
    "content": "use std::collections::{HashMap, HashSet};\n\nuse ast::*;\nuse span::Node;\nuse strings;\n\n#[derive(Clone, Copy, Debug, PartialEq, Hash)]\npub enum Symbol {\n    Typename,\n    Identifier,\n}\n\npub struct Env {\n    pub symbols: Vec<HashMap<String, Symbol>>,\n    pub extensions_gnu: bool,\n    pub extensions_clang: bool,\n    pub reserved: HashSet<&'static str>,\n}\n\nimpl Env {\n    pub fn with_core() -> Env {\n        let mut reserved = HashSet::default();\n        reserved.extend(strings::RESERVED_C11.iter());\n        Env {\n            extensions_gnu: false,\n            extensions_clang: false,\n            symbols: vec![HashMap::default()],\n            reserved: reserved,\n        }\n    }\n\n    pub fn with_gnu() -> Env {\n        let mut symbols = HashMap::default();\n        let mut reserved = HashSet::default();\n        symbols.insert(\"__builtin_va_list\".to_owned(), Symbol::Typename);\n        reserved.extend(strings::RESERVED_C11.iter());\n        reserved.extend(strings::RESERVED_GNU.iter());\n        Env {\n            extensions_gnu: true,\n            extensions_clang: false,\n            symbols: vec![symbols],\n            reserved: reserved,\n        }\n    }\n\n    pub fn with_clang() -> Env {\n        let mut symbols = HashMap::default();\n        let mut reserved = HashSet::default();\n        symbols.insert(\"__builtin_va_list\".to_owned(), Symbol::Typename);\n        reserved.extend(strings::RESERVED_C11.iter());\n        reserved.extend(strings::RESERVED_GNU.iter());\n        reserved.extend(strings::RESERVED_CLANG.iter());\n        Env {\n            extensions_gnu: true,\n            extensions_clang: true,\n            symbols: vec![symbols],\n            reserved: reserved,\n        }\n    }\n\n    pub fn enter_scope(&mut self) {\n        self.symbols.push(HashMap::new());\n    }\n\n    pub fn leave_scope(&mut self) {\n        self.symbols.pop().expect(\"more scope pops than pushes\");\n    }\n\n    pub fn is_typename(&self, ident: &str) -> bool {\n        for scope in self.symbols.iter().rev() {\n            if let Some(symbol) = scope.get(ident) {\n                return *symbol == Symbol::Typename;\n            }\n        }\n        false\n    }\n\n    pub fn handle_declarator(&mut self, d: &Node<Declarator>, sym: Symbol) {\n        if let Some(name) = find_declarator_name(&d.node.kind.node) {\n            self.add_symbol(name, sym)\n        }\n    }\n\n    pub fn add_symbol(&mut self, s: &str, symbol: Symbol) {\n        let scope = self\n            .symbols\n            .last_mut()\n            .expect(\"at least one scope should be always present\");\n        scope.insert(s.to_string(), symbol);\n    }\n\n    #[cfg(test)]\n    pub fn add_typename(&mut self, s: &str) {\n        self.add_symbol(s, Symbol::Typename)\n    }\n}\n\nfn find_declarator_name(d: &DeclaratorKind) -> Option<&str> {\n    match d {\n        &DeclaratorKind::Abstract => None,\n        &DeclaratorKind::Identifier(ref i) => Some(&i.node.name),\n        &DeclaratorKind::Declarator(ref d) => find_declarator_name(&d.node.kind.node),\n    }\n}\n"
  },
  {
    "path": "src/lib.rs",
    "content": "//! C language parser and abstract syntax tree\n//!\n//! ```\n//! use lang_c::driver::{Config, parse};\n//!\n//! fn main() {\n//!     let config = Config::default();\n//!     println!(\"{:?}\", parse(&config, \"example.c\"));\n//! }\n//! ```\n\n#![allow(deprecated)]\n#![allow(ellipsis_inclusive_range_patterns)]\n\npub mod ast;\npub mod driver;\npub mod loc;\npub mod print;\npub mod span;\npub mod visit;\n\nmod astutil;\nmod env;\nmod parser;\nmod strings;\n\n#[cfg(test)]\nmod tests;\n"
  },
  {
    "path": "src/loc.rs",
    "content": "//! Convert byte offsets into line numbers\nconst F_NEW: u32 = 1;\nconst F_RET: u32 = 2;\n\n#[derive(Debug, Clone, Copy, PartialEq)]\npub struct Location<'a> {\n    pub file: &'a str,\n    pub line: usize,\n}\n\n/// Find file name and line number that correspond to an offset in a preprocessed source.\n///\n/// If location was in an included file, second element of the returned tuple contains a list of\n/// locations of `#include` directives, in the order they were procssed (top-level file first, then\n/// all intermediate included files).\npub fn get_location_for_offset<'a>(src: &'a str, pos: usize) -> (Location<'a>, Vec<Location<'a>>) {\n    let mut p = 0;\n    let mut inc = Vec::new();\n    let mut loc = Location { file: \"\", line: 1 };\n\n    while p < pos {\n        let n = p + src[p..].find(\"\\n\").unwrap_or(src[p..].len());\n        if pos <= n {\n            break;\n        }\n\n        if let Some((l, f)) = parse_line_directive(&src[p..n]) {\n            if f & F_NEW == F_NEW {\n                inc.push(loc);\n            }\n            if f & F_RET == F_RET {\n                inc.pop();\n            }\n            loc = l;\n        } else {\n            loc.line += 1;\n        }\n\n        p = n + 1;\n    }\n    (loc, inc)\n}\n\n#[test]\nfn test_get_location_for_offset() {\n    fn t(src: &str, pos: usize, file: &str, line: usize, includes: &[(&str, usize)]) {\n        let (loc, inc) = get_location_for_offset(src, pos);\n        assert_eq!(\n            loc,\n            Location {\n                file: file,\n                line: line\n            }\n        );\n        assert_eq!(inc.len(), includes.len());\n        for (loc, &(f, l)) in inc.iter().zip(includes) {\n            assert_eq!(loc, &Location { file: f, line: l });\n        }\n    }\n\n    t(\"# 10 \\\"init\\\"\", 0, \"\", 1, &[]);\n    t(\"# 10 \\\"init\\\"\", 1, \"\", 1, &[]);\n    t(\"# 10 \\\"init\\\"\\na\\nb\\n\", 12, \"init\", 10, &[]);\n    t(\"# 10 \\\"init\\\"\\na\\nb\\n\", 13, \"init\", 10, &[]);\n    t(\"# 10 \\\"init\\\"\\na\\nb\\n\", 14, \"init\", 11, &[]);\n    t(\"# 10 \\\"init\\\"\\na\\nb\\n\", 15, \"init\", 11, &[]);\n\n    const T: &'static str = r#\"\n# 10 \"foo\"\n...\n# 1 \"bar\" 1 3 4\n# 5 \"bar\" 3\n# 11 \"baz\" 1\n...\n...\n# 6 \"bar\" 2\n...\n# 15 \"foo\" 2\n...\n...\n# 2 \"ook\" 1\n\"#;\n    t(T, 12, \"foo\", 10, &[]);\n    t(T, 32, \"bar\", 1, &[(\"foo\", 11)]);\n    t(T, 61, \"baz\", 12, &[(\"foo\", 11), (\"bar\", 5)]);\n    t(T, 77, \"bar\", 6, &[(\"foo\", 11)]);\n    t(T, 98, \"foo\", 16, &[]);\n    t(T, 102, \"foo\", 17, &[]);\n    t(T, 114, \"ook\", 2, &[(\"foo\", 17)]);\n}\n\nmacro_rules! otry {\n    ($e:expr) => {\n        match $e {\n            Some(v) => v,\n            None => return None,\n        }\n    };\n}\n\nfn strip_prefix<'a>(s: &'a str, p: &str) -> Option<&'a str> {\n    if s.starts_with(p) {\n        Some(&s[p.len()..])\n    } else {\n        None\n    }\n}\n\n// https://gcc.gnu.org/onlinedocs/cpp/Preprocessor-Output.html\nfn parse_line_directive(s: &str) -> Option<(Location, u32)> {\n    let s = otry!(strip_prefix(s, \"# \"));\n    let n = otry!(s.find(\" \"));\n    let line = otry!(usize::from_str_radix(&s[..n], 10).ok());\n\n    let s = otry!(strip_prefix(&s[n..], \" \\\"\"));\n    let mut n = 0;\n    while n < s.len() {\n        n += otry!(s[n..].find(&['\"', '\\\\'][..]));\n        if s[n..].starts_with('\"') {\n            break;\n        }\n        n += otry!(s[n..].char_indices().nth(2).map(|p| p.0));\n    }\n    let file = &s[..n];\n    let s = otry!(strip_prefix(&s[n..], \"\\\"\"));\n\n    let flags = s.bytes().filter(|&c| c >= b'1' && c <= b'4');\n    let flags = flags.fold(0, |a, f| a | 1 << (f - b'1'));\n\n    Some((\n        Location {\n            file: file,\n            line: line,\n        },\n        flags,\n    ))\n}\n\n#[test]\nfn test_line_directive() {\n    assert_eq!(\n        parse_line_directive(r#\"# 14 \"ab\\\"\\000\" 1 2 3 4\"#),\n        Some((\n            Location {\n                file: r#\"ab\\\"\\000\"#,\n                line: 14\n            },\n            15,\n        ))\n    );\n    assert_eq!(parse_line_directive(\"#\"), None);\n    assert_eq!(parse_line_directive(\"# 1 \"), None);\n    assert_eq!(parse_line_directive(\"# 1 \\\"\"), None);\n    assert_eq!(parse_line_directive(\"# -1 \\\"\\\"\"), None);\n    assert_eq!(\n        parse_line_directive(\"# 0 \\\"\\\"\"),\n        Some((Location { file: \"\", line: 0 }, 0))\n    );\n    assert_eq!(parse_line_directive(\"# 0 \\\"# #\\x0a\\x0a\\\\\"), None);\n    assert_eq!(parse_line_directive(\"# 0 \\\"\\\\\"), None);\n    assert_eq!(parse_line_directive(\"# 0 \\\"\\\\…\"), None);\n}\n"
  },
  {
    "path": "src/parser.rs",
    "content": "#![cfg_attr(rustfmt, rustfmt_skip)]\n#![allow(unknown_lints)]\n#![allow(ellipsis_inclusive_range_patterns)]\n// Generated by rust-peg. Do not edit.\nuse self::RuleResult::{Failed, Matched};\nuse ast::*;\nuse astutil::*;\nuse env::{Env, Symbol};\nuse span::{Node, Span};\nfn escape_default(s: &str) -> String {\n    s.chars().flat_map(|c| c.escape_default()).collect()\n}\nfn char_range_at(s: &str, pos: usize) -> (char, usize) {\n    let c = &s[pos..].chars().next().unwrap();\n    let next_pos = pos + c.len_utf8();\n    (*c, next_pos)\n}\n#[derive(Clone)]\nenum RuleResult<T> {\n    Matched(usize, T),\n    Failed,\n}\n#[derive(PartialEq, Eq, Debug, Clone)]\npub struct ParseError {\n    pub line: usize,\n    pub column: usize,\n    pub offset: usize,\n    pub expected: ::std::collections::HashSet<&'static str>,\n}\npub type ParseResult<T> = Result<T, ParseError>;\nimpl ::std::fmt::Display for ParseError {\n    fn fmt(&self, fmt: &mut ::std::fmt::Formatter) -> ::std::result::Result<(), ::std::fmt::Error> {\n        try!(write!(fmt, \"error at {}:{}: expected \", self.line, self.column));\n        if self.expected.len() == 0 {\n            try!(write!(fmt, \"EOF\"));\n        } else if self.expected.len() == 1 {\n            try!(write!(fmt, \"`{}`\", escape_default(self.expected.iter().next().unwrap())));\n        } else {\n            let mut iter = self.expected.iter();\n            try!(write!(fmt, \"one of `{}`\", escape_default(iter.next().unwrap())));\n            for elem in iter {\n                try!(write!(fmt, \", `{}`\", escape_default(elem)));\n            }\n        }\n        Ok(())\n    }\n}\nimpl ::std::error::Error for ParseError {\n    fn description(&self) -> &str {\n        \"parse error\"\n    }\n}\nfn slice_eq(input: &str, state: &mut ParseState, pos: usize, m: &'static str) -> RuleResult<()> {\n    #![inline]\n    #![allow(dead_code)]\n    let l = m.len();\n    if input.len() >= pos + l && &input.as_bytes()[pos..pos + l] == m.as_bytes() {\n        Matched(pos + l, ())\n    } else {\n        state.mark_failure(pos, m)\n    }\n}\nfn slice_eq_case_insensitive(input: &str, state: &mut ParseState, pos: usize, m: &'static str) -> RuleResult<()> {\n    #![inline]\n    #![allow(dead_code)]\n    let mut used = 0usize;\n    let mut input_iter = input[pos..].chars().flat_map(|x| x.to_uppercase());\n    for m_char_upper in m.chars().flat_map(|x| x.to_uppercase()) {\n        used += m_char_upper.len_utf8();\n        let input_char_result = input_iter.next();\n        if input_char_result.is_none() || input_char_result.unwrap() != m_char_upper {\n            return state.mark_failure(pos, m);\n        }\n    }\n    Matched(pos + used, ())\n}\nfn any_char(input: &str, state: &mut ParseState, pos: usize) -> RuleResult<()> {\n    #![inline]\n    #![allow(dead_code)]\n    if input.len() > pos {\n        let (_, next) = char_range_at(input, pos);\n        Matched(next, ())\n    } else {\n        state.mark_failure(pos, \"<character>\")\n    }\n}\nfn pos_to_line(input: &str, pos: usize) -> (usize, usize) {\n    let before = &input[..pos];\n    let line = before.as_bytes().iter().filter(|&&c| c == b'\\n').count() + 1;\n    let col = before.chars().rev().take_while(|&c| c != '\\n').count() + 1;\n    (line, col)\n}\nimpl<'input> ParseState<'input> {\n    fn mark_failure(&mut self, pos: usize, expected: &'static str) -> RuleResult<()> {\n        if self.suppress_fail == 0 {\n            if pos > self.max_err_pos {\n                self.max_err_pos = pos;\n                self.expected.clear();\n            }\n            if pos == self.max_err_pos {\n                self.expected.insert(expected);\n            }\n        }\n        Failed\n    }\n}\nstruct ParseState<'input> {\n    max_err_pos: usize,\n    suppress_fail: usize,\n    expected: ::std::collections::HashSet<&'static str>,\n    _phantom: ::std::marker::PhantomData<&'input ()>,\n    postfix_expression0_cache: ::std::collections::HashMap<usize, RuleResult<Expression>>,\n}\nimpl<'input> ParseState<'input> {\n    fn new() -> ParseState<'input> {\n        ParseState { max_err_pos: 0, suppress_fail: 0, expected: ::std::collections::HashSet::new(), _phantom: ::std::marker::PhantomData, postfix_expression0_cache: ::std::collections::HashMap::new() }\n    }\n}\n\nfn __parse__<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<()> {\n    #![allow(non_snake_case, unused)]\n    {\n        __state.suppress_fail += 1;\n        let res = {\n            let mut __repeat_pos = __pos;\n            loop {\n                let __pos = __repeat_pos;\n                let __step_res = {\n                    let __choice_res = {\n                        let __seq_res = match slice_eq(__input, __state, __pos, \"\\r\") {\n                            Matched(__newpos, _) => Matched(__newpos, ()),\n                            Failed => Matched(__pos, ()),\n                        };\n                        match __seq_res {\n                            Matched(__pos, _) => {\n                                let __seq_res = slice_eq(__input, __state, __pos, \"\\n\");\n                                match __seq_res {\n                                    Matched(__pos, _) => match __parse_directive(__input, __state, __pos, env) {\n                                        Matched(__newpos, _) => Matched(__newpos, ()),\n                                        Failed => Matched(__pos, ()),\n                                    },\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    };\n                    match __choice_res {\n                        Matched(__pos, __value) => Matched(__pos, __value),\n                        Failed => {\n                            if __input.len() > __pos {\n                                let (__ch, __next) = char_range_at(__input, __pos);\n                                match __ch {\n                                    ' ' | '\\t' => Matched(__next, ()),\n                                    _ => __state.mark_failure(__pos, \"[ \\t]\"),\n                                }\n                            } else {\n                                __state.mark_failure(__pos, \"[ \\t]\")\n                            }\n                        }\n                    }\n                };\n                match __step_res {\n                    Matched(__newpos, __value) => {\n                        __repeat_pos = __newpos;\n                    }\n                    Failed => {\n                        break;\n                    }\n                }\n            }\n            Matched(__repeat_pos, ())\n        };\n        __state.suppress_fail -= 1;\n        res\n    }\n}\n\nfn __parse_directive<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<()> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = slice_eq(__input, __state, __pos, \"#\");\n        match __seq_res {\n            Matched(__pos, _) => {\n                let mut __repeat_pos = __pos;\n                loop {\n                    let __pos = __repeat_pos;\n                    let __step_res = if __input.len() > __pos {\n                        let (__ch, __next) = char_range_at(__input, __pos);\n                        match __ch {\n                            '\\n' => __state.mark_failure(__pos, \"[^\\n]\"),\n                            _ => Matched(__next, ()),\n                        }\n                    } else {\n                        __state.mark_failure(__pos, \"[^\\n]\")\n                    };\n                    match __step_res {\n                        Matched(__newpos, __value) => {\n                            __repeat_pos = __newpos;\n                        }\n                        Failed => {\n                            break;\n                        }\n                    }\n                }\n                Matched(__repeat_pos, ())\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_identifier<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Node<Identifier>> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = Matched(__pos, __pos);\n        match __seq_res {\n            Matched(__pos, l) => {\n                let __seq_res = __parse_identifier0(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, e) => {\n                        let __seq_res = Matched(__pos, __pos);\n                        match __seq_res {\n                            Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_identifier0<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Identifier> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = {\n            let str_start = __pos;\n            match {\n                let __seq_res = if __input.len() > __pos {\n                    let (__ch, __next) = char_range_at(__input, __pos);\n                    match __ch {\n                        '_' | 'a'...'z' | 'A'...'Z' => Matched(__next, ()),\n                        _ => __state.mark_failure(__pos, \"[_a-zA-Z]\"),\n                    }\n                } else {\n                    __state.mark_failure(__pos, \"[_a-zA-Z]\")\n                };\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let mut __repeat_pos = __pos;\n                        loop {\n                            let __pos = __repeat_pos;\n                            let __step_res = if __input.len() > __pos {\n                                let (__ch, __next) = char_range_at(__input, __pos);\n                                match __ch {\n                                    '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                    _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                }\n                            } else {\n                                __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                            };\n                            match __step_res {\n                                Matched(__newpos, __value) => {\n                                    __repeat_pos = __newpos;\n                                }\n                                Failed => {\n                                    break;\n                                }\n                            }\n                        }\n                        Matched(__repeat_pos, ())\n                    }\n                    Failed => Failed,\n                }\n            } {\n                Matched(__newpos, _) => Matched(__newpos, &__input[str_start..__newpos]),\n                Failed => Failed,\n            }\n        };\n        match __seq_res {\n            Matched(__pos, n) => {\n                match {\n                    if !env.reserved.contains(n) {\n                        Ok(Identifier { name: n.into() })\n                    } else {\n                        Err(\"identifier\")\n                    }\n                } {\n                    Ok(res) => Matched(__pos, res),\n                    Err(expected) => {\n                        __state.mark_failure(__pos, expected);\n                        Failed\n                    }\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_ohx<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<()> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = slice_eq(__input, __state, __pos, \"0\");\n        match __seq_res {\n            Matched(__pos, _) => {\n                if __input.len() > __pos {\n                    let (__ch, __next) = char_range_at(__input, __pos);\n                    match __ch {\n                        'x' | 'X' => Matched(__next, ()),\n                        _ => __state.mark_failure(__pos, \"[xX]\"),\n                    }\n                } else {\n                    __state.mark_failure(__pos, \"[xX]\")\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_obb<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<()> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = slice_eq(__input, __state, __pos, \"0\");\n        match __seq_res {\n            Matched(__pos, _) => {\n                if __input.len() > __pos {\n                    let (__ch, __next) = char_range_at(__input, __pos);\n                    match __ch {\n                        'b' | 'B' => Matched(__next, ()),\n                        _ => __state.mark_failure(__pos, \"[bB]\"),\n                    }\n                } else {\n                    __state.mark_failure(__pos, \"[bB]\")\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_dec<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<()> {\n    #![allow(non_snake_case, unused)]\n    if __input.len() > __pos {\n        let (__ch, __next) = char_range_at(__input, __pos);\n        match __ch {\n            '0'...'9' => Matched(__next, ()),\n            _ => __state.mark_failure(__pos, \"[0-9]\"),\n        }\n    } else {\n        __state.mark_failure(__pos, \"[0-9]\")\n    }\n}\n\nfn __parse_oct<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<()> {\n    #![allow(non_snake_case, unused)]\n    if __input.len() > __pos {\n        let (__ch, __next) = char_range_at(__input, __pos);\n        match __ch {\n            '0'...'7' => Matched(__next, ()),\n            _ => __state.mark_failure(__pos, \"[0-7]\"),\n        }\n    } else {\n        __state.mark_failure(__pos, \"[0-7]\")\n    }\n}\n\nfn __parse_hex<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<()> {\n    #![allow(non_snake_case, unused)]\n    if __input.len() > __pos {\n        let (__ch, __next) = char_range_at(__input, __pos);\n        match __ch {\n            '0'...'9' | 'a'...'f' | 'A'...'F' => Matched(__next, ()),\n            _ => __state.mark_failure(__pos, \"[0-9a-fA-F]\"),\n        }\n    } else {\n        __state.mark_failure(__pos, \"[0-9a-fA-F]\")\n    }\n}\n\nfn __parse_bin<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<()> {\n    #![allow(non_snake_case, unused)]\n    if __input.len() > __pos {\n        let (__ch, __next) = char_range_at(__input, __pos);\n        match __ch {\n            '0'...'1' => Matched(__next, ()),\n            _ => __state.mark_failure(__pos, \"[0-1]\"),\n        }\n    } else {\n        __state.mark_failure(__pos, \"[0-1]\")\n    }\n}\n\nfn __parse_constant<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Constant> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            let __seq_res = {\n                __state.suppress_fail += 1;\n                let __assert_res = if __input.len() > __pos {\n                    let (__ch, __next) = char_range_at(__input, __pos);\n                    match __ch {\n                        '0'...'9' | '.' => Matched(__next, ()),\n                        _ => __state.mark_failure(__pos, \"[0-9.]\"),\n                    }\n                } else {\n                    __state.mark_failure(__pos, \"[0-9.]\")\n                };\n                __state.suppress_fail -= 1;\n                match __assert_res {\n                    Matched(_, __value) => Matched(__pos, __value),\n                    Failed => Failed,\n                }\n            };\n            match __seq_res {\n                Matched(__pos, _) => {\n                    let __seq_res = __parse_numeric_constant(__input, __state, __pos, env);\n                    match __seq_res {\n                        Matched(__pos, c) => Matched(__pos, { c }),\n                        Failed => Failed,\n                    }\n                }\n                Failed => Failed,\n            }\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                let __seq_res = {\n                    __state.suppress_fail += 1;\n                    let __assert_res = if __input.len() > __pos {\n                        let (__ch, __next) = char_range_at(__input, __pos);\n                        match __ch {\n                            '\\'' | 'u' | 'U' | 'L' => Matched(__next, ()),\n                            _ => __state.mark_failure(__pos, \"['uUL]\"),\n                        }\n                    } else {\n                        __state.mark_failure(__pos, \"['uUL]\")\n                    };\n                    __state.suppress_fail -= 1;\n                    match __assert_res {\n                        Matched(_, __value) => Matched(__pos, __value),\n                        Failed => Failed,\n                    }\n                };\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = __parse_character_constant(__input, __state, __pos, env);\n                        match __seq_res {\n                            Matched(__pos, c) => Matched(__pos, { Constant::Character(c) }),\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n        }\n    }\n}\n\nfn __parse_numeric_constant<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Constant> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            let __seq_res = __parse_float_constant(__input, __state, __pos, env);\n            match __seq_res {\n                Matched(__pos, c) => Matched(__pos, { Constant::Float(c) }),\n                Failed => Failed,\n            }\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                let __seq_res = __parse_integer_constant(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, c) => Matched(__pos, { Constant::Integer(c) }),\n                    Failed => Failed,\n                }\n            }\n        }\n    }\n}\n\nfn __parse_integer_constant<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Integer> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = __parse_integer_number(__input, __state, __pos, env);\n        match __seq_res {\n            Matched(__pos, n) => {\n                let __seq_res = __parse_integer_suffix(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, suffix) => Matched(__pos, {\n                        let (base, number) = n;\n                        Integer { base: base, number: number.to_owned().into_boxed_str(), suffix: suffix }\n                    }),\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_integer_number<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<(IntegerBase, &'input str)> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            let __seq_res = {\n                let str_start = __pos;\n                match {\n                    let __seq_res = if __input.len() > __pos {\n                        let (__ch, __next) = char_range_at(__input, __pos);\n                        match __ch {\n                            '1'...'9' => Matched(__next, ()),\n                            _ => __state.mark_failure(__pos, \"[1-9]\"),\n                        }\n                    } else {\n                        __state.mark_failure(__pos, \"[1-9]\")\n                    };\n                    match __seq_res {\n                        Matched(__pos, _) => {\n                            let mut __repeat_pos = __pos;\n                            loop {\n                                let __pos = __repeat_pos;\n                                let __step_res = __parse_dec(__input, __state, __pos, env);\n                                match __step_res {\n                                    Matched(__newpos, __value) => {\n                                        __repeat_pos = __newpos;\n                                    }\n                                    Failed => {\n                                        break;\n                                    }\n                                }\n                            }\n                            Matched(__repeat_pos, ())\n                        }\n                        Failed => Failed,\n                    }\n                } {\n                    Matched(__newpos, _) => Matched(__newpos, &__input[str_start..__newpos]),\n                    Failed => Failed,\n                }\n            };\n            match __seq_res {\n                Matched(__pos, n) => Matched(__pos, { (IntegerBase::Decimal, n) }),\n                Failed => Failed,\n            }\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                let __choice_res = {\n                    let __seq_res = __parse_ohx(__input, __state, __pos, env);\n                    match __seq_res {\n                        Matched(__pos, _) => {\n                            let __seq_res = {\n                                let str_start = __pos;\n                                match {\n                                    let mut __repeat_pos = __pos;\n                                    let mut __repeat_value = vec![];\n                                    loop {\n                                        let __pos = __repeat_pos;\n                                        let __step_res = __parse_hex(__input, __state, __pos, env);\n                                        match __step_res {\n                                            Matched(__newpos, __value) => {\n                                                __repeat_pos = __newpos;\n                                                __repeat_value.push(__value);\n                                            }\n                                            Failed => {\n                                                break;\n                                            }\n                                        }\n                                    }\n                                    if __repeat_value.len() >= 1 {\n                                        Matched(__repeat_pos, ())\n                                    } else {\n                                        Failed\n                                    }\n                                } {\n                                    Matched(__newpos, _) => Matched(__newpos, &__input[str_start..__newpos]),\n                                    Failed => Failed,\n                                }\n                            };\n                            match __seq_res {\n                                Matched(__pos, n) => Matched(__pos, { (IntegerBase::Hexadecimal, n) }),\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                };\n                match __choice_res {\n                    Matched(__pos, __value) => Matched(__pos, __value),\n                    Failed => {\n                        let __choice_res = {\n                            let __seq_res = slice_eq(__input, __state, __pos, \"0\");\n                            match __seq_res {\n                                Matched(__pos, _) => {\n                                    let __seq_res = {\n                                        let str_start = __pos;\n                                        match {\n                                            let mut __repeat_pos = __pos;\n                                            let mut __repeat_value = vec![];\n                                            loop {\n                                                let __pos = __repeat_pos;\n                                                let __step_res = __parse_oct(__input, __state, __pos, env);\n                                                match __step_res {\n                                                    Matched(__newpos, __value) => {\n                                                        __repeat_pos = __newpos;\n                                                        __repeat_value.push(__value);\n                                                    }\n                                                    Failed => {\n                                                        break;\n                                                    }\n                                                }\n                                            }\n                                            if __repeat_value.len() >= 1 {\n                                                Matched(__repeat_pos, ())\n                                            } else {\n                                                Failed\n                                            }\n                                        } {\n                                            Matched(__newpos, _) => Matched(__newpos, &__input[str_start..__newpos]),\n                                            Failed => Failed,\n                                        }\n                                    };\n                                    match __seq_res {\n                                        Matched(__pos, n) => Matched(__pos, { (IntegerBase::Octal, n) }),\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        };\n                        match __choice_res {\n                            Matched(__pos, __value) => Matched(__pos, __value),\n                            Failed => {\n                                let __choice_res = {\n                                    let __seq_res = {\n                                        __state.suppress_fail += 1;\n                                        let __assert_res = __parse_gnu_guard(__input, __state, __pos, env);\n                                        __state.suppress_fail -= 1;\n                                        match __assert_res {\n                                            Matched(_, __value) => Matched(__pos, __value),\n                                            Failed => Failed,\n                                        }\n                                    };\n                                    match __seq_res {\n                                        Matched(__pos, _) => {\n                                            let __seq_res = {\n                                                let __seq_res = __parse_obb(__input, __state, __pos, env);\n                                                match __seq_res {\n                                                    Matched(__pos, _) => {\n                                                        let __seq_res = {\n                                                            let str_start = __pos;\n                                                            match {\n                                                                let mut __repeat_pos = __pos;\n                                                                let mut __repeat_value = vec![];\n                                                                loop {\n                                                                    let __pos = __repeat_pos;\n                                                                    let __step_res = __parse_bin(__input, __state, __pos, env);\n                                                                    match __step_res {\n                                                                        Matched(__newpos, __value) => {\n                                                                            __repeat_pos = __newpos;\n                                                                            __repeat_value.push(__value);\n                                                                        }\n                                                                        Failed => {\n                                                                            break;\n                                                                        }\n                                                                    }\n                                                                }\n                                                                if __repeat_value.len() >= 1 {\n                                                                    Matched(__repeat_pos, ())\n                                                                } else {\n                                                                    Failed\n                                                                }\n                                                            } {\n                                                                Matched(__newpos, _) => Matched(__newpos, &__input[str_start..__newpos]),\n                                                                Failed => Failed,\n                                                            }\n                                                        };\n                                                        match __seq_res {\n                                                            Matched(__pos, n) => Matched(__pos, { (IntegerBase::Binary, n) }),\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            };\n                                            match __seq_res {\n                                                Matched(__pos, e) => Matched(__pos, { e }),\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                };\n                                match __choice_res {\n                                    Matched(__pos, __value) => Matched(__pos, __value),\n                                    Failed => {\n                                        let __seq_res = {\n                                            let str_start = __pos;\n                                            match slice_eq(__input, __state, __pos, \"0\") {\n                                                Matched(__newpos, _) => Matched(__newpos, &__input[str_start..__newpos]),\n                                                Failed => Failed,\n                                            }\n                                        };\n                                        match __seq_res {\n                                            Matched(__pos, n) => Matched(__pos, { (IntegerBase::Decimal, n) }),\n                                            Failed => Failed,\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n\nfn __parse_integer_suffix<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<IntegerSuffix> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            __state.suppress_fail += 1;\n            let res = __parse_integer_suffix_inner(__input, __state, __pos, env);\n            __state.suppress_fail -= 1;\n            res\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                __state.mark_failure(__pos, \"integer suffix\");\n                Failed\n            }\n        }\n    }\n}\n\nfn __parse_integer_suffix_inner<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<IntegerSuffix> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = {\n            let str_start = __pos;\n            match {\n                let mut __repeat_pos = __pos;\n                loop {\n                    let __pos = __repeat_pos;\n                    let __step_res = {\n                        let __choice_res = if __input.len() > __pos {\n                            let (__ch, __next) = char_range_at(__input, __pos);\n                            match __ch {\n                                'u' | 'U' | 'l' | 'L' => Matched(__next, ()),\n                                _ => __state.mark_failure(__pos, \"[uUlL]\"),\n                            }\n                        } else {\n                            __state.mark_failure(__pos, \"[uUlL]\")\n                        };\n                        match __choice_res {\n                            Matched(__pos, __value) => Matched(__pos, __value),\n                            Failed => {\n                                let __seq_res = {\n                                    __state.suppress_fail += 1;\n                                    let __assert_res = __parse_gnu_guard(__input, __state, __pos, env);\n                                    __state.suppress_fail -= 1;\n                                    match __assert_res {\n                                        Matched(_, __value) => Matched(__pos, __value),\n                                        Failed => Failed,\n                                    }\n                                };\n                                match __seq_res {\n                                    Matched(__pos, _) => {\n                                        let __seq_res = if __input.len() > __pos {\n                                            let (__ch, __next) = char_range_at(__input, __pos);\n                                            match __ch {\n                                                'i' | 'I' | 'j' | 'J' => Matched(__next, ()),\n                                                _ => __state.mark_failure(__pos, \"[iIjJ]\"),\n                                            }\n                                        } else {\n                                            __state.mark_failure(__pos, \"[iIjJ]\")\n                                        };\n                                        match __seq_res {\n                                            Matched(__pos, e) => Matched(__pos, { e }),\n                                            Failed => Failed,\n                                        }\n                                    }\n                                    Failed => Failed,\n                                }\n                            }\n                        }\n                    };\n                    match __step_res {\n                        Matched(__newpos, __value) => {\n                            __repeat_pos = __newpos;\n                        }\n                        Failed => {\n                            break;\n                        }\n                    }\n                }\n                Matched(__repeat_pos, ())\n            } {\n                Matched(__newpos, _) => Matched(__newpos, &__input[str_start..__newpos]),\n                Failed => Failed,\n            }\n        };\n        match __seq_res {\n            Matched(__pos, s) => match { int_suffix(s) } {\n                Ok(res) => Matched(__pos, res),\n                Err(expected) => {\n                    __state.mark_failure(__pos, expected);\n                    Failed\n                }\n            },\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_float_constant<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Float> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = __parse_float_number(__input, __state, __pos, env);\n        match __seq_res {\n            Matched(__pos, n) => {\n                let __seq_res = __parse_float_suffix(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, suffix) => Matched(__pos, {\n                        let (base, number) = n;\n                        Float { base: base, number: number.to_string().into_boxed_str(), suffix: suffix }\n                    }),\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_float_number<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<(FloatBase, &'input str)> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            let __seq_res = {\n                let str_start = __pos;\n                match __parse_float_decimal(__input, __state, __pos, env) {\n                    Matched(__newpos, _) => Matched(__newpos, &__input[str_start..__newpos]),\n                    Failed => Failed,\n                }\n            };\n            match __seq_res {\n                Matched(__pos, n) => Matched(__pos, { (FloatBase::Decimal, n) }),\n                Failed => Failed,\n            }\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                let __seq_res = __parse_ohx(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = {\n                            let str_start = __pos;\n                            match __parse_float_hexadecimal(__input, __state, __pos, env) {\n                                Matched(__newpos, _) => Matched(__newpos, &__input[str_start..__newpos]),\n                                Failed => Failed,\n                            }\n                        };\n                        match __seq_res {\n                            Matched(__pos, n) => Matched(__pos, { (FloatBase::Hexadecimal, n) }),\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n        }\n    }\n}\n\nfn __parse_float_decimal<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<()> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            let __seq_res = {\n                let mut __repeat_pos = __pos;\n                loop {\n                    let __pos = __repeat_pos;\n                    let __step_res = __parse_dec(__input, __state, __pos, env);\n                    match __step_res {\n                        Matched(__newpos, __value) => {\n                            __repeat_pos = __newpos;\n                        }\n                        Failed => {\n                            break;\n                        }\n                    }\n                }\n                Matched(__repeat_pos, ())\n            };\n            match __seq_res {\n                Matched(__pos, _) => {\n                    let __seq_res = slice_eq(__input, __state, __pos, \".\");\n                    match __seq_res {\n                        Matched(__pos, _) => {\n                            let __seq_res = {\n                                let mut __repeat_pos = __pos;\n                                let mut __repeat_value = vec![];\n                                loop {\n                                    let __pos = __repeat_pos;\n                                    let __step_res = __parse_dec(__input, __state, __pos, env);\n                                    match __step_res {\n                                        Matched(__newpos, __value) => {\n                                            __repeat_pos = __newpos;\n                                            __repeat_value.push(__value);\n                                        }\n                                        Failed => {\n                                            break;\n                                        }\n                                    }\n                                }\n                                if __repeat_value.len() >= 1 {\n                                    Matched(__repeat_pos, ())\n                                } else {\n                                    Failed\n                                }\n                            };\n                            match __seq_res {\n                                Matched(__pos, _) => match __parse_float_decimal_exp(__input, __state, __pos, env) {\n                                    Matched(__newpos, _) => Matched(__newpos, ()),\n                                    Failed => Matched(__pos, ()),\n                                },\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                }\n                Failed => Failed,\n            }\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                let __choice_res = {\n                    let __seq_res = {\n                        let mut __repeat_pos = __pos;\n                        let mut __repeat_value = vec![];\n                        loop {\n                            let __pos = __repeat_pos;\n                            let __step_res = __parse_dec(__input, __state, __pos, env);\n                            match __step_res {\n                                Matched(__newpos, __value) => {\n                                    __repeat_pos = __newpos;\n                                    __repeat_value.push(__value);\n                                }\n                                Failed => {\n                                    break;\n                                }\n                            }\n                        }\n                        if __repeat_value.len() >= 1 {\n                            Matched(__repeat_pos, ())\n                        } else {\n                            Failed\n                        }\n                    };\n                    match __seq_res {\n                        Matched(__pos, _) => {\n                            let __seq_res = slice_eq(__input, __state, __pos, \".\");\n                            match __seq_res {\n                                Matched(__pos, _) => match __parse_float_decimal_exp(__input, __state, __pos, env) {\n                                    Matched(__newpos, _) => Matched(__newpos, ()),\n                                    Failed => Matched(__pos, ()),\n                                },\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                };\n                match __choice_res {\n                    Matched(__pos, __value) => Matched(__pos, __value),\n                    Failed => {\n                        let __seq_res = {\n                            let mut __repeat_pos = __pos;\n                            let mut __repeat_value = vec![];\n                            loop {\n                                let __pos = __repeat_pos;\n                                let __step_res = __parse_dec(__input, __state, __pos, env);\n                                match __step_res {\n                                    Matched(__newpos, __value) => {\n                                        __repeat_pos = __newpos;\n                                        __repeat_value.push(__value);\n                                    }\n                                    Failed => {\n                                        break;\n                                    }\n                                }\n                            }\n                            if __repeat_value.len() >= 1 {\n                                Matched(__repeat_pos, ())\n                            } else {\n                                Failed\n                            }\n                        };\n                        match __seq_res {\n                            Matched(__pos, _) => __parse_float_decimal_exp(__input, __state, __pos, env),\n                            Failed => Failed,\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n\nfn __parse_float_decimal_exp<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<()> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = if __input.len() > __pos {\n            let (__ch, __next) = char_range_at(__input, __pos);\n            match __ch {\n                'e' | 'E' => Matched(__next, ()),\n                _ => __state.mark_failure(__pos, \"[eE]\"),\n            }\n        } else {\n            __state.mark_failure(__pos, \"[eE]\")\n        };\n        match __seq_res {\n            Matched(__pos, _) => {\n                let __seq_res = match if __input.len() > __pos {\n                    let (__ch, __next) = char_range_at(__input, __pos);\n                    match __ch {\n                        '+' | '-' => Matched(__next, ()),\n                        _ => __state.mark_failure(__pos, \"[+-]\"),\n                    }\n                } else {\n                    __state.mark_failure(__pos, \"[+-]\")\n                } {\n                    Matched(__newpos, _) => Matched(__newpos, ()),\n                    Failed => Matched(__pos, ()),\n                };\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let mut __repeat_pos = __pos;\n                        let mut __repeat_value = vec![];\n                        loop {\n                            let __pos = __repeat_pos;\n                            let __step_res = __parse_dec(__input, __state, __pos, env);\n                            match __step_res {\n                                Matched(__newpos, __value) => {\n                                    __repeat_pos = __newpos;\n                                    __repeat_value.push(__value);\n                                }\n                                Failed => {\n                                    break;\n                                }\n                            }\n                        }\n                        if __repeat_value.len() >= 1 {\n                            Matched(__repeat_pos, ())\n                        } else {\n                            Failed\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_float_hexadecimal<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<()> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            let __seq_res = {\n                let mut __repeat_pos = __pos;\n                loop {\n                    let __pos = __repeat_pos;\n                    let __step_res = __parse_hex(__input, __state, __pos, env);\n                    match __step_res {\n                        Matched(__newpos, __value) => {\n                            __repeat_pos = __newpos;\n                        }\n                        Failed => {\n                            break;\n                        }\n                    }\n                }\n                Matched(__repeat_pos, ())\n            };\n            match __seq_res {\n                Matched(__pos, _) => {\n                    let __seq_res = slice_eq(__input, __state, __pos, \".\");\n                    match __seq_res {\n                        Matched(__pos, _) => {\n                            let __seq_res = {\n                                let mut __repeat_pos = __pos;\n                                let mut __repeat_value = vec![];\n                                loop {\n                                    let __pos = __repeat_pos;\n                                    let __step_res = __parse_hex(__input, __state, __pos, env);\n                                    match __step_res {\n                                        Matched(__newpos, __value) => {\n                                            __repeat_pos = __newpos;\n                                            __repeat_value.push(__value);\n                                        }\n                                        Failed => {\n                                            break;\n                                        }\n                                    }\n                                }\n                                if __repeat_value.len() >= 1 {\n                                    Matched(__repeat_pos, ())\n                                } else {\n                                    Failed\n                                }\n                            };\n                            match __seq_res {\n                                Matched(__pos, _) => __parse_float_binary_exp(__input, __state, __pos, env),\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                }\n                Failed => Failed,\n            }\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                let __choice_res = {\n                    let __seq_res = {\n                        let mut __repeat_pos = __pos;\n                        let mut __repeat_value = vec![];\n                        loop {\n                            let __pos = __repeat_pos;\n                            let __step_res = __parse_hex(__input, __state, __pos, env);\n                            match __step_res {\n                                Matched(__newpos, __value) => {\n                                    __repeat_pos = __newpos;\n                                    __repeat_value.push(__value);\n                                }\n                                Failed => {\n                                    break;\n                                }\n                            }\n                        }\n                        if __repeat_value.len() >= 1 {\n                            Matched(__repeat_pos, ())\n                        } else {\n                            Failed\n                        }\n                    };\n                    match __seq_res {\n                        Matched(__pos, _) => {\n                            let __seq_res = slice_eq(__input, __state, __pos, \".\");\n                            match __seq_res {\n                                Matched(__pos, _) => __parse_float_binary_exp(__input, __state, __pos, env),\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                };\n                match __choice_res {\n                    Matched(__pos, __value) => Matched(__pos, __value),\n                    Failed => {\n                        let __seq_res = {\n                            let mut __repeat_pos = __pos;\n                            let mut __repeat_value = vec![];\n                            loop {\n                                let __pos = __repeat_pos;\n                                let __step_res = __parse_hex(__input, __state, __pos, env);\n                                match __step_res {\n                                    Matched(__newpos, __value) => {\n                                        __repeat_pos = __newpos;\n                                        __repeat_value.push(__value);\n                                    }\n                                    Failed => {\n                                        break;\n                                    }\n                                }\n                            }\n                            if __repeat_value.len() >= 1 {\n                                Matched(__repeat_pos, ())\n                            } else {\n                                Failed\n                            }\n                        };\n                        match __seq_res {\n                            Matched(__pos, _) => __parse_float_binary_exp(__input, __state, __pos, env),\n                            Failed => Failed,\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n\nfn __parse_float_binary_exp<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<()> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = if __input.len() > __pos {\n            let (__ch, __next) = char_range_at(__input, __pos);\n            match __ch {\n                'p' | 'P' => Matched(__next, ()),\n                _ => __state.mark_failure(__pos, \"[pP]\"),\n            }\n        } else {\n            __state.mark_failure(__pos, \"[pP]\")\n        };\n        match __seq_res {\n            Matched(__pos, _) => {\n                let __seq_res = match if __input.len() > __pos {\n                    let (__ch, __next) = char_range_at(__input, __pos);\n                    match __ch {\n                        '+' | '-' => Matched(__next, ()),\n                        _ => __state.mark_failure(__pos, \"[+-]\"),\n                    }\n                } else {\n                    __state.mark_failure(__pos, \"[+-]\")\n                } {\n                    Matched(__newpos, _) => Matched(__newpos, ()),\n                    Failed => Matched(__pos, ()),\n                };\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let mut __repeat_pos = __pos;\n                        let mut __repeat_value = vec![];\n                        loop {\n                            let __pos = __repeat_pos;\n                            let __step_res = __parse_dec(__input, __state, __pos, env);\n                            match __step_res {\n                                Matched(__newpos, __value) => {\n                                    __repeat_pos = __newpos;\n                                    __repeat_value.push(__value);\n                                }\n                                Failed => {\n                                    break;\n                                }\n                            }\n                        }\n                        if __repeat_value.len() >= 1 {\n                            Matched(__repeat_pos, ())\n                        } else {\n                            Failed\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_float_suffix<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<FloatSuffix> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            __state.suppress_fail += 1;\n            let res = __parse_float_suffix_inner(__input, __state, __pos, env);\n            __state.suppress_fail -= 1;\n            res\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                __state.mark_failure(__pos, \"float literal suffix\");\n                Failed\n            }\n        }\n    }\n}\n\nfn __parse_float_suffix_inner<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<FloatSuffix> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            let __seq_res = {\n                let __seq_res = {\n                    __state.suppress_fail += 1;\n                    let __assert_res = __parse_gnu_guard(__input, __state, __pos, env);\n                    __state.suppress_fail -= 1;\n                    match __assert_res {\n                        Matched(_, __value) => Matched(__pos, __value),\n                        Failed => Failed,\n                    }\n                };\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = if __input.len() > __pos {\n                            let (__ch, __next) = char_range_at(__input, __pos);\n                            match __ch {\n                                'i' | 'I' | 'j' | 'J' => Matched(__next, ()),\n                                _ => __state.mark_failure(__pos, \"[iIjJ]\"),\n                            }\n                        } else {\n                            __state.mark_failure(__pos, \"[iIjJ]\")\n                        };\n                        match __seq_res {\n                            Matched(__pos, e) => Matched(__pos, { e }),\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            };\n            match __seq_res {\n                Matched(__pos, _) => {\n                    let __seq_res = __parse_float_format(__input, __state, __pos, env);\n                    match __seq_res {\n                        Matched(__pos, fmt) => Matched(__pos, { FloatSuffix { format: fmt, imaginary: true } }),\n                        Failed => Failed,\n                    }\n                }\n                Failed => Failed,\n            }\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                let __seq_res = __parse_float_format(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, fmt) => {\n                        let __seq_res = match {\n                            let __seq_res = {\n                                __state.suppress_fail += 1;\n                                let __assert_res = __parse_gnu_guard(__input, __state, __pos, env);\n                                __state.suppress_fail -= 1;\n                                match __assert_res {\n                                    Matched(_, __value) => Matched(__pos, __value),\n                                    Failed => Failed,\n                                }\n                            };\n                            match __seq_res {\n                                Matched(__pos, _) => {\n                                    let __seq_res = if __input.len() > __pos {\n                                        let (__ch, __next) = char_range_at(__input, __pos);\n                                        match __ch {\n                                            'i' | 'I' | 'j' | 'J' => Matched(__next, ()),\n                                            _ => __state.mark_failure(__pos, \"[iIjJ]\"),\n                                        }\n                                    } else {\n                                        __state.mark_failure(__pos, \"[iIjJ]\")\n                                    };\n                                    match __seq_res {\n                                        Matched(__pos, e) => Matched(__pos, { e }),\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        } {\n                            Matched(__newpos, __value) => Matched(__newpos, Some(__value)),\n                            Failed => Matched(__pos, None),\n                        };\n                        match __seq_res {\n                            Matched(__pos, imag) => Matched(__pos, { FloatSuffix { format: fmt, imaginary: imag.is_some() } }),\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n        }\n    }\n}\n\nfn __parse_float_format<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<FloatFormat> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            let __seq_res = __parse_ts18661_float_suffix(__input, __state, __pos, env);\n            match __seq_res {\n                Matched(__pos, f) => Matched(__pos, { FloatFormat::TS18661Format(f) }),\n                Failed => Failed,\n            }\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                let __choice_res = {\n                    let __seq_res = if __input.len() > __pos {\n                        let (__ch, __next) = char_range_at(__input, __pos);\n                        match __ch {\n                            'f' | 'F' => Matched(__next, ()),\n                            _ => __state.mark_failure(__pos, \"[fF]\"),\n                        }\n                    } else {\n                        __state.mark_failure(__pos, \"[fF]\")\n                    };\n                    match __seq_res {\n                        Matched(__pos, _) => Matched(__pos, { FloatFormat::Float }),\n                        Failed => Failed,\n                    }\n                };\n                match __choice_res {\n                    Matched(__pos, __value) => Matched(__pos, __value),\n                    Failed => {\n                        let __choice_res = {\n                            let __seq_res = if __input.len() > __pos {\n                                let (__ch, __next) = char_range_at(__input, __pos);\n                                match __ch {\n                                    'l' | 'L' => Matched(__next, ()),\n                                    _ => __state.mark_failure(__pos, \"[lL]\"),\n                                }\n                            } else {\n                                __state.mark_failure(__pos, \"[lL]\")\n                            };\n                            match __seq_res {\n                                Matched(__pos, _) => Matched(__pos, { FloatFormat::LongDouble }),\n                                Failed => Failed,\n                            }\n                        };\n                        match __choice_res {\n                            Matched(__pos, __value) => Matched(__pos, __value),\n                            Failed => Matched(__pos, { FloatFormat::Double }),\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n\nfn __parse_character_constant<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<String> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = {\n            let str_start = __pos;\n            match {\n                let __seq_res = match if __input.len() > __pos {\n                    let (__ch, __next) = char_range_at(__input, __pos);\n                    match __ch {\n                        'L' | 'u' | 'U' => Matched(__next, ()),\n                        _ => __state.mark_failure(__pos, \"[LuU]\"),\n                    }\n                } else {\n                    __state.mark_failure(__pos, \"[LuU]\")\n                } {\n                    Matched(__newpos, _) => Matched(__newpos, ()),\n                    Failed => Matched(__pos, ()),\n                };\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = slice_eq(__input, __state, __pos, \"'\");\n                        match __seq_res {\n                            Matched(__pos, _) => {\n                                let __seq_res = {\n                                    let mut __repeat_pos = __pos;\n                                    let mut __repeat_value = vec![];\n                                    loop {\n                                        let __pos = __repeat_pos;\n                                        let __step_res = __parse_character(__input, __state, __pos, env);\n                                        match __step_res {\n                                            Matched(__newpos, __value) => {\n                                                __repeat_pos = __newpos;\n                                                __repeat_value.push(__value);\n                                            }\n                                            Failed => {\n                                                break;\n                                            }\n                                        }\n                                    }\n                                    if __repeat_value.len() >= 1 {\n                                        Matched(__repeat_pos, ())\n                                    } else {\n                                        Failed\n                                    }\n                                };\n                                match __seq_res {\n                                    Matched(__pos, _) => slice_eq(__input, __state, __pos, \"'\"),\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            } {\n                Matched(__newpos, _) => Matched(__newpos, &__input[str_start..__newpos]),\n                Failed => Failed,\n            }\n        };\n        match __seq_res {\n            Matched(__pos, c) => Matched(__pos, { String::from(c) }),\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_character<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<()> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = if __input.len() > __pos {\n            let (__ch, __next) = char_range_at(__input, __pos);\n            match __ch {\n                '\\'' | '\\\\' | '\\n' => __state.mark_failure(__pos, \"[^'\\\\\\n]\"),\n                _ => Matched(__next, ()),\n            }\n        } else {\n            __state.mark_failure(__pos, \"[^'\\\\\\n]\")\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => __parse_escape_sequence(__input, __state, __pos, env),\n        }\n    }\n}\n\nfn __parse_escape_sequence<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<()> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = slice_eq(__input, __state, __pos, \"\\\\\");\n        match __seq_res {\n            Matched(__pos, _) => {\n                let __choice_res = if __input.len() > __pos {\n                    let (__ch, __next) = char_range_at(__input, __pos);\n                    match __ch {\n                        '\\'' | '\"' | '?' | '\\\\' | 'a' | 'b' | 'f' | 'n' | 'r' | 't' | 'v' => Matched(__next, ()),\n                        _ => __state.mark_failure(__pos, \"['\\\"?\\\\abfnrtv]\"),\n                    }\n                } else {\n                    __state.mark_failure(__pos, \"['\\\"?\\\\abfnrtv]\")\n                };\n                match __choice_res {\n                    Matched(__pos, __value) => Matched(__pos, __value),\n                    Failed => {\n                        let __choice_res = {\n                            let mut __repeat_pos = __pos;\n                            let mut __repeat_value = vec![];\n                            loop {\n                                let __pos = __repeat_pos;\n                                if __repeat_value.len() >= 3 {\n                                    break;\n                                }\n                                let __step_res = __parse_oct(__input, __state, __pos, env);\n                                match __step_res {\n                                    Matched(__newpos, __value) => {\n                                        __repeat_pos = __newpos;\n                                        __repeat_value.push(__value);\n                                    }\n                                    Failed => {\n                                        break;\n                                    }\n                                }\n                            }\n                            if __repeat_value.len() >= 1 {\n                                Matched(__repeat_pos, ())\n                            } else {\n                                Failed\n                            }\n                        };\n                        match __choice_res {\n                            Matched(__pos, __value) => Matched(__pos, __value),\n                            Failed => {\n                                let __seq_res = slice_eq(__input, __state, __pos, \"x\");\n                                match __seq_res {\n                                    Matched(__pos, _) => {\n                                        let mut __repeat_pos = __pos;\n                                        let mut __repeat_value = vec![];\n                                        loop {\n                                            let __pos = __repeat_pos;\n                                            let __step_res = __parse_hex(__input, __state, __pos, env);\n                                            match __step_res {\n                                                Matched(__newpos, __value) => {\n                                                    __repeat_pos = __newpos;\n                                                    __repeat_value.push(__value);\n                                                }\n                                                Failed => {\n                                                    break;\n                                                }\n                                            }\n                                        }\n                                        if __repeat_value.len() >= 1 {\n                                            Matched(__repeat_pos, ())\n                                        } else {\n                                            Failed\n                                        }\n                                    }\n                                    Failed => Failed,\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_string_literal<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Node<Vec<String>>> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = {\n            let __seq_res = Matched(__pos, __pos);\n            match __seq_res {\n                Matched(__pos, l) => {\n                    let __seq_res = {\n                        let __seq_res = {\n                            let mut __repeat_pos = __pos;\n                            let mut __repeat_value = vec![];\n                            loop {\n                                let __pos = __repeat_pos;\n                                let __pos = if __repeat_value.len() > 0 {\n                                    let __sep_res = __parse__(__input, __state, __pos, env);\n                                    match __sep_res {\n                                        Matched(__newpos, _) => __newpos,\n                                        Failed => break,\n                                    }\n                                } else {\n                                    __pos\n                                };\n                                let __step_res = __parse_string_literal0(__input, __state, __pos, env);\n                                match __step_res {\n                                    Matched(__newpos, __value) => {\n                                        __repeat_pos = __newpos;\n                                        __repeat_value.push(__value);\n                                    }\n                                    Failed => {\n                                        break;\n                                    }\n                                }\n                            }\n                            if __repeat_value.len() >= 1 {\n                                Matched(__repeat_pos, __repeat_value)\n                            } else {\n                                Failed\n                            }\n                        };\n                        match __seq_res {\n                            Matched(__pos, e) => Matched(__pos, { e }),\n                            Failed => Failed,\n                        }\n                    };\n                    match __seq_res {\n                        Matched(__pos, e) => {\n                            let __seq_res = Matched(__pos, __pos);\n                            match __seq_res {\n                                Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                }\n                Failed => Failed,\n            }\n        };\n        match __seq_res {\n            Matched(__pos, s) => Matched(__pos, { s }),\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_string_literal0<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<String> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = {\n            let str_start = __pos;\n            match {\n                let __seq_res = match __parse_encoding_prefix(__input, __state, __pos, env) {\n                    Matched(__newpos, _) => Matched(__newpos, ()),\n                    Failed => Matched(__pos, ()),\n                };\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = slice_eq(__input, __state, __pos, \"\\\"\");\n                        match __seq_res {\n                            Matched(__pos, _) => {\n                                let __seq_res = {\n                                    let mut __repeat_pos = __pos;\n                                    loop {\n                                        let __pos = __repeat_pos;\n                                        let __step_res = __parse_string_char(__input, __state, __pos, env);\n                                        match __step_res {\n                                            Matched(__newpos, __value) => {\n                                                __repeat_pos = __newpos;\n                                            }\n                                            Failed => {\n                                                break;\n                                            }\n                                        }\n                                    }\n                                    Matched(__repeat_pos, ())\n                                };\n                                match __seq_res {\n                                    Matched(__pos, _) => slice_eq(__input, __state, __pos, \"\\\"\"),\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            } {\n                Matched(__newpos, _) => Matched(__newpos, &__input[str_start..__newpos]),\n                Failed => Failed,\n            }\n        };\n        match __seq_res {\n            Matched(__pos, s) => Matched(__pos, { String::from(s) }),\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_encoding_prefix<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<()> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = slice_eq(__input, __state, __pos, \"u8\");\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                if __input.len() > __pos {\n                    let (__ch, __next) = char_range_at(__input, __pos);\n                    match __ch {\n                        'u' | 'U' | 'L' => Matched(__next, ()),\n                        _ => __state.mark_failure(__pos, \"[uUL]\"),\n                    }\n                } else {\n                    __state.mark_failure(__pos, \"[uUL]\")\n                }\n            }\n        }\n    }\n}\n\nfn __parse_string_char<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<()> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = if __input.len() > __pos {\n            let (__ch, __next) = char_range_at(__input, __pos);\n            match __ch {\n                '\"' | '\\\\' | '\\n' => __state.mark_failure(__pos, \"[^\\\"\\\\\\n]\"),\n                _ => Matched(__next, ()),\n            }\n        } else {\n            __state.mark_failure(__pos, \"[^\\\"\\\\\\n]\")\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => __parse_escape_sequence(__input, __state, __pos, env),\n        }\n    }\n}\n\nfn __parse_primary_expression<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Box<Node<Expression>>> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = {\n            let __seq_res = Matched(__pos, __pos);\n            match __seq_res {\n                Matched(__pos, l) => {\n                    let __seq_res = __parse_primary_expression0(__input, __state, __pos, env);\n                    match __seq_res {\n                        Matched(__pos, e) => {\n                            let __seq_res = Matched(__pos, __pos);\n                            match __seq_res {\n                                Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                }\n                Failed => Failed,\n            }\n        };\n        match __seq_res {\n            Matched(__pos, e) => Matched(__pos, { Box::new(e) }),\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_primary_expression0<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Expression> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            let __seq_res = __parse_string_literal(__input, __state, __pos, env);\n            match __seq_res {\n                Matched(__pos, a) => Matched(__pos, { Expression::StringLiteral(Box::new(a)) }),\n                Failed => Failed,\n            }\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                let __choice_res = {\n                    let __seq_res = {\n                        let __seq_res = Matched(__pos, __pos);\n                        match __seq_res {\n                            Matched(__pos, l) => {\n                                let __seq_res = __parse_constant(__input, __state, __pos, env);\n                                match __seq_res {\n                                    Matched(__pos, e) => {\n                                        let __seq_res = Matched(__pos, __pos);\n                                        match __seq_res {\n                                            Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                            Failed => Failed,\n                                        }\n                                    }\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    };\n                    match __seq_res {\n                        Matched(__pos, a) => Matched(__pos, { Expression::Constant(Box::new(a)) }),\n                        Failed => Failed,\n                    }\n                };\n                match __choice_res {\n                    Matched(__pos, __value) => Matched(__pos, __value),\n                    Failed => {\n                        let __choice_res = {\n                            let __seq_res = __parse_identifier(__input, __state, __pos, env);\n                            match __seq_res {\n                                Matched(__pos, a) => Matched(__pos, { Expression::Identifier(Box::new(a)) }),\n                                Failed => Failed,\n                            }\n                        };\n                        match __choice_res {\n                            Matched(__pos, __value) => Matched(__pos, __value),\n                            Failed => {\n                                let __choice_res = {\n                                    let __seq_res = slice_eq(__input, __state, __pos, \"(\");\n                                    match __seq_res {\n                                        Matched(__pos, _) => {\n                                            let __seq_res = __parse__(__input, __state, __pos, env);\n                                            match __seq_res {\n                                                Matched(__pos, _) => {\n                                                    let __seq_res = __parse_expression0(__input, __state, __pos, env);\n                                                    match __seq_res {\n                                                        Matched(__pos, a) => {\n                                                            let __seq_res = __parse__(__input, __state, __pos, env);\n                                                            match __seq_res {\n                                                                Matched(__pos, _) => {\n                                                                    let __seq_res = slice_eq(__input, __state, __pos, \")\");\n                                                                    match __seq_res {\n                                                                        Matched(__pos, _) => Matched(__pos, { a }),\n                                                                        Failed => Failed,\n                                                                    }\n                                                                }\n                                                                Failed => Failed,\n                                                            }\n                                                        }\n                                                        Failed => Failed,\n                                                    }\n                                                }\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                };\n                                match __choice_res {\n                                    Matched(__pos, __value) => Matched(__pos, __value),\n                                    Failed => {\n                                        let __choice_res = {\n                                            let __seq_res = {\n                                                let __seq_res = Matched(__pos, __pos);\n                                                match __seq_res {\n                                                    Matched(__pos, l) => {\n                                                        let __seq_res = __parse_generic_selection(__input, __state, __pos, env);\n                                                        match __seq_res {\n                                                            Matched(__pos, e) => {\n                                                                let __seq_res = Matched(__pos, __pos);\n                                                                match __seq_res {\n                                                                    Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                                    Failed => Failed,\n                                                                }\n                                                            }\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            };\n                                            match __seq_res {\n                                                Matched(__pos, a) => Matched(__pos, { Expression::GenericSelection(Box::new(a)) }),\n                                                Failed => Failed,\n                                            }\n                                        };\n                                        match __choice_res {\n                                            Matched(__pos, __value) => Matched(__pos, __value),\n                                            Failed => {\n                                                let __seq_res = {\n                                                    __state.suppress_fail += 1;\n                                                    let __assert_res = __parse_gnu_guard(__input, __state, __pos, env);\n                                                    __state.suppress_fail -= 1;\n                                                    match __assert_res {\n                                                        Matched(_, __value) => Matched(__pos, __value),\n                                                        Failed => Failed,\n                                                    }\n                                                };\n                                                match __seq_res {\n                                                    Matched(__pos, _) => {\n                                                        let __seq_res = __parse_gnu_primary_expression(__input, __state, __pos, env);\n                                                        match __seq_res {\n                                                            Matched(__pos, e) => Matched(__pos, { e }),\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n\nfn __parse_generic_selection<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<GenericSelection> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = {\n            __state.suppress_fail += 1;\n            let res = {\n                let __seq_res = slice_eq(__input, __state, __pos, \"_Generic\");\n                match __seq_res {\n                    Matched(__pos, e) => {\n                        let __seq_res = {\n                            __state.suppress_fail += 1;\n                            let __assert_res = if __input.len() > __pos {\n                                let (__ch, __next) = char_range_at(__input, __pos);\n                                match __ch {\n                                    '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                    _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                }\n                            } else {\n                                __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                            };\n                            __state.suppress_fail -= 1;\n                            match __assert_res {\n                                Failed => Matched(__pos, ()),\n                                Matched(..) => Failed,\n                            }\n                        };\n                        match __seq_res {\n                            Matched(__pos, _) => Matched(__pos, { e }),\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            };\n            __state.suppress_fail -= 1;\n            res\n        };\n        match __seq_res {\n            Matched(__pos, _) => {\n                let __seq_res = __parse__(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = slice_eq(__input, __state, __pos, \"(\");\n                        match __seq_res {\n                            Matched(__pos, _) => {\n                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                match __seq_res {\n                                    Matched(__pos, _) => {\n                                        let __seq_res = __parse_assignment_expression(__input, __state, __pos, env);\n                                        match __seq_res {\n                                            Matched(__pos, e) => {\n                                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                                match __seq_res {\n                                                    Matched(__pos, _) => {\n                                                        let __seq_res = slice_eq(__input, __state, __pos, \",\");\n                                                        match __seq_res {\n                                                            Matched(__pos, _) => {\n                                                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                                                match __seq_res {\n                                                                    Matched(__pos, _) => {\n                                                                        let __seq_res = {\n                                                                            let __seq_res = {\n                                                                                let mut __repeat_pos = __pos;\n                                                                                let mut __repeat_value = vec![];\n                                                                                loop {\n                                                                                    let __pos = __repeat_pos;\n                                                                                    let __pos = if __repeat_value.len() > 0 {\n                                                                                        let __sep_res = {\n                                                                                            let __seq_res = __parse__(__input, __state, __pos, env);\n                                                                                            match __seq_res {\n                                                                                                Matched(__pos, _) => {\n                                                                                                    let __seq_res = slice_eq(__input, __state, __pos, \",\");\n                                                                                                    match __seq_res {\n                                                                                                        Matched(__pos, _) => __parse__(__input, __state, __pos, env),\n                                                                                                        Failed => Failed,\n                                                                                                    }\n                                                                                                }\n                                                                                                Failed => Failed,\n                                                                                            }\n                                                                                        };\n                                                                                        match __sep_res {\n                                                                                            Matched(__newpos, _) => __newpos,\n                                                                                            Failed => break,\n                                                                                        }\n                                                                                    } else {\n                                                                                        __pos\n                                                                                    };\n                                                                                    let __step_res = {\n                                                                                        let __seq_res = Matched(__pos, __pos);\n                                                                                        match __seq_res {\n                                                                                            Matched(__pos, l) => {\n                                                                                                let __seq_res = __parse_generic_association(__input, __state, __pos, env);\n                                                                                                match __seq_res {\n                                                                                                    Matched(__pos, e) => {\n                                                                                                        let __seq_res = Matched(__pos, __pos);\n                                                                                                        match __seq_res {\n                                                                                                            Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                                                                            Failed => Failed,\n                                                                                                        }\n                                                                                                    }\n                                                                                                    Failed => Failed,\n                                                                                                }\n                                                                                            }\n                                                                                            Failed => Failed,\n                                                                                        }\n                                                                                    };\n                                                                                    match __step_res {\n                                                                                        Matched(__newpos, __value) => {\n                                                                                            __repeat_pos = __newpos;\n                                                                                            __repeat_value.push(__value);\n                                                                                        }\n                                                                                        Failed => {\n                                                                                            break;\n                                                                                        }\n                                                                                    }\n                                                                                }\n                                                                                if __repeat_value.len() >= 1 {\n                                                                                    Matched(__repeat_pos, __repeat_value)\n                                                                                } else {\n                                                                                    Failed\n                                                                                }\n                                                                            };\n                                                                            match __seq_res {\n                                                                                Matched(__pos, e) => Matched(__pos, { e }),\n                                                                                Failed => Failed,\n                                                                            }\n                                                                        };\n                                                                        match __seq_res {\n                                                                            Matched(__pos, a) => {\n                                                                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                                                                match __seq_res {\n                                                                                    Matched(__pos, _) => {\n                                                                                        let __seq_res = slice_eq(__input, __state, __pos, \")\");\n                                                                                        match __seq_res {\n                                                                                            Matched(__pos, _) => Matched(__pos, { GenericSelection { expression: e, associations: a } }),\n                                                                                            Failed => Failed,\n                                                                                        }\n                                                                                    }\n                                                                                    Failed => Failed,\n                                                                                }\n                                                                            }\n                                                                            Failed => Failed,\n                                                                        }\n                                                                    }\n                                                                    Failed => Failed,\n                                                                }\n                                                            }\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    }\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_generic_association<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<GenericAssociation> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            let __seq_res = __parse_type_name(__input, __state, __pos, env);\n            match __seq_res {\n                Matched(__pos, t) => {\n                    let __seq_res = __parse__(__input, __state, __pos, env);\n                    match __seq_res {\n                        Matched(__pos, _) => {\n                            let __seq_res = slice_eq(__input, __state, __pos, \":\");\n                            match __seq_res {\n                                Matched(__pos, _) => {\n                                    let __seq_res = __parse__(__input, __state, __pos, env);\n                                    match __seq_res {\n                                        Matched(__pos, _) => {\n                                            let __seq_res = __parse_assignment_expression(__input, __state, __pos, env);\n                                            match __seq_res {\n                                                Matched(__pos, e) => Matched(__pos, {\n                                                    let span = Span::span(t.span.start, e.span.end);\n                                                    GenericAssociation::Type(Node::new(GenericAssociationType { type_name: t, expression: e }, span))\n                                                }),\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                }\n                Failed => Failed,\n            }\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                let __seq_res = {\n                    __state.suppress_fail += 1;\n                    let res = {\n                        let __seq_res = slice_eq(__input, __state, __pos, \"default\");\n                        match __seq_res {\n                            Matched(__pos, e) => {\n                                let __seq_res = {\n                                    __state.suppress_fail += 1;\n                                    let __assert_res = if __input.len() > __pos {\n                                        let (__ch, __next) = char_range_at(__input, __pos);\n                                        match __ch {\n                                            '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                            _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                        }\n                                    } else {\n                                        __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                                    };\n                                    __state.suppress_fail -= 1;\n                                    match __assert_res {\n                                        Failed => Matched(__pos, ()),\n                                        Matched(..) => Failed,\n                                    }\n                                };\n                                match __seq_res {\n                                    Matched(__pos, _) => Matched(__pos, { e }),\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    };\n                    __state.suppress_fail -= 1;\n                    res\n                };\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = __parse__(__input, __state, __pos, env);\n                        match __seq_res {\n                            Matched(__pos, _) => {\n                                let __seq_res = slice_eq(__input, __state, __pos, \":\");\n                                match __seq_res {\n                                    Matched(__pos, _) => {\n                                        let __seq_res = __parse__(__input, __state, __pos, env);\n                                        match __seq_res {\n                                            Matched(__pos, _) => {\n                                                let __seq_res = __parse_assignment_expression(__input, __state, __pos, env);\n                                                match __seq_res {\n                                                    Matched(__pos, e) => Matched(__pos, { GenericAssociation::Default(e) }),\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    }\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n        }\n    }\n}\n\nfn __parse_postfix_expression<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Box<Node<Expression>>> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = {\n            let __seq_res = Matched(__pos, __pos);\n            match __seq_res {\n                Matched(__pos, l) => {\n                    let __seq_res = __parse_postfix_expression0(__input, __state, __pos, env);\n                    match __seq_res {\n                        Matched(__pos, e) => {\n                            let __seq_res = Matched(__pos, __pos);\n                            match __seq_res {\n                                Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                }\n                Failed => Failed,\n            }\n        };\n        match __seq_res {\n            Matched(__pos, e) => Matched(__pos, { Box::new(e) }),\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_postfix_expression0<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Expression> {\n    #![allow(non_snake_case, unused)]\n    if let Some(entry) = __state.postfix_expression0_cache.get(&__pos) {\n        return entry.clone();\n    }\n    let __rule_result = {\n        let __seq_res = {\n            let __seq_res = Matched(__pos, __pos);\n            match __seq_res {\n                Matched(__pos, l) => {\n                    let __seq_res = __parse_postfix_expression1(__input, __state, __pos, env);\n                    match __seq_res {\n                        Matched(__pos, e) => {\n                            let __seq_res = Matched(__pos, __pos);\n                            match __seq_res {\n                                Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                }\n                Failed => Failed,\n            }\n        };\n        match __seq_res {\n            Matched(__pos, e) => {\n                let __seq_res = __parse__(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = {\n                            let __seq_res = {\n                                let mut __repeat_pos = __pos;\n                                let mut __repeat_value = vec![];\n                                loop {\n                                    let __pos = __repeat_pos;\n                                    let __pos = if __repeat_value.len() > 0 {\n                                        let __sep_res = __parse__(__input, __state, __pos, env);\n                                        match __sep_res {\n                                            Matched(__newpos, _) => __newpos,\n                                            Failed => break,\n                                        }\n                                    } else {\n                                        __pos\n                                    };\n                                    let __step_res = {\n                                        let __seq_res = Matched(__pos, __pos);\n                                        match __seq_res {\n                                            Matched(__pos, l) => {\n                                                let __seq_res = __parse_postfix_expressionT(__input, __state, __pos, env);\n                                                match __seq_res {\n                                                    Matched(__pos, e) => {\n                                                        let __seq_res = Matched(__pos, __pos);\n                                                        match __seq_res {\n                                                            Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    };\n                                    match __step_res {\n                                        Matched(__newpos, __value) => {\n                                            __repeat_pos = __newpos;\n                                            __repeat_value.push(__value);\n                                        }\n                                        Failed => {\n                                            break;\n                                        }\n                                    }\n                                }\n                                Matched(__repeat_pos, __repeat_value)\n                            };\n                            match __seq_res {\n                                Matched(__pos, e) => Matched(__pos, { e }),\n                                Failed => Failed,\n                            }\n                        };\n                        match __seq_res {\n                            Matched(__pos, t) => Matched(__pos, { apply_ops(t, e).node }),\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    };\n    __state.postfix_expression0_cache.insert(__pos, __rule_result.clone());\n    __rule_result\n}\n\nfn __parse_postfix_expression1<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Expression> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = __parse_compound_literal(__input, __state, __pos, env);\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => __parse_primary_expression0(__input, __state, __pos, env),\n        }\n    }\n}\n\nfn __parse_postfix_expressionT<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Operation> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = __parse_index_operator(__input, __state, __pos, env);\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                let __choice_res = {\n                    let __seq_res = slice_eq(__input, __state, __pos, \"(\");\n                    match __seq_res {\n                        Matched(__pos, _) => {\n                            let __seq_res = __parse__(__input, __state, __pos, env);\n                            match __seq_res {\n                                Matched(__pos, _) => {\n                                    let __seq_res = {\n                                        let __seq_res = {\n                                            let mut __repeat_pos = __pos;\n                                            let mut __repeat_value = vec![];\n                                            loop {\n                                                let __pos = __repeat_pos;\n                                                let __pos = if __repeat_value.len() > 0 {\n                                                    let __sep_res = {\n                                                        let __seq_res = __parse__(__input, __state, __pos, env);\n                                                        match __seq_res {\n                                                            Matched(__pos, _) => {\n                                                                let __seq_res = slice_eq(__input, __state, __pos, \",\");\n                                                                match __seq_res {\n                                                                    Matched(__pos, _) => __parse__(__input, __state, __pos, env),\n                                                                    Failed => Failed,\n                                                                }\n                                                            }\n                                                            Failed => Failed,\n                                                        }\n                                                    };\n                                                    match __sep_res {\n                                                        Matched(__newpos, _) => __newpos,\n                                                        Failed => break,\n                                                    }\n                                                } else {\n                                                    __pos\n                                                };\n                                                let __step_res = {\n                                                    let __seq_res = Matched(__pos, __pos);\n                                                    match __seq_res {\n                                                        Matched(__pos, l) => {\n                                                            let __seq_res = __parse_assignment_expression0(__input, __state, __pos, env);\n                                                            match __seq_res {\n                                                                Matched(__pos, e) => {\n                                                                    let __seq_res = Matched(__pos, __pos);\n                                                                    match __seq_res {\n                                                                        Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                                        Failed => Failed,\n                                                                    }\n                                                                }\n                                                                Failed => Failed,\n                                                            }\n                                                        }\n                                                        Failed => Failed,\n                                                    }\n                                                };\n                                                match __step_res {\n                                                    Matched(__newpos, __value) => {\n                                                        __repeat_pos = __newpos;\n                                                        __repeat_value.push(__value);\n                                                    }\n                                                    Failed => {\n                                                        break;\n                                                    }\n                                                }\n                                            }\n                                            Matched(__repeat_pos, __repeat_value)\n                                        };\n                                        match __seq_res {\n                                            Matched(__pos, e) => Matched(__pos, { e }),\n                                            Failed => Failed,\n                                        }\n                                    };\n                                    match __seq_res {\n                                        Matched(__pos, e) => {\n                                            let __seq_res = __parse__(__input, __state, __pos, env);\n                                            match __seq_res {\n                                                Matched(__pos, _) => {\n                                                    let __seq_res = slice_eq(__input, __state, __pos, \")\");\n                                                    match __seq_res {\n                                                        Matched(__pos, _) => Matched(__pos, { Operation::Call(e) }),\n                                                        Failed => Failed,\n                                                    }\n                                                }\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                };\n                match __choice_res {\n                    Matched(__pos, __value) => Matched(__pos, __value),\n                    Failed => {\n                        let __choice_res = {\n                            let __seq_res = {\n                                let __seq_res = Matched(__pos, __pos);\n                                match __seq_res {\n                                    Matched(__pos, l) => {\n                                        let __seq_res = __parse_member_operator(__input, __state, __pos, env);\n                                        match __seq_res {\n                                            Matched(__pos, e) => {\n                                                let __seq_res = Matched(__pos, __pos);\n                                                match __seq_res {\n                                                    Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    }\n                                    Failed => Failed,\n                                }\n                            };\n                            match __seq_res {\n                                Matched(__pos, o) => {\n                                    let __seq_res = __parse__(__input, __state, __pos, env);\n                                    match __seq_res {\n                                        Matched(__pos, _) => {\n                                            let __seq_res = __parse_identifier(__input, __state, __pos, env);\n                                            match __seq_res {\n                                                Matched(__pos, i) => Matched(__pos, { Operation::Member(o, i) }),\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        };\n                        match __choice_res {\n                            Matched(__pos, __value) => Matched(__pos, __value),\n                            Failed => {\n                                let __seq_res = {\n                                    let __seq_res = Matched(__pos, __pos);\n                                    match __seq_res {\n                                        Matched(__pos, l) => {\n                                            let __seq_res = __parse_postfix_operator(__input, __state, __pos, env);\n                                            match __seq_res {\n                                                Matched(__pos, e) => {\n                                                    let __seq_res = Matched(__pos, __pos);\n                                                    match __seq_res {\n                                                        Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                        Failed => Failed,\n                                                    }\n                                                }\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                };\n                                match __seq_res {\n                                    Matched(__pos, o) => Matched(__pos, { Operation::Unary(o) }),\n                                    Failed => Failed,\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n\nfn __parse_index_operator<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Operation> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = {\n            let __seq_res = Matched(__pos, __pos);\n            match __seq_res {\n                Matched(__pos, l) => {\n                    let __seq_res = __parse_index_operator0(__input, __state, __pos, env);\n                    match __seq_res {\n                        Matched(__pos, e) => {\n                            let __seq_res = Matched(__pos, __pos);\n                            match __seq_res {\n                                Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                }\n                Failed => Failed,\n            }\n        };\n        match __seq_res {\n            Matched(__pos, i) => Matched(__pos, { Operation::Binary(Node::new(BinaryOperator::Index, i.span), i.node) }),\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_index_operator0<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Node<Expression>> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = slice_eq(__input, __state, __pos, \"[\");\n        match __seq_res {\n            Matched(__pos, _) => {\n                let __seq_res = __parse__(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = {\n                            let __seq_res = Matched(__pos, __pos);\n                            match __seq_res {\n                                Matched(__pos, l) => {\n                                    let __seq_res = __parse_expression0(__input, __state, __pos, env);\n                                    match __seq_res {\n                                        Matched(__pos, e) => {\n                                            let __seq_res = Matched(__pos, __pos);\n                                            match __seq_res {\n                                                Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        };\n                        match __seq_res {\n                            Matched(__pos, e) => {\n                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                match __seq_res {\n                                    Matched(__pos, _) => {\n                                        let __seq_res = slice_eq(__input, __state, __pos, \"]\");\n                                        match __seq_res {\n                                            Matched(__pos, _) => Matched(__pos, { e }),\n                                            Failed => Failed,\n                                        }\n                                    }\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_member_operator<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<MemberOperator> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            let __seq_res = slice_eq(__input, __state, __pos, \".\");\n            match __seq_res {\n                Matched(__pos, _) => Matched(__pos, { MemberOperator::Direct }),\n                Failed => Failed,\n            }\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                let __seq_res = slice_eq(__input, __state, __pos, \"->\");\n                match __seq_res {\n                    Matched(__pos, _) => Matched(__pos, { MemberOperator::Indirect }),\n                    Failed => Failed,\n                }\n            }\n        }\n    }\n}\n\nfn __parse_postfix_operator<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<UnaryOperator> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            let __seq_res = slice_eq(__input, __state, __pos, \"++\");\n            match __seq_res {\n                Matched(__pos, _) => Matched(__pos, { UnaryOperator::PostIncrement }),\n                Failed => Failed,\n            }\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                let __seq_res = slice_eq(__input, __state, __pos, \"--\");\n                match __seq_res {\n                    Matched(__pos, _) => Matched(__pos, { UnaryOperator::PostDecrement }),\n                    Failed => Failed,\n                }\n            }\n        }\n    }\n}\n\nfn __parse_compound_literal<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Expression> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = {\n            let __seq_res = Matched(__pos, __pos);\n            match __seq_res {\n                Matched(__pos, l) => {\n                    let __seq_res = __parse_compound_literal_inner(__input, __state, __pos, env);\n                    match __seq_res {\n                        Matched(__pos, e) => {\n                            let __seq_res = Matched(__pos, __pos);\n                            match __seq_res {\n                                Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                }\n                Failed => Failed,\n            }\n        };\n        match __seq_res {\n            Matched(__pos, n) => Matched(__pos, { Expression::CompoundLiteral(Box::new(n)) }),\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_compound_literal_inner<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<CompoundLiteral> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = slice_eq(__input, __state, __pos, \"(\");\n        match __seq_res {\n            Matched(__pos, _) => {\n                let __seq_res = __parse__(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = __parse_type_name(__input, __state, __pos, env);\n                        match __seq_res {\n                            Matched(__pos, t) => {\n                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                match __seq_res {\n                                    Matched(__pos, _) => {\n                                        let __seq_res = slice_eq(__input, __state, __pos, \")\");\n                                        match __seq_res {\n                                            Matched(__pos, _) => {\n                                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                                match __seq_res {\n                                                    Matched(__pos, _) => {\n                                                        let __seq_res = slice_eq(__input, __state, __pos, \"{\");\n                                                        match __seq_res {\n                                                            Matched(__pos, _) => {\n                                                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                                                match __seq_res {\n                                                                    Matched(__pos, _) => {\n                                                                        let __seq_res = {\n                                                                            let __seq_res = {\n                                                                                let mut __repeat_pos = __pos;\n                                                                                let mut __repeat_value = vec![];\n                                                                                loop {\n                                                                                    let __pos = __repeat_pos;\n                                                                                    let __pos = if __repeat_value.len() > 0 {\n                                                                                        let __sep_res = {\n                                                                                            let __seq_res = __parse__(__input, __state, __pos, env);\n                                                                                            match __seq_res {\n                                                                                                Matched(__pos, _) => {\n                                                                                                    let __seq_res = slice_eq(__input, __state, __pos, \",\");\n                                                                                                    match __seq_res {\n                                                                                                        Matched(__pos, _) => __parse__(__input, __state, __pos, env),\n                                                                                                        Failed => Failed,\n                                                                                                    }\n                                                                                                }\n                                                                                                Failed => Failed,\n                                                                                            }\n                                                                                        };\n                                                                                        match __sep_res {\n                                                                                            Matched(__newpos, _) => __newpos,\n                                                                                            Failed => break,\n                                                                                        }\n                                                                                    } else {\n                                                                                        __pos\n                                                                                    };\n                                                                                    let __step_res = {\n                                                                                        let __seq_res = Matched(__pos, __pos);\n                                                                                        match __seq_res {\n                                                                                            Matched(__pos, l) => {\n                                                                                                let __seq_res = __parse_initializer_list_item(__input, __state, __pos, env);\n                                                                                                match __seq_res {\n                                                                                                    Matched(__pos, e) => {\n                                                                                                        let __seq_res = Matched(__pos, __pos);\n                                                                                                        match __seq_res {\n                                                                                                            Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                                                                            Failed => Failed,\n                                                                                                        }\n                                                                                                    }\n                                                                                                    Failed => Failed,\n                                                                                                }\n                                                                                            }\n                                                                                            Failed => Failed,\n                                                                                        }\n                                                                                    };\n                                                                                    match __step_res {\n                                                                                        Matched(__newpos, __value) => {\n                                                                                            __repeat_pos = __newpos;\n                                                                                            __repeat_value.push(__value);\n                                                                                        }\n                                                                                        Failed => {\n                                                                                            break;\n                                                                                        }\n                                                                                    }\n                                                                                }\n                                                                                if __repeat_value.len() >= 1 {\n                                                                                    Matched(__repeat_pos, __repeat_value)\n                                                                                } else {\n                                                                                    Failed\n                                                                                }\n                                                                            };\n                                                                            match __seq_res {\n                                                                                Matched(__pos, e) => Matched(__pos, { e }),\n                                                                                Failed => Failed,\n                                                                            }\n                                                                        };\n                                                                        match __seq_res {\n                                                                            Matched(__pos, i) => {\n                                                                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                                                                match __seq_res {\n                                                                                    Matched(__pos, _) => {\n                                                                                        let __seq_res = match slice_eq(__input, __state, __pos, \",\") {\n                                                                                            Matched(__newpos, _) => Matched(__newpos, ()),\n                                                                                            Failed => Matched(__pos, ()),\n                                                                                        };\n                                                                                        match __seq_res {\n                                                                                            Matched(__pos, _) => {\n                                                                                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                                                                                match __seq_res {\n                                                                                                    Matched(__pos, _) => {\n                                                                                                        let __seq_res = slice_eq(__input, __state, __pos, \"}\");\n                                                                                                        match __seq_res {\n                                                                                                            Matched(__pos, _) => Matched(__pos, { CompoundLiteral { type_name: t, initializer_list: i } }),\n                                                                                                            Failed => Failed,\n                                                                                                        }\n                                                                                                    }\n                                                                                                    Failed => Failed,\n                                                                                                }\n                                                                                            }\n                                                                                            Failed => Failed,\n                                                                                        }\n                                                                                    }\n                                                                                    Failed => Failed,\n                                                                                }\n                                                                            }\n                                                                            Failed => Failed,\n                                                                        }\n                                                                    }\n                                                                    Failed => Failed,\n                                                                }\n                                                            }\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    }\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_unary_expression<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Box<Node<Expression>>> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = {\n            let __seq_res = Matched(__pos, __pos);\n            match __seq_res {\n                Matched(__pos, l) => {\n                    let __seq_res = __parse_unary_expression0(__input, __state, __pos, env);\n                    match __seq_res {\n                        Matched(__pos, e) => {\n                            let __seq_res = Matched(__pos, __pos);\n                            match __seq_res {\n                                Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                }\n                Failed => Failed,\n            }\n        };\n        match __seq_res {\n            Matched(__pos, e) => Matched(__pos, { Box::new(e) }),\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_unary_expression0<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Expression> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = __parse_postfix_expression0(__input, __state, __pos, env);\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                let __choice_res = __parse_unary_prefix(__input, __state, __pos, env);\n                match __choice_res {\n                    Matched(__pos, __value) => Matched(__pos, __value),\n                    Failed => {\n                        let __choice_res = __parse_unary_cast(__input, __state, __pos, env);\n                        match __choice_res {\n                            Matched(__pos, __value) => Matched(__pos, __value),\n                            Failed => {\n                                let __choice_res = __parse_sizeof_expression(__input, __state, __pos, env);\n                                match __choice_res {\n                                    Matched(__pos, __value) => Matched(__pos, __value),\n                                    Failed => {\n                                        let __choice_res = __parse_alignof_expression(__input, __state, __pos, env);\n                                        match __choice_res {\n                                            Matched(__pos, __value) => Matched(__pos, __value),\n                                            Failed => {\n                                                let __seq_res = {\n                                                    let __seq_res = {\n                                                        __state.suppress_fail += 1;\n                                                        let __assert_res = __parse_gnu_guard(__input, __state, __pos, env);\n                                                        __state.suppress_fail -= 1;\n                                                        match __assert_res {\n                                                            Matched(_, __value) => Matched(__pos, __value),\n                                                            Failed => Failed,\n                                                        }\n                                                    };\n                                                    match __seq_res {\n                                                        Matched(__pos, _) => {\n                                                            let __seq_res = {\n                                                                __state.suppress_fail += 1;\n                                                                let res = {\n                                                                    let __seq_res = slice_eq(__input, __state, __pos, \"__extension__\");\n                                                                    match __seq_res {\n                                                                        Matched(__pos, e) => {\n                                                                            let __seq_res = {\n                                                                                __state.suppress_fail += 1;\n                                                                                let __assert_res = if __input.len() > __pos {\n                                                                                    let (__ch, __next) = char_range_at(__input, __pos);\n                                                                                    match __ch {\n                                                                                        '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                                                                        _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                                                                    }\n                                                                                } else {\n                                                                                    __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                                                                                };\n                                                                                __state.suppress_fail -= 1;\n                                                                                match __assert_res {\n                                                                                    Failed => Matched(__pos, ()),\n                                                                                    Matched(..) => Failed,\n                                                                                }\n                                                                            };\n                                                                            match __seq_res {\n                                                                                Matched(__pos, _) => Matched(__pos, { e }),\n                                                                                Failed => Failed,\n                                                                            }\n                                                                        }\n                                                                        Failed => Failed,\n                                                                    }\n                                                                };\n                                                                __state.suppress_fail -= 1;\n                                                                res\n                                                            };\n                                                            match __seq_res {\n                                                                Matched(__pos, e) => Matched(__pos, { e }),\n                                                                Failed => Failed,\n                                                            }\n                                                        }\n                                                        Failed => Failed,\n                                                    }\n                                                };\n                                                match __seq_res {\n                                                    Matched(__pos, _) => {\n                                                        let __seq_res = __parse__(__input, __state, __pos, env);\n                                                        match __seq_res {\n                                                            Matched(__pos, _) => {\n                                                                let __seq_res = __parse_unary_expression0(__input, __state, __pos, env);\n                                                                match __seq_res {\n                                                                    Matched(__pos, e) => Matched(__pos, { e }),\n                                                                    Failed => Failed,\n                                                                }\n                                                            }\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n\nfn __parse_unary_prefix<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Expression> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = {\n            let __seq_res = Matched(__pos, __pos);\n            match __seq_res {\n                Matched(__pos, l) => {\n                    let __seq_res = __parse_unary_prefix_inner(__input, __state, __pos, env);\n                    match __seq_res {\n                        Matched(__pos, e) => {\n                            let __seq_res = Matched(__pos, __pos);\n                            match __seq_res {\n                                Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                }\n                Failed => Failed,\n            }\n        };\n        match __seq_res {\n            Matched(__pos, n) => Matched(__pos, { Expression::UnaryOperator(Box::new(n)) }),\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_unary_prefix_inner<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<UnaryOperatorExpression> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = {\n            let __seq_res = Matched(__pos, __pos);\n            match __seq_res {\n                Matched(__pos, l) => {\n                    let __seq_res = __parse_prefix_operator(__input, __state, __pos, env);\n                    match __seq_res {\n                        Matched(__pos, e) => {\n                            let __seq_res = Matched(__pos, __pos);\n                            match __seq_res {\n                                Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                }\n                Failed => Failed,\n            }\n        };\n        match __seq_res {\n            Matched(__pos, op) => {\n                let __seq_res = __parse__(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = __parse_unary_expression(__input, __state, __pos, env);\n                        match __seq_res {\n                            Matched(__pos, e) => Matched(__pos, { UnaryOperatorExpression { operator: op, operand: e } }),\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_prefix_operator<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<UnaryOperator> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            let __seq_res = slice_eq(__input, __state, __pos, \"++\");\n            match __seq_res {\n                Matched(__pos, _) => Matched(__pos, { UnaryOperator::PreIncrement }),\n                Failed => Failed,\n            }\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                let __seq_res = slice_eq(__input, __state, __pos, \"--\");\n                match __seq_res {\n                    Matched(__pos, _) => Matched(__pos, { UnaryOperator::PreDecrement }),\n                    Failed => Failed,\n                }\n            }\n        }\n    }\n}\n\nfn __parse_unary_cast<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Expression> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = {\n            let __seq_res = Matched(__pos, __pos);\n            match __seq_res {\n                Matched(__pos, l) => {\n                    let __seq_res = __parse_unary_cast_inner(__input, __state, __pos, env);\n                    match __seq_res {\n                        Matched(__pos, e) => {\n                            let __seq_res = Matched(__pos, __pos);\n                            match __seq_res {\n                                Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                }\n                Failed => Failed,\n            }\n        };\n        match __seq_res {\n            Matched(__pos, n) => Matched(__pos, { Expression::UnaryOperator(Box::new(n)) }),\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_unary_cast_inner<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<UnaryOperatorExpression> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = {\n            let __seq_res = Matched(__pos, __pos);\n            match __seq_res {\n                Matched(__pos, l) => {\n                    let __seq_res = __parse_unary_operator(__input, __state, __pos, env);\n                    match __seq_res {\n                        Matched(__pos, e) => {\n                            let __seq_res = Matched(__pos, __pos);\n                            match __seq_res {\n                                Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                }\n                Failed => Failed,\n            }\n        };\n        match __seq_res {\n            Matched(__pos, op) => {\n                let __seq_res = __parse__(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = __parse_cast_expression(__input, __state, __pos, env);\n                        match __seq_res {\n                            Matched(__pos, e) => Matched(__pos, { UnaryOperatorExpression { operator: op, operand: e } }),\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_unary_operator<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<UnaryOperator> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            let __seq_res = slice_eq(__input, __state, __pos, \"&\");\n            match __seq_res {\n                Matched(__pos, _) => {\n                    let __seq_res = {\n                        __state.suppress_fail += 1;\n                        let __assert_res = slice_eq(__input, __state, __pos, \"&\");\n                        __state.suppress_fail -= 1;\n                        match __assert_res {\n                            Failed => Matched(__pos, ()),\n                            Matched(..) => Failed,\n                        }\n                    };\n                    match __seq_res {\n                        Matched(__pos, _) => Matched(__pos, { UnaryOperator::Address }),\n                        Failed => Failed,\n                    }\n                }\n                Failed => Failed,\n            }\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                let __choice_res = {\n                    let __seq_res = slice_eq(__input, __state, __pos, \"*\");\n                    match __seq_res {\n                        Matched(__pos, _) => Matched(__pos, { UnaryOperator::Indirection }),\n                        Failed => Failed,\n                    }\n                };\n                match __choice_res {\n                    Matched(__pos, __value) => Matched(__pos, __value),\n                    Failed => {\n                        let __choice_res = {\n                            let __seq_res = slice_eq(__input, __state, __pos, \"+\");\n                            match __seq_res {\n                                Matched(__pos, _) => Matched(__pos, { UnaryOperator::Plus }),\n                                Failed => Failed,\n                            }\n                        };\n                        match __choice_res {\n                            Matched(__pos, __value) => Matched(__pos, __value),\n                            Failed => {\n                                let __choice_res = {\n                                    let __seq_res = slice_eq(__input, __state, __pos, \"-\");\n                                    match __seq_res {\n                                        Matched(__pos, _) => Matched(__pos, { UnaryOperator::Minus }),\n                                        Failed => Failed,\n                                    }\n                                };\n                                match __choice_res {\n                                    Matched(__pos, __value) => Matched(__pos, __value),\n                                    Failed => {\n                                        let __choice_res = {\n                                            let __seq_res = slice_eq(__input, __state, __pos, \"~\");\n                                            match __seq_res {\n                                                Matched(__pos, _) => Matched(__pos, { UnaryOperator::Complement }),\n                                                Failed => Failed,\n                                            }\n                                        };\n                                        match __choice_res {\n                                            Matched(__pos, __value) => Matched(__pos, __value),\n                                            Failed => {\n                                                let __seq_res = slice_eq(__input, __state, __pos, \"!\");\n                                                match __seq_res {\n                                                    Matched(__pos, _) => Matched(__pos, { UnaryOperator::Negate }),\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n\nfn __parse_sizeof_expression<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Expression> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            let __seq_res = __parse_sizeof_ty_expression(__input, __state, __pos, env);\n            match __seq_res {\n                Matched(__pos, n) => Matched(__pos, { Expression::SizeOfTy(n) }),\n                Failed => Failed,\n            }\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                let __seq_res = __parse_sizeof_val_expression(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, n) => Matched(__pos, { Expression::SizeOfVal(n) }),\n                    Failed => Failed,\n                }\n            }\n        }\n    }\n}\n\nfn __parse_sizeof_ty_expression<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Box<Node<SizeOfTy>>> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = {\n            let __seq_res = Matched(__pos, __pos);\n            match __seq_res {\n                Matched(__pos, l) => {\n                    let __seq_res = __parse_sizeof_ty_expression0(__input, __state, __pos, env);\n                    match __seq_res {\n                        Matched(__pos, e) => {\n                            let __seq_res = Matched(__pos, __pos);\n                            match __seq_res {\n                                Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                }\n                Failed => Failed,\n            }\n        };\n        match __seq_res {\n            Matched(__pos, e) => Matched(__pos, { Box::new(e) }),\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_sizeof_ty_expression0<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<SizeOfTy> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = {\n            __state.suppress_fail += 1;\n            let res = {\n                let __seq_res = slice_eq(__input, __state, __pos, \"sizeof\");\n                match __seq_res {\n                    Matched(__pos, e) => {\n                        let __seq_res = {\n                            __state.suppress_fail += 1;\n                            let __assert_res = if __input.len() > __pos {\n                                let (__ch, __next) = char_range_at(__input, __pos);\n                                match __ch {\n                                    '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                    _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                }\n                            } else {\n                                __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                            };\n                            __state.suppress_fail -= 1;\n                            match __assert_res {\n                                Failed => Matched(__pos, ()),\n                                Matched(..) => Failed,\n                            }\n                        };\n                        match __seq_res {\n                            Matched(__pos, _) => Matched(__pos, { e }),\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            };\n            __state.suppress_fail -= 1;\n            res\n        };\n        match __seq_res {\n            Matched(__pos, _) => {\n                let __seq_res = __parse__(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = slice_eq(__input, __state, __pos, \"(\");\n                        match __seq_res {\n                            Matched(__pos, _) => {\n                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                match __seq_res {\n                                    Matched(__pos, _) => {\n                                        let __seq_res = __parse_type_name(__input, __state, __pos, env);\n                                        match __seq_res {\n                                            Matched(__pos, t) => {\n                                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                                match __seq_res {\n                                                    Matched(__pos, _) => {\n                                                        let __seq_res = slice_eq(__input, __state, __pos, \")\");\n                                                        match __seq_res {\n                                                            Matched(__pos, _) => Matched(__pos, { SizeOfTy(t) }),\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    }\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_sizeof_val_expression<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Box<Node<SizeOfVal>>> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = {\n            let __seq_res = Matched(__pos, __pos);\n            match __seq_res {\n                Matched(__pos, l) => {\n                    let __seq_res = __parse_sizeof_val_expression0(__input, __state, __pos, env);\n                    match __seq_res {\n                        Matched(__pos, e) => {\n                            let __seq_res = Matched(__pos, __pos);\n                            match __seq_res {\n                                Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                }\n                Failed => Failed,\n            }\n        };\n        match __seq_res {\n            Matched(__pos, e) => Matched(__pos, { Box::new(e) }),\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_sizeof_val_expression0<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<SizeOfVal> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = {\n            __state.suppress_fail += 1;\n            let res = {\n                let __seq_res = slice_eq(__input, __state, __pos, \"sizeof\");\n                match __seq_res {\n                    Matched(__pos, e) => {\n                        let __seq_res = {\n                            __state.suppress_fail += 1;\n                            let __assert_res = if __input.len() > __pos {\n                                let (__ch, __next) = char_range_at(__input, __pos);\n                                match __ch {\n                                    '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                    _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                }\n                            } else {\n                                __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                            };\n                            __state.suppress_fail -= 1;\n                            match __assert_res {\n                                Failed => Matched(__pos, ()),\n                                Matched(..) => Failed,\n                            }\n                        };\n                        match __seq_res {\n                            Matched(__pos, _) => Matched(__pos, { e }),\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            };\n            __state.suppress_fail -= 1;\n            res\n        };\n        match __seq_res {\n            Matched(__pos, _) => {\n                let __seq_res = __parse__(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = __parse_unary_expression(__input, __state, __pos, env);\n                        match __seq_res {\n                            Matched(__pos, e) => Matched(__pos, { SizeOfVal(e) }),\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_alignof_expression<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Expression> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = __parse_alignof(__input, __state, __pos, env);\n        match __seq_res {\n            Matched(__pos, e) => Matched(__pos, { Expression::AlignOf(e) }),\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_alignof<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Box<Node<AlignOf>>> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = {\n            let __seq_res = Matched(__pos, __pos);\n            match __seq_res {\n                Matched(__pos, l) => {\n                    let __seq_res = __parse_alignof0(__input, __state, __pos, env);\n                    match __seq_res {\n                        Matched(__pos, e) => {\n                            let __seq_res = Matched(__pos, __pos);\n                            match __seq_res {\n                                Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                }\n                Failed => Failed,\n            }\n        };\n        match __seq_res {\n            Matched(__pos, e) => Matched(__pos, { Box::new(e) }),\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_alignof0<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<AlignOf> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = {\n            __state.suppress_fail += 1;\n            let res = {\n                let __seq_res = {\n                    let __choice_res = slice_eq(__input, __state, __pos, \"_Alignof\");\n                    match __choice_res {\n                        Matched(__pos, __value) => Matched(__pos, __value),\n                        Failed => {\n                            let __seq_res = {\n                                __state.suppress_fail += 1;\n                                let __assert_res = __parse_gnu_guard(__input, __state, __pos, env);\n                                __state.suppress_fail -= 1;\n                                match __assert_res {\n                                    Matched(_, __value) => Matched(__pos, __value),\n                                    Failed => Failed,\n                                }\n                            };\n                            match __seq_res {\n                                Matched(__pos, _) => {\n                                    let __seq_res = {\n                                        let __seq_res = slice_eq(__input, __state, __pos, \"__alignof\");\n                                        match __seq_res {\n                                            Matched(__pos, _) => match slice_eq(__input, __state, __pos, \"__\") {\n                                                Matched(__newpos, _) => Matched(__newpos, ()),\n                                                Failed => Matched(__pos, ()),\n                                            },\n                                            Failed => Failed,\n                                        }\n                                    };\n                                    match __seq_res {\n                                        Matched(__pos, e) => Matched(__pos, { e }),\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        }\n                    }\n                };\n                match __seq_res {\n                    Matched(__pos, e) => {\n                        let __seq_res = {\n                            __state.suppress_fail += 1;\n                            let __assert_res = if __input.len() > __pos {\n                                let (__ch, __next) = char_range_at(__input, __pos);\n                                match __ch {\n                                    '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                    _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                }\n                            } else {\n                                __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                            };\n                            __state.suppress_fail -= 1;\n                            match __assert_res {\n                                Failed => Matched(__pos, ()),\n                                Matched(..) => Failed,\n                            }\n                        };\n                        match __seq_res {\n                            Matched(__pos, _) => Matched(__pos, { e }),\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            };\n            __state.suppress_fail -= 1;\n            res\n        };\n        match __seq_res {\n            Matched(__pos, _) => {\n                let __seq_res = __parse__(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = slice_eq(__input, __state, __pos, \"(\");\n                        match __seq_res {\n                            Matched(__pos, _) => {\n                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                match __seq_res {\n                                    Matched(__pos, _) => {\n                                        let __seq_res = __parse_type_name(__input, __state, __pos, env);\n                                        match __seq_res {\n                                            Matched(__pos, t) => {\n                                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                                match __seq_res {\n                                                    Matched(__pos, _) => {\n                                                        let __seq_res = slice_eq(__input, __state, __pos, \")\");\n                                                        match __seq_res {\n                                                            Matched(__pos, _) => Matched(__pos, { AlignOf(Box::new(t)) }),\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    }\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_cast_expression<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Box<Node<Expression>>> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = {\n            let __seq_res = Matched(__pos, __pos);\n            match __seq_res {\n                Matched(__pos, l) => {\n                    let __seq_res = __parse_cast_expression0(__input, __state, __pos, env);\n                    match __seq_res {\n                        Matched(__pos, e) => {\n                            let __seq_res = Matched(__pos, __pos);\n                            match __seq_res {\n                                Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                }\n                Failed => Failed,\n            }\n        };\n        match __seq_res {\n            Matched(__pos, e) => Matched(__pos, { Box::new(e) }),\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_cast_expression0<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Expression> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            let __seq_res = {\n                let __seq_res = Matched(__pos, __pos);\n                match __seq_res {\n                    Matched(__pos, l) => {\n                        let __seq_res = __parse_cast_expression_inner(__input, __state, __pos, env);\n                        match __seq_res {\n                            Matched(__pos, e) => {\n                                let __seq_res = Matched(__pos, __pos);\n                                match __seq_res {\n                                    Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            };\n            match __seq_res {\n                Matched(__pos, c) => Matched(__pos, { Expression::Cast(Box::new(c)) }),\n                Failed => Failed,\n            }\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => __parse_unary_expression0(__input, __state, __pos, env),\n        }\n    }\n}\n\nfn __parse_cast_expression_inner<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<CastExpression> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = slice_eq(__input, __state, __pos, \"(\");\n        match __seq_res {\n            Matched(__pos, _) => {\n                let __seq_res = __parse__(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = __parse_type_name(__input, __state, __pos, env);\n                        match __seq_res {\n                            Matched(__pos, t) => {\n                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                match __seq_res {\n                                    Matched(__pos, _) => {\n                                        let __seq_res = slice_eq(__input, __state, __pos, \")\");\n                                        match __seq_res {\n                                            Matched(__pos, _) => {\n                                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                                match __seq_res {\n                                                    Matched(__pos, _) => {\n                                                        let __seq_res = __parse_cast_expression(__input, __state, __pos, env);\n                                                        match __seq_res {\n                                                            Matched(__pos, e) => Matched(__pos, { CastExpression { type_name: t, expression: e } }),\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    }\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_binary_expression<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Box<Node<Expression>>> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = __parse_binary_expression0(__input, __state, __pos, env);\n        match __seq_res {\n            Matched(__pos, e) => Matched(__pos, { Box::new(e) }),\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_binary_expression0<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Node<Expression>> {\n    #![allow(non_snake_case, unused)]\n    {\n        fn __infix_parse<'input>(__min_prec: i32, __input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Node<Expression>> {\n            if let Matched(__pos, mut __infix_result) = __parse_binary_operand(__input, __state, __pos, env) {\n                let mut __repeat_pos = __pos;\n                loop {\n                    let __pos = __repeat_pos;\n                    if 0i32 >= __min_prec {\n                        if let Matched(__pos, o) = {\n                            let __seq_res = __parse__(__input, __state, __pos, env);\n                            match __seq_res {\n                                Matched(__pos, _) => {\n                                    let __seq_res = {\n                                        let __seq_res = Matched(__pos, __pos);\n                                        match __seq_res {\n                                            Matched(__pos, l) => {\n                                                let __seq_res = slice_eq(__input, __state, __pos, \"||\");\n                                                match __seq_res {\n                                                    Matched(__pos, e) => {\n                                                        let __seq_res = Matched(__pos, __pos);\n                                                        match __seq_res {\n                                                            Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    };\n                                    match __seq_res {\n                                        Matched(__pos, n) => {\n                                            let __seq_res = __parse__(__input, __state, __pos, env);\n                                            match __seq_res {\n                                                Matched(__pos, _) => Matched(__pos, { n }),\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        } {\n                            if let Matched(__pos, y) = __infix_parse(1i32, __input, __state, __pos, env) {\n                                let x = __infix_result;\n                                __infix_result = { infix(o, BinaryOperator::LogicalOr, x, y) };\n                                __repeat_pos = __pos;\n                                continue;\n                            }\n                        }\n                    }\n                    if 1i32 >= __min_prec {\n                        if let Matched(__pos, o) = {\n                            let __seq_res = __parse__(__input, __state, __pos, env);\n                            match __seq_res {\n                                Matched(__pos, _) => {\n                                    let __seq_res = {\n                                        let __seq_res = Matched(__pos, __pos);\n                                        match __seq_res {\n                                            Matched(__pos, l) => {\n                                                let __seq_res = slice_eq(__input, __state, __pos, \"&&\");\n                                                match __seq_res {\n                                                    Matched(__pos, e) => {\n                                                        let __seq_res = Matched(__pos, __pos);\n                                                        match __seq_res {\n                                                            Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    };\n                                    match __seq_res {\n                                        Matched(__pos, n) => {\n                                            let __seq_res = __parse__(__input, __state, __pos, env);\n                                            match __seq_res {\n                                                Matched(__pos, _) => Matched(__pos, { n }),\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        } {\n                            if let Matched(__pos, y) = __infix_parse(2i32, __input, __state, __pos, env) {\n                                let x = __infix_result;\n                                __infix_result = { infix(o, BinaryOperator::LogicalAnd, x, y) };\n                                __repeat_pos = __pos;\n                                continue;\n                            }\n                        }\n                    }\n                    if 2i32 >= __min_prec {\n                        if let Matched(__pos, o) = {\n                            let __seq_res = __parse__(__input, __state, __pos, env);\n                            match __seq_res {\n                                Matched(__pos, _) => {\n                                    let __seq_res = {\n                                        let __seq_res = Matched(__pos, __pos);\n                                        match __seq_res {\n                                            Matched(__pos, l) => {\n                                                let __seq_res = slice_eq(__input, __state, __pos, \"|\");\n                                                match __seq_res {\n                                                    Matched(__pos, e) => {\n                                                        let __seq_res = Matched(__pos, __pos);\n                                                        match __seq_res {\n                                                            Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    };\n                                    match __seq_res {\n                                        Matched(__pos, n) => {\n                                            let __seq_res = __parse__(__input, __state, __pos, env);\n                                            match __seq_res {\n                                                Matched(__pos, _) => Matched(__pos, { n }),\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        } {\n                            if let Matched(__pos, y) = __infix_parse(3i32, __input, __state, __pos, env) {\n                                let x = __infix_result;\n                                __infix_result = { infix(o, BinaryOperator::BitwiseOr, x, y) };\n                                __repeat_pos = __pos;\n                                continue;\n                            }\n                        }\n                    }\n                    if 3i32 >= __min_prec {\n                        if let Matched(__pos, o) = {\n                            let __seq_res = __parse__(__input, __state, __pos, env);\n                            match __seq_res {\n                                Matched(__pos, _) => {\n                                    let __seq_res = {\n                                        let __seq_res = Matched(__pos, __pos);\n                                        match __seq_res {\n                                            Matched(__pos, l) => {\n                                                let __seq_res = slice_eq(__input, __state, __pos, \"^\");\n                                                match __seq_res {\n                                                    Matched(__pos, e) => {\n                                                        let __seq_res = Matched(__pos, __pos);\n                                                        match __seq_res {\n                                                            Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    };\n                                    match __seq_res {\n                                        Matched(__pos, n) => {\n                                            let __seq_res = __parse__(__input, __state, __pos, env);\n                                            match __seq_res {\n                                                Matched(__pos, _) => Matched(__pos, { n }),\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        } {\n                            if let Matched(__pos, y) = __infix_parse(4i32, __input, __state, __pos, env) {\n                                let x = __infix_result;\n                                __infix_result = { infix(o, BinaryOperator::BitwiseXor, x, y) };\n                                __repeat_pos = __pos;\n                                continue;\n                            }\n                        }\n                    }\n                    if 4i32 >= __min_prec {\n                        if let Matched(__pos, o) = {\n                            let __seq_res = __parse__(__input, __state, __pos, env);\n                            match __seq_res {\n                                Matched(__pos, _) => {\n                                    let __seq_res = {\n                                        let __seq_res = Matched(__pos, __pos);\n                                        match __seq_res {\n                                            Matched(__pos, l) => {\n                                                let __seq_res = {\n                                                    let __seq_res = slice_eq(__input, __state, __pos, \"&\");\n                                                    match __seq_res {\n                                                        Matched(__pos, _) => {\n                                                            __state.suppress_fail += 1;\n                                                            let __assert_res = slice_eq(__input, __state, __pos, \"&\");\n                                                            __state.suppress_fail -= 1;\n                                                            match __assert_res {\n                                                                Failed => Matched(__pos, ()),\n                                                                Matched(..) => Failed,\n                                                            }\n                                                        }\n                                                        Failed => Failed,\n                                                    }\n                                                };\n                                                match __seq_res {\n                                                    Matched(__pos, e) => {\n                                                        let __seq_res = Matched(__pos, __pos);\n                                                        match __seq_res {\n                                                            Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    };\n                                    match __seq_res {\n                                        Matched(__pos, n) => {\n                                            let __seq_res = __parse__(__input, __state, __pos, env);\n                                            match __seq_res {\n                                                Matched(__pos, _) => Matched(__pos, { n }),\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        } {\n                            if let Matched(__pos, y) = __infix_parse(5i32, __input, __state, __pos, env) {\n                                let x = __infix_result;\n                                __infix_result = { infix(o, BinaryOperator::BitwiseAnd, x, y) };\n                                __repeat_pos = __pos;\n                                continue;\n                            }\n                        }\n                    }\n                    if 5i32 >= __min_prec {\n                        if let Matched(__pos, o) = {\n                            let __seq_res = __parse__(__input, __state, __pos, env);\n                            match __seq_res {\n                                Matched(__pos, _) => {\n                                    let __seq_res = {\n                                        let __seq_res = Matched(__pos, __pos);\n                                        match __seq_res {\n                                            Matched(__pos, l) => {\n                                                let __seq_res = slice_eq(__input, __state, __pos, \"==\");\n                                                match __seq_res {\n                                                    Matched(__pos, e) => {\n                                                        let __seq_res = Matched(__pos, __pos);\n                                                        match __seq_res {\n                                                            Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    };\n                                    match __seq_res {\n                                        Matched(__pos, n) => {\n                                            let __seq_res = __parse__(__input, __state, __pos, env);\n                                            match __seq_res {\n                                                Matched(__pos, _) => Matched(__pos, { n }),\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        } {\n                            if let Matched(__pos, y) = __infix_parse(6i32, __input, __state, __pos, env) {\n                                let x = __infix_result;\n                                __infix_result = { infix(o, BinaryOperator::Equals, x, y) };\n                                __repeat_pos = __pos;\n                                continue;\n                            }\n                        }\n                        if let Matched(__pos, o) = {\n                            let __seq_res = __parse__(__input, __state, __pos, env);\n                            match __seq_res {\n                                Matched(__pos, _) => {\n                                    let __seq_res = {\n                                        let __seq_res = Matched(__pos, __pos);\n                                        match __seq_res {\n                                            Matched(__pos, l) => {\n                                                let __seq_res = slice_eq(__input, __state, __pos, \"!=\");\n                                                match __seq_res {\n                                                    Matched(__pos, e) => {\n                                                        let __seq_res = Matched(__pos, __pos);\n                                                        match __seq_res {\n                                                            Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    };\n                                    match __seq_res {\n                                        Matched(__pos, n) => {\n                                            let __seq_res = __parse__(__input, __state, __pos, env);\n                                            match __seq_res {\n                                                Matched(__pos, _) => Matched(__pos, { n }),\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        } {\n                            if let Matched(__pos, y) = __infix_parse(6i32, __input, __state, __pos, env) {\n                                let x = __infix_result;\n                                __infix_result = { infix(o, BinaryOperator::NotEquals, x, y) };\n                                __repeat_pos = __pos;\n                                continue;\n                            }\n                        }\n                    }\n                    if 6i32 >= __min_prec {\n                        if let Matched(__pos, o) = {\n                            let __seq_res = __parse__(__input, __state, __pos, env);\n                            match __seq_res {\n                                Matched(__pos, _) => {\n                                    let __seq_res = {\n                                        let __seq_res = Matched(__pos, __pos);\n                                        match __seq_res {\n                                            Matched(__pos, l) => {\n                                                let __seq_res = slice_eq(__input, __state, __pos, \"<\");\n                                                match __seq_res {\n                                                    Matched(__pos, e) => {\n                                                        let __seq_res = Matched(__pos, __pos);\n                                                        match __seq_res {\n                                                            Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    };\n                                    match __seq_res {\n                                        Matched(__pos, n) => {\n                                            let __seq_res = __parse__(__input, __state, __pos, env);\n                                            match __seq_res {\n                                                Matched(__pos, _) => Matched(__pos, { n }),\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        } {\n                            if let Matched(__pos, y) = __infix_parse(7i32, __input, __state, __pos, env) {\n                                let x = __infix_result;\n                                __infix_result = { infix(o, BinaryOperator::Less, x, y) };\n                                __repeat_pos = __pos;\n                                continue;\n                            }\n                        }\n                        if let Matched(__pos, o) = {\n                            let __seq_res = __parse__(__input, __state, __pos, env);\n                            match __seq_res {\n                                Matched(__pos, _) => {\n                                    let __seq_res = {\n                                        let __seq_res = Matched(__pos, __pos);\n                                        match __seq_res {\n                                            Matched(__pos, l) => {\n                                                let __seq_res = slice_eq(__input, __state, __pos, \">\");\n                                                match __seq_res {\n                                                    Matched(__pos, e) => {\n                                                        let __seq_res = Matched(__pos, __pos);\n                                                        match __seq_res {\n                                                            Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    };\n                                    match __seq_res {\n                                        Matched(__pos, n) => {\n                                            let __seq_res = __parse__(__input, __state, __pos, env);\n                                            match __seq_res {\n                                                Matched(__pos, _) => Matched(__pos, { n }),\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        } {\n                            if let Matched(__pos, y) = __infix_parse(7i32, __input, __state, __pos, env) {\n                                let x = __infix_result;\n                                __infix_result = { infix(o, BinaryOperator::Greater, x, y) };\n                                __repeat_pos = __pos;\n                                continue;\n                            }\n                        }\n                        if let Matched(__pos, o) = {\n                            let __seq_res = __parse__(__input, __state, __pos, env);\n                            match __seq_res {\n                                Matched(__pos, _) => {\n                                    let __seq_res = {\n                                        let __seq_res = Matched(__pos, __pos);\n                                        match __seq_res {\n                                            Matched(__pos, l) => {\n                                                let __seq_res = slice_eq(__input, __state, __pos, \"<=\");\n                                                match __seq_res {\n                                                    Matched(__pos, e) => {\n                                                        let __seq_res = Matched(__pos, __pos);\n                                                        match __seq_res {\n                                                            Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    };\n                                    match __seq_res {\n                                        Matched(__pos, n) => {\n                                            let __seq_res = __parse__(__input, __state, __pos, env);\n                                            match __seq_res {\n                                                Matched(__pos, _) => Matched(__pos, { n }),\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        } {\n                            if let Matched(__pos, y) = __infix_parse(7i32, __input, __state, __pos, env) {\n                                let x = __infix_result;\n                                __infix_result = { infix(o, BinaryOperator::LessOrEqual, x, y) };\n                                __repeat_pos = __pos;\n                                continue;\n                            }\n                        }\n                        if let Matched(__pos, o) = {\n                            let __seq_res = __parse__(__input, __state, __pos, env);\n                            match __seq_res {\n                                Matched(__pos, _) => {\n                                    let __seq_res = {\n                                        let __seq_res = Matched(__pos, __pos);\n                                        match __seq_res {\n                                            Matched(__pos, l) => {\n                                                let __seq_res = slice_eq(__input, __state, __pos, \">=\");\n                                                match __seq_res {\n                                                    Matched(__pos, e) => {\n                                                        let __seq_res = Matched(__pos, __pos);\n                                                        match __seq_res {\n                                                            Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    };\n                                    match __seq_res {\n                                        Matched(__pos, n) => {\n                                            let __seq_res = __parse__(__input, __state, __pos, env);\n                                            match __seq_res {\n                                                Matched(__pos, _) => Matched(__pos, { n }),\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        } {\n                            if let Matched(__pos, y) = __infix_parse(7i32, __input, __state, __pos, env) {\n                                let x = __infix_result;\n                                __infix_result = { infix(o, BinaryOperator::GreaterOrEqual, x, y) };\n                                __repeat_pos = __pos;\n                                continue;\n                            }\n                        }\n                    }\n                    if 7i32 >= __min_prec {\n                        if let Matched(__pos, o) = {\n                            let __seq_res = __parse__(__input, __state, __pos, env);\n                            match __seq_res {\n                                Matched(__pos, _) => {\n                                    let __seq_res = {\n                                        let __seq_res = Matched(__pos, __pos);\n                                        match __seq_res {\n                                            Matched(__pos, l) => {\n                                                let __seq_res = slice_eq(__input, __state, __pos, \"<<\");\n                                                match __seq_res {\n                                                    Matched(__pos, e) => {\n                                                        let __seq_res = Matched(__pos, __pos);\n                                                        match __seq_res {\n                                                            Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    };\n                                    match __seq_res {\n                                        Matched(__pos, n) => {\n                                            let __seq_res = __parse__(__input, __state, __pos, env);\n                                            match __seq_res {\n                                                Matched(__pos, _) => Matched(__pos, { n }),\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        } {\n                            if let Matched(__pos, y) = __infix_parse(8i32, __input, __state, __pos, env) {\n                                let x = __infix_result;\n                                __infix_result = { infix(o, BinaryOperator::ShiftLeft, x, y) };\n                                __repeat_pos = __pos;\n                                continue;\n                            }\n                        }\n                        if let Matched(__pos, o) = {\n                            let __seq_res = __parse__(__input, __state, __pos, env);\n                            match __seq_res {\n                                Matched(__pos, _) => {\n                                    let __seq_res = {\n                                        let __seq_res = Matched(__pos, __pos);\n                                        match __seq_res {\n                                            Matched(__pos, l) => {\n                                                let __seq_res = slice_eq(__input, __state, __pos, \">>\");\n                                                match __seq_res {\n                                                    Matched(__pos, e) => {\n                                                        let __seq_res = Matched(__pos, __pos);\n                                                        match __seq_res {\n                                                            Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    };\n                                    match __seq_res {\n                                        Matched(__pos, n) => {\n                                            let __seq_res = __parse__(__input, __state, __pos, env);\n                                            match __seq_res {\n                                                Matched(__pos, _) => Matched(__pos, { n }),\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        } {\n                            if let Matched(__pos, y) = __infix_parse(8i32, __input, __state, __pos, env) {\n                                let x = __infix_result;\n                                __infix_result = { infix(o, BinaryOperator::ShiftRight, x, y) };\n                                __repeat_pos = __pos;\n                                continue;\n                            }\n                        }\n                    }\n                    if 8i32 >= __min_prec {\n                        if let Matched(__pos, o) = {\n                            let __seq_res = __parse__(__input, __state, __pos, env);\n                            match __seq_res {\n                                Matched(__pos, _) => {\n                                    let __seq_res = {\n                                        let __seq_res = Matched(__pos, __pos);\n                                        match __seq_res {\n                                            Matched(__pos, l) => {\n                                                let __seq_res = slice_eq(__input, __state, __pos, \"+\");\n                                                match __seq_res {\n                                                    Matched(__pos, e) => {\n                                                        let __seq_res = Matched(__pos, __pos);\n                                                        match __seq_res {\n                                                            Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    };\n                                    match __seq_res {\n                                        Matched(__pos, n) => {\n                                            let __seq_res = __parse__(__input, __state, __pos, env);\n                                            match __seq_res {\n                                                Matched(__pos, _) => Matched(__pos, { n }),\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        } {\n                            if let Matched(__pos, y) = __infix_parse(9i32, __input, __state, __pos, env) {\n                                let x = __infix_result;\n                                __infix_result = { infix(o, BinaryOperator::Plus, x, y) };\n                                __repeat_pos = __pos;\n                                continue;\n                            }\n                        }\n                        if let Matched(__pos, o) = {\n                            let __seq_res = __parse__(__input, __state, __pos, env);\n                            match __seq_res {\n                                Matched(__pos, _) => {\n                                    let __seq_res = {\n                                        let __seq_res = Matched(__pos, __pos);\n                                        match __seq_res {\n                                            Matched(__pos, l) => {\n                                                let __seq_res = slice_eq(__input, __state, __pos, \"-\");\n                                                match __seq_res {\n                                                    Matched(__pos, e) => {\n                                                        let __seq_res = Matched(__pos, __pos);\n                                                        match __seq_res {\n                                                            Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    };\n                                    match __seq_res {\n                                        Matched(__pos, n) => {\n                                            let __seq_res = __parse__(__input, __state, __pos, env);\n                                            match __seq_res {\n                                                Matched(__pos, _) => Matched(__pos, { n }),\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        } {\n                            if let Matched(__pos, y) = __infix_parse(9i32, __input, __state, __pos, env) {\n                                let x = __infix_result;\n                                __infix_result = { infix(o, BinaryOperator::Minus, x, y) };\n                                __repeat_pos = __pos;\n                                continue;\n                            }\n                        }\n                    }\n                    if 9i32 >= __min_prec {\n                        if let Matched(__pos, o) = {\n                            let __seq_res = __parse__(__input, __state, __pos, env);\n                            match __seq_res {\n                                Matched(__pos, _) => {\n                                    let __seq_res = {\n                                        let __seq_res = Matched(__pos, __pos);\n                                        match __seq_res {\n                                            Matched(__pos, l) => {\n                                                let __seq_res = slice_eq(__input, __state, __pos, \"*\");\n                                                match __seq_res {\n                                                    Matched(__pos, e) => {\n                                                        let __seq_res = Matched(__pos, __pos);\n                                                        match __seq_res {\n                                                            Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    };\n                                    match __seq_res {\n                                        Matched(__pos, n) => {\n                                            let __seq_res = __parse__(__input, __state, __pos, env);\n                                            match __seq_res {\n                                                Matched(__pos, _) => Matched(__pos, { n }),\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        } {\n                            if let Matched(__pos, y) = __infix_parse(10i32, __input, __state, __pos, env) {\n                                let x = __infix_result;\n                                __infix_result = { infix(o, BinaryOperator::Multiply, x, y) };\n                                __repeat_pos = __pos;\n                                continue;\n                            }\n                        }\n                        if let Matched(__pos, o) = {\n                            let __seq_res = __parse__(__input, __state, __pos, env);\n                            match __seq_res {\n                                Matched(__pos, _) => {\n                                    let __seq_res = {\n                                        let __seq_res = Matched(__pos, __pos);\n                                        match __seq_res {\n                                            Matched(__pos, l) => {\n                                                let __seq_res = slice_eq(__input, __state, __pos, \"/\");\n                                                match __seq_res {\n                                                    Matched(__pos, e) => {\n                                                        let __seq_res = Matched(__pos, __pos);\n                                                        match __seq_res {\n                                                            Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    };\n                                    match __seq_res {\n                                        Matched(__pos, n) => {\n                                            let __seq_res = __parse__(__input, __state, __pos, env);\n                                            match __seq_res {\n                                                Matched(__pos, _) => Matched(__pos, { n }),\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        } {\n                            if let Matched(__pos, y) = __infix_parse(10i32, __input, __state, __pos, env) {\n                                let x = __infix_result;\n                                __infix_result = { infix(o, BinaryOperator::Divide, x, y) };\n                                __repeat_pos = __pos;\n                                continue;\n                            }\n                        }\n                        if let Matched(__pos, o) = {\n                            let __seq_res = __parse__(__input, __state, __pos, env);\n                            match __seq_res {\n                                Matched(__pos, _) => {\n                                    let __seq_res = {\n                                        let __seq_res = Matched(__pos, __pos);\n                                        match __seq_res {\n                                            Matched(__pos, l) => {\n                                                let __seq_res = slice_eq(__input, __state, __pos, \"%\");\n                                                match __seq_res {\n                                                    Matched(__pos, e) => {\n                                                        let __seq_res = Matched(__pos, __pos);\n                                                        match __seq_res {\n                                                            Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    };\n                                    match __seq_res {\n                                        Matched(__pos, n) => {\n                                            let __seq_res = __parse__(__input, __state, __pos, env);\n                                            match __seq_res {\n                                                Matched(__pos, _) => Matched(__pos, { n }),\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        } {\n                            if let Matched(__pos, y) = __infix_parse(10i32, __input, __state, __pos, env) {\n                                let x = __infix_result;\n                                __infix_result = { infix(o, BinaryOperator::Modulo, x, y) };\n                                __repeat_pos = __pos;\n                                continue;\n                            }\n                        }\n                    }\n                    break;\n                }\n                Matched(__repeat_pos, __infix_result)\n            } else {\n                Failed\n            }\n        }\n        __infix_parse(0, __input, __state, __pos, env)\n    }\n}\n\nfn __parse_binary_operand<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Node<Expression>> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = Matched(__pos, __pos);\n        match __seq_res {\n            Matched(__pos, l) => {\n                let __seq_res = __parse_cast_expression0(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, e) => {\n                        let __seq_res = Matched(__pos, __pos);\n                        match __seq_res {\n                            Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_conditional_expression<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Box<Node<Expression>>> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = {\n            let __seq_res = Matched(__pos, __pos);\n            match __seq_res {\n                Matched(__pos, l) => {\n                    let __seq_res = __parse_conditional_expression0(__input, __state, __pos, env);\n                    match __seq_res {\n                        Matched(__pos, e) => {\n                            let __seq_res = Matched(__pos, __pos);\n                            match __seq_res {\n                                Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                }\n                Failed => Failed,\n            }\n        };\n        match __seq_res {\n            Matched(__pos, e) => Matched(__pos, { Box::new(e) }),\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_conditional_expression0<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Expression> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = __parse_binary_expression0(__input, __state, __pos, env);\n        match __seq_res {\n            Matched(__pos, a) => {\n                let __seq_res = __parse__(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = match __parse_conditional_expressionT(__input, __state, __pos, env) {\n                            Matched(__newpos, __value) => Matched(__newpos, Some(__value)),\n                            Failed => Matched(__pos, None),\n                        };\n                        match __seq_res {\n                            Matched(__pos, t) => Matched(__pos, {\n                                if let Some((b, c)) = t {\n                                    let span = Span::span(a.span.start, c.span.end);\n                                    Expression::Conditional(Box::new(Node::new(ConditionalExpression { condition: Box::new(a), then_expression: b, else_expression: c }, span)))\n                                } else {\n                                    a.node\n                                }\n                            }),\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_conditional_expressionT<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<(Box<Node<Expression>>, Box<Node<Expression>>)> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = slice_eq(__input, __state, __pos, \"?\");\n        match __seq_res {\n            Matched(__pos, _) => {\n                let __seq_res = __parse__(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = {\n                            let __seq_res = Matched(__pos, __pos);\n                            match __seq_res {\n                                Matched(__pos, l) => {\n                                    let __seq_res = __parse_expression0(__input, __state, __pos, env);\n                                    match __seq_res {\n                                        Matched(__pos, e) => {\n                                            let __seq_res = Matched(__pos, __pos);\n                                            match __seq_res {\n                                                Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        };\n                        match __seq_res {\n                            Matched(__pos, a) => {\n                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                match __seq_res {\n                                    Matched(__pos, _) => {\n                                        let __seq_res = slice_eq(__input, __state, __pos, \":\");\n                                        match __seq_res {\n                                            Matched(__pos, _) => {\n                                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                                match __seq_res {\n                                                    Matched(__pos, _) => {\n                                                        let __seq_res = {\n                                                            let __seq_res = Matched(__pos, __pos);\n                                                            match __seq_res {\n                                                                Matched(__pos, l) => {\n                                                                    let __seq_res = __parse_conditional_expression0(__input, __state, __pos, env);\n                                                                    match __seq_res {\n                                                                        Matched(__pos, e) => {\n                                                                            let __seq_res = Matched(__pos, __pos);\n                                                                            match __seq_res {\n                                                                                Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                                                Failed => Failed,\n                                                                            }\n                                                                        }\n                                                                        Failed => Failed,\n                                                                    }\n                                                                }\n                                                                Failed => Failed,\n                                                            }\n                                                        };\n                                                        match __seq_res {\n                                                            Matched(__pos, b) => Matched(__pos, { (Box::new(a), Box::new(b)) }),\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    }\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_assignment_expression<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Box<Node<Expression>>> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = {\n            let __seq_res = Matched(__pos, __pos);\n            match __seq_res {\n                Matched(__pos, l) => {\n                    let __seq_res = __parse_assignment_expression0(__input, __state, __pos, env);\n                    match __seq_res {\n                        Matched(__pos, e) => {\n                            let __seq_res = Matched(__pos, __pos);\n                            match __seq_res {\n                                Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                }\n                Failed => Failed,\n            }\n        };\n        match __seq_res {\n            Matched(__pos, e) => Matched(__pos, { Box::new(e) }),\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_assignment_expression0<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Expression> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            let __seq_res = {\n                let __seq_res = Matched(__pos, __pos);\n                match __seq_res {\n                    Matched(__pos, l) => {\n                        let __seq_res = __parse_assignment_expression_inner(__input, __state, __pos, env);\n                        match __seq_res {\n                            Matched(__pos, e) => {\n                                let __seq_res = Matched(__pos, __pos);\n                                match __seq_res {\n                                    Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            };\n            match __seq_res {\n                Matched(__pos, n) => Matched(__pos, { Expression::BinaryOperator(Box::new(n)) }),\n                Failed => Failed,\n            }\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => __parse_conditional_expression0(__input, __state, __pos, env),\n        }\n    }\n}\n\nfn __parse_assignment_expression_inner<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<BinaryOperatorExpression> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = __parse_unary_expression(__input, __state, __pos, env);\n        match __seq_res {\n            Matched(__pos, a) => {\n                let __seq_res = __parse__(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = {\n                            let __seq_res = Matched(__pos, __pos);\n                            match __seq_res {\n                                Matched(__pos, l) => {\n                                    let __seq_res = __parse_assignment_operator(__input, __state, __pos, env);\n                                    match __seq_res {\n                                        Matched(__pos, e) => {\n                                            let __seq_res = Matched(__pos, __pos);\n                                            match __seq_res {\n                                                Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        };\n                        match __seq_res {\n                            Matched(__pos, op) => {\n                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                match __seq_res {\n                                    Matched(__pos, _) => {\n                                        let __seq_res = __parse_assignment_expression(__input, __state, __pos, env);\n                                        match __seq_res {\n                                            Matched(__pos, b) => Matched(__pos, { BinaryOperatorExpression { operator: op, lhs: a, rhs: b } }),\n                                            Failed => Failed,\n                                        }\n                                    }\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_assignment_operator<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<BinaryOperator> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            let __seq_res = slice_eq(__input, __state, __pos, \"=\");\n            match __seq_res {\n                Matched(__pos, _) => Matched(__pos, { BinaryOperator::Assign }),\n                Failed => Failed,\n            }\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                let __choice_res = {\n                    let __seq_res = slice_eq(__input, __state, __pos, \"*=\");\n                    match __seq_res {\n                        Matched(__pos, _) => Matched(__pos, { BinaryOperator::AssignMultiply }),\n                        Failed => Failed,\n                    }\n                };\n                match __choice_res {\n                    Matched(__pos, __value) => Matched(__pos, __value),\n                    Failed => {\n                        let __choice_res = {\n                            let __seq_res = slice_eq(__input, __state, __pos, \"/=\");\n                            match __seq_res {\n                                Matched(__pos, _) => Matched(__pos, { BinaryOperator::AssignDivide }),\n                                Failed => Failed,\n                            }\n                        };\n                        match __choice_res {\n                            Matched(__pos, __value) => Matched(__pos, __value),\n                            Failed => {\n                                let __choice_res = {\n                                    let __seq_res = slice_eq(__input, __state, __pos, \"%=\");\n                                    match __seq_res {\n                                        Matched(__pos, _) => Matched(__pos, { BinaryOperator::AssignModulo }),\n                                        Failed => Failed,\n                                    }\n                                };\n                                match __choice_res {\n                                    Matched(__pos, __value) => Matched(__pos, __value),\n                                    Failed => {\n                                        let __choice_res = {\n                                            let __seq_res = slice_eq(__input, __state, __pos, \"+=\");\n                                            match __seq_res {\n                                                Matched(__pos, _) => Matched(__pos, { BinaryOperator::AssignPlus }),\n                                                Failed => Failed,\n                                            }\n                                        };\n                                        match __choice_res {\n                                            Matched(__pos, __value) => Matched(__pos, __value),\n                                            Failed => {\n                                                let __choice_res = {\n                                                    let __seq_res = slice_eq(__input, __state, __pos, \"-=\");\n                                                    match __seq_res {\n                                                        Matched(__pos, _) => Matched(__pos, { BinaryOperator::AssignMinus }),\n                                                        Failed => Failed,\n                                                    }\n                                                };\n                                                match __choice_res {\n                                                    Matched(__pos, __value) => Matched(__pos, __value),\n                                                    Failed => {\n                                                        let __choice_res = {\n                                                            let __seq_res = slice_eq(__input, __state, __pos, \"<<=\");\n                                                            match __seq_res {\n                                                                Matched(__pos, _) => Matched(__pos, { BinaryOperator::AssignShiftLeft }),\n                                                                Failed => Failed,\n                                                            }\n                                                        };\n                                                        match __choice_res {\n                                                            Matched(__pos, __value) => Matched(__pos, __value),\n                                                            Failed => {\n                                                                let __choice_res = {\n                                                                    let __seq_res = slice_eq(__input, __state, __pos, \">>=\");\n                                                                    match __seq_res {\n                                                                        Matched(__pos, _) => Matched(__pos, { BinaryOperator::AssignShiftRight }),\n                                                                        Failed => Failed,\n                                                                    }\n                                                                };\n                                                                match __choice_res {\n                                                                    Matched(__pos, __value) => Matched(__pos, __value),\n                                                                    Failed => {\n                                                                        let __choice_res = {\n                                                                            let __seq_res = slice_eq(__input, __state, __pos, \"&=\");\n                                                                            match __seq_res {\n                                                                                Matched(__pos, _) => Matched(__pos, { BinaryOperator::AssignBitwiseAnd }),\n                                                                                Failed => Failed,\n                                                                            }\n                                                                        };\n                                                                        match __choice_res {\n                                                                            Matched(__pos, __value) => Matched(__pos, __value),\n                                                                            Failed => {\n                                                                                let __choice_res = {\n                                                                                    let __seq_res = slice_eq(__input, __state, __pos, \"^=\");\n                                                                                    match __seq_res {\n                                                                                        Matched(__pos, _) => Matched(__pos, { BinaryOperator::AssignBitwiseXor }),\n                                                                                        Failed => Failed,\n                                                                                    }\n                                                                                };\n                                                                                match __choice_res {\n                                                                                    Matched(__pos, __value) => Matched(__pos, __value),\n                                                                                    Failed => {\n                                                                                        let __seq_res = slice_eq(__input, __state, __pos, \"|=\");\n                                                                                        match __seq_res {\n                                                                                            Matched(__pos, _) => Matched(__pos, { BinaryOperator::AssignBitwiseOr }),\n                                                                                            Failed => Failed,\n                                                                                        }\n                                                                                    }\n                                                                                }\n                                                                            }\n                                                                        }\n                                                                    }\n                                                                }\n                                                            }\n                                                        }\n                                                    }\n                                                }\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n\nfn __parse_expression<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Box<Node<Expression>>> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = {\n            let __seq_res = Matched(__pos, __pos);\n            match __seq_res {\n                Matched(__pos, l) => {\n                    let __seq_res = __parse_expression0(__input, __state, __pos, env);\n                    match __seq_res {\n                        Matched(__pos, e) => {\n                            let __seq_res = Matched(__pos, __pos);\n                            match __seq_res {\n                                Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                }\n                Failed => Failed,\n            }\n        };\n        match __seq_res {\n            Matched(__pos, e) => Matched(__pos, { Box::new(e) }),\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_expression0<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Expression> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = {\n            let __seq_res = Matched(__pos, __pos);\n            match __seq_res {\n                Matched(__pos, l) => {\n                    let __seq_res = __parse_assignment_expression0(__input, __state, __pos, env);\n                    match __seq_res {\n                        Matched(__pos, e) => {\n                            let __seq_res = Matched(__pos, __pos);\n                            match __seq_res {\n                                Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                }\n                Failed => Failed,\n            }\n        };\n        match __seq_res {\n            Matched(__pos, e) => {\n                let __seq_res = __parse__(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = {\n                            let __seq_res = {\n                                let mut __repeat_pos = __pos;\n                                let mut __repeat_value = vec![];\n                                loop {\n                                    let __pos = __repeat_pos;\n                                    let __pos = if __repeat_value.len() > 0 {\n                                        let __sep_res = __parse__(__input, __state, __pos, env);\n                                        match __sep_res {\n                                            Matched(__newpos, _) => __newpos,\n                                            Failed => break,\n                                        }\n                                    } else {\n                                        __pos\n                                    };\n                                    let __step_res = __parse_expressionT(__input, __state, __pos, env);\n                                    match __step_res {\n                                        Matched(__newpos, __value) => {\n                                            __repeat_pos = __newpos;\n                                            __repeat_value.push(__value);\n                                        }\n                                        Failed => {\n                                            break;\n                                        }\n                                    }\n                                }\n                                Matched(__repeat_pos, __repeat_value)\n                            };\n                            match __seq_res {\n                                Matched(__pos, e) => Matched(__pos, { e }),\n                                Failed => Failed,\n                            }\n                        };\n                        match __seq_res {\n                            Matched(__pos, t) => Matched(__pos, {\n                                if t.len() > 0 {\n                                    let mut t = t;\n                                    t.insert(0, e);\n                                    Expression::Comma(Box::new(t))\n                                } else {\n                                    e.node\n                                }\n                            }),\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_expressionT<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Node<Expression>> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = slice_eq(__input, __state, __pos, \",\");\n        match __seq_res {\n            Matched(__pos, _) => {\n                let __seq_res = __parse__(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = {\n                            let __seq_res = Matched(__pos, __pos);\n                            match __seq_res {\n                                Matched(__pos, l) => {\n                                    let __seq_res = __parse_assignment_expression0(__input, __state, __pos, env);\n                                    match __seq_res {\n                                        Matched(__pos, e) => {\n                                            let __seq_res = Matched(__pos, __pos);\n                                            match __seq_res {\n                                                Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        };\n                        match __seq_res {\n                            Matched(__pos, e) => Matched(__pos, { e }),\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_constant_expression<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Box<Node<Expression>>> {\n    #![allow(non_snake_case, unused)]\n    __parse_conditional_expression(__input, __state, __pos, env)\n}\n\nfn __parse_constant_expression0<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Expression> {\n    #![allow(non_snake_case, unused)]\n    __parse_conditional_expression0(__input, __state, __pos, env)\n}\n\nfn __parse_declaration<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Node<Declaration>> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = Matched(__pos, __pos);\n        match __seq_res {\n            Matched(__pos, l) => {\n                let __seq_res = __parse_declaration0(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, e) => {\n                        let __seq_res = Matched(__pos, __pos);\n                        match __seq_res {\n                            Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_declaration0<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Declaration> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = match {\n            let __seq_res = {\n                __state.suppress_fail += 1;\n                let __assert_res = __parse_gnu_guard(__input, __state, __pos, env);\n                __state.suppress_fail -= 1;\n                match __assert_res {\n                    Matched(_, __value) => Matched(__pos, __value),\n                    Failed => Failed,\n                }\n            };\n            match __seq_res {\n                Matched(__pos, _) => {\n                    let __seq_res = {\n                        __state.suppress_fail += 1;\n                        let res = {\n                            let __seq_res = slice_eq(__input, __state, __pos, \"__extension__\");\n                            match __seq_res {\n                                Matched(__pos, e) => {\n                                    let __seq_res = {\n                                        __state.suppress_fail += 1;\n                                        let __assert_res = if __input.len() > __pos {\n                                            let (__ch, __next) = char_range_at(__input, __pos);\n                                            match __ch {\n                                                '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                                _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                            }\n                                        } else {\n                                            __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                                        };\n                                        __state.suppress_fail -= 1;\n                                        match __assert_res {\n                                            Failed => Matched(__pos, ()),\n                                            Matched(..) => Failed,\n                                        }\n                                    };\n                                    match __seq_res {\n                                        Matched(__pos, _) => Matched(__pos, { e }),\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        };\n                        __state.suppress_fail -= 1;\n                        res\n                    };\n                    match __seq_res {\n                        Matched(__pos, e) => Matched(__pos, { e }),\n                        Failed => Failed,\n                    }\n                }\n                Failed => Failed,\n            }\n        } {\n            Matched(__newpos, _) => Matched(__newpos, ()),\n            Failed => Matched(__pos, ()),\n        };\n        match __seq_res {\n            Matched(__pos, _) => {\n                let __seq_res = __parse__(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = __parse_declaration1(__input, __state, __pos, env);\n                        match __seq_res {\n                            Matched(__pos, d) => {\n                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                match __seq_res {\n                                    Matched(__pos, _) => {\n                                        let __seq_res = slice_eq(__input, __state, __pos, \";\");\n                                        match __seq_res {\n                                            Matched(__pos, _) => Matched(__pos, { Declaration { specifiers: d.0, declarators: d.1 } }),\n                                            Failed => Failed,\n                                        }\n                                    }\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_declaration1<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<(Vec<Node<DeclarationSpecifier>>, Vec<Node<InitDeclarator>>)> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = __parse_declaration_specifiers_unique(__input, __state, __pos, env);\n        match __seq_res {\n            Matched(__pos, h) => {\n                let __seq_res = __parse__(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = __parse_declaration2(__input, __state, __pos, env);\n                        match __seq_res {\n                            Matched(__pos, t) => Matched(__pos, { (concat(h, t.0), t.1) }),\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_declaration2<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<(Vec<Node<DeclarationSpecifier>>, Vec<Node<InitDeclarator>>)> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            let __seq_res = __parse_declaration_typedef(__input, __state, __pos, env);\n            match __seq_res {\n                Matched(__pos, h) => {\n                    let __seq_res = __parse__(__input, __state, __pos, env);\n                    match __seq_res {\n                        Matched(__pos, _) => {\n                            let __seq_res = __parse_declaration_typedef_tail(__input, __state, __pos, env);\n                            match __seq_res {\n                                Matched(__pos, t) => Matched(__pos, { (concat(h, t.0), t.1) }),\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                }\n                Failed => Failed,\n            }\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                let __choice_res = {\n                    let __seq_res = __parse_declaration_unique_type(__input, __state, __pos, env);\n                    match __seq_res {\n                        Matched(__pos, h) => {\n                            let __seq_res = __parse__(__input, __state, __pos, env);\n                            match __seq_res {\n                                Matched(__pos, _) => {\n                                    let __seq_res = {\n                                        let __seq_res = __parse_declaration_specifiers_unique(__input, __state, __pos, env);\n                                        match __seq_res {\n                                            Matched(__pos, h) => {\n                                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                                match __seq_res {\n                                                    Matched(__pos, _) => {\n                                                        let __seq_res = {\n                                                            let __choice_res = {\n                                                                let __seq_res = __parse_declaration_typedef(__input, __state, __pos, env);\n                                                                match __seq_res {\n                                                                    Matched(__pos, h) => {\n                                                                        let __seq_res = __parse__(__input, __state, __pos, env);\n                                                                        match __seq_res {\n                                                                            Matched(__pos, _) => {\n                                                                                let __seq_res = {\n                                                                                    let __seq_res = __parse_declaration_specifiers_unique(__input, __state, __pos, env);\n                                                                                    match __seq_res {\n                                                                                        Matched(__pos, s) => {\n                                                                                            let __seq_res = __parse__(__input, __state, __pos, env);\n                                                                                            match __seq_res {\n                                                                                                Matched(__pos, _) => {\n                                                                                                    let __seq_res = __parse_declaration_type_declarators(__input, __state, __pos, env);\n                                                                                                    match __seq_res {\n                                                                                                        Matched(__pos, d) => Matched(__pos, { (s, d) }),\n                                                                                                        Failed => Failed,\n                                                                                                    }\n                                                                                                }\n                                                                                                Failed => Failed,\n                                                                                            }\n                                                                                        }\n                                                                                        Failed => Failed,\n                                                                                    }\n                                                                                };\n                                                                                match __seq_res {\n                                                                                    Matched(__pos, t) => Matched(__pos, { (concat(h, t.0), t.1) }),\n                                                                                    Failed => Failed,\n                                                                                }\n                                                                            }\n                                                                            Failed => Failed,\n                                                                        }\n                                                                    }\n                                                                    Failed => Failed,\n                                                                }\n                                                            };\n                                                            match __choice_res {\n                                                                Matched(__pos, __value) => Matched(__pos, __value),\n                                                                Failed => {\n                                                                    let __seq_res = __parse_declaration_init_declarators(__input, __state, __pos, env);\n                                                                    match __seq_res {\n                                                                        Matched(__pos, d) => Matched(__pos, { (Vec::new(), d) }),\n                                                                        Failed => Failed,\n                                                                    }\n                                                                }\n                                                            }\n                                                        };\n                                                        match __seq_res {\n                                                            Matched(__pos, t) => Matched(__pos, { (concat(h, t.0), t.1) }),\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    };\n                                    match __seq_res {\n                                        Matched(__pos, t) => Matched(__pos, { (concat(h, t.0), t.1) }),\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                };\n                match __choice_res {\n                    Matched(__pos, __value) => Matched(__pos, __value),\n                    Failed => {\n                        let __seq_res = __parse_declaration_nonunique_type(__input, __state, __pos, env);\n                        match __seq_res {\n                            Matched(__pos, h) => {\n                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                match __seq_res {\n                                    Matched(__pos, _) => {\n                                        let __seq_res = {\n                                            let __seq_res = __parse_declaration_specifiers_nonunique(__input, __state, __pos, env);\n                                            match __seq_res {\n                                                Matched(__pos, h) => {\n                                                    let __seq_res = __parse__(__input, __state, __pos, env);\n                                                    match __seq_res {\n                                                        Matched(__pos, _) => {\n                                                            let __seq_res = {\n                                                                let __choice_res = {\n                                                                    let __seq_res = __parse_declaration_typedef(__input, __state, __pos, env);\n                                                                    match __seq_res {\n                                                                        Matched(__pos, h) => {\n                                                                            let __seq_res = __parse__(__input, __state, __pos, env);\n                                                                            match __seq_res {\n                                                                                Matched(__pos, _) => {\n                                                                                    let __seq_res = {\n                                                                                        let __seq_res = __parse_declaration_specifiers_nonunique(__input, __state, __pos, env);\n                                                                                        match __seq_res {\n                                                                                            Matched(__pos, s) => {\n                                                                                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                                                                                match __seq_res {\n                                                                                                    Matched(__pos, _) => {\n                                                                                                        let __seq_res = __parse_declaration_type_declarators(__input, __state, __pos, env);\n                                                                                                        match __seq_res {\n                                                                                                            Matched(__pos, d) => Matched(__pos, { (s, d) }),\n                                                                                                            Failed => Failed,\n                                                                                                        }\n                                                                                                    }\n                                                                                                    Failed => Failed,\n                                                                                                }\n                                                                                            }\n                                                                                            Failed => Failed,\n                                                                                        }\n                                                                                    };\n                                                                                    match __seq_res {\n                                                                                        Matched(__pos, t) => Matched(__pos, { (concat(h, t.0), t.1) }),\n                                                                                        Failed => Failed,\n                                                                                    }\n                                                                                }\n                                                                                Failed => Failed,\n                                                                            }\n                                                                        }\n                                                                        Failed => Failed,\n                                                                    }\n                                                                };\n                                                                match __choice_res {\n                                                                    Matched(__pos, __value) => Matched(__pos, __value),\n                                                                    Failed => {\n                                                                        let __seq_res = __parse_declaration_init_declarators(__input, __state, __pos, env);\n                                                                        match __seq_res {\n                                                                            Matched(__pos, d) => Matched(__pos, { (Vec::new(), d) }),\n                                                                            Failed => Failed,\n                                                                        }\n                                                                    }\n                                                                }\n                                                            };\n                                                            match __seq_res {\n                                                                Matched(__pos, t) => Matched(__pos, { (concat(h, t.0), t.1) }),\n                                                                Failed => Failed,\n                                                            }\n                                                        }\n                                                        Failed => Failed,\n                                                    }\n                                                }\n                                                Failed => Failed,\n                                            }\n                                        };\n                                        match __seq_res {\n                                            Matched(__pos, t) => Matched(__pos, { (concat(h, t.0), t.1) }),\n                                            Failed => Failed,\n                                        }\n                                    }\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n\nfn __parse_declaration_typedef_tail<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<(Vec<Node<DeclarationSpecifier>>, Vec<Node<InitDeclarator>>)> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = __parse_declaration_specifiers_unique(__input, __state, __pos, env);\n        match __seq_res {\n            Matched(__pos, h) => {\n                let __seq_res = __parse__(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = __parse_declaration_typedef_tail0(__input, __state, __pos, env);\n                        match __seq_res {\n                            Matched(__pos, t) => Matched(__pos, { (concat(h, t.0), t.1) }),\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_declaration_typedef_tail0<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<(Vec<Node<DeclarationSpecifier>>, Vec<Node<InitDeclarator>>)> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            let __seq_res = __parse_declaration_unique_type(__input, __state, __pos, env);\n            match __seq_res {\n                Matched(__pos, h) => {\n                    let __seq_res = __parse__(__input, __state, __pos, env);\n                    match __seq_res {\n                        Matched(__pos, _) => {\n                            let __seq_res = {\n                                let __seq_res = __parse_declaration_specifiers_unique(__input, __state, __pos, env);\n                                match __seq_res {\n                                    Matched(__pos, s) => {\n                                        let __seq_res = __parse__(__input, __state, __pos, env);\n                                        match __seq_res {\n                                            Matched(__pos, _) => {\n                                                let __seq_res = __parse_declaration_type_declarators(__input, __state, __pos, env);\n                                                match __seq_res {\n                                                    Matched(__pos, d) => Matched(__pos, { (s, d) }),\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    }\n                                    Failed => Failed,\n                                }\n                            };\n                            match __seq_res {\n                                Matched(__pos, t) => Matched(__pos, { (concat(h, t.0), t.1) }),\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                }\n                Failed => Failed,\n            }\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                let __seq_res = __parse_declaration_nonunique_type(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, h) => {\n                        let __seq_res = __parse__(__input, __state, __pos, env);\n                        match __seq_res {\n                            Matched(__pos, _) => {\n                                let __seq_res = {\n                                    let __seq_res = __parse_declaration_specifiers_nonunique(__input, __state, __pos, env);\n                                    match __seq_res {\n                                        Matched(__pos, s) => {\n                                            let __seq_res = __parse__(__input, __state, __pos, env);\n                                            match __seq_res {\n                                                Matched(__pos, _) => {\n                                                    let __seq_res = __parse_declaration_type_declarators(__input, __state, __pos, env);\n                                                    match __seq_res {\n                                                        Matched(__pos, d) => Matched(__pos, { (s, d) }),\n                                                        Failed => Failed,\n                                                    }\n                                                }\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                };\n                                match __seq_res {\n                                    Matched(__pos, t) => Matched(__pos, { (concat(h, t.0), t.1) }),\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n        }\n    }\n}\n\nfn __parse_declaration_unique_type<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Vec<Node<DeclarationSpecifier>>> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = {\n            let __seq_res = Matched(__pos, __pos);\n            match __seq_res {\n                Matched(__pos, l) => {\n                    let __seq_res = __parse_declaration_specifier_unique_type0(__input, __state, __pos, env);\n                    match __seq_res {\n                        Matched(__pos, e) => {\n                            let __seq_res = Matched(__pos, __pos);\n                            match __seq_res {\n                                Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                }\n                Failed => Failed,\n            }\n        };\n        match __seq_res {\n            Matched(__pos, n) => Matched(__pos, { vec![n] }),\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_declaration_nonunique_type<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Vec<Node<DeclarationSpecifier>>> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = {\n            let __seq_res = Matched(__pos, __pos);\n            match __seq_res {\n                Matched(__pos, l) => {\n                    let __seq_res = __parse_declaration_specifier_nonunique_type0(__input, __state, __pos, env);\n                    match __seq_res {\n                        Matched(__pos, e) => {\n                            let __seq_res = Matched(__pos, __pos);\n                            match __seq_res {\n                                Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                }\n                Failed => Failed,\n            }\n        };\n        match __seq_res {\n            Matched(__pos, n) => Matched(__pos, { vec![n] }),\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_declaration_specifiers<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Vec<Node<DeclarationSpecifier>>> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = __parse_declaration_specifiers_unique(__input, __state, __pos, env);\n        match __seq_res {\n            Matched(__pos, s) => {\n                let __seq_res = __parse__(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = __parse_declaration_specifiers_tail(__input, __state, __pos, env);\n                        match __seq_res {\n                            Matched(__pos, t) => Matched(__pos, { concat(s, t) }),\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_declaration_specifiers_tail<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Vec<Node<DeclarationSpecifier>>> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            let __seq_res = __parse_declaration_unique_type(__input, __state, __pos, env);\n            match __seq_res {\n                Matched(__pos, t) => {\n                    let __seq_res = __parse__(__input, __state, __pos, env);\n                    match __seq_res {\n                        Matched(__pos, _) => {\n                            let __seq_res = __parse_declaration_specifiers_unique(__input, __state, __pos, env);\n                            match __seq_res {\n                                Matched(__pos, s) => Matched(__pos, { concat(t, s) }),\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                }\n                Failed => Failed,\n            }\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                let __seq_res = __parse_declaration_nonunique_type(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, t) => {\n                        let __seq_res = __parse__(__input, __state, __pos, env);\n                        match __seq_res {\n                            Matched(__pos, _) => {\n                                let __seq_res = __parse_declaration_specifiers_nonunique(__input, __state, __pos, env);\n                                match __seq_res {\n                                    Matched(__pos, s) => Matched(__pos, { concat(t, s) }),\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n        }\n    }\n}\n\nfn __parse_declaration_specifiers_unique<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Vec<Node<DeclarationSpecifier>>> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = {\n            let mut __repeat_pos = __pos;\n            let mut __repeat_value = vec![];\n            loop {\n                let __pos = __repeat_pos;\n                let __pos = if __repeat_value.len() > 0 {\n                    let __sep_res = __parse__(__input, __state, __pos, env);\n                    match __sep_res {\n                        Matched(__newpos, _) => __newpos,\n                        Failed => break,\n                    }\n                } else {\n                    __pos\n                };\n                let __step_res = {\n                    let __seq_res = Matched(__pos, __pos);\n                    match __seq_res {\n                        Matched(__pos, l) => {\n                            let __seq_res = __parse_declaration_specifier_nontype(__input, __state, __pos, env);\n                            match __seq_res {\n                                Matched(__pos, e) => {\n                                    let __seq_res = Matched(__pos, __pos);\n                                    match __seq_res {\n                                        Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                };\n                match __step_res {\n                    Matched(__newpos, __value) => {\n                        __repeat_pos = __newpos;\n                        __repeat_value.push(__value);\n                    }\n                    Failed => {\n                        break;\n                    }\n                }\n            }\n            Matched(__repeat_pos, __repeat_value)\n        };\n        match __seq_res {\n            Matched(__pos, e) => Matched(__pos, { e }),\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_declaration_specifiers_nonunique<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Vec<Node<DeclarationSpecifier>>> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = {\n            let mut __repeat_pos = __pos;\n            let mut __repeat_value = vec![];\n            loop {\n                let __pos = __repeat_pos;\n                let __pos = if __repeat_value.len() > 0 {\n                    let __sep_res = __parse__(__input, __state, __pos, env);\n                    match __sep_res {\n                        Matched(__newpos, _) => __newpos,\n                        Failed => break,\n                    }\n                } else {\n                    __pos\n                };\n                let __step_res = {\n                    let __seq_res = Matched(__pos, __pos);\n                    match __seq_res {\n                        Matched(__pos, l) => {\n                            let __seq_res = {\n                                let __choice_res = __parse_declaration_specifier_nontype(__input, __state, __pos, env);\n                                match __choice_res {\n                                    Matched(__pos, __value) => Matched(__pos, __value),\n                                    Failed => __parse_declaration_specifier_nonunique_type0(__input, __state, __pos, env),\n                                }\n                            };\n                            match __seq_res {\n                                Matched(__pos, e) => {\n                                    let __seq_res = Matched(__pos, __pos);\n                                    match __seq_res {\n                                        Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                };\n                match __step_res {\n                    Matched(__newpos, __value) => {\n                        __repeat_pos = __newpos;\n                        __repeat_value.push(__value);\n                    }\n                    Failed => {\n                        break;\n                    }\n                }\n            }\n            Matched(__repeat_pos, __repeat_value)\n        };\n        match __seq_res {\n            Matched(__pos, e) => Matched(__pos, { e }),\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_declaration_specifier_nontype<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<DeclarationSpecifier> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            let __seq_res = __parse_storage_class_specifier(__input, __state, __pos, env);\n            match __seq_res {\n                Matched(__pos, s) => Matched(__pos, { DeclarationSpecifier::StorageClass(s) }),\n                Failed => Failed,\n            }\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                let __choice_res = {\n                    let __seq_res = __parse_type_qualifier(__input, __state, __pos, env);\n                    match __seq_res {\n                        Matched(__pos, s) => Matched(__pos, { DeclarationSpecifier::TypeQualifier(s) }),\n                        Failed => Failed,\n                    }\n                };\n                match __choice_res {\n                    Matched(__pos, __value) => Matched(__pos, __value),\n                    Failed => {\n                        let __choice_res = {\n                            let __seq_res = __parse_function_specifier(__input, __state, __pos, env);\n                            match __seq_res {\n                                Matched(__pos, s) => Matched(__pos, { DeclarationSpecifier::Function(s) }),\n                                Failed => Failed,\n                            }\n                        };\n                        match __choice_res {\n                            Matched(__pos, __value) => Matched(__pos, __value),\n                            Failed => {\n                                let __choice_res = {\n                                    let __seq_res = __parse_alignment_specifier(__input, __state, __pos, env);\n                                    match __seq_res {\n                                        Matched(__pos, s) => Matched(__pos, { DeclarationSpecifier::Alignment(s) }),\n                                        Failed => Failed,\n                                    }\n                                };\n                                match __choice_res {\n                                    Matched(__pos, __value) => Matched(__pos, __value),\n                                    Failed => {\n                                        let __seq_res = {\n                                            let __seq_res = {\n                                                __state.suppress_fail += 1;\n                                                let __assert_res = __parse_gnu_guard(__input, __state, __pos, env);\n                                                __state.suppress_fail -= 1;\n                                                match __assert_res {\n                                                    Matched(_, __value) => Matched(__pos, __value),\n                                                    Failed => Failed,\n                                                }\n                                            };\n                                            match __seq_res {\n                                                Matched(__pos, _) => {\n                                                    let __seq_res = __parse_attribute_specifier(__input, __state, __pos, env);\n                                                    match __seq_res {\n                                                        Matched(__pos, e) => Matched(__pos, { e }),\n                                                        Failed => Failed,\n                                                    }\n                                                }\n                                                Failed => Failed,\n                                            }\n                                        };\n                                        match __seq_res {\n                                            Matched(__pos, s) => Matched(__pos, { DeclarationSpecifier::Extension(s) }),\n                                            Failed => Failed,\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n\nfn __parse_declaration_typedef<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Vec<Node<DeclarationSpecifier>>> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = {\n            let __seq_res = Matched(__pos, __pos);\n            match __seq_res {\n                Matched(__pos, l) => {\n                    let __seq_res = __parse_declaration_typedef0(__input, __state, __pos, env);\n                    match __seq_res {\n                        Matched(__pos, e) => {\n                            let __seq_res = Matched(__pos, __pos);\n                            match __seq_res {\n                                Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                }\n                Failed => Failed,\n            }\n        };\n        match __seq_res {\n            Matched(__pos, s) => Matched(__pos, { vec![s] }),\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_declaration_typedef0<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<DeclarationSpecifier> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = __parse_storage_class_typedef(__input, __state, __pos, env);\n        match __seq_res {\n            Matched(__pos, s) => Matched(__pos, { DeclarationSpecifier::StorageClass(s) }),\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_declaration_specifier_unique_type0<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<DeclarationSpecifier> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = {\n            let __seq_res = Matched(__pos, __pos);\n            match __seq_res {\n                Matched(__pos, l) => {\n                    let __seq_res = __parse_type_specifier_unique(__input, __state, __pos, env);\n                    match __seq_res {\n                        Matched(__pos, e) => {\n                            let __seq_res = Matched(__pos, __pos);\n                            match __seq_res {\n                                Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                }\n                Failed => Failed,\n            }\n        };\n        match __seq_res {\n            Matched(__pos, s) => Matched(__pos, { DeclarationSpecifier::TypeSpecifier(s) }),\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_declaration_specifier_nonunique_type0<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<DeclarationSpecifier> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = {\n            let __seq_res = Matched(__pos, __pos);\n            match __seq_res {\n                Matched(__pos, l) => {\n                    let __seq_res = __parse_type_specifier_nonunique(__input, __state, __pos, env);\n                    match __seq_res {\n                        Matched(__pos, e) => {\n                            let __seq_res = Matched(__pos, __pos);\n                            match __seq_res {\n                                Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                }\n                Failed => Failed,\n            }\n        };\n        match __seq_res {\n            Matched(__pos, s) => Matched(__pos, { DeclarationSpecifier::TypeSpecifier(s) }),\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_declaration_init_declarators<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Vec<Node<InitDeclarator>>> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = {\n            let mut __repeat_pos = __pos;\n            let mut __repeat_value = vec![];\n            loop {\n                let __pos = __repeat_pos;\n                let __pos = if __repeat_value.len() > 0 {\n                    let __sep_res = {\n                        let __seq_res = __parse__(__input, __state, __pos, env);\n                        match __seq_res {\n                            Matched(__pos, _) => {\n                                let __seq_res = slice_eq(__input, __state, __pos, \",\");\n                                match __seq_res {\n                                    Matched(__pos, _) => __parse__(__input, __state, __pos, env),\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    };\n                    match __sep_res {\n                        Matched(__newpos, _) => __newpos,\n                        Failed => break,\n                    }\n                } else {\n                    __pos\n                };\n                let __step_res = {\n                    let __seq_res = Matched(__pos, __pos);\n                    match __seq_res {\n                        Matched(__pos, l) => {\n                            let __seq_res = __parse_init_declarator(__input, __state, __pos, env);\n                            match __seq_res {\n                                Matched(__pos, e) => {\n                                    let __seq_res = Matched(__pos, __pos);\n                                    match __seq_res {\n                                        Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                };\n                match __step_res {\n                    Matched(__newpos, __value) => {\n                        __repeat_pos = __newpos;\n                        __repeat_value.push(__value);\n                    }\n                    Failed => {\n                        break;\n                    }\n                }\n            }\n            Matched(__repeat_pos, __repeat_value)\n        };\n        match __seq_res {\n            Matched(__pos, e) => Matched(__pos, { e }),\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_declaration_type_declarators<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Vec<Node<InitDeclarator>>> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = {\n            let mut __repeat_pos = __pos;\n            let mut __repeat_value = vec![];\n            loop {\n                let __pos = __repeat_pos;\n                let __pos = if __repeat_value.len() > 0 {\n                    let __sep_res = {\n                        let __seq_res = __parse__(__input, __state, __pos, env);\n                        match __seq_res {\n                            Matched(__pos, _) => {\n                                let __seq_res = slice_eq(__input, __state, __pos, \",\");\n                                match __seq_res {\n                                    Matched(__pos, _) => __parse__(__input, __state, __pos, env),\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    };\n                    match __sep_res {\n                        Matched(__newpos, _) => __newpos,\n                        Failed => break,\n                    }\n                } else {\n                    __pos\n                };\n                let __step_res = {\n                    let __seq_res = Matched(__pos, __pos);\n                    match __seq_res {\n                        Matched(__pos, l) => {\n                            let __seq_res = __parse_type_declarator(__input, __state, __pos, env);\n                            match __seq_res {\n                                Matched(__pos, e) => {\n                                    let __seq_res = Matched(__pos, __pos);\n                                    match __seq_res {\n                                        Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                };\n                match __step_res {\n                    Matched(__newpos, __value) => {\n                        __repeat_pos = __newpos;\n                        __repeat_value.push(__value);\n                    }\n                    Failed => {\n                        break;\n                    }\n                }\n            }\n            Matched(__repeat_pos, __repeat_value)\n        };\n        match __seq_res {\n            Matched(__pos, e) => Matched(__pos, { e }),\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_init_declarator<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<InitDeclarator> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = __parse_init_declarator_declarator(__input, __state, __pos, env);\n        match __seq_res {\n            Matched(__pos, d) => {\n                let __seq_res = __parse__(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = match {\n                            let __seq_res = {\n                                __state.suppress_fail += 1;\n                                let __assert_res = __parse_gnu_guard(__input, __state, __pos, env);\n                                __state.suppress_fail -= 1;\n                                match __assert_res {\n                                    Matched(_, __value) => Matched(__pos, __value),\n                                    Failed => Failed,\n                                }\n                            };\n                            match __seq_res {\n                                Matched(__pos, _) => {\n                                    let __seq_res = __parse_init_declarator_gnu(__input, __state, __pos, env);\n                                    match __seq_res {\n                                        Matched(__pos, e) => Matched(__pos, { e }),\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        } {\n                            Matched(__newpos, __value) => Matched(__newpos, Some(__value)),\n                            Failed => Matched(__pos, None),\n                        };\n                        match __seq_res {\n                            Matched(__pos, e) => {\n                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                match __seq_res {\n                                    Matched(__pos, _) => {\n                                        let __seq_res = match {\n                                            let __seq_res = Matched(__pos, __pos);\n                                            match __seq_res {\n                                                Matched(__pos, l) => {\n                                                    let __seq_res = __parse_init_declarator_init(__input, __state, __pos, env);\n                                                    match __seq_res {\n                                                        Matched(__pos, e) => {\n                                                            let __seq_res = Matched(__pos, __pos);\n                                                            match __seq_res {\n                                                                Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                                Failed => Failed,\n                                                            }\n                                                        }\n                                                        Failed => Failed,\n                                                    }\n                                                }\n                                                Failed => Failed,\n                                            }\n                                        } {\n                                            Matched(__newpos, __value) => Matched(__newpos, Some(__value)),\n                                            Failed => Matched(__pos, None),\n                                        };\n                                        match __seq_res {\n                                            Matched(__pos, i) => Matched(__pos, { InitDeclarator { declarator: with_ext(d, e), initializer: i } }),\n                                            Failed => Failed,\n                                        }\n                                    }\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_init_declarator_declarator<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Node<Declarator>> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = __parse_declarator(__input, __state, __pos, env);\n        match __seq_res {\n            Matched(__pos, d) => Matched(__pos, {\n                env.handle_declarator(&d, Symbol::Identifier);\n                d\n            }),\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_init_declarator_init<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Initializer> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = slice_eq(__input, __state, __pos, \"=\");\n        match __seq_res {\n            Matched(__pos, _) => {\n                let __seq_res = __parse__(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = __parse_initializer(__input, __state, __pos, env);\n                        match __seq_res {\n                            Matched(__pos, i) => Matched(__pos, { i }),\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_init_declarator_gnu<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Vec<Node<Extension>>> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = match __parse_asm_label(__input, __state, __pos, env) {\n            Matched(__newpos, __value) => Matched(__newpos, Some(__value)),\n            Failed => Matched(__pos, None),\n        };\n        match __seq_res {\n            Matched(__pos, l) => {\n                let __seq_res = __parse__(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = __parse_attribute_specifier_list(__input, __state, __pos, env);\n                        match __seq_res {\n                            Matched(__pos, a) => Matched(__pos, { l.into_iter().chain(a).collect() }),\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_type_declarator<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<InitDeclarator> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = __parse_declarator(__input, __state, __pos, env);\n        match __seq_res {\n            Matched(__pos, d) => {\n                let __seq_res = __parse__(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = match {\n                            let __seq_res = {\n                                __state.suppress_fail += 1;\n                                let __assert_res = __parse_gnu_guard(__input, __state, __pos, env);\n                                __state.suppress_fail -= 1;\n                                match __assert_res {\n                                    Matched(_, __value) => Matched(__pos, __value),\n                                    Failed => Failed,\n                                }\n                            };\n                            match __seq_res {\n                                Matched(__pos, _) => {\n                                    let __seq_res = __parse_init_declarator_gnu(__input, __state, __pos, env);\n                                    match __seq_res {\n                                        Matched(__pos, e) => Matched(__pos, { e }),\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        } {\n                            Matched(__newpos, __value) => Matched(__newpos, Some(__value)),\n                            Failed => Matched(__pos, None),\n                        };\n                        match __seq_res {\n                            Matched(__pos, e) => Matched(__pos, {\n                                env.handle_declarator(&d, Symbol::Typename);\n                                InitDeclarator { declarator: with_ext(d, e), initializer: None }\n                            }),\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_storage_class_specifier<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Node<StorageClassSpecifier>> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = Matched(__pos, __pos);\n        match __seq_res {\n            Matched(__pos, l) => {\n                let __seq_res = __parse_storage_class_specifier0(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, e) => {\n                        let __seq_res = Matched(__pos, __pos);\n                        match __seq_res {\n                            Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_storage_class_specifier0<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<StorageClassSpecifier> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            let __seq_res = {\n                __state.suppress_fail += 1;\n                let res = {\n                    let __seq_res = slice_eq(__input, __state, __pos, \"extern\");\n                    match __seq_res {\n                        Matched(__pos, e) => {\n                            let __seq_res = {\n                                __state.suppress_fail += 1;\n                                let __assert_res = if __input.len() > __pos {\n                                    let (__ch, __next) = char_range_at(__input, __pos);\n                                    match __ch {\n                                        '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                        _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                    }\n                                } else {\n                                    __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                                };\n                                __state.suppress_fail -= 1;\n                                match __assert_res {\n                                    Failed => Matched(__pos, ()),\n                                    Matched(..) => Failed,\n                                }\n                            };\n                            match __seq_res {\n                                Matched(__pos, _) => Matched(__pos, { e }),\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                };\n                __state.suppress_fail -= 1;\n                res\n            };\n            match __seq_res {\n                Matched(__pos, _) => Matched(__pos, { StorageClassSpecifier::Extern }),\n                Failed => Failed,\n            }\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                let __choice_res = {\n                    let __seq_res = {\n                        __state.suppress_fail += 1;\n                        let res = {\n                            let __seq_res = slice_eq(__input, __state, __pos, \"static\");\n                            match __seq_res {\n                                Matched(__pos, e) => {\n                                    let __seq_res = {\n                                        __state.suppress_fail += 1;\n                                        let __assert_res = if __input.len() > __pos {\n                                            let (__ch, __next) = char_range_at(__input, __pos);\n                                            match __ch {\n                                                '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                                _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                            }\n                                        } else {\n                                            __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                                        };\n                                        __state.suppress_fail -= 1;\n                                        match __assert_res {\n                                            Failed => Matched(__pos, ()),\n                                            Matched(..) => Failed,\n                                        }\n                                    };\n                                    match __seq_res {\n                                        Matched(__pos, _) => Matched(__pos, { e }),\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        };\n                        __state.suppress_fail -= 1;\n                        res\n                    };\n                    match __seq_res {\n                        Matched(__pos, _) => Matched(__pos, { StorageClassSpecifier::Static }),\n                        Failed => Failed,\n                    }\n                };\n                match __choice_res {\n                    Matched(__pos, __value) => Matched(__pos, __value),\n                    Failed => {\n                        let __choice_res = {\n                            let __seq_res = {\n                                __state.suppress_fail += 1;\n                                let res = {\n                                    let __seq_res = slice_eq(__input, __state, __pos, \"_Thread_local\");\n                                    match __seq_res {\n                                        Matched(__pos, e) => {\n                                            let __seq_res = {\n                                                __state.suppress_fail += 1;\n                                                let __assert_res = if __input.len() > __pos {\n                                                    let (__ch, __next) = char_range_at(__input, __pos);\n                                                    match __ch {\n                                                        '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                                        _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                                    }\n                                                } else {\n                                                    __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                                                };\n                                                __state.suppress_fail -= 1;\n                                                match __assert_res {\n                                                    Failed => Matched(__pos, ()),\n                                                    Matched(..) => Failed,\n                                                }\n                                            };\n                                            match __seq_res {\n                                                Matched(__pos, _) => Matched(__pos, { e }),\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                };\n                                __state.suppress_fail -= 1;\n                                res\n                            };\n                            match __seq_res {\n                                Matched(__pos, _) => Matched(__pos, { StorageClassSpecifier::ThreadLocal }),\n                                Failed => Failed,\n                            }\n                        };\n                        match __choice_res {\n                            Matched(__pos, __value) => Matched(__pos, __value),\n                            Failed => {\n                                let __choice_res = {\n                                    let __seq_res = {\n                                        __state.suppress_fail += 1;\n                                        let res = {\n                                            let __seq_res = slice_eq(__input, __state, __pos, \"auto\");\n                                            match __seq_res {\n                                                Matched(__pos, e) => {\n                                                    let __seq_res = {\n                                                        __state.suppress_fail += 1;\n                                                        let __assert_res = if __input.len() > __pos {\n                                                            let (__ch, __next) = char_range_at(__input, __pos);\n                                                            match __ch {\n                                                                '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                                                _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                                            }\n                                                        } else {\n                                                            __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                                                        };\n                                                        __state.suppress_fail -= 1;\n                                                        match __assert_res {\n                                                            Failed => Matched(__pos, ()),\n                                                            Matched(..) => Failed,\n                                                        }\n                                                    };\n                                                    match __seq_res {\n                                                        Matched(__pos, _) => Matched(__pos, { e }),\n                                                        Failed => Failed,\n                                                    }\n                                                }\n                                                Failed => Failed,\n                                            }\n                                        };\n                                        __state.suppress_fail -= 1;\n                                        res\n                                    };\n                                    match __seq_res {\n                                        Matched(__pos, _) => Matched(__pos, { StorageClassSpecifier::Auto }),\n                                        Failed => Failed,\n                                    }\n                                };\n                                match __choice_res {\n                                    Matched(__pos, __value) => Matched(__pos, __value),\n                                    Failed => {\n                                        let __seq_res = {\n                                            __state.suppress_fail += 1;\n                                            let res = {\n                                                let __seq_res = slice_eq(__input, __state, __pos, \"register\");\n                                                match __seq_res {\n                                                    Matched(__pos, e) => {\n                                                        let __seq_res = {\n                                                            __state.suppress_fail += 1;\n                                                            let __assert_res = if __input.len() > __pos {\n                                                                let (__ch, __next) = char_range_at(__input, __pos);\n                                                                match __ch {\n                                                                    '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                                                    _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                                                }\n                                                            } else {\n                                                                __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                                                            };\n                                                            __state.suppress_fail -= 1;\n                                                            match __assert_res {\n                                                                Failed => Matched(__pos, ()),\n                                                                Matched(..) => Failed,\n                                                            }\n                                                        };\n                                                        match __seq_res {\n                                                            Matched(__pos, _) => Matched(__pos, { e }),\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            };\n                                            __state.suppress_fail -= 1;\n                                            res\n                                        };\n                                        match __seq_res {\n                                            Matched(__pos, _) => Matched(__pos, { StorageClassSpecifier::Register }),\n                                            Failed => Failed,\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n\nfn __parse_storage_class_typedef<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Node<StorageClassSpecifier>> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = Matched(__pos, __pos);\n        match __seq_res {\n            Matched(__pos, l) => {\n                let __seq_res = __parse_storage_class_typedef0(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, e) => {\n                        let __seq_res = Matched(__pos, __pos);\n                        match __seq_res {\n                            Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_storage_class_typedef0<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<StorageClassSpecifier> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = {\n            __state.suppress_fail += 1;\n            let res = {\n                let __seq_res = slice_eq(__input, __state, __pos, \"typedef\");\n                match __seq_res {\n                    Matched(__pos, e) => {\n                        let __seq_res = {\n                            __state.suppress_fail += 1;\n                            let __assert_res = if __input.len() > __pos {\n                                let (__ch, __next) = char_range_at(__input, __pos);\n                                match __ch {\n                                    '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                    _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                }\n                            } else {\n                                __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                            };\n                            __state.suppress_fail -= 1;\n                            match __assert_res {\n                                Failed => Matched(__pos, ()),\n                                Matched(..) => Failed,\n                            }\n                        };\n                        match __seq_res {\n                            Matched(__pos, _) => Matched(__pos, { e }),\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            };\n            __state.suppress_fail -= 1;\n            res\n        };\n        match __seq_res {\n            Matched(__pos, _) => Matched(__pos, { StorageClassSpecifier::Typedef }),\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_type_specifier_unique<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<TypeSpecifier> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            let __seq_res = {\n                __state.suppress_fail += 1;\n                let res = {\n                    let __seq_res = slice_eq(__input, __state, __pos, \"void\");\n                    match __seq_res {\n                        Matched(__pos, e) => {\n                            let __seq_res = {\n                                __state.suppress_fail += 1;\n                                let __assert_res = if __input.len() > __pos {\n                                    let (__ch, __next) = char_range_at(__input, __pos);\n                                    match __ch {\n                                        '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                        _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                    }\n                                } else {\n                                    __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                                };\n                                __state.suppress_fail -= 1;\n                                match __assert_res {\n                                    Failed => Matched(__pos, ()),\n                                    Matched(..) => Failed,\n                                }\n                            };\n                            match __seq_res {\n                                Matched(__pos, _) => Matched(__pos, { e }),\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                };\n                __state.suppress_fail -= 1;\n                res\n            };\n            match __seq_res {\n                Matched(__pos, _) => Matched(__pos, { TypeSpecifier::Void }),\n                Failed => Failed,\n            }\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                let __choice_res = {\n                    let __seq_res = {\n                        __state.suppress_fail += 1;\n                        let res = {\n                            let __seq_res = slice_eq(__input, __state, __pos, \"_Bool\");\n                            match __seq_res {\n                                Matched(__pos, e) => {\n                                    let __seq_res = {\n                                        __state.suppress_fail += 1;\n                                        let __assert_res = if __input.len() > __pos {\n                                            let (__ch, __next) = char_range_at(__input, __pos);\n                                            match __ch {\n                                                '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                                _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                            }\n                                        } else {\n                                            __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                                        };\n                                        __state.suppress_fail -= 1;\n                                        match __assert_res {\n                                            Failed => Matched(__pos, ()),\n                                            Matched(..) => Failed,\n                                        }\n                                    };\n                                    match __seq_res {\n                                        Matched(__pos, _) => Matched(__pos, { e }),\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        };\n                        __state.suppress_fail -= 1;\n                        res\n                    };\n                    match __seq_res {\n                        Matched(__pos, _) => Matched(__pos, { TypeSpecifier::Bool }),\n                        Failed => Failed,\n                    }\n                };\n                match __choice_res {\n                    Matched(__pos, __value) => Matched(__pos, __value),\n                    Failed => {\n                        let __choice_res = {\n                            let __seq_res = {\n                                __state.suppress_fail += 1;\n                                let res = {\n                                    let __seq_res = slice_eq(__input, __state, __pos, \"_Atomic\");\n                                    match __seq_res {\n                                        Matched(__pos, e) => {\n                                            let __seq_res = {\n                                                __state.suppress_fail += 1;\n                                                let __assert_res = if __input.len() > __pos {\n                                                    let (__ch, __next) = char_range_at(__input, __pos);\n                                                    match __ch {\n                                                        '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                                        _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                                    }\n                                                } else {\n                                                    __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                                                };\n                                                __state.suppress_fail -= 1;\n                                                match __assert_res {\n                                                    Failed => Matched(__pos, ()),\n                                                    Matched(..) => Failed,\n                                                }\n                                            };\n                                            match __seq_res {\n                                                Matched(__pos, _) => Matched(__pos, { e }),\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                };\n                                __state.suppress_fail -= 1;\n                                res\n                            };\n                            match __seq_res {\n                                Matched(__pos, _) => {\n                                    let __seq_res = __parse__(__input, __state, __pos, env);\n                                    match __seq_res {\n                                        Matched(__pos, _) => {\n                                            let __seq_res = slice_eq(__input, __state, __pos, \"(\");\n                                            match __seq_res {\n                                                Matched(__pos, _) => {\n                                                    let __seq_res = __parse__(__input, __state, __pos, env);\n                                                    match __seq_res {\n                                                        Matched(__pos, _) => {\n                                                            let __seq_res = __parse_type_name(__input, __state, __pos, env);\n                                                            match __seq_res {\n                                                                Matched(__pos, t) => {\n                                                                    let __seq_res = __parse__(__input, __state, __pos, env);\n                                                                    match __seq_res {\n                                                                        Matched(__pos, _) => {\n                                                                            let __seq_res = slice_eq(__input, __state, __pos, \")\");\n                                                                            match __seq_res {\n                                                                                Matched(__pos, _) => Matched(__pos, { TypeSpecifier::Atomic(t) }),\n                                                                                Failed => Failed,\n                                                                            }\n                                                                        }\n                                                                        Failed => Failed,\n                                                                    }\n                                                                }\n                                                                Failed => Failed,\n                                                            }\n                                                        }\n                                                        Failed => Failed,\n                                                    }\n                                                }\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        };\n                        match __choice_res {\n                            Matched(__pos, __value) => Matched(__pos, __value),\n                            Failed => {\n                                let __choice_res = {\n                                    let __seq_res = {\n                                        let __seq_res = Matched(__pos, __pos);\n                                        match __seq_res {\n                                            Matched(__pos, l) => {\n                                                let __seq_res = __parse_struct_or_union_specifier(__input, __state, __pos, env);\n                                                match __seq_res {\n                                                    Matched(__pos, e) => {\n                                                        let __seq_res = Matched(__pos, __pos);\n                                                        match __seq_res {\n                                                            Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    };\n                                    match __seq_res {\n                                        Matched(__pos, s) => Matched(__pos, { TypeSpecifier::Struct(s) }),\n                                        Failed => Failed,\n                                    }\n                                };\n                                match __choice_res {\n                                    Matched(__pos, __value) => Matched(__pos, __value),\n                                    Failed => {\n                                        let __choice_res = {\n                                            let __seq_res = {\n                                                let __seq_res = Matched(__pos, __pos);\n                                                match __seq_res {\n                                                    Matched(__pos, l) => {\n                                                        let __seq_res = __parse_enum_specifier(__input, __state, __pos, env);\n                                                        match __seq_res {\n                                                            Matched(__pos, e) => {\n                                                                let __seq_res = Matched(__pos, __pos);\n                                                                match __seq_res {\n                                                                    Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                                    Failed => Failed,\n                                                                }\n                                                            }\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            };\n                                            match __seq_res {\n                                                Matched(__pos, e) => Matched(__pos, { TypeSpecifier::Enum(e) }),\n                                                Failed => Failed,\n                                            }\n                                        };\n                                        match __choice_res {\n                                            Matched(__pos, __value) => Matched(__pos, __value),\n                                            Failed => {\n                                                let __seq_res = __parse_typedef_name(__input, __state, __pos, env);\n                                                match __seq_res {\n                                                    Matched(__pos, t) => Matched(__pos, { TypeSpecifier::TypedefName(t) }),\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n\nfn __parse_type_specifier_nonunique<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<TypeSpecifier> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            let __seq_res = {\n                __state.suppress_fail += 1;\n                let res = {\n                    let __seq_res = slice_eq(__input, __state, __pos, \"char\");\n                    match __seq_res {\n                        Matched(__pos, e) => {\n                            let __seq_res = {\n                                __state.suppress_fail += 1;\n                                let __assert_res = if __input.len() > __pos {\n                                    let (__ch, __next) = char_range_at(__input, __pos);\n                                    match __ch {\n                                        '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                        _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                    }\n                                } else {\n                                    __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                                };\n                                __state.suppress_fail -= 1;\n                                match __assert_res {\n                                    Failed => Matched(__pos, ()),\n                                    Matched(..) => Failed,\n                                }\n                            };\n                            match __seq_res {\n                                Matched(__pos, _) => Matched(__pos, { e }),\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                };\n                __state.suppress_fail -= 1;\n                res\n            };\n            match __seq_res {\n                Matched(__pos, _) => Matched(__pos, { TypeSpecifier::Char }),\n                Failed => Failed,\n            }\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                let __choice_res = {\n                    let __seq_res = {\n                        __state.suppress_fail += 1;\n                        let res = {\n                            let __seq_res = slice_eq(__input, __state, __pos, \"short\");\n                            match __seq_res {\n                                Matched(__pos, e) => {\n                                    let __seq_res = {\n                                        __state.suppress_fail += 1;\n                                        let __assert_res = if __input.len() > __pos {\n                                            let (__ch, __next) = char_range_at(__input, __pos);\n                                            match __ch {\n                                                '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                                _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                            }\n                                        } else {\n                                            __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                                        };\n                                        __state.suppress_fail -= 1;\n                                        match __assert_res {\n                                            Failed => Matched(__pos, ()),\n                                            Matched(..) => Failed,\n                                        }\n                                    };\n                                    match __seq_res {\n                                        Matched(__pos, _) => Matched(__pos, { e }),\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        };\n                        __state.suppress_fail -= 1;\n                        res\n                    };\n                    match __seq_res {\n                        Matched(__pos, _) => Matched(__pos, { TypeSpecifier::Short }),\n                        Failed => Failed,\n                    }\n                };\n                match __choice_res {\n                    Matched(__pos, __value) => Matched(__pos, __value),\n                    Failed => {\n                        let __choice_res = {\n                            let __seq_res = {\n                                __state.suppress_fail += 1;\n                                let res = {\n                                    let __seq_res = slice_eq(__input, __state, __pos, \"int\");\n                                    match __seq_res {\n                                        Matched(__pos, e) => {\n                                            let __seq_res = {\n                                                __state.suppress_fail += 1;\n                                                let __assert_res = if __input.len() > __pos {\n                                                    let (__ch, __next) = char_range_at(__input, __pos);\n                                                    match __ch {\n                                                        '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                                        _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                                    }\n                                                } else {\n                                                    __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                                                };\n                                                __state.suppress_fail -= 1;\n                                                match __assert_res {\n                                                    Failed => Matched(__pos, ()),\n                                                    Matched(..) => Failed,\n                                                }\n                                            };\n                                            match __seq_res {\n                                                Matched(__pos, _) => Matched(__pos, { e }),\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                };\n                                __state.suppress_fail -= 1;\n                                res\n                            };\n                            match __seq_res {\n                                Matched(__pos, _) => Matched(__pos, { TypeSpecifier::Int }),\n                                Failed => Failed,\n                            }\n                        };\n                        match __choice_res {\n                            Matched(__pos, __value) => Matched(__pos, __value),\n                            Failed => {\n                                let __choice_res = {\n                                    let __seq_res = {\n                                        __state.suppress_fail += 1;\n                                        let res = {\n                                            let __seq_res = slice_eq(__input, __state, __pos, \"long\");\n                                            match __seq_res {\n                                                Matched(__pos, e) => {\n                                                    let __seq_res = {\n                                                        __state.suppress_fail += 1;\n                                                        let __assert_res = if __input.len() > __pos {\n                                                            let (__ch, __next) = char_range_at(__input, __pos);\n                                                            match __ch {\n                                                                '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                                                _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                                            }\n                                                        } else {\n                                                            __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                                                        };\n                                                        __state.suppress_fail -= 1;\n                                                        match __assert_res {\n                                                            Failed => Matched(__pos, ()),\n                                                            Matched(..) => Failed,\n                                                        }\n                                                    };\n                                                    match __seq_res {\n                                                        Matched(__pos, _) => Matched(__pos, { e }),\n                                                        Failed => Failed,\n                                                    }\n                                                }\n                                                Failed => Failed,\n                                            }\n                                        };\n                                        __state.suppress_fail -= 1;\n                                        res\n                                    };\n                                    match __seq_res {\n                                        Matched(__pos, _) => Matched(__pos, { TypeSpecifier::Long }),\n                                        Failed => Failed,\n                                    }\n                                };\n                                match __choice_res {\n                                    Matched(__pos, __value) => Matched(__pos, __value),\n                                    Failed => {\n                                        let __choice_res = {\n                                            let __seq_res = {\n                                                __state.suppress_fail += 1;\n                                                let res = {\n                                                    let __seq_res = slice_eq(__input, __state, __pos, \"float\");\n                                                    match __seq_res {\n                                                        Matched(__pos, e) => {\n                                                            let __seq_res = {\n                                                                __state.suppress_fail += 1;\n                                                                let __assert_res = if __input.len() > __pos {\n                                                                    let (__ch, __next) = char_range_at(__input, __pos);\n                                                                    match __ch {\n                                                                        '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                                                        _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                                                    }\n                                                                } else {\n                                                                    __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                                                                };\n                                                                __state.suppress_fail -= 1;\n                                                                match __assert_res {\n                                                                    Failed => Matched(__pos, ()),\n                                                                    Matched(..) => Failed,\n                                                                }\n                                                            };\n                                                            match __seq_res {\n                                                                Matched(__pos, _) => Matched(__pos, { e }),\n                                                                Failed => Failed,\n                                                            }\n                                                        }\n                                                        Failed => Failed,\n                                                    }\n                                                };\n                                                __state.suppress_fail -= 1;\n                                                res\n                                            };\n                                            match __seq_res {\n                                                Matched(__pos, _) => Matched(__pos, { TypeSpecifier::Float }),\n                                                Failed => Failed,\n                                            }\n                                        };\n                                        match __choice_res {\n                                            Matched(__pos, __value) => Matched(__pos, __value),\n                                            Failed => {\n                                                let __choice_res = {\n                                                    let __seq_res = {\n                                                        __state.suppress_fail += 1;\n                                                        let res = {\n                                                            let __seq_res = slice_eq(__input, __state, __pos, \"double\");\n                                                            match __seq_res {\n                                                                Matched(__pos, e) => {\n                                                                    let __seq_res = {\n                                                                        __state.suppress_fail += 1;\n                                                                        let __assert_res = if __input.len() > __pos {\n                                                                            let (__ch, __next) = char_range_at(__input, __pos);\n                                                                            match __ch {\n                                                                                '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                                                                _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                                                            }\n                                                                        } else {\n                                                                            __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                                                                        };\n                                                                        __state.suppress_fail -= 1;\n                                                                        match __assert_res {\n                                                                            Failed => Matched(__pos, ()),\n                                                                            Matched(..) => Failed,\n                                                                        }\n                                                                    };\n                                                                    match __seq_res {\n                                                                        Matched(__pos, _) => Matched(__pos, { e }),\n                                                                        Failed => Failed,\n                                                                    }\n                                                                }\n                                                                Failed => Failed,\n                                                            }\n                                                        };\n                                                        __state.suppress_fail -= 1;\n                                                        res\n                                                    };\n                                                    match __seq_res {\n                                                        Matched(__pos, _) => Matched(__pos, { TypeSpecifier::Double }),\n                                                        Failed => Failed,\n                                                    }\n                                                };\n                                                match __choice_res {\n                                                    Matched(__pos, __value) => Matched(__pos, __value),\n                                                    Failed => {\n                                                        let __choice_res = {\n                                                            let __seq_res = {\n                                                                __state.suppress_fail += 1;\n                                                                let res = {\n                                                                    let __seq_res = {\n                                                                        let __choice_res = slice_eq(__input, __state, __pos, \"signed\");\n                                                                        match __choice_res {\n                                                                            Matched(__pos, __value) => Matched(__pos, __value),\n                                                                            Failed => {\n                                                                                let __seq_res = {\n                                                                                    __state.suppress_fail += 1;\n                                                                                    let __assert_res = __parse_gnu_guard(__input, __state, __pos, env);\n                                                                                    __state.suppress_fail -= 1;\n                                                                                    match __assert_res {\n                                                                                        Matched(_, __value) => Matched(__pos, __value),\n                                                                                        Failed => Failed,\n                                                                                    }\n                                                                                };\n                                                                                match __seq_res {\n                                                                                    Matched(__pos, _) => {\n                                                                                        let __seq_res = {\n                                                                                            let __seq_res = slice_eq(__input, __state, __pos, \"__signed\");\n                                                                                            match __seq_res {\n                                                                                                Matched(__pos, _) => match slice_eq(__input, __state, __pos, \"__\") {\n                                                                                                    Matched(__newpos, _) => Matched(__newpos, ()),\n                                                                                                    Failed => Matched(__pos, ()),\n                                                                                                },\n                                                                                                Failed => Failed,\n                                                                                            }\n                                                                                        };\n                                                                                        match __seq_res {\n                                                                                            Matched(__pos, e) => Matched(__pos, { e }),\n                                                                                            Failed => Failed,\n                                                                                        }\n                                                                                    }\n                                                                                    Failed => Failed,\n                                                                                }\n                                                                            }\n                                                                        }\n                                                                    };\n                                                                    match __seq_res {\n                                                                        Matched(__pos, e) => {\n                                                                            let __seq_res = {\n                                                                                __state.suppress_fail += 1;\n                                                                                let __assert_res = if __input.len() > __pos {\n                                                                                    let (__ch, __next) = char_range_at(__input, __pos);\n                                                                                    match __ch {\n                                                                                        '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                                                                        _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                                                                    }\n                                                                                } else {\n                                                                                    __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                                                                                };\n                                                                                __state.suppress_fail -= 1;\n                                                                                match __assert_res {\n                                                                                    Failed => Matched(__pos, ()),\n                                                                                    Matched(..) => Failed,\n                                                                                }\n                                                                            };\n                                                                            match __seq_res {\n                                                                                Matched(__pos, _) => Matched(__pos, { e }),\n                                                                                Failed => Failed,\n                                                                            }\n                                                                        }\n                                                                        Failed => Failed,\n                                                                    }\n                                                                };\n                                                                __state.suppress_fail -= 1;\n                                                                res\n                                                            };\n                                                            match __seq_res {\n                                                                Matched(__pos, _) => Matched(__pos, { TypeSpecifier::Signed }),\n                                                                Failed => Failed,\n                                                            }\n                                                        };\n                                                        match __choice_res {\n                                                            Matched(__pos, __value) => Matched(__pos, __value),\n                                                            Failed => {\n                                                                let __choice_res = {\n                                                                    let __seq_res = {\n                                                                        __state.suppress_fail += 1;\n                                                                        let res = {\n                                                                            let __seq_res = slice_eq(__input, __state, __pos, \"unsigned\");\n                                                                            match __seq_res {\n                                                                                Matched(__pos, e) => {\n                                                                                    let __seq_res = {\n                                                                                        __state.suppress_fail += 1;\n                                                                                        let __assert_res = if __input.len() > __pos {\n                                                                                            let (__ch, __next) = char_range_at(__input, __pos);\n                                                                                            match __ch {\n                                                                                                '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                                                                                _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                                                                            }\n                                                                                        } else {\n                                                                                            __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                                                                                        };\n                                                                                        __state.suppress_fail -= 1;\n                                                                                        match __assert_res {\n                                                                                            Failed => Matched(__pos, ()),\n                                                                                            Matched(..) => Failed,\n                                                                                        }\n                                                                                    };\n                                                                                    match __seq_res {\n                                                                                        Matched(__pos, _) => Matched(__pos, { e }),\n                                                                                        Failed => Failed,\n                                                                                    }\n                                                                                }\n                                                                                Failed => Failed,\n                                                                            }\n                                                                        };\n                                                                        __state.suppress_fail -= 1;\n                                                                        res\n                                                                    };\n                                                                    match __seq_res {\n                                                                        Matched(__pos, _) => Matched(__pos, { TypeSpecifier::Unsigned }),\n                                                                        Failed => Failed,\n                                                                    }\n                                                                };\n                                                                match __choice_res {\n                                                                    Matched(__pos, __value) => Matched(__pos, __value),\n                                                                    Failed => {\n                                                                        let __choice_res = {\n                                                                            let __seq_res = {\n                                                                                __state.suppress_fail += 1;\n                                                                                let res = {\n                                                                                    let __seq_res = {\n                                                                                        let __choice_res = slice_eq(__input, __state, __pos, \"_Complex\");\n                                                                                        match __choice_res {\n                                                                                            Matched(__pos, __value) => Matched(__pos, __value),\n                                                                                            Failed => {\n                                                                                                let __seq_res = {\n                                                                                                    __state.suppress_fail += 1;\n                                                                                                    let __assert_res = __parse_gnu_guard(__input, __state, __pos, env);\n                                                                                                    __state.suppress_fail -= 1;\n                                                                                                    match __assert_res {\n                                                                                                        Matched(_, __value) => Matched(__pos, __value),\n                                                                                                        Failed => Failed,\n                                                                                                    }\n                                                                                                };\n                                                                                                match __seq_res {\n                                                                                                    Matched(__pos, _) => {\n                                                                                                        let __seq_res = {\n                                                                                                            let __seq_res = slice_eq(__input, __state, __pos, \"__complex\");\n                                                                                                            match __seq_res {\n                                                                                                                Matched(__pos, _) => match slice_eq(__input, __state, __pos, \"__\") {\n                                                                                                                    Matched(__newpos, _) => Matched(__newpos, ()),\n                                                                                                                    Failed => Matched(__pos, ()),\n                                                                                                                },\n                                                                                                                Failed => Failed,\n                                                                                                            }\n                                                                                                        };\n                                                                                                        match __seq_res {\n                                                                                                            Matched(__pos, e) => Matched(__pos, { e }),\n                                                                                                            Failed => Failed,\n                                                                                                        }\n                                                                                                    }\n                                                                                                    Failed => Failed,\n                                                                                                }\n                                                                                            }\n                                                                                        }\n                                                                                    };\n                                                                                    match __seq_res {\n                                                                                        Matched(__pos, e) => {\n                                                                                            let __seq_res = {\n                                                                                                __state.suppress_fail += 1;\n                                                                                                let __assert_res = if __input.len() > __pos {\n                                                                                                    let (__ch, __next) = char_range_at(__input, __pos);\n                                                                                                    match __ch {\n                                                                                                        '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                                                                                        _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                                                                                    }\n                                                                                                } else {\n                                                                                                    __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                                                                                                };\n                                                                                                __state.suppress_fail -= 1;\n                                                                                                match __assert_res {\n                                                                                                    Failed => Matched(__pos, ()),\n                                                                                                    Matched(..) => Failed,\n                                                                                                }\n                                                                                            };\n                                                                                            match __seq_res {\n                                                                                                Matched(__pos, _) => Matched(__pos, { e }),\n                                                                                                Failed => Failed,\n                                                                                            }\n                                                                                        }\n                                                                                        Failed => Failed,\n                                                                                    }\n                                                                                };\n                                                                                __state.suppress_fail -= 1;\n                                                                                res\n                                                                            };\n                                                                            match __seq_res {\n                                                                                Matched(__pos, _) => Matched(__pos, { TypeSpecifier::Complex }),\n                                                                                Failed => Failed,\n                                                                            }\n                                                                        };\n                                                                        match __choice_res {\n                                                                            Matched(__pos, __value) => Matched(__pos, __value),\n                                                                            Failed => {\n                                                                                let __choice_res = {\n                                                                                    let __seq_res = {\n                                                                                        __state.suppress_fail += 1;\n                                                                                        let res = {\n                                                                                            let __seq_res = __parse_ts18661_float_type_specifier(__input, __state, __pos, env);\n                                                                                            match __seq_res {\n                                                                                                Matched(__pos, e) => {\n                                                                                                    let __seq_res = {\n                                                                                                        __state.suppress_fail += 1;\n                                                                                                        let __assert_res = if __input.len() > __pos {\n                                                                                                            let (__ch, __next) = char_range_at(__input, __pos);\n                                                                                                            match __ch {\n                                                                                                                '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                                                                                                _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                                                                                            }\n                                                                                                        } else {\n                                                                                                            __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                                                                                                        };\n                                                                                                        __state.suppress_fail -= 1;\n                                                                                                        match __assert_res {\n                                                                                                            Failed => Matched(__pos, ()),\n                                                                                                            Matched(..) => Failed,\n                                                                                                        }\n                                                                                                    };\n                                                                                                    match __seq_res {\n                                                                                                        Matched(__pos, _) => Matched(__pos, { e }),\n                                                                                                        Failed => Failed,\n                                                                                                    }\n                                                                                                }\n                                                                                                Failed => Failed,\n                                                                                            }\n                                                                                        };\n                                                                                        __state.suppress_fail -= 1;\n                                                                                        res\n                                                                                    };\n                                                                                    match __seq_res {\n                                                                                        Matched(__pos, t) => Matched(__pos, { TypeSpecifier::TS18661Float(t) }),\n                                                                                        Failed => Failed,\n                                                                                    }\n                                                                                };\n                                                                                match __choice_res {\n                                                                                    Matched(__pos, __value) => Matched(__pos, __value),\n                                                                                    Failed => {\n                                                                                        let __seq_res = {\n                                                                                            __state.suppress_fail += 1;\n                                                                                            let __assert_res = __parse_gnu_guard(__input, __state, __pos, env);\n                                                                                            __state.suppress_fail -= 1;\n                                                                                            match __assert_res {\n                                                                                                Matched(_, __value) => Matched(__pos, __value),\n                                                                                                Failed => Failed,\n                                                                                            }\n                                                                                        };\n                                                                                        match __seq_res {\n                                                                                            Matched(__pos, _) => {\n                                                                                                let __seq_res = __parse_typeof_specifier(__input, __state, __pos, env);\n                                                                                                match __seq_res {\n                                                                                                    Matched(__pos, e) => Matched(__pos, { e }),\n                                                                                                    Failed => Failed,\n                                                                                                }\n                                                                                            }\n                                                                                            Failed => Failed,\n                                                                                        }\n                                                                                    }\n                                                                                }\n                                                                            }\n                                                                        }\n                                                                    }\n                                                                }\n                                                            }\n                                                        }\n                                                    }\n                                                }\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n\nfn __parse_struct_or_union_specifier<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<StructType> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            let __seq_res = {\n                let __seq_res = Matched(__pos, __pos);\n                match __seq_res {\n                    Matched(__pos, l) => {\n                        let __seq_res = __parse_struct_or_union(__input, __state, __pos, env);\n                        match __seq_res {\n                            Matched(__pos, e) => {\n                                let __seq_res = Matched(__pos, __pos);\n                                match __seq_res {\n                                    Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            };\n            match __seq_res {\n                Matched(__pos, t) => {\n                    let __seq_res = __parse__(__input, __state, __pos, env);\n                    match __seq_res {\n                        Matched(__pos, _) => {\n                            let __seq_res = match __parse_identifier(__input, __state, __pos, env) {\n                                Matched(__newpos, __value) => Matched(__newpos, Some(__value)),\n                                Failed => Matched(__pos, None),\n                            };\n                            match __seq_res {\n                                Matched(__pos, i) => {\n                                    let __seq_res = __parse__(__input, __state, __pos, env);\n                                    match __seq_res {\n                                        Matched(__pos, _) => {\n                                            let __seq_res = __parse_struct_or_union_body(__input, __state, __pos, env);\n                                            match __seq_res {\n                                                Matched(__pos, d) => Matched(__pos, { StructType { kind: t, identifier: i, declarations: d } }),\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                }\n                Failed => Failed,\n            }\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                let __seq_res = {\n                    let __seq_res = Matched(__pos, __pos);\n                    match __seq_res {\n                        Matched(__pos, l) => {\n                            let __seq_res = __parse_struct_or_union(__input, __state, __pos, env);\n                            match __seq_res {\n                                Matched(__pos, e) => {\n                                    let __seq_res = Matched(__pos, __pos);\n                                    match __seq_res {\n                                        Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                };\n                match __seq_res {\n                    Matched(__pos, t) => {\n                        let __seq_res = __parse__(__input, __state, __pos, env);\n                        match __seq_res {\n                            Matched(__pos, _) => {\n                                let __seq_res = __parse_identifier(__input, __state, __pos, env);\n                                match __seq_res {\n                                    Matched(__pos, i) => Matched(__pos, { StructType { kind: t, identifier: Some(i), declarations: None } }),\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n        }\n    }\n}\n\nfn __parse_struct_or_union_body<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Option<Vec<Node<StructDeclaration>>>> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            let __seq_res = slice_eq(__input, __state, __pos, \"{\");\n            match __seq_res {\n                Matched(__pos, _) => {\n                    let __seq_res = __parse__(__input, __state, __pos, env);\n                    match __seq_res {\n                        Matched(__pos, _) => {\n                            let __seq_res = {\n                                let __seq_res = {\n                                    let mut __repeat_pos = __pos;\n                                    let mut __repeat_value = vec![];\n                                    loop {\n                                        let __pos = __repeat_pos;\n                                        let __pos = if __repeat_value.len() > 0 {\n                                            let __sep_res = __parse__(__input, __state, __pos, env);\n                                            match __sep_res {\n                                                Matched(__newpos, _) => __newpos,\n                                                Failed => break,\n                                            }\n                                        } else {\n                                            __pos\n                                        };\n                                        let __step_res = {\n                                            let __seq_res = Matched(__pos, __pos);\n                                            match __seq_res {\n                                                Matched(__pos, l) => {\n                                                    let __seq_res = __parse_struct_declaration(__input, __state, __pos, env);\n                                                    match __seq_res {\n                                                        Matched(__pos, e) => {\n                                                            let __seq_res = Matched(__pos, __pos);\n                                                            match __seq_res {\n                                                                Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                                Failed => Failed,\n                                                            }\n                                                        }\n                                                        Failed => Failed,\n                                                    }\n                                                }\n                                                Failed => Failed,\n                                            }\n                                        };\n                                        match __step_res {\n                                            Matched(__newpos, __value) => {\n                                                __repeat_pos = __newpos;\n                                                __repeat_value.push(__value);\n                                            }\n                                            Failed => {\n                                                break;\n                                            }\n                                        }\n                                    }\n                                    if __repeat_value.len() >= 1 {\n                                        Matched(__repeat_pos, __repeat_value)\n                                    } else {\n                                        Failed\n                                    }\n                                };\n                                match __seq_res {\n                                    Matched(__pos, e) => Matched(__pos, { e }),\n                                    Failed => Failed,\n                                }\n                            };\n                            match __seq_res {\n                                Matched(__pos, d) => {\n                                    let __seq_res = __parse__(__input, __state, __pos, env);\n                                    match __seq_res {\n                                        Matched(__pos, _) => {\n                                            let __seq_res = slice_eq(__input, __state, __pos, \"}\");\n                                            match __seq_res {\n                                                Matched(__pos, _) => Matched(__pos, { Some(d) }),\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                }\n                Failed => Failed,\n            }\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                let __choice_res = {\n                    let __seq_res = {\n                        let __seq_res = {\n                            __state.suppress_fail += 1;\n                            let __assert_res = __parse_gnu_guard(__input, __state, __pos, env);\n                            __state.suppress_fail -= 1;\n                            match __assert_res {\n                                Matched(_, __value) => Matched(__pos, __value),\n                                Failed => Failed,\n                            }\n                        };\n                        match __seq_res {\n                            Matched(__pos, _) => {\n                                let __seq_res = {\n                                    let __seq_res = slice_eq(__input, __state, __pos, \"{\");\n                                    match __seq_res {\n                                        Matched(__pos, _) => {\n                                            let __seq_res = __parse__(__input, __state, __pos, env);\n                                            match __seq_res {\n                                                Matched(__pos, _) => slice_eq(__input, __state, __pos, \"}\"),\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                };\n                                match __seq_res {\n                                    Matched(__pos, e) => Matched(__pos, { e }),\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    };\n                    match __seq_res {\n                        Matched(__pos, _) => Matched(__pos, { Some(Vec::new()) }),\n                        Failed => Failed,\n                    }\n                };\n                match __choice_res {\n                    Matched(__pos, __value) => Matched(__pos, __value),\n                    Failed => Matched(__pos, { None }),\n                }\n            }\n        }\n    }\n}\n\nfn __parse_struct_or_union<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<StructKind> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            let __seq_res = {\n                __state.suppress_fail += 1;\n                let res = {\n                    let __seq_res = slice_eq(__input, __state, __pos, \"struct\");\n                    match __seq_res {\n                        Matched(__pos, e) => {\n                            let __seq_res = {\n                                __state.suppress_fail += 1;\n                                let __assert_res = if __input.len() > __pos {\n                                    let (__ch, __next) = char_range_at(__input, __pos);\n                                    match __ch {\n                                        '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                        _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                    }\n                                } else {\n                                    __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                                };\n                                __state.suppress_fail -= 1;\n                                match __assert_res {\n                                    Failed => Matched(__pos, ()),\n                                    Matched(..) => Failed,\n                                }\n                            };\n                            match __seq_res {\n                                Matched(__pos, _) => Matched(__pos, { e }),\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                };\n                __state.suppress_fail -= 1;\n                res\n            };\n            match __seq_res {\n                Matched(__pos, _) => Matched(__pos, { StructKind::Struct }),\n                Failed => Failed,\n            }\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                let __seq_res = {\n                    __state.suppress_fail += 1;\n                    let res = {\n                        let __seq_res = slice_eq(__input, __state, __pos, \"union\");\n                        match __seq_res {\n                            Matched(__pos, e) => {\n                                let __seq_res = {\n                                    __state.suppress_fail += 1;\n                                    let __assert_res = if __input.len() > __pos {\n                                        let (__ch, __next) = char_range_at(__input, __pos);\n                                        match __ch {\n                                            '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                            _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                        }\n                                    } else {\n                                        __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                                    };\n                                    __state.suppress_fail -= 1;\n                                    match __assert_res {\n                                        Failed => Matched(__pos, ()),\n                                        Matched(..) => Failed,\n                                    }\n                                };\n                                match __seq_res {\n                                    Matched(__pos, _) => Matched(__pos, { e }),\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    };\n                    __state.suppress_fail -= 1;\n                    res\n                };\n                match __seq_res {\n                    Matched(__pos, _) => Matched(__pos, { StructKind::Union }),\n                    Failed => Failed,\n                }\n            }\n        }\n    }\n}\n\nfn __parse_struct_declaration<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<StructDeclaration> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            let __seq_res = {\n                let __seq_res = Matched(__pos, __pos);\n                match __seq_res {\n                    Matched(__pos, l) => {\n                        let __seq_res = __parse_struct_field(__input, __state, __pos, env);\n                        match __seq_res {\n                            Matched(__pos, e) => {\n                                let __seq_res = Matched(__pos, __pos);\n                                match __seq_res {\n                                    Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            };\n            match __seq_res {\n                Matched(__pos, f) => Matched(__pos, { StructDeclaration::Field(f) }),\n                Failed => Failed,\n            }\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                let __choice_res = {\n                    let __seq_res = __parse_static_assert(__input, __state, __pos, env);\n                    match __seq_res {\n                        Matched(__pos, s) => Matched(__pos, { StructDeclaration::StaticAssert(s) }),\n                        Failed => Failed,\n                    }\n                };\n                match __choice_res {\n                    Matched(__pos, __value) => Matched(__pos, __value),\n                    Failed => {\n                        let __seq_res = {\n                            let __seq_res = {\n                                __state.suppress_fail += 1;\n                                let __assert_res = __parse_gnu_guard(__input, __state, __pos, env);\n                                __state.suppress_fail -= 1;\n                                match __assert_res {\n                                    Matched(_, __value) => Matched(__pos, __value),\n                                    Failed => Failed,\n                                }\n                            };\n                            match __seq_res {\n                                Matched(__pos, _) => {\n                                    let __seq_res = {\n                                        __state.suppress_fail += 1;\n                                        let res = {\n                                            let __seq_res = slice_eq(__input, __state, __pos, \"__extension__\");\n                                            match __seq_res {\n                                                Matched(__pos, e) => {\n                                                    let __seq_res = {\n                                                        __state.suppress_fail += 1;\n                                                        let __assert_res = if __input.len() > __pos {\n                                                            let (__ch, __next) = char_range_at(__input, __pos);\n                                                            match __ch {\n                                                                '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                                                _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                                            }\n                                                        } else {\n                                                            __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                                                        };\n                                                        __state.suppress_fail -= 1;\n                                                        match __assert_res {\n                                                            Failed => Matched(__pos, ()),\n                                                            Matched(..) => Failed,\n                                                        }\n                                                    };\n                                                    match __seq_res {\n                                                        Matched(__pos, _) => Matched(__pos, { e }),\n                                                        Failed => Failed,\n                                                    }\n                                                }\n                                                Failed => Failed,\n                                            }\n                                        };\n                                        __state.suppress_fail -= 1;\n                                        res\n                                    };\n                                    match __seq_res {\n                                        Matched(__pos, e) => Matched(__pos, { e }),\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        };\n                        match __seq_res {\n                            Matched(__pos, _) => {\n                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                match __seq_res {\n                                    Matched(__pos, _) => {\n                                        let __seq_res = __parse_struct_declaration(__input, __state, __pos, env);\n                                        match __seq_res {\n                                            Matched(__pos, d) => Matched(__pos, { d }),\n                                            Failed => Failed,\n                                        }\n                                    }\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n\nfn __parse_struct_field<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<StructField> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = __parse_specifier_qualifiers(__input, __state, __pos, env);\n        match __seq_res {\n            Matched(__pos, s) => {\n                let __seq_res = __parse__(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = {\n                            let __seq_res = {\n                                let mut __repeat_pos = __pos;\n                                let mut __repeat_value = vec![];\n                                loop {\n                                    let __pos = __repeat_pos;\n                                    let __pos = if __repeat_value.len() > 0 {\n                                        let __sep_res = {\n                                            let __seq_res = __parse__(__input, __state, __pos, env);\n                                            match __seq_res {\n                                                Matched(__pos, _) => {\n                                                    let __seq_res = slice_eq(__input, __state, __pos, \",\");\n                                                    match __seq_res {\n                                                        Matched(__pos, _) => __parse__(__input, __state, __pos, env),\n                                                        Failed => Failed,\n                                                    }\n                                                }\n                                                Failed => Failed,\n                                            }\n                                        };\n                                        match __sep_res {\n                                            Matched(__newpos, _) => __newpos,\n                                            Failed => break,\n                                        }\n                                    } else {\n                                        __pos\n                                    };\n                                    let __step_res = {\n                                        let __seq_res = Matched(__pos, __pos);\n                                        match __seq_res {\n                                            Matched(__pos, l) => {\n                                                let __seq_res = __parse_struct_declarator(__input, __state, __pos, env);\n                                                match __seq_res {\n                                                    Matched(__pos, e) => {\n                                                        let __seq_res = Matched(__pos, __pos);\n                                                        match __seq_res {\n                                                            Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    };\n                                    match __step_res {\n                                        Matched(__newpos, __value) => {\n                                            __repeat_pos = __newpos;\n                                            __repeat_value.push(__value);\n                                        }\n                                        Failed => {\n                                            break;\n                                        }\n                                    }\n                                }\n                                Matched(__repeat_pos, __repeat_value)\n                            };\n                            match __seq_res {\n                                Matched(__pos, e) => Matched(__pos, { e }),\n                                Failed => Failed,\n                            }\n                        };\n                        match __seq_res {\n                            Matched(__pos, d) => {\n                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                match __seq_res {\n                                    Matched(__pos, _) => {\n                                        let __seq_res = slice_eq(__input, __state, __pos, \";\");\n                                        match __seq_res {\n                                            Matched(__pos, _) => {\n                                                let __seq_res = match {\n                                                    let __seq_res = {\n                                                        __state.suppress_fail += 1;\n                                                        let __assert_res = __parse_gnu_guard(__input, __state, __pos, env);\n                                                        __state.suppress_fail -= 1;\n                                                        match __assert_res {\n                                                            Matched(_, __value) => Matched(__pos, __value),\n                                                            Failed => Failed,\n                                                        }\n                                                    };\n                                                    match __seq_res {\n                                                        Matched(__pos, _) => {\n                                                            let __seq_res = {\n                                                                let mut __repeat_pos = __pos;\n                                                                let mut __repeat_value = vec![];\n                                                                loop {\n                                                                    let __pos = __repeat_pos;\n                                                                    let __step_res = {\n                                                                        let __seq_res = __parse__(__input, __state, __pos, env);\n                                                                        match __seq_res {\n                                                                            Matched(__pos, _) => slice_eq(__input, __state, __pos, \";\"),\n                                                                            Failed => Failed,\n                                                                        }\n                                                                    };\n                                                                    match __step_res {\n                                                                        Matched(__newpos, __value) => {\n                                                                            __repeat_pos = __newpos;\n                                                                            __repeat_value.push(__value);\n                                                                        }\n                                                                        Failed => {\n                                                                            break;\n                                                                        }\n                                                                    }\n                                                                }\n                                                                Matched(__repeat_pos, __repeat_value)\n                                                            };\n                                                            match __seq_res {\n                                                                Matched(__pos, e) => Matched(__pos, { e }),\n                                                                Failed => Failed,\n                                                            }\n                                                        }\n                                                        Failed => Failed,\n                                                    }\n                                                } {\n                                                    Matched(__newpos, _) => Matched(__newpos, ()),\n                                                    Failed => Matched(__pos, ()),\n                                                };\n                                                match __seq_res {\n                                                    Matched(__pos, _) => Matched(__pos, { StructField { specifiers: s, declarators: d } }),\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    }\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_specifier_qualifiers<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Vec<Node<SpecifierQualifier>>> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            let __seq_res = {\n                let __seq_res = {\n                    let mut __repeat_pos = __pos;\n                    let mut __repeat_value = vec![];\n                    loop {\n                        let __pos = __repeat_pos;\n                        let __pos = if __repeat_value.len() > 0 {\n                            let __sep_res = __parse__(__input, __state, __pos, env);\n                            match __sep_res {\n                                Matched(__newpos, _) => __newpos,\n                                Failed => break,\n                            }\n                        } else {\n                            __pos\n                        };\n                        let __step_res = {\n                            let __seq_res = Matched(__pos, __pos);\n                            match __seq_res {\n                                Matched(__pos, l) => {\n                                    let __seq_res = __parse_specifier_qualifier_qualifier0(__input, __state, __pos, env);\n                                    match __seq_res {\n                                        Matched(__pos, e) => {\n                                            let __seq_res = Matched(__pos, __pos);\n                                            match __seq_res {\n                                                Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        };\n                        match __step_res {\n                            Matched(__newpos, __value) => {\n                                __repeat_pos = __newpos;\n                                __repeat_value.push(__value);\n                            }\n                            Failed => {\n                                break;\n                            }\n                        }\n                    }\n                    Matched(__repeat_pos, __repeat_value)\n                };\n                match __seq_res {\n                    Matched(__pos, e) => Matched(__pos, { e }),\n                    Failed => Failed,\n                }\n            };\n            match __seq_res {\n                Matched(__pos, before) => {\n                    let __seq_res = __parse__(__input, __state, __pos, env);\n                    match __seq_res {\n                        Matched(__pos, _) => {\n                            let __seq_res = {\n                                let __seq_res = Matched(__pos, __pos);\n                                match __seq_res {\n                                    Matched(__pos, l) => {\n                                        let __seq_res = __parse_specifier_qualifier_unique_type0(__input, __state, __pos, env);\n                                        match __seq_res {\n                                            Matched(__pos, e) => {\n                                                let __seq_res = Matched(__pos, __pos);\n                                                match __seq_res {\n                                                    Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    }\n                                    Failed => Failed,\n                                }\n                            };\n                            match __seq_res {\n                                Matched(__pos, single) => {\n                                    let __seq_res = __parse__(__input, __state, __pos, env);\n                                    match __seq_res {\n                                        Matched(__pos, _) => {\n                                            let __seq_res = {\n                                                let __seq_res = {\n                                                    let mut __repeat_pos = __pos;\n                                                    let mut __repeat_value = vec![];\n                                                    loop {\n                                                        let __pos = __repeat_pos;\n                                                        let __pos = if __repeat_value.len() > 0 {\n                                                            let __sep_res = __parse__(__input, __state, __pos, env);\n                                                            match __sep_res {\n                                                                Matched(__newpos, _) => __newpos,\n                                                                Failed => break,\n                                                            }\n                                                        } else {\n                                                            __pos\n                                                        };\n                                                        let __step_res = {\n                                                            let __seq_res = Matched(__pos, __pos);\n                                                            match __seq_res {\n                                                                Matched(__pos, l) => {\n                                                                    let __seq_res = __parse_specifier_qualifier_qualifier0(__input, __state, __pos, env);\n                                                                    match __seq_res {\n                                                                        Matched(__pos, e) => {\n                                                                            let __seq_res = Matched(__pos, __pos);\n                                                                            match __seq_res {\n                                                                                Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                                                Failed => Failed,\n                                                                            }\n                                                                        }\n                                                                        Failed => Failed,\n                                                                    }\n                                                                }\n                                                                Failed => Failed,\n                                                            }\n                                                        };\n                                                        match __step_res {\n                                                            Matched(__newpos, __value) => {\n                                                                __repeat_pos = __newpos;\n                                                                __repeat_value.push(__value);\n                                                            }\n                                                            Failed => {\n                                                                break;\n                                                            }\n                                                        }\n                                                    }\n                                                    Matched(__repeat_pos, __repeat_value)\n                                                };\n                                                match __seq_res {\n                                                    Matched(__pos, e) => Matched(__pos, { e }),\n                                                    Failed => Failed,\n                                                }\n                                            };\n                                            match __seq_res {\n                                                Matched(__pos, after) => Matched(__pos, {\n                                                    let mut before = before;\n                                                    before.push(single);\n                                                    before.extend(after);\n                                                    before\n                                                }),\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                }\n                Failed => Failed,\n            }\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                let __seq_res = {\n                    let __seq_res = {\n                        let mut __repeat_pos = __pos;\n                        let mut __repeat_value = vec![];\n                        loop {\n                            let __pos = __repeat_pos;\n                            let __pos = if __repeat_value.len() > 0 {\n                                let __sep_res = __parse__(__input, __state, __pos, env);\n                                match __sep_res {\n                                    Matched(__newpos, _) => __newpos,\n                                    Failed => break,\n                                }\n                            } else {\n                                __pos\n                            };\n                            let __step_res = {\n                                let __seq_res = Matched(__pos, __pos);\n                                match __seq_res {\n                                    Matched(__pos, l) => {\n                                        let __seq_res = __parse_specifier_qualifier_qualifier0(__input, __state, __pos, env);\n                                        match __seq_res {\n                                            Matched(__pos, e) => {\n                                                let __seq_res = Matched(__pos, __pos);\n                                                match __seq_res {\n                                                    Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    }\n                                    Failed => Failed,\n                                }\n                            };\n                            match __step_res {\n                                Matched(__newpos, __value) => {\n                                    __repeat_pos = __newpos;\n                                    __repeat_value.push(__value);\n                                }\n                                Failed => {\n                                    break;\n                                }\n                            }\n                        }\n                        Matched(__repeat_pos, __repeat_value)\n                    };\n                    match __seq_res {\n                        Matched(__pos, e) => Matched(__pos, { e }),\n                        Failed => Failed,\n                    }\n                };\n                match __seq_res {\n                    Matched(__pos, before) => {\n                        let __seq_res = __parse__(__input, __state, __pos, env);\n                        match __seq_res {\n                            Matched(__pos, _) => {\n                                let __seq_res = {\n                                    let __seq_res = Matched(__pos, __pos);\n                                    match __seq_res {\n                                        Matched(__pos, l) => {\n                                            let __seq_res = __parse_specifier_qualifier_nonunique_type0(__input, __state, __pos, env);\n                                            match __seq_res {\n                                                Matched(__pos, e) => {\n                                                    let __seq_res = Matched(__pos, __pos);\n                                                    match __seq_res {\n                                                        Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                        Failed => Failed,\n                                                    }\n                                                }\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                };\n                                match __seq_res {\n                                    Matched(__pos, single) => {\n                                        let __seq_res = __parse__(__input, __state, __pos, env);\n                                        match __seq_res {\n                                            Matched(__pos, _) => {\n                                                let __seq_res = {\n                                                    let __seq_res = {\n                                                        let mut __repeat_pos = __pos;\n                                                        let mut __repeat_value = vec![];\n                                                        loop {\n                                                            let __pos = __repeat_pos;\n                                                            let __pos = if __repeat_value.len() > 0 {\n                                                                let __sep_res = __parse__(__input, __state, __pos, env);\n                                                                match __sep_res {\n                                                                    Matched(__newpos, _) => __newpos,\n                                                                    Failed => break,\n                                                                }\n                                                            } else {\n                                                                __pos\n                                                            };\n                                                            let __step_res = {\n                                                                let __choice_res = {\n                                                                    let __seq_res = Matched(__pos, __pos);\n                                                                    match __seq_res {\n                                                                        Matched(__pos, l) => {\n                                                                            let __seq_res = __parse_specifier_qualifier_nonunique_type0(__input, __state, __pos, env);\n                                                                            match __seq_res {\n                                                                                Matched(__pos, e) => {\n                                                                                    let __seq_res = Matched(__pos, __pos);\n                                                                                    match __seq_res {\n                                                                                        Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                                                        Failed => Failed,\n                                                                                    }\n                                                                                }\n                                                                                Failed => Failed,\n                                                                            }\n                                                                        }\n                                                                        Failed => Failed,\n                                                                    }\n                                                                };\n                                                                match __choice_res {\n                                                                    Matched(__pos, __value) => Matched(__pos, __value),\n                                                                    Failed => {\n                                                                        let __seq_res = Matched(__pos, __pos);\n                                                                        match __seq_res {\n                                                                            Matched(__pos, l) => {\n                                                                                let __seq_res = __parse_specifier_qualifier_qualifier0(__input, __state, __pos, env);\n                                                                                match __seq_res {\n                                                                                    Matched(__pos, e) => {\n                                                                                        let __seq_res = Matched(__pos, __pos);\n                                                                                        match __seq_res {\n                                                                                            Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                                                            Failed => Failed,\n                                                                                        }\n                                                                                    }\n                                                                                    Failed => Failed,\n                                                                                }\n                                                                            }\n                                                                            Failed => Failed,\n                                                                        }\n                                                                    }\n                                                                }\n                                                            };\n                                                            match __step_res {\n                                                                Matched(__newpos, __value) => {\n                                                                    __repeat_pos = __newpos;\n                                                                    __repeat_value.push(__value);\n                                                                }\n                                                                Failed => {\n                                                                    break;\n                                                                }\n                                                            }\n                                                        }\n                                                        Matched(__repeat_pos, __repeat_value)\n                                                    };\n                                                    match __seq_res {\n                                                        Matched(__pos, e) => Matched(__pos, { e }),\n                                                        Failed => Failed,\n                                                    }\n                                                };\n                                                match __seq_res {\n                                                    Matched(__pos, after) => Matched(__pos, {\n                                                        let mut before = before;\n                                                        before.push(single);\n                                                        before.extend(after);\n                                                        before\n                                                    }),\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    }\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n        }\n    }\n}\n\nfn __parse_specifier_qualifier_unique_type0<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<SpecifierQualifier> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = {\n            let __seq_res = Matched(__pos, __pos);\n            match __seq_res {\n                Matched(__pos, l) => {\n                    let __seq_res = __parse_type_specifier_unique(__input, __state, __pos, env);\n                    match __seq_res {\n                        Matched(__pos, e) => {\n                            let __seq_res = Matched(__pos, __pos);\n                            match __seq_res {\n                                Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                }\n                Failed => Failed,\n            }\n        };\n        match __seq_res {\n            Matched(__pos, s) => Matched(__pos, { SpecifierQualifier::TypeSpecifier(s) }),\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_specifier_qualifier_nonunique_type0<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<SpecifierQualifier> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = {\n            let __seq_res = Matched(__pos, __pos);\n            match __seq_res {\n                Matched(__pos, l) => {\n                    let __seq_res = __parse_type_specifier_nonunique(__input, __state, __pos, env);\n                    match __seq_res {\n                        Matched(__pos, e) => {\n                            let __seq_res = Matched(__pos, __pos);\n                            match __seq_res {\n                                Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                }\n                Failed => Failed,\n            }\n        };\n        match __seq_res {\n            Matched(__pos, s) => Matched(__pos, { SpecifierQualifier::TypeSpecifier(s) }),\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_specifier_qualifier_qualifier0<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<SpecifierQualifier> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            let __seq_res = __parse_type_qualifier(__input, __state, __pos, env);\n            match __seq_res {\n                Matched(__pos, q) => Matched(__pos, { SpecifierQualifier::TypeQualifier(q) }),\n                Failed => Failed,\n            }\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                let __seq_res = {\n                    let __seq_res = {\n                        __state.suppress_fail += 1;\n                        let __assert_res = __parse_gnu_guard(__input, __state, __pos, env);\n                        __state.suppress_fail -= 1;\n                        match __assert_res {\n                            Matched(_, __value) => Matched(__pos, __value),\n                            Failed => Failed,\n                        }\n                    };\n                    match __seq_res {\n                        Matched(__pos, _) => {\n                            let __seq_res = __parse_attribute_specifier(__input, __state, __pos, env);\n                            match __seq_res {\n                                Matched(__pos, e) => Matched(__pos, { e }),\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                };\n                match __seq_res {\n                    Matched(__pos, e) => Matched(__pos, { SpecifierQualifier::Extension(e) }),\n                    Failed => Failed,\n                }\n            }\n        }\n    }\n}\n\nfn __parse_struct_declarator<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<StructDeclarator> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            let __seq_res = match __parse_declarator(__input, __state, __pos, env) {\n                Matched(__newpos, __value) => Matched(__newpos, Some(__value)),\n                Failed => Matched(__pos, None),\n            };\n            match __seq_res {\n                Matched(__pos, d) => {\n                    let __seq_res = __parse__(__input, __state, __pos, env);\n                    match __seq_res {\n                        Matched(__pos, _) => {\n                            let __seq_res = slice_eq(__input, __state, __pos, \":\");\n                            match __seq_res {\n                                Matched(__pos, _) => {\n                                    let __seq_res = __parse__(__input, __state, __pos, env);\n                                    match __seq_res {\n                                        Matched(__pos, _) => {\n                                            let __seq_res = __parse_constant_expression(__input, __state, __pos, env);\n                                            match __seq_res {\n                                                Matched(__pos, e) => {\n                                                    let __seq_res = match {\n                                                        let __seq_res = {\n                                                            __state.suppress_fail += 1;\n                                                            let __assert_res = __parse_gnu_guard(__input, __state, __pos, env);\n                                                            __state.suppress_fail -= 1;\n                                                            match __assert_res {\n                                                                Matched(_, __value) => Matched(__pos, __value),\n                                                                Failed => Failed,\n                                                            }\n                                                        };\n                                                        match __seq_res {\n                                                            Matched(__pos, _) => {\n                                                                let __seq_res = __parse_attribute_specifier_list(__input, __state, __pos, env);\n                                                                match __seq_res {\n                                                                    Matched(__pos, e) => Matched(__pos, { e }),\n                                                                    Failed => Failed,\n                                                                }\n                                                            }\n                                                            Failed => Failed,\n                                                        }\n                                                    } {\n                                                        Matched(__newpos, __value) => Matched(__newpos, Some(__value)),\n                                                        Failed => Matched(__pos, None),\n                                                    };\n                                                    match __seq_res {\n                                                        Matched(__pos, a) => Matched(__pos, { StructDeclarator { declarator: d.map(|d| with_ext(d, a)), bit_width: Some(e) } }),\n                                                        Failed => Failed,\n                                                    }\n                                                }\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                }\n                Failed => Failed,\n            }\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                let __seq_res = __parse_declarator(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, d) => {\n                        let __seq_res = __parse__(__input, __state, __pos, env);\n                        match __seq_res {\n                            Matched(__pos, _) => {\n                                let __seq_res = match {\n                                    let __seq_res = {\n                                        __state.suppress_fail += 1;\n                                        let __assert_res = __parse_gnu_guard(__input, __state, __pos, env);\n                                        __state.suppress_fail -= 1;\n                                        match __assert_res {\n                                            Matched(_, __value) => Matched(__pos, __value),\n                                            Failed => Failed,\n                                        }\n                                    };\n                                    match __seq_res {\n                                        Matched(__pos, _) => {\n                                            let __seq_res = __parse_attribute_specifier_list(__input, __state, __pos, env);\n                                            match __seq_res {\n                                                Matched(__pos, e) => Matched(__pos, { e }),\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                } {\n                                    Matched(__newpos, __value) => Matched(__newpos, Some(__value)),\n                                    Failed => Matched(__pos, None),\n                                };\n                                match __seq_res {\n                                    Matched(__pos, a) => Matched(__pos, { StructDeclarator { declarator: Some(with_ext(d, a)), bit_width: None } }),\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n        }\n    }\n}\n\nfn __parse_enum_specifier<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<EnumType> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            let __seq_res = {\n                __state.suppress_fail += 1;\n                let res = {\n                    let __seq_res = slice_eq(__input, __state, __pos, \"enum\");\n                    match __seq_res {\n                        Matched(__pos, e) => {\n                            let __seq_res = {\n                                __state.suppress_fail += 1;\n                                let __assert_res = if __input.len() > __pos {\n                                    let (__ch, __next) = char_range_at(__input, __pos);\n                                    match __ch {\n                                        '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                        _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                    }\n                                } else {\n                                    __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                                };\n                                __state.suppress_fail -= 1;\n                                match __assert_res {\n                                    Failed => Matched(__pos, ()),\n                                    Matched(..) => Failed,\n                                }\n                            };\n                            match __seq_res {\n                                Matched(__pos, _) => Matched(__pos, { e }),\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                };\n                __state.suppress_fail -= 1;\n                res\n            };\n            match __seq_res {\n                Matched(__pos, _) => {\n                    let __seq_res = __parse__(__input, __state, __pos, env);\n                    match __seq_res {\n                        Matched(__pos, _) => {\n                            let __seq_res = match __parse_identifier(__input, __state, __pos, env) {\n                                Matched(__newpos, __value) => Matched(__newpos, Some(__value)),\n                                Failed => Matched(__pos, None),\n                            };\n                            match __seq_res {\n                                Matched(__pos, i) => {\n                                    let __seq_res = __parse__(__input, __state, __pos, env);\n                                    match __seq_res {\n                                        Matched(__pos, _) => {\n                                            let __seq_res = slice_eq(__input, __state, __pos, \"{\");\n                                            match __seq_res {\n                                                Matched(__pos, _) => {\n                                                    let __seq_res = __parse__(__input, __state, __pos, env);\n                                                    match __seq_res {\n                                                        Matched(__pos, _) => {\n                                                            let __seq_res = {\n                                                                let __seq_res = {\n                                                                    let mut __repeat_pos = __pos;\n                                                                    let mut __repeat_value = vec![];\n                                                                    loop {\n                                                                        let __pos = __repeat_pos;\n                                                                        let __pos = if __repeat_value.len() > 0 {\n                                                                            let __sep_res = {\n                                                                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                                                                match __seq_res {\n                                                                                    Matched(__pos, _) => {\n                                                                                        let __seq_res = slice_eq(__input, __state, __pos, \",\");\n                                                                                        match __seq_res {\n                                                                                            Matched(__pos, _) => __parse__(__input, __state, __pos, env),\n                                                                                            Failed => Failed,\n                                                                                        }\n                                                                                    }\n                                                                                    Failed => Failed,\n                                                                                }\n                                                                            };\n                                                                            match __sep_res {\n                                                                                Matched(__newpos, _) => __newpos,\n                                                                                Failed => break,\n                                                                            }\n                                                                        } else {\n                                                                            __pos\n                                                                        };\n                                                                        let __step_res = {\n                                                                            let __seq_res = Matched(__pos, __pos);\n                                                                            match __seq_res {\n                                                                                Matched(__pos, l) => {\n                                                                                    let __seq_res = __parse_enumerator(__input, __state, __pos, env);\n                                                                                    match __seq_res {\n                                                                                        Matched(__pos, e) => {\n                                                                                            let __seq_res = Matched(__pos, __pos);\n                                                                                            match __seq_res {\n                                                                                                Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                                                                Failed => Failed,\n                                                                                            }\n                                                                                        }\n                                                                                        Failed => Failed,\n                                                                                    }\n                                                                                }\n                                                                                Failed => Failed,\n                                                                            }\n                                                                        };\n                                                                        match __step_res {\n                                                                            Matched(__newpos, __value) => {\n                                                                                __repeat_pos = __newpos;\n                                                                                __repeat_value.push(__value);\n                                                                            }\n                                                                            Failed => {\n                                                                                break;\n                                                                            }\n                                                                        }\n                                                                    }\n                                                                    if __repeat_value.len() >= 1 {\n                                                                        Matched(__repeat_pos, __repeat_value)\n                                                                    } else {\n                                                                        Failed\n                                                                    }\n                                                                };\n                                                                match __seq_res {\n                                                                    Matched(__pos, e) => Matched(__pos, { e }),\n                                                                    Failed => Failed,\n                                                                }\n                                                            };\n                                                            match __seq_res {\n                                                                Matched(__pos, e) => {\n                                                                    let __seq_res = __parse__(__input, __state, __pos, env);\n                                                                    match __seq_res {\n                                                                        Matched(__pos, _) => {\n                                                                            let __seq_res = match slice_eq(__input, __state, __pos, \",\") {\n                                                                                Matched(__newpos, _) => Matched(__newpos, ()),\n                                                                                Failed => Matched(__pos, ()),\n                                                                            };\n                                                                            match __seq_res {\n                                                                                Matched(__pos, _) => {\n                                                                                    let __seq_res = __parse__(__input, __state, __pos, env);\n                                                                                    match __seq_res {\n                                                                                        Matched(__pos, _) => {\n                                                                                            let __seq_res = slice_eq(__input, __state, __pos, \"}\");\n                                                                                            match __seq_res {\n                                                                                                Matched(__pos, _) => Matched(__pos, { EnumType { identifier: i, enumerators: e } }),\n                                                                                                Failed => Failed,\n                                                                                            }\n                                                                                        }\n                                                                                        Failed => Failed,\n                                                                                    }\n                                                                                }\n                                                                                Failed => Failed,\n                                                                            }\n                                                                        }\n                                                                        Failed => Failed,\n                                                                    }\n                                                                }\n                                                                Failed => Failed,\n                                                            }\n                                                        }\n                                                        Failed => Failed,\n                                                    }\n                                                }\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                }\n                Failed => Failed,\n            }\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                let __seq_res = {\n                    __state.suppress_fail += 1;\n                    let res = {\n                        let __seq_res = slice_eq(__input, __state, __pos, \"enum\");\n                        match __seq_res {\n                            Matched(__pos, e) => {\n                                let __seq_res = {\n                                    __state.suppress_fail += 1;\n                                    let __assert_res = if __input.len() > __pos {\n                                        let (__ch, __next) = char_range_at(__input, __pos);\n                                        match __ch {\n                                            '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                            _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                        }\n                                    } else {\n                                        __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                                    };\n                                    __state.suppress_fail -= 1;\n                                    match __assert_res {\n                                        Failed => Matched(__pos, ()),\n                                        Matched(..) => Failed,\n                                    }\n                                };\n                                match __seq_res {\n                                    Matched(__pos, _) => Matched(__pos, { e }),\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    };\n                    __state.suppress_fail -= 1;\n                    res\n                };\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = __parse__(__input, __state, __pos, env);\n                        match __seq_res {\n                            Matched(__pos, _) => {\n                                let __seq_res = __parse_identifier(__input, __state, __pos, env);\n                                match __seq_res {\n                                    Matched(__pos, i) => Matched(__pos, { EnumType { identifier: Some(i), enumerators: Vec::new() } }),\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n        }\n    }\n}\n\nfn __parse_enumerator<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Enumerator> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = __parse_identifier(__input, __state, __pos, env);\n        match __seq_res {\n            Matched(__pos, i) => {\n                let __seq_res = __parse__(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = match {\n                            let __seq_res = {\n                                __state.suppress_fail += 1;\n                                let __assert_res = __parse_gnu_guard(__input, __state, __pos, env);\n                                __state.suppress_fail -= 1;\n                                match __assert_res {\n                                    Matched(_, __value) => Matched(__pos, __value),\n                                    Failed => Failed,\n                                }\n                            };\n                            match __seq_res {\n                                Matched(__pos, _) => {\n                                    let __seq_res = __parse_attribute_specifier_list(__input, __state, __pos, env);\n                                    match __seq_res {\n                                        Matched(__pos, e) => Matched(__pos, { e }),\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        } {\n                            Matched(__newpos, __value) => Matched(__newpos, Some(__value)),\n                            Failed => Matched(__pos, None),\n                        };\n                        match __seq_res {\n                            Matched(__pos, a) => {\n                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                match __seq_res {\n                                    Matched(__pos, _) => {\n                                        let __seq_res = match __parse_enumerator_constant(__input, __state, __pos, env) {\n                                            Matched(__newpos, __value) => Matched(__newpos, Some(__value)),\n                                            Failed => Matched(__pos, None),\n                                        };\n                                        match __seq_res {\n                                            Matched(__pos, e) => Matched(__pos, {\n                                                env.add_symbol(&i.node.name, Symbol::Identifier);\n                                                Enumerator { identifier: i, expression: e, extensions: a.unwrap_or_default() }\n                                            }),\n                                            Failed => Failed,\n                                        }\n                                    }\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_enumerator_constant<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Box<Node<Expression>>> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = slice_eq(__input, __state, __pos, \"=\");\n        match __seq_res {\n            Matched(__pos, _) => {\n                let __seq_res = __parse__(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = __parse_constant_expression(__input, __state, __pos, env);\n                        match __seq_res {\n                            Matched(__pos, e) => Matched(__pos, { e }),\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_type_qualifier<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Node<TypeQualifier>> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = Matched(__pos, __pos);\n        match __seq_res {\n            Matched(__pos, l) => {\n                let __seq_res = __parse_type_qualifier0(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, e) => {\n                        let __seq_res = Matched(__pos, __pos);\n                        match __seq_res {\n                            Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_type_qualifier0<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<TypeQualifier> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            let __seq_res = {\n                __state.suppress_fail += 1;\n                let res = {\n                    let __seq_res = {\n                        let __choice_res = slice_eq(__input, __state, __pos, \"const\");\n                        match __choice_res {\n                            Matched(__pos, __value) => Matched(__pos, __value),\n                            Failed => {\n                                let __seq_res = {\n                                    __state.suppress_fail += 1;\n                                    let __assert_res = __parse_gnu_guard(__input, __state, __pos, env);\n                                    __state.suppress_fail -= 1;\n                                    match __assert_res {\n                                        Matched(_, __value) => Matched(__pos, __value),\n                                        Failed => Failed,\n                                    }\n                                };\n                                match __seq_res {\n                                    Matched(__pos, _) => {\n                                        let __seq_res = slice_eq(__input, __state, __pos, \"__const\");\n                                        match __seq_res {\n                                            Matched(__pos, e) => Matched(__pos, { e }),\n                                            Failed => Failed,\n                                        }\n                                    }\n                                    Failed => Failed,\n                                }\n                            }\n                        }\n                    };\n                    match __seq_res {\n                        Matched(__pos, e) => {\n                            let __seq_res = {\n                                __state.suppress_fail += 1;\n                                let __assert_res = if __input.len() > __pos {\n                                    let (__ch, __next) = char_range_at(__input, __pos);\n                                    match __ch {\n                                        '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                        _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                    }\n                                } else {\n                                    __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                                };\n                                __state.suppress_fail -= 1;\n                                match __assert_res {\n                                    Failed => Matched(__pos, ()),\n                                    Matched(..) => Failed,\n                                }\n                            };\n                            match __seq_res {\n                                Matched(__pos, _) => Matched(__pos, { e }),\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                };\n                __state.suppress_fail -= 1;\n                res\n            };\n            match __seq_res {\n                Matched(__pos, _) => Matched(__pos, { TypeQualifier::Const }),\n                Failed => Failed,\n            }\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                let __choice_res = {\n                    let __seq_res = {\n                        __state.suppress_fail += 1;\n                        let res = {\n                            let __seq_res = {\n                                let __choice_res = slice_eq(__input, __state, __pos, \"restrict\");\n                                match __choice_res {\n                                    Matched(__pos, __value) => Matched(__pos, __value),\n                                    Failed => {\n                                        let __seq_res = {\n                                            __state.suppress_fail += 1;\n                                            let __assert_res = __parse_gnu_guard(__input, __state, __pos, env);\n                                            __state.suppress_fail -= 1;\n                                            match __assert_res {\n                                                Matched(_, __value) => Matched(__pos, __value),\n                                                Failed => Failed,\n                                            }\n                                        };\n                                        match __seq_res {\n                                            Matched(__pos, _) => {\n                                                let __seq_res = {\n                                                    let __seq_res = slice_eq(__input, __state, __pos, \"__restrict\");\n                                                    match __seq_res {\n                                                        Matched(__pos, _) => match slice_eq(__input, __state, __pos, \"__\") {\n                                                            Matched(__newpos, _) => Matched(__newpos, ()),\n                                                            Failed => Matched(__pos, ()),\n                                                        },\n                                                        Failed => Failed,\n                                                    }\n                                                };\n                                                match __seq_res {\n                                                    Matched(__pos, e) => Matched(__pos, { e }),\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    }\n                                }\n                            };\n                            match __seq_res {\n                                Matched(__pos, e) => {\n                                    let __seq_res = {\n                                        __state.suppress_fail += 1;\n                                        let __assert_res = if __input.len() > __pos {\n                                            let (__ch, __next) = char_range_at(__input, __pos);\n                                            match __ch {\n                                                '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                                _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                            }\n                                        } else {\n                                            __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                                        };\n                                        __state.suppress_fail -= 1;\n                                        match __assert_res {\n                                            Failed => Matched(__pos, ()),\n                                            Matched(..) => Failed,\n                                        }\n                                    };\n                                    match __seq_res {\n                                        Matched(__pos, _) => Matched(__pos, { e }),\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        };\n                        __state.suppress_fail -= 1;\n                        res\n                    };\n                    match __seq_res {\n                        Matched(__pos, _) => Matched(__pos, { TypeQualifier::Restrict }),\n                        Failed => Failed,\n                    }\n                };\n                match __choice_res {\n                    Matched(__pos, __value) => Matched(__pos, __value),\n                    Failed => {\n                        let __choice_res = {\n                            let __seq_res = {\n                                __state.suppress_fail += 1;\n                                let res = {\n                                    let __seq_res = {\n                                        let __choice_res = slice_eq(__input, __state, __pos, \"volatile\");\n                                        match __choice_res {\n                                            Matched(__pos, __value) => Matched(__pos, __value),\n                                            Failed => {\n                                                let __seq_res = {\n                                                    __state.suppress_fail += 1;\n                                                    let __assert_res = __parse_gnu_guard(__input, __state, __pos, env);\n                                                    __state.suppress_fail -= 1;\n                                                    match __assert_res {\n                                                        Matched(_, __value) => Matched(__pos, __value),\n                                                        Failed => Failed,\n                                                    }\n                                                };\n                                                match __seq_res {\n                                                    Matched(__pos, _) => {\n                                                        let __seq_res = {\n                                                            let __seq_res = slice_eq(__input, __state, __pos, \"__volatile\");\n                                                            match __seq_res {\n                                                                Matched(__pos, _) => match slice_eq(__input, __state, __pos, \"__\") {\n                                                                    Matched(__newpos, _) => Matched(__newpos, ()),\n                                                                    Failed => Matched(__pos, ()),\n                                                                },\n                                                                Failed => Failed,\n                                                            }\n                                                        };\n                                                        match __seq_res {\n                                                            Matched(__pos, e) => Matched(__pos, { e }),\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                        }\n                                    };\n                                    match __seq_res {\n                                        Matched(__pos, e) => {\n                                            let __seq_res = {\n                                                __state.suppress_fail += 1;\n                                                let __assert_res = if __input.len() > __pos {\n                                                    let (__ch, __next) = char_range_at(__input, __pos);\n                                                    match __ch {\n                                                        '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                                        _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                                    }\n                                                } else {\n                                                    __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                                                };\n                                                __state.suppress_fail -= 1;\n                                                match __assert_res {\n                                                    Failed => Matched(__pos, ()),\n                                                    Matched(..) => Failed,\n                                                }\n                                            };\n                                            match __seq_res {\n                                                Matched(__pos, _) => Matched(__pos, { e }),\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                };\n                                __state.suppress_fail -= 1;\n                                res\n                            };\n                            match __seq_res {\n                                Matched(__pos, _) => Matched(__pos, { TypeQualifier::Volatile }),\n                                Failed => Failed,\n                            }\n                        };\n                        match __choice_res {\n                            Matched(__pos, __value) => Matched(__pos, __value),\n                            Failed => {\n                                let __choice_res = {\n                                    let __seq_res = {\n                                        let __seq_res = {\n                                            __state.suppress_fail += 1;\n                                            let __assert_res = __parse_clang_guard(__input, __state, __pos, env);\n                                            __state.suppress_fail -= 1;\n                                            match __assert_res {\n                                                Matched(_, __value) => Matched(__pos, __value),\n                                                Failed => Failed,\n                                            }\n                                        };\n                                        match __seq_res {\n                                            Matched(__pos, _) => {\n                                                let __seq_res = {\n                                                    __state.suppress_fail += 1;\n                                                    let res = {\n                                                        let __seq_res = slice_eq(__input, __state, __pos, \"_Nonnull\");\n                                                        match __seq_res {\n                                                            Matched(__pos, e) => {\n                                                                let __seq_res = {\n                                                                    __state.suppress_fail += 1;\n                                                                    let __assert_res = if __input.len() > __pos {\n                                                                        let (__ch, __next) = char_range_at(__input, __pos);\n                                                                        match __ch {\n                                                                            '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                                                            _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                                                        }\n                                                                    } else {\n                                                                        __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                                                                    };\n                                                                    __state.suppress_fail -= 1;\n                                                                    match __assert_res {\n                                                                        Failed => Matched(__pos, ()),\n                                                                        Matched(..) => Failed,\n                                                                    }\n                                                                };\n                                                                match __seq_res {\n                                                                    Matched(__pos, _) => Matched(__pos, { e }),\n                                                                    Failed => Failed,\n                                                                }\n                                                            }\n                                                            Failed => Failed,\n                                                        }\n                                                    };\n                                                    __state.suppress_fail -= 1;\n                                                    res\n                                                };\n                                                match __seq_res {\n                                                    Matched(__pos, e) => Matched(__pos, { e }),\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    };\n                                    match __seq_res {\n                                        Matched(__pos, _) => Matched(__pos, { TypeQualifier::Nonnull }),\n                                        Failed => Failed,\n                                    }\n                                };\n                                match __choice_res {\n                                    Matched(__pos, __value) => Matched(__pos, __value),\n                                    Failed => {\n                                        let __choice_res = {\n                                            let __seq_res = {\n                                                let __seq_res = {\n                                                    __state.suppress_fail += 1;\n                                                    let __assert_res = __parse_clang_guard(__input, __state, __pos, env);\n                                                    __state.suppress_fail -= 1;\n                                                    match __assert_res {\n                                                        Matched(_, __value) => Matched(__pos, __value),\n                                                        Failed => Failed,\n                                                    }\n                                                };\n                                                match __seq_res {\n                                                    Matched(__pos, _) => {\n                                                        let __seq_res = {\n                                                            __state.suppress_fail += 1;\n                                                            let res = {\n                                                                let __seq_res = slice_eq(__input, __state, __pos, \"_Null_unspecified\");\n                                                                match __seq_res {\n                                                                    Matched(__pos, e) => {\n                                                                        let __seq_res = {\n                                                                            __state.suppress_fail += 1;\n                                                                            let __assert_res = if __input.len() > __pos {\n                                                                                let (__ch, __next) = char_range_at(__input, __pos);\n                                                                                match __ch {\n                                                                                    '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                                                                    _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                                                                }\n                                                                            } else {\n                                                                                __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                                                                            };\n                                                                            __state.suppress_fail -= 1;\n                                                                            match __assert_res {\n                                                                                Failed => Matched(__pos, ()),\n                                                                                Matched(..) => Failed,\n                                                                            }\n                                                                        };\n                                                                        match __seq_res {\n                                                                            Matched(__pos, _) => Matched(__pos, { e }),\n                                                                            Failed => Failed,\n                                                                        }\n                                                                    }\n                                                                    Failed => Failed,\n                                                                }\n                                                            };\n                                                            __state.suppress_fail -= 1;\n                                                            res\n                                                        };\n                                                        match __seq_res {\n                                                            Matched(__pos, e) => Matched(__pos, { e }),\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            };\n                                            match __seq_res {\n                                                Matched(__pos, _) => Matched(__pos, { TypeQualifier::NullUnspecified }),\n                                                Failed => Failed,\n                                            }\n                                        };\n                                        match __choice_res {\n                                            Matched(__pos, __value) => Matched(__pos, __value),\n                                            Failed => {\n                                                let __choice_res = {\n                                                    let __seq_res = {\n                                                        let __seq_res = {\n                                                            __state.suppress_fail += 1;\n                                                            let __assert_res = __parse_clang_guard(__input, __state, __pos, env);\n                                                            __state.suppress_fail -= 1;\n                                                            match __assert_res {\n                                                                Matched(_, __value) => Matched(__pos, __value),\n                                                                Failed => Failed,\n                                                            }\n                                                        };\n                                                        match __seq_res {\n                                                            Matched(__pos, _) => {\n                                                                let __seq_res = {\n                                                                    __state.suppress_fail += 1;\n                                                                    let res = {\n                                                                        let __seq_res = slice_eq(__input, __state, __pos, \"_Nullable\");\n                                                                        match __seq_res {\n                                                                            Matched(__pos, e) => {\n                                                                                let __seq_res = {\n                                                                                    __state.suppress_fail += 1;\n                                                                                    let __assert_res = if __input.len() > __pos {\n                                                                                        let (__ch, __next) = char_range_at(__input, __pos);\n                                                                                        match __ch {\n                                                                                            '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                                                                            _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                                                                        }\n                                                                                    } else {\n                                                                                        __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                                                                                    };\n                                                                                    __state.suppress_fail -= 1;\n                                                                                    match __assert_res {\n                                                                                        Failed => Matched(__pos, ()),\n                                                                                        Matched(..) => Failed,\n                                                                                    }\n                                                                                };\n                                                                                match __seq_res {\n                                                                                    Matched(__pos, _) => Matched(__pos, { e }),\n                                                                                    Failed => Failed,\n                                                                                }\n                                                                            }\n                                                                            Failed => Failed,\n                                                                        }\n                                                                    };\n                                                                    __state.suppress_fail -= 1;\n                                                                    res\n                                                                };\n                                                                match __seq_res {\n                                                                    Matched(__pos, e) => Matched(__pos, { e }),\n                                                                    Failed => Failed,\n                                                                }\n                                                            }\n                                                            Failed => Failed,\n                                                        }\n                                                    };\n                                                    match __seq_res {\n                                                        Matched(__pos, _) => Matched(__pos, { TypeQualifier::Nullable }),\n                                                        Failed => Failed,\n                                                    }\n                                                };\n                                                match __choice_res {\n                                                    Matched(__pos, __value) => Matched(__pos, __value),\n                                                    Failed => {\n                                                        let __seq_res = {\n                                                            __state.suppress_fail += 1;\n                                                            let res = {\n                                                                let __seq_res = slice_eq(__input, __state, __pos, \"_Atomic\");\n                                                                match __seq_res {\n                                                                    Matched(__pos, e) => {\n                                                                        let __seq_res = {\n                                                                            __state.suppress_fail += 1;\n                                                                            let __assert_res = if __input.len() > __pos {\n                                                                                let (__ch, __next) = char_range_at(__input, __pos);\n                                                                                match __ch {\n                                                                                    '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                                                                    _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                                                                }\n                                                                            } else {\n                                                                                __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                                                                            };\n                                                                            __state.suppress_fail -= 1;\n                                                                            match __assert_res {\n                                                                                Failed => Matched(__pos, ()),\n                                                                                Matched(..) => Failed,\n                                                                            }\n                                                                        };\n                                                                        match __seq_res {\n                                                                            Matched(__pos, _) => Matched(__pos, { e }),\n                                                                            Failed => Failed,\n                                                                        }\n                                                                    }\n                                                                    Failed => Failed,\n                                                                }\n                                                            };\n                                                            __state.suppress_fail -= 1;\n                                                            res\n                                                        };\n                                                        match __seq_res {\n                                                            Matched(__pos, _) => {\n                                                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                                                match __seq_res {\n                                                                    Matched(__pos, _) => {\n                                                                        let __seq_res = {\n                                                                            __state.suppress_fail += 1;\n                                                                            let __assert_res = slice_eq(__input, __state, __pos, \"(\");\n                                                                            __state.suppress_fail -= 1;\n                                                                            match __assert_res {\n                                                                                Failed => Matched(__pos, ()),\n                                                                                Matched(..) => Failed,\n                                                                            }\n                                                                        };\n                                                                        match __seq_res {\n                                                                            Matched(__pos, _) => Matched(__pos, { TypeQualifier::Atomic }),\n                                                                            Failed => Failed,\n                                                                        }\n                                                                    }\n                                                                    Failed => Failed,\n                                                                }\n                                                            }\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                }\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n\nfn __parse_function_specifier<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Node<FunctionSpecifier>> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = Matched(__pos, __pos);\n        match __seq_res {\n            Matched(__pos, l) => {\n                let __seq_res = __parse_function_specifier0(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, e) => {\n                        let __seq_res = Matched(__pos, __pos);\n                        match __seq_res {\n                            Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_function_specifier0<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<FunctionSpecifier> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            let __seq_res = {\n                __state.suppress_fail += 1;\n                let res = {\n                    let __seq_res = {\n                        let __choice_res = slice_eq(__input, __state, __pos, \"inline\");\n                        match __choice_res {\n                            Matched(__pos, __value) => Matched(__pos, __value),\n                            Failed => {\n                                let __seq_res = {\n                                    __state.suppress_fail += 1;\n                                    let __assert_res = __parse_gnu_guard(__input, __state, __pos, env);\n                                    __state.suppress_fail -= 1;\n                                    match __assert_res {\n                                        Matched(_, __value) => Matched(__pos, __value),\n                                        Failed => Failed,\n                                    }\n                                };\n                                match __seq_res {\n                                    Matched(__pos, _) => {\n                                        let __seq_res = {\n                                            let __seq_res = slice_eq(__input, __state, __pos, \"__inline\");\n                                            match __seq_res {\n                                                Matched(__pos, _) => match slice_eq(__input, __state, __pos, \"__\") {\n                                                    Matched(__newpos, _) => Matched(__newpos, ()),\n                                                    Failed => Matched(__pos, ()),\n                                                },\n                                                Failed => Failed,\n                                            }\n                                        };\n                                        match __seq_res {\n                                            Matched(__pos, e) => Matched(__pos, { e }),\n                                            Failed => Failed,\n                                        }\n                                    }\n                                    Failed => Failed,\n                                }\n                            }\n                        }\n                    };\n                    match __seq_res {\n                        Matched(__pos, e) => {\n                            let __seq_res = {\n                                __state.suppress_fail += 1;\n                                let __assert_res = if __input.len() > __pos {\n                                    let (__ch, __next) = char_range_at(__input, __pos);\n                                    match __ch {\n                                        '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                        _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                    }\n                                } else {\n                                    __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                                };\n                                __state.suppress_fail -= 1;\n                                match __assert_res {\n                                    Failed => Matched(__pos, ()),\n                                    Matched(..) => Failed,\n                                }\n                            };\n                            match __seq_res {\n                                Matched(__pos, _) => Matched(__pos, { e }),\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                };\n                __state.suppress_fail -= 1;\n                res\n            };\n            match __seq_res {\n                Matched(__pos, _) => Matched(__pos, { FunctionSpecifier::Inline }),\n                Failed => Failed,\n            }\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                let __seq_res = {\n                    __state.suppress_fail += 1;\n                    let res = {\n                        let __seq_res = slice_eq(__input, __state, __pos, \"_Noreturn\");\n                        match __seq_res {\n                            Matched(__pos, e) => {\n                                let __seq_res = {\n                                    __state.suppress_fail += 1;\n                                    let __assert_res = if __input.len() > __pos {\n                                        let (__ch, __next) = char_range_at(__input, __pos);\n                                        match __ch {\n                                            '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                            _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                        }\n                                    } else {\n                                        __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                                    };\n                                    __state.suppress_fail -= 1;\n                                    match __assert_res {\n                                        Failed => Matched(__pos, ()),\n                                        Matched(..) => Failed,\n                                    }\n                                };\n                                match __seq_res {\n                                    Matched(__pos, _) => Matched(__pos, { e }),\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    };\n                    __state.suppress_fail -= 1;\n                    res\n                };\n                match __seq_res {\n                    Matched(__pos, _) => Matched(__pos, { FunctionSpecifier::Noreturn }),\n                    Failed => Failed,\n                }\n            }\n        }\n    }\n}\n\nfn __parse_alignment_specifier<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Node<AlignmentSpecifier>> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = Matched(__pos, __pos);\n        match __seq_res {\n            Matched(__pos, l) => {\n                let __seq_res = __parse_alignment_specifier0(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, e) => {\n                        let __seq_res = Matched(__pos, __pos);\n                        match __seq_res {\n                            Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_alignment_specifier0<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<AlignmentSpecifier> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            let __seq_res = {\n                __state.suppress_fail += 1;\n                let res = {\n                    let __seq_res = slice_eq(__input, __state, __pos, \"_Alignas\");\n                    match __seq_res {\n                        Matched(__pos, e) => {\n                            let __seq_res = {\n                                __state.suppress_fail += 1;\n                                let __assert_res = if __input.len() > __pos {\n                                    let (__ch, __next) = char_range_at(__input, __pos);\n                                    match __ch {\n                                        '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                        _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                    }\n                                } else {\n                                    __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                                };\n                                __state.suppress_fail -= 1;\n                                match __assert_res {\n                                    Failed => Matched(__pos, ()),\n                                    Matched(..) => Failed,\n                                }\n                            };\n                            match __seq_res {\n                                Matched(__pos, _) => Matched(__pos, { e }),\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                };\n                __state.suppress_fail -= 1;\n                res\n            };\n            match __seq_res {\n                Matched(__pos, _) => {\n                    let __seq_res = __parse__(__input, __state, __pos, env);\n                    match __seq_res {\n                        Matched(__pos, _) => {\n                            let __seq_res = slice_eq(__input, __state, __pos, \"(\");\n                            match __seq_res {\n                                Matched(__pos, _) => {\n                                    let __seq_res = __parse__(__input, __state, __pos, env);\n                                    match __seq_res {\n                                        Matched(__pos, _) => {\n                                            let __seq_res = __parse_type_name(__input, __state, __pos, env);\n                                            match __seq_res {\n                                                Matched(__pos, t) => {\n                                                    let __seq_res = __parse__(__input, __state, __pos, env);\n                                                    match __seq_res {\n                                                        Matched(__pos, _) => {\n                                                            let __seq_res = slice_eq(__input, __state, __pos, \")\");\n                                                            match __seq_res {\n                                                                Matched(__pos, _) => Matched(__pos, { AlignmentSpecifier::Type(t) }),\n                                                                Failed => Failed,\n                                                            }\n                                                        }\n                                                        Failed => Failed,\n                                                    }\n                                                }\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                }\n                Failed => Failed,\n            }\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                let __seq_res = {\n                    __state.suppress_fail += 1;\n                    let res = {\n                        let __seq_res = slice_eq(__input, __state, __pos, \"_Alignas\");\n                        match __seq_res {\n                            Matched(__pos, e) => {\n                                let __seq_res = {\n                                    __state.suppress_fail += 1;\n                                    let __assert_res = if __input.len() > __pos {\n                                        let (__ch, __next) = char_range_at(__input, __pos);\n                                        match __ch {\n                                            '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                            _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                        }\n                                    } else {\n                                        __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                                    };\n                                    __state.suppress_fail -= 1;\n                                    match __assert_res {\n                                        Failed => Matched(__pos, ()),\n                                        Matched(..) => Failed,\n                                    }\n                                };\n                                match __seq_res {\n                                    Matched(__pos, _) => Matched(__pos, { e }),\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    };\n                    __state.suppress_fail -= 1;\n                    res\n                };\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = __parse__(__input, __state, __pos, env);\n                        match __seq_res {\n                            Matched(__pos, _) => {\n                                let __seq_res = slice_eq(__input, __state, __pos, \"(\");\n                                match __seq_res {\n                                    Matched(__pos, _) => {\n                                        let __seq_res = __parse__(__input, __state, __pos, env);\n                                        match __seq_res {\n                                            Matched(__pos, _) => {\n                                                let __seq_res = __parse_constant_expression(__input, __state, __pos, env);\n                                                match __seq_res {\n                                                    Matched(__pos, e) => {\n                                                        let __seq_res = __parse__(__input, __state, __pos, env);\n                                                        match __seq_res {\n                                                            Matched(__pos, _) => {\n                                                                let __seq_res = slice_eq(__input, __state, __pos, \")\");\n                                                                match __seq_res {\n                                                                    Matched(__pos, _) => Matched(__pos, { AlignmentSpecifier::Constant(e) }),\n                                                                    Failed => Failed,\n                                                                }\n                                                            }\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    }\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n        }\n    }\n}\n\nfn __parse_declarator<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Node<Declarator>> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = Matched(__pos, __pos);\n        match __seq_res {\n            Matched(__pos, l) => {\n                let __seq_res = __parse_declarator0(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, e) => {\n                        let __seq_res = Matched(__pos, __pos);\n                        match __seq_res {\n                            Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_declarator0<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Declarator> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = match {\n            let __seq_res = {\n                __state.suppress_fail += 1;\n                let __assert_res = __parse_gnu_guard(__input, __state, __pos, env);\n                __state.suppress_fail -= 1;\n                match __assert_res {\n                    Matched(_, __value) => Matched(__pos, __value),\n                    Failed => Failed,\n                }\n            };\n            match __seq_res {\n                Matched(__pos, _) => {\n                    let __seq_res = __parse_attribute_specifier_list(__input, __state, __pos, env);\n                    match __seq_res {\n                        Matched(__pos, e) => Matched(__pos, { e }),\n                        Failed => Failed,\n                    }\n                }\n                Failed => Failed,\n            }\n        } {\n            Matched(__newpos, __value) => Matched(__newpos, Some(__value)),\n            Failed => Matched(__pos, None),\n        };\n        match __seq_res {\n            Matched(__pos, attr) => {\n                let __seq_res = __parse__(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = {\n                            let __seq_res = {\n                                let mut __repeat_pos = __pos;\n                                let mut __repeat_value = vec![];\n                                loop {\n                                    let __pos = __repeat_pos;\n                                    let __pos = if __repeat_value.len() > 0 {\n                                        let __sep_res = __parse__(__input, __state, __pos, env);\n                                        match __sep_res {\n                                            Matched(__newpos, _) => __newpos,\n                                            Failed => break,\n                                        }\n                                    } else {\n                                        __pos\n                                    };\n                                    let __step_res = __parse_pointer(__input, __state, __pos, env);\n                                    match __step_res {\n                                        Matched(__newpos, __value) => {\n                                            __repeat_pos = __newpos;\n                                            __repeat_value.push(__value);\n                                        }\n                                        Failed => {\n                                            break;\n                                        }\n                                    }\n                                }\n                                Matched(__repeat_pos, __repeat_value)\n                            };\n                            match __seq_res {\n                                Matched(__pos, e) => Matched(__pos, { e }),\n                                Failed => Failed,\n                            }\n                        };\n                        match __seq_res {\n                            Matched(__pos, pointer) => {\n                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                match __seq_res {\n                                    Matched(__pos, _) => {\n                                        let __seq_res = {\n                                            let __seq_res = Matched(__pos, __pos);\n                                            match __seq_res {\n                                                Matched(__pos, l) => {\n                                                    let __seq_res = __parse_direct_declarator(__input, __state, __pos, env);\n                                                    match __seq_res {\n                                                        Matched(__pos, e) => {\n                                                            let __seq_res = Matched(__pos, __pos);\n                                                            match __seq_res {\n                                                                Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                                Failed => Failed,\n                                                            }\n                                                        }\n                                                        Failed => Failed,\n                                                    }\n                                                }\n                                                Failed => Failed,\n                                            }\n                                        };\n                                        match __seq_res {\n                                            Matched(__pos, kind) => {\n                                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                                match __seq_res {\n                                                    Matched(__pos, _) => {\n                                                        let __seq_res = {\n                                                            let __seq_res = {\n                                                                let mut __repeat_pos = __pos;\n                                                                let mut __repeat_value = vec![];\n                                                                loop {\n                                                                    let __pos = __repeat_pos;\n                                                                    let __pos = if __repeat_value.len() > 0 {\n                                                                        let __sep_res = __parse__(__input, __state, __pos, env);\n                                                                        match __sep_res {\n                                                                            Matched(__newpos, _) => __newpos,\n                                                                            Failed => break,\n                                                                        }\n                                                                    } else {\n                                                                        __pos\n                                                                    };\n                                                                    let __step_res = {\n                                                                        let __seq_res = Matched(__pos, __pos);\n                                                                        match __seq_res {\n                                                                            Matched(__pos, l) => {\n                                                                                let __seq_res = __parse_derived_declarator(__input, __state, __pos, env);\n                                                                                match __seq_res {\n                                                                                    Matched(__pos, e) => {\n                                                                                        let __seq_res = Matched(__pos, __pos);\n                                                                                        match __seq_res {\n                                                                                            Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                                                            Failed => Failed,\n                                                                                        }\n                                                                                    }\n                                                                                    Failed => Failed,\n                                                                                }\n                                                                            }\n                                                                            Failed => Failed,\n                                                                        }\n                                                                    };\n                                                                    match __step_res {\n                                                                        Matched(__newpos, __value) => {\n                                                                            __repeat_pos = __newpos;\n                                                                            __repeat_value.push(__value);\n                                                                        }\n                                                                        Failed => {\n                                                                            break;\n                                                                        }\n                                                                    }\n                                                                }\n                                                                Matched(__repeat_pos, __repeat_value)\n                                                            };\n                                                            match __seq_res {\n                                                                Matched(__pos, e) => Matched(__pos, { e }),\n                                                                Failed => Failed,\n                                                            }\n                                                        };\n                                                        match __seq_res {\n                                                            Matched(__pos, derived) => Matched(__pos, { Declarator { kind: kind, derived: concat(pointer, derived), extensions: attr.unwrap_or_default() } }),\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    }\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_direct_declarator<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<DeclaratorKind> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            let __seq_res = __parse_identifier(__input, __state, __pos, env);\n            match __seq_res {\n                Matched(__pos, i) => Matched(__pos, { DeclaratorKind::Identifier(i) }),\n                Failed => Failed,\n            }\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                let __seq_res = slice_eq(__input, __state, __pos, \"(\");\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = __parse__(__input, __state, __pos, env);\n                        match __seq_res {\n                            Matched(__pos, _) => {\n                                let __seq_res = __parse_declarator(__input, __state, __pos, env);\n                                match __seq_res {\n                                    Matched(__pos, d) => {\n                                        let __seq_res = __parse__(__input, __state, __pos, env);\n                                        match __seq_res {\n                                            Matched(__pos, _) => {\n                                                let __seq_res = slice_eq(__input, __state, __pos, \")\");\n                                                match __seq_res {\n                                                    Matched(__pos, _) => Matched(__pos, { DeclaratorKind::Declarator(Box::new(d)) }),\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    }\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n        }\n    }\n}\n\nfn __parse_derived_declarator<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<DerivedDeclarator> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            let __seq_res = slice_eq(__input, __state, __pos, \"[\");\n            match __seq_res {\n                Matched(__pos, _) => {\n                    let __seq_res = __parse__(__input, __state, __pos, env);\n                    match __seq_res {\n                        Matched(__pos, _) => {\n                            let __seq_res = {\n                                let __seq_res = Matched(__pos, __pos);\n                                match __seq_res {\n                                    Matched(__pos, l) => {\n                                        let __seq_res = __parse_array_declarator(__input, __state, __pos, env);\n                                        match __seq_res {\n                                            Matched(__pos, e) => {\n                                                let __seq_res = Matched(__pos, __pos);\n                                                match __seq_res {\n                                                    Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    }\n                                    Failed => Failed,\n                                }\n                            };\n                            match __seq_res {\n                                Matched(__pos, a) => Matched(__pos, { DerivedDeclarator::Array(a) }),\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                }\n                Failed => Failed,\n            }\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                let __choice_res = {\n                    let __seq_res = slice_eq(__input, __state, __pos, \"(\");\n                    match __seq_res {\n                        Matched(__pos, _) => {\n                            let __seq_res = __parse__(__input, __state, __pos, env);\n                            match __seq_res {\n                                Matched(__pos, _) => {\n                                    let __seq_res = {\n                                        let __seq_res = Matched(__pos, {\n                                            env.enter_scope();\n                                        });\n                                        match __seq_res {\n                                            Matched(__pos, _) => {\n                                                let __seq_res = match {\n                                                    let __seq_res = Matched(__pos, __pos);\n                                                    match __seq_res {\n                                                        Matched(__pos, l) => {\n                                                            let __seq_res = __parse_function_declarator(__input, __state, __pos, env);\n                                                            match __seq_res {\n                                                                Matched(__pos, e) => {\n                                                                    let __seq_res = Matched(__pos, __pos);\n                                                                    match __seq_res {\n                                                                        Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                                        Failed => Failed,\n                                                                    }\n                                                                }\n                                                                Failed => Failed,\n                                                            }\n                                                        }\n                                                        Failed => Failed,\n                                                    }\n                                                } {\n                                                    Matched(__newpos, __value) => Matched(__newpos, Some(__value)),\n                                                    Failed => Matched(__pos, None),\n                                                };\n                                                match __seq_res {\n                                                    Matched(__pos, e) => {\n                                                        match {\n                                                            env.leave_scope();\n                                                            e.ok_or(\"\")\n                                                        } {\n                                                            Ok(res) => Matched(__pos, res),\n                                                            Err(expected) => {\n                                                                __state.mark_failure(__pos, expected);\n                                                                Failed\n                                                            }\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    };\n                                    match __seq_res {\n                                        Matched(__pos, f) => {\n                                            let __seq_res = __parse__(__input, __state, __pos, env);\n                                            match __seq_res {\n                                                Matched(__pos, _) => {\n                                                    let __seq_res = slice_eq(__input, __state, __pos, \")\");\n                                                    match __seq_res {\n                                                        Matched(__pos, _) => Matched(__pos, { DerivedDeclarator::Function(f) }),\n                                                        Failed => Failed,\n                                                    }\n                                                }\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                };\n                match __choice_res {\n                    Matched(__pos, __value) => Matched(__pos, __value),\n                    Failed => {\n                        let __seq_res = slice_eq(__input, __state, __pos, \"(\");\n                        match __seq_res {\n                            Matched(__pos, _) => {\n                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                match __seq_res {\n                                    Matched(__pos, _) => {\n                                        let __seq_res = {\n                                            let __seq_res = {\n                                                let mut __repeat_pos = __pos;\n                                                let mut __repeat_value = vec![];\n                                                loop {\n                                                    let __pos = __repeat_pos;\n                                                    let __pos = if __repeat_value.len() > 0 {\n                                                        let __sep_res = {\n                                                            let __seq_res = __parse__(__input, __state, __pos, env);\n                                                            match __seq_res {\n                                                                Matched(__pos, _) => {\n                                                                    let __seq_res = slice_eq(__input, __state, __pos, \",\");\n                                                                    match __seq_res {\n                                                                        Matched(__pos, _) => __parse__(__input, __state, __pos, env),\n                                                                        Failed => Failed,\n                                                                    }\n                                                                }\n                                                                Failed => Failed,\n                                                            }\n                                                        };\n                                                        match __sep_res {\n                                                            Matched(__newpos, _) => __newpos,\n                                                            Failed => break,\n                                                        }\n                                                    } else {\n                                                        __pos\n                                                    };\n                                                    let __step_res = __parse_identifier(__input, __state, __pos, env);\n                                                    match __step_res {\n                                                        Matched(__newpos, __value) => {\n                                                            __repeat_pos = __newpos;\n                                                            __repeat_value.push(__value);\n                                                        }\n                                                        Failed => {\n                                                            break;\n                                                        }\n                                                    }\n                                                }\n                                                Matched(__repeat_pos, __repeat_value)\n                                            };\n                                            match __seq_res {\n                                                Matched(__pos, e) => Matched(__pos, { e }),\n                                                Failed => Failed,\n                                            }\n                                        };\n                                        match __seq_res {\n                                            Matched(__pos, p) => {\n                                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                                match __seq_res {\n                                                    Matched(__pos, _) => {\n                                                        let __seq_res = slice_eq(__input, __state, __pos, \")\");\n                                                        match __seq_res {\n                                                            Matched(__pos, _) => Matched(__pos, { DerivedDeclarator::KRFunction(p) }),\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    }\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n\nfn __parse_array_declarator<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<ArrayDeclarator> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            let __seq_res = {\n                let __seq_res = {\n                    let mut __repeat_pos = __pos;\n                    let mut __repeat_value = vec![];\n                    loop {\n                        let __pos = __repeat_pos;\n                        let __pos = if __repeat_value.len() > 0 {\n                            let __sep_res = __parse__(__input, __state, __pos, env);\n                            match __sep_res {\n                                Matched(__newpos, _) => __newpos,\n                                Failed => break,\n                            }\n                        } else {\n                            __pos\n                        };\n                        let __step_res = __parse_type_qualifier(__input, __state, __pos, env);\n                        match __step_res {\n                            Matched(__newpos, __value) => {\n                                __repeat_pos = __newpos;\n                                __repeat_value.push(__value);\n                            }\n                            Failed => {\n                                break;\n                            }\n                        }\n                    }\n                    Matched(__repeat_pos, __repeat_value)\n                };\n                match __seq_res {\n                    Matched(__pos, e) => Matched(__pos, { e }),\n                    Failed => Failed,\n                }\n            };\n            match __seq_res {\n                Matched(__pos, q) => {\n                    let __seq_res = __parse__(__input, __state, __pos, env);\n                    match __seq_res {\n                        Matched(__pos, _) => {\n                            let __seq_res = slice_eq(__input, __state, __pos, \"]\");\n                            match __seq_res {\n                                Matched(__pos, _) => Matched(__pos, { ArrayDeclarator { qualifiers: q, size: ArraySize::Unknown } }),\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                }\n                Failed => Failed,\n            }\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                let __choice_res = {\n                    let __seq_res = {\n                        let __seq_res = {\n                            let mut __repeat_pos = __pos;\n                            let mut __repeat_value = vec![];\n                            loop {\n                                let __pos = __repeat_pos;\n                                let __pos = if __repeat_value.len() > 0 {\n                                    let __sep_res = __parse__(__input, __state, __pos, env);\n                                    match __sep_res {\n                                        Matched(__newpos, _) => __newpos,\n                                        Failed => break,\n                                    }\n                                } else {\n                                    __pos\n                                };\n                                let __step_res = __parse_type_qualifier(__input, __state, __pos, env);\n                                match __step_res {\n                                    Matched(__newpos, __value) => {\n                                        __repeat_pos = __newpos;\n                                        __repeat_value.push(__value);\n                                    }\n                                    Failed => {\n                                        break;\n                                    }\n                                }\n                            }\n                            Matched(__repeat_pos, __repeat_value)\n                        };\n                        match __seq_res {\n                            Matched(__pos, e) => Matched(__pos, { e }),\n                            Failed => Failed,\n                        }\n                    };\n                    match __seq_res {\n                        Matched(__pos, q) => {\n                            let __seq_res = __parse__(__input, __state, __pos, env);\n                            match __seq_res {\n                                Matched(__pos, _) => {\n                                    let __seq_res = __parse_assignment_expression(__input, __state, __pos, env);\n                                    match __seq_res {\n                                        Matched(__pos, e) => {\n                                            let __seq_res = __parse__(__input, __state, __pos, env);\n                                            match __seq_res {\n                                                Matched(__pos, _) => {\n                                                    let __seq_res = slice_eq(__input, __state, __pos, \"]\");\n                                                    match __seq_res {\n                                                        Matched(__pos, _) => Matched(__pos, { ArrayDeclarator { qualifiers: q, size: ArraySize::VariableExpression(e) } }),\n                                                        Failed => Failed,\n                                                    }\n                                                }\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                };\n                match __choice_res {\n                    Matched(__pos, __value) => Matched(__pos, __value),\n                    Failed => {\n                        let __choice_res = {\n                            let __seq_res = {\n                                __state.suppress_fail += 1;\n                                let res = {\n                                    let __seq_res = slice_eq(__input, __state, __pos, \"static\");\n                                    match __seq_res {\n                                        Matched(__pos, e) => {\n                                            let __seq_res = {\n                                                __state.suppress_fail += 1;\n                                                let __assert_res = if __input.len() > __pos {\n                                                    let (__ch, __next) = char_range_at(__input, __pos);\n                                                    match __ch {\n                                                        '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                                        _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                                    }\n                                                } else {\n                                                    __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                                                };\n                                                __state.suppress_fail -= 1;\n                                                match __assert_res {\n                                                    Failed => Matched(__pos, ()),\n                                                    Matched(..) => Failed,\n                                                }\n                                            };\n                                            match __seq_res {\n                                                Matched(__pos, _) => Matched(__pos, { e }),\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                };\n                                __state.suppress_fail -= 1;\n                                res\n                            };\n                            match __seq_res {\n                                Matched(__pos, _) => {\n                                    let __seq_res = __parse__(__input, __state, __pos, env);\n                                    match __seq_res {\n                                        Matched(__pos, _) => {\n                                            let __seq_res = {\n                                                let __seq_res = {\n                                                    let mut __repeat_pos = __pos;\n                                                    let mut __repeat_value = vec![];\n                                                    loop {\n                                                        let __pos = __repeat_pos;\n                                                        let __pos = if __repeat_value.len() > 0 {\n                                                            let __sep_res = __parse__(__input, __state, __pos, env);\n                                                            match __sep_res {\n                                                                Matched(__newpos, _) => __newpos,\n                                                                Failed => break,\n                                                            }\n                                                        } else {\n                                                            __pos\n                                                        };\n                                                        let __step_res = __parse_type_qualifier(__input, __state, __pos, env);\n                                                        match __step_res {\n                                                            Matched(__newpos, __value) => {\n                                                                __repeat_pos = __newpos;\n                                                                __repeat_value.push(__value);\n                                                            }\n                                                            Failed => {\n                                                                break;\n                                                            }\n                                                        }\n                                                    }\n                                                    Matched(__repeat_pos, __repeat_value)\n                                                };\n                                                match __seq_res {\n                                                    Matched(__pos, e) => Matched(__pos, { e }),\n                                                    Failed => Failed,\n                                                }\n                                            };\n                                            match __seq_res {\n                                                Matched(__pos, q) => {\n                                                    let __seq_res = __parse__(__input, __state, __pos, env);\n                                                    match __seq_res {\n                                                        Matched(__pos, _) => {\n                                                            let __seq_res = __parse_assignment_expression(__input, __state, __pos, env);\n                                                            match __seq_res {\n                                                                Matched(__pos, e) => {\n                                                                    let __seq_res = __parse__(__input, __state, __pos, env);\n                                                                    match __seq_res {\n                                                                        Matched(__pos, _) => {\n                                                                            let __seq_res = slice_eq(__input, __state, __pos, \"]\");\n                                                                            match __seq_res {\n                                                                                Matched(__pos, _) => Matched(__pos, { ArrayDeclarator { qualifiers: q, size: ArraySize::StaticExpression(e) } }),\n                                                                                Failed => Failed,\n                                                                            }\n                                                                        }\n                                                                        Failed => Failed,\n                                                                    }\n                                                                }\n                                                                Failed => Failed,\n                                                            }\n                                                        }\n                                                        Failed => Failed,\n                                                    }\n                                                }\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        };\n                        match __choice_res {\n                            Matched(__pos, __value) => Matched(__pos, __value),\n                            Failed => {\n                                let __choice_res = {\n                                    let __seq_res = {\n                                        let __seq_res = {\n                                            let mut __repeat_pos = __pos;\n                                            let mut __repeat_value = vec![];\n                                            loop {\n                                                let __pos = __repeat_pos;\n                                                let __pos = if __repeat_value.len() > 0 {\n                                                    let __sep_res = __parse__(__input, __state, __pos, env);\n                                                    match __sep_res {\n                                                        Matched(__newpos, _) => __newpos,\n                                                        Failed => break,\n                                                    }\n                                                } else {\n                                                    __pos\n                                                };\n                                                let __step_res = __parse_type_qualifier(__input, __state, __pos, env);\n                                                match __step_res {\n                                                    Matched(__newpos, __value) => {\n                                                        __repeat_pos = __newpos;\n                                                        __repeat_value.push(__value);\n                                                    }\n                                                    Failed => {\n                                                        break;\n                                                    }\n                                                }\n                                            }\n                                            if __repeat_value.len() >= 1 {\n                                                Matched(__repeat_pos, __repeat_value)\n                                            } else {\n                                                Failed\n                                            }\n                                        };\n                                        match __seq_res {\n                                            Matched(__pos, e) => Matched(__pos, { e }),\n                                            Failed => Failed,\n                                        }\n                                    };\n                                    match __seq_res {\n                                        Matched(__pos, q) => {\n                                            let __seq_res = __parse__(__input, __state, __pos, env);\n                                            match __seq_res {\n                                                Matched(__pos, _) => {\n                                                    let __seq_res = {\n                                                        __state.suppress_fail += 1;\n                                                        let res = {\n                                                            let __seq_res = slice_eq(__input, __state, __pos, \"static\");\n                                                            match __seq_res {\n                                                                Matched(__pos, e) => {\n                                                                    let __seq_res = {\n                                                                        __state.suppress_fail += 1;\n                                                                        let __assert_res = if __input.len() > __pos {\n                                                                            let (__ch, __next) = char_range_at(__input, __pos);\n                                                                            match __ch {\n                                                                                '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                                                                _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                                                            }\n                                                                        } else {\n                                                                            __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                                                                        };\n                                                                        __state.suppress_fail -= 1;\n                                                                        match __assert_res {\n                                                                            Failed => Matched(__pos, ()),\n                                                                            Matched(..) => Failed,\n                                                                        }\n                                                                    };\n                                                                    match __seq_res {\n                                                                        Matched(__pos, _) => Matched(__pos, { e }),\n                                                                        Failed => Failed,\n                                                                    }\n                                                                }\n                                                                Failed => Failed,\n                                                            }\n                                                        };\n                                                        __state.suppress_fail -= 1;\n                                                        res\n                                                    };\n                                                    match __seq_res {\n                                                        Matched(__pos, _) => {\n                                                            let __seq_res = __parse__(__input, __state, __pos, env);\n                                                            match __seq_res {\n                                                                Matched(__pos, _) => {\n                                                                    let __seq_res = __parse_assignment_expression(__input, __state, __pos, env);\n                                                                    match __seq_res {\n                                                                        Matched(__pos, e) => {\n                                                                            let __seq_res = __parse__(__input, __state, __pos, env);\n                                                                            match __seq_res {\n                                                                                Matched(__pos, _) => {\n                                                                                    let __seq_res = slice_eq(__input, __state, __pos, \"]\");\n                                                                                    match __seq_res {\n                                                                                        Matched(__pos, _) => Matched(__pos, { ArrayDeclarator { qualifiers: q, size: ArraySize::StaticExpression(e) } }),\n                                                                                        Failed => Failed,\n                                                                                    }\n                                                                                }\n                                                                                Failed => Failed,\n                                                                            }\n                                                                        }\n                                                                        Failed => Failed,\n                                                                    }\n                                                                }\n                                                                Failed => Failed,\n                                                            }\n                                                        }\n                                                        Failed => Failed,\n                                                    }\n                                                }\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                };\n                                match __choice_res {\n                                    Matched(__pos, __value) => Matched(__pos, __value),\n                                    Failed => {\n                                        let __seq_res = {\n                                            let __seq_res = {\n                                                let mut __repeat_pos = __pos;\n                                                let mut __repeat_value = vec![];\n                                                loop {\n                                                    let __pos = __repeat_pos;\n                                                    let __pos = if __repeat_value.len() > 0 {\n                                                        let __sep_res = __parse__(__input, __state, __pos, env);\n                                                        match __sep_res {\n                                                            Matched(__newpos, _) => __newpos,\n                                                            Failed => break,\n                                                        }\n                                                    } else {\n                                                        __pos\n                                                    };\n                                                    let __step_res = __parse_type_qualifier(__input, __state, __pos, env);\n                                                    match __step_res {\n                                                        Matched(__newpos, __value) => {\n                                                            __repeat_pos = __newpos;\n                                                            __repeat_value.push(__value);\n                                                        }\n                                                        Failed => {\n                                                            break;\n                                                        }\n                                                    }\n                                                }\n                                                Matched(__repeat_pos, __repeat_value)\n                                            };\n                                            match __seq_res {\n                                                Matched(__pos, e) => Matched(__pos, { e }),\n                                                Failed => Failed,\n                                            }\n                                        };\n                                        match __seq_res {\n                                            Matched(__pos, q) => {\n                                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                                match __seq_res {\n                                                    Matched(__pos, _) => {\n                                                        let __seq_res = slice_eq(__input, __state, __pos, \"*\");\n                                                        match __seq_res {\n                                                            Matched(__pos, _) => {\n                                                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                                                match __seq_res {\n                                                                    Matched(__pos, _) => {\n                                                                        let __seq_res = slice_eq(__input, __state, __pos, \"]\");\n                                                                        match __seq_res {\n                                                                            Matched(__pos, _) => Matched(__pos, { ArrayDeclarator { qualifiers: q, size: ArraySize::VariableUnknown } }),\n                                                                            Failed => Failed,\n                                                                        }\n                                                                    }\n                                                                    Failed => Failed,\n                                                                }\n                                                            }\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n\nfn __parse_function_declarator<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<FunctionDeclarator> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = {\n            let __seq_res = {\n                let mut __repeat_pos = __pos;\n                let mut __repeat_value = vec![];\n                loop {\n                    let __pos = __repeat_pos;\n                    let __pos = if __repeat_value.len() > 0 {\n                        let __sep_res = {\n                            let __seq_res = __parse__(__input, __state, __pos, env);\n                            match __seq_res {\n                                Matched(__pos, _) => {\n                                    let __seq_res = slice_eq(__input, __state, __pos, \",\");\n                                    match __seq_res {\n                                        Matched(__pos, _) => __parse__(__input, __state, __pos, env),\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        };\n                        match __sep_res {\n                            Matched(__newpos, _) => __newpos,\n                            Failed => break,\n                        }\n                    } else {\n                        __pos\n                    };\n                    let __step_res = __parse_parameter_declaration(__input, __state, __pos, env);\n                    match __step_res {\n                        Matched(__newpos, __value) => {\n                            __repeat_pos = __newpos;\n                            __repeat_value.push(__value);\n                        }\n                        Failed => {\n                            break;\n                        }\n                    }\n                }\n                if __repeat_value.len() >= 1 {\n                    Matched(__repeat_pos, __repeat_value)\n                } else {\n                    Failed\n                }\n            };\n            match __seq_res {\n                Matched(__pos, e) => Matched(__pos, { e }),\n                Failed => Failed,\n            }\n        };\n        match __seq_res {\n            Matched(__pos, p) => {\n                let __seq_res = __parse__(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = __parse_ellipsis(__input, __state, __pos, env);\n                        match __seq_res {\n                            Matched(__pos, e) => Matched(__pos, { FunctionDeclarator { parameters: p, ellipsis: e } }),\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_pointer<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Node<DerivedDeclarator>> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = Matched(__pos, __pos);\n        match __seq_res {\n            Matched(__pos, l) => {\n                let __seq_res = __parse_pointer0(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, e) => {\n                        let __seq_res = Matched(__pos, __pos);\n                        match __seq_res {\n                            Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_pointer0<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<DerivedDeclarator> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = {\n            let str_start = __pos;\n            match {\n                let __choice_res = slice_eq(__input, __state, __pos, \"*\");\n                match __choice_res {\n                    Matched(__pos, __value) => Matched(__pos, __value),\n                    Failed => {\n                        let __seq_res = {\n                            __state.suppress_fail += 1;\n                            let __assert_res = __parse_clang_guard(__input, __state, __pos, env);\n                            __state.suppress_fail -= 1;\n                            match __assert_res {\n                                Matched(_, __value) => Matched(__pos, __value),\n                                Failed => Failed,\n                            }\n                        };\n                        match __seq_res {\n                            Matched(__pos, _) => {\n                                let __seq_res = slice_eq(__input, __state, __pos, \"^\");\n                                match __seq_res {\n                                    Matched(__pos, e) => Matched(__pos, { e }),\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    }\n                }\n            } {\n                Matched(__newpos, _) => Matched(__newpos, &__input[str_start..__newpos]),\n                Failed => Failed,\n            }\n        };\n        match __seq_res {\n            Matched(__pos, t) => {\n                let __seq_res = __parse__(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = {\n                            let __seq_res = {\n                                let mut __repeat_pos = __pos;\n                                let mut __repeat_value = vec![];\n                                loop {\n                                    let __pos = __repeat_pos;\n                                    let __pos = if __repeat_value.len() > 0 {\n                                        let __sep_res = __parse__(__input, __state, __pos, env);\n                                        match __sep_res {\n                                            Matched(__newpos, _) => __newpos,\n                                            Failed => break,\n                                        }\n                                    } else {\n                                        __pos\n                                    };\n                                    let __step_res = {\n                                        let __seq_res = Matched(__pos, __pos);\n                                        match __seq_res {\n                                            Matched(__pos, l) => {\n                                                let __seq_res = __parse_pointer_qualifier(__input, __state, __pos, env);\n                                                match __seq_res {\n                                                    Matched(__pos, e) => {\n                                                        let __seq_res = Matched(__pos, __pos);\n                                                        match __seq_res {\n                                                            Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    };\n                                    match __step_res {\n                                        Matched(__newpos, __value) => {\n                                            __repeat_pos = __newpos;\n                                            __repeat_value.push(__value);\n                                        }\n                                        Failed => {\n                                            break;\n                                        }\n                                    }\n                                }\n                                Matched(__repeat_pos, __repeat_value)\n                            };\n                            match __seq_res {\n                                Matched(__pos, e) => Matched(__pos, { e }),\n                                Failed => Failed,\n                            }\n                        };\n                        match __seq_res {\n                            Matched(__pos, q) => Matched(__pos, {\n                                if t == \"^\" {\n                                    DerivedDeclarator::Block(q)\n                                } else {\n                                    DerivedDeclarator::Pointer(q)\n                                }\n                            }),\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_pointer_qualifier<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<PointerQualifier> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            let __seq_res = __parse_type_qualifier(__input, __state, __pos, env);\n            match __seq_res {\n                Matched(__pos, q) => Matched(__pos, { PointerQualifier::TypeQualifier(q) }),\n                Failed => Failed,\n            }\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                let __seq_res = {\n                    let __seq_res = {\n                        __state.suppress_fail += 1;\n                        let __assert_res = __parse_gnu_guard(__input, __state, __pos, env);\n                        __state.suppress_fail -= 1;\n                        match __assert_res {\n                            Matched(_, __value) => Matched(__pos, __value),\n                            Failed => Failed,\n                        }\n                    };\n                    match __seq_res {\n                        Matched(__pos, _) => {\n                            let __seq_res = __parse_attribute_specifier(__input, __state, __pos, env);\n                            match __seq_res {\n                                Matched(__pos, e) => Matched(__pos, { e }),\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                };\n                match __seq_res {\n                    Matched(__pos, e) => Matched(__pos, { PointerQualifier::Extension(e) }),\n                    Failed => Failed,\n                }\n            }\n        }\n    }\n}\n\nfn __parse_ellipsis<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Ellipsis> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            let __seq_res = slice_eq(__input, __state, __pos, \",\");\n            match __seq_res {\n                Matched(__pos, _) => {\n                    let __seq_res = __parse__(__input, __state, __pos, env);\n                    match __seq_res {\n                        Matched(__pos, _) => {\n                            let __seq_res = slice_eq(__input, __state, __pos, \"...\");\n                            match __seq_res {\n                                Matched(__pos, _) => Matched(__pos, { Ellipsis::Some }),\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                }\n                Failed => Failed,\n            }\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => Matched(__pos, { Ellipsis::None }),\n        }\n    }\n}\n\nfn __parse_parameter_declaration<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Node<ParameterDeclaration>> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = Matched(__pos, __pos);\n        match __seq_res {\n            Matched(__pos, l) => {\n                let __seq_res = __parse_parameter_declaration0(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, e) => {\n                        let __seq_res = Matched(__pos, __pos);\n                        match __seq_res {\n                            Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_parameter_declaration0<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<ParameterDeclaration> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = __parse_declaration_specifiers(__input, __state, __pos, env);\n        match __seq_res {\n            Matched(__pos, s) => {\n                let __seq_res = __parse__(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = __parse_parameter_declarator(__input, __state, __pos, env);\n                        match __seq_res {\n                            Matched(__pos, d) => {\n                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                match __seq_res {\n                                    Matched(__pos, _) => {\n                                        let __seq_res = match {\n                                            let __seq_res = {\n                                                __state.suppress_fail += 1;\n                                                let __assert_res = __parse_gnu_guard(__input, __state, __pos, env);\n                                                __state.suppress_fail -= 1;\n                                                match __assert_res {\n                                                    Matched(_, __value) => Matched(__pos, __value),\n                                                    Failed => Failed,\n                                                }\n                                            };\n                                            match __seq_res {\n                                                Matched(__pos, _) => {\n                                                    let __seq_res = __parse_attribute_specifier_list(__input, __state, __pos, env);\n                                                    match __seq_res {\n                                                        Matched(__pos, e) => Matched(__pos, { e }),\n                                                        Failed => Failed,\n                                                    }\n                                                }\n                                                Failed => Failed,\n                                            }\n                                        } {\n                                            Matched(__newpos, __value) => Matched(__newpos, Some(__value)),\n                                            Failed => Matched(__pos, None),\n                                        };\n                                        match __seq_res {\n                                            Matched(__pos, a) => Matched(__pos, { ParameterDeclaration { specifiers: s, declarator: d, extensions: a.unwrap_or_default() } }),\n                                            Failed => Failed,\n                                        }\n                                    }\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_parameter_declarator<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Option<Node<Declarator>>> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            let __seq_res = __parse_declarator(__input, __state, __pos, env);\n            match __seq_res {\n                Matched(__pos, d) => Matched(__pos, {\n                    env.handle_declarator(&d, Symbol::Identifier);\n                    Some(d)\n                }),\n                Failed => Failed,\n            }\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                let __choice_res = {\n                    let __seq_res = __parse_abstract_declarator(__input, __state, __pos, env);\n                    match __seq_res {\n                        Matched(__pos, d) => Matched(__pos, { Some(d) }),\n                        Failed => Failed,\n                    }\n                };\n                match __choice_res {\n                    Matched(__pos, __value) => Matched(__pos, __value),\n                    Failed => Matched(__pos, { None }),\n                }\n            }\n        }\n    }\n}\n\nfn __parse_type_name<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Node<TypeName>> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = Matched(__pos, __pos);\n        match __seq_res {\n            Matched(__pos, l) => {\n                let __seq_res = __parse_type_name0(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, e) => {\n                        let __seq_res = Matched(__pos, __pos);\n                        match __seq_res {\n                            Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_type_name0<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<TypeName> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = __parse_specifier_qualifiers(__input, __state, __pos, env);\n        match __seq_res {\n            Matched(__pos, s) => {\n                let __seq_res = __parse__(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = match __parse_abstract_declarator(__input, __state, __pos, env) {\n                            Matched(__newpos, __value) => Matched(__newpos, Some(__value)),\n                            Failed => Matched(__pos, None),\n                        };\n                        match __seq_res {\n                            Matched(__pos, d) => Matched(__pos, { TypeName { specifiers: s, declarator: d } }),\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_abstract_declarator<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Node<Declarator>> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = Matched(__pos, __pos);\n        match __seq_res {\n            Matched(__pos, l) => {\n                let __seq_res = __parse_abstract_declarator0(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, e) => {\n                        let __seq_res = Matched(__pos, __pos);\n                        match __seq_res {\n                            Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_abstract_declarator0<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Declarator> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            let __seq_res = {\n                let __seq_res = {\n                    let mut __repeat_pos = __pos;\n                    let mut __repeat_value = vec![];\n                    loop {\n                        let __pos = __repeat_pos;\n                        let __pos = if __repeat_value.len() > 0 {\n                            let __sep_res = __parse__(__input, __state, __pos, env);\n                            match __sep_res {\n                                Matched(__newpos, _) => __newpos,\n                                Failed => break,\n                            }\n                        } else {\n                            __pos\n                        };\n                        let __step_res = __parse_pointer(__input, __state, __pos, env);\n                        match __step_res {\n                            Matched(__newpos, __value) => {\n                                __repeat_pos = __newpos;\n                                __repeat_value.push(__value);\n                            }\n                            Failed => {\n                                break;\n                            }\n                        }\n                    }\n                    Matched(__repeat_pos, __repeat_value)\n                };\n                match __seq_res {\n                    Matched(__pos, e) => Matched(__pos, { e }),\n                    Failed => Failed,\n                }\n            };\n            match __seq_res {\n                Matched(__pos, p) => {\n                    let __seq_res = __parse__(__input, __state, __pos, env);\n                    match __seq_res {\n                        Matched(__pos, _) => {\n                            let __seq_res = {\n                                let __seq_res = Matched(__pos, __pos);\n                                match __seq_res {\n                                    Matched(__pos, l) => {\n                                        let __seq_res = __parse_direct_abstract_declarator(__input, __state, __pos, env);\n                                        match __seq_res {\n                                            Matched(__pos, e) => {\n                                                let __seq_res = Matched(__pos, __pos);\n                                                match __seq_res {\n                                                    Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    }\n                                    Failed => Failed,\n                                }\n                            };\n                            match __seq_res {\n                                Matched(__pos, k) => {\n                                    let __seq_res = __parse__(__input, __state, __pos, env);\n                                    match __seq_res {\n                                        Matched(__pos, _) => {\n                                            let __seq_res = {\n                                                let __seq_res = {\n                                                    let mut __repeat_pos = __pos;\n                                                    let mut __repeat_value = vec![];\n                                                    loop {\n                                                        let __pos = __repeat_pos;\n                                                        let __pos = if __repeat_value.len() > 0 {\n                                                            let __sep_res = __parse__(__input, __state, __pos, env);\n                                                            match __sep_res {\n                                                                Matched(__newpos, _) => __newpos,\n                                                                Failed => break,\n                                                            }\n                                                        } else {\n                                                            __pos\n                                                        };\n                                                        let __step_res = __parse_derived_abstract_declarator(__input, __state, __pos, env);\n                                                        match __step_res {\n                                                            Matched(__newpos, __value) => {\n                                                                __repeat_pos = __newpos;\n                                                                __repeat_value.push(__value);\n                                                            }\n                                                            Failed => {\n                                                                break;\n                                                            }\n                                                        }\n                                                    }\n                                                    Matched(__repeat_pos, __repeat_value)\n                                                };\n                                                match __seq_res {\n                                                    Matched(__pos, e) => Matched(__pos, { e }),\n                                                    Failed => Failed,\n                                                }\n                                            };\n                                            match __seq_res {\n                                                Matched(__pos, d) => Matched(__pos, { Declarator { kind: k, derived: concat(p, d), extensions: Vec::new() } }),\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                }\n                Failed => Failed,\n            }\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                let __choice_res = {\n                    let __seq_res = {\n                        let __seq_res = {\n                            let mut __repeat_pos = __pos;\n                            let mut __repeat_value = vec![];\n                            loop {\n                                let __pos = __repeat_pos;\n                                let __pos = if __repeat_value.len() > 0 {\n                                    let __sep_res = __parse__(__input, __state, __pos, env);\n                                    match __sep_res {\n                                        Matched(__newpos, _) => __newpos,\n                                        Failed => break,\n                                    }\n                                } else {\n                                    __pos\n                                };\n                                let __step_res = __parse_pointer(__input, __state, __pos, env);\n                                match __step_res {\n                                    Matched(__newpos, __value) => {\n                                        __repeat_pos = __newpos;\n                                        __repeat_value.push(__value);\n                                    }\n                                    Failed => {\n                                        break;\n                                    }\n                                }\n                            }\n                            Matched(__repeat_pos, __repeat_value)\n                        };\n                        match __seq_res {\n                            Matched(__pos, e) => Matched(__pos, { e }),\n                            Failed => Failed,\n                        }\n                    };\n                    match __seq_res {\n                        Matched(__pos, p) => {\n                            let __seq_res = Matched(__pos, __pos);\n                            match __seq_res {\n                                Matched(__pos, k) => {\n                                    let __seq_res = __parse__(__input, __state, __pos, env);\n                                    match __seq_res {\n                                        Matched(__pos, _) => {\n                                            let __seq_res = {\n                                                let __seq_res = {\n                                                    let mut __repeat_pos = __pos;\n                                                    let mut __repeat_value = vec![];\n                                                    loop {\n                                                        let __pos = __repeat_pos;\n                                                        let __pos = if __repeat_value.len() > 0 {\n                                                            let __sep_res = __parse__(__input, __state, __pos, env);\n                                                            match __sep_res {\n                                                                Matched(__newpos, _) => __newpos,\n                                                                Failed => break,\n                                                            }\n                                                        } else {\n                                                            __pos\n                                                        };\n                                                        let __step_res = __parse_derived_abstract_declarator(__input, __state, __pos, env);\n                                                        match __step_res {\n                                                            Matched(__newpos, __value) => {\n                                                                __repeat_pos = __newpos;\n                                                                __repeat_value.push(__value);\n                                                            }\n                                                            Failed => {\n                                                                break;\n                                                            }\n                                                        }\n                                                    }\n                                                    if __repeat_value.len() >= 1 {\n                                                        Matched(__repeat_pos, __repeat_value)\n                                                    } else {\n                                                        Failed\n                                                    }\n                                                };\n                                                match __seq_res {\n                                                    Matched(__pos, e) => Matched(__pos, { e }),\n                                                    Failed => Failed,\n                                                }\n                                            };\n                                            match __seq_res {\n                                                Matched(__pos, d) => Matched(__pos, { Declarator { kind: Node::new(DeclaratorKind::Abstract, Span::span(k, k)), derived: concat(p, d), extensions: Vec::new() } }),\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                };\n                match __choice_res {\n                    Matched(__pos, __value) => Matched(__pos, __value),\n                    Failed => {\n                        let __seq_res = {\n                            let __seq_res = {\n                                let mut __repeat_pos = __pos;\n                                let mut __repeat_value = vec![];\n                                loop {\n                                    let __pos = __repeat_pos;\n                                    let __pos = if __repeat_value.len() > 0 {\n                                        let __sep_res = __parse__(__input, __state, __pos, env);\n                                        match __sep_res {\n                                            Matched(__newpos, _) => __newpos,\n                                            Failed => break,\n                                        }\n                                    } else {\n                                        __pos\n                                    };\n                                    let __step_res = __parse_pointer(__input, __state, __pos, env);\n                                    match __step_res {\n                                        Matched(__newpos, __value) => {\n                                            __repeat_pos = __newpos;\n                                            __repeat_value.push(__value);\n                                        }\n                                        Failed => {\n                                            break;\n                                        }\n                                    }\n                                }\n                                if __repeat_value.len() >= 1 {\n                                    Matched(__repeat_pos, __repeat_value)\n                                } else {\n                                    Failed\n                                }\n                            };\n                            match __seq_res {\n                                Matched(__pos, e) => Matched(__pos, { e }),\n                                Failed => Failed,\n                            }\n                        };\n                        match __seq_res {\n                            Matched(__pos, p) => {\n                                let __seq_res = Matched(__pos, __pos);\n                                match __seq_res {\n                                    Matched(__pos, k) => Matched(__pos, { Declarator { kind: Node::new(DeclaratorKind::Abstract, Span::span(k, k)), derived: p, extensions: Vec::new() } }),\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n\nfn __parse_direct_abstract_declarator<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<DeclaratorKind> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = slice_eq(__input, __state, __pos, \"(\");\n        match __seq_res {\n            Matched(__pos, _) => {\n                let __seq_res = __parse__(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = __parse_abstract_declarator(__input, __state, __pos, env);\n                        match __seq_res {\n                            Matched(__pos, d) => {\n                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                match __seq_res {\n                                    Matched(__pos, _) => {\n                                        let __seq_res = slice_eq(__input, __state, __pos, \")\");\n                                        match __seq_res {\n                                            Matched(__pos, _) => Matched(__pos, { DeclaratorKind::Declarator(Box::new(d)) }),\n                                            Failed => Failed,\n                                        }\n                                    }\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_derived_abstract_declarator<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Node<DerivedDeclarator>> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = Matched(__pos, __pos);\n        match __seq_res {\n            Matched(__pos, l) => {\n                let __seq_res = __parse_derived_abstract_declarator0(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, e) => {\n                        let __seq_res = Matched(__pos, __pos);\n                        match __seq_res {\n                            Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_derived_abstract_declarator0<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<DerivedDeclarator> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            let __seq_res = slice_eq(__input, __state, __pos, \"[\");\n            match __seq_res {\n                Matched(__pos, _) => {\n                    let __seq_res = __parse__(__input, __state, __pos, env);\n                    match __seq_res {\n                        Matched(__pos, _) => {\n                            let __seq_res = {\n                                let __seq_res = Matched(__pos, __pos);\n                                match __seq_res {\n                                    Matched(__pos, l) => {\n                                        let __seq_res = __parse_abstract_array_declarator(__input, __state, __pos, env);\n                                        match __seq_res {\n                                            Matched(__pos, e) => {\n                                                let __seq_res = Matched(__pos, __pos);\n                                                match __seq_res {\n                                                    Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    }\n                                    Failed => Failed,\n                                }\n                            };\n                            match __seq_res {\n                                Matched(__pos, a) => Matched(__pos, { DerivedDeclarator::Array(a) }),\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                }\n                Failed => Failed,\n            }\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                let __seq_res = slice_eq(__input, __state, __pos, \"(\");\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = __parse__(__input, __state, __pos, env);\n                        match __seq_res {\n                            Matched(__pos, _) => {\n                                let __seq_res = {\n                                    let __seq_res = Matched(__pos, __pos);\n                                    match __seq_res {\n                                        Matched(__pos, l) => {\n                                            let __seq_res = __parse_abstract_function_declarator(__input, __state, __pos, env);\n                                            match __seq_res {\n                                                Matched(__pos, e) => {\n                                                    let __seq_res = Matched(__pos, __pos);\n                                                    match __seq_res {\n                                                        Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                        Failed => Failed,\n                                                    }\n                                                }\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                };\n                                match __seq_res {\n                                    Matched(__pos, d) => {\n                                        let __seq_res = __parse__(__input, __state, __pos, env);\n                                        match __seq_res {\n                                            Matched(__pos, _) => {\n                                                let __seq_res = slice_eq(__input, __state, __pos, \")\");\n                                                match __seq_res {\n                                                    Matched(__pos, _) => Matched(__pos, { DerivedDeclarator::Function(d) }),\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    }\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n        }\n    }\n}\n\nfn __parse_abstract_array_declarator<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<ArrayDeclarator> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            let __seq_res = {\n                let __seq_res = {\n                    let mut __repeat_pos = __pos;\n                    let mut __repeat_value = vec![];\n                    loop {\n                        let __pos = __repeat_pos;\n                        let __pos = if __repeat_value.len() > 0 {\n                            let __sep_res = __parse__(__input, __state, __pos, env);\n                            match __sep_res {\n                                Matched(__newpos, _) => __newpos,\n                                Failed => break,\n                            }\n                        } else {\n                            __pos\n                        };\n                        let __step_res = __parse_type_qualifier(__input, __state, __pos, env);\n                        match __step_res {\n                            Matched(__newpos, __value) => {\n                                __repeat_pos = __newpos;\n                                __repeat_value.push(__value);\n                            }\n                            Failed => {\n                                break;\n                            }\n                        }\n                    }\n                    Matched(__repeat_pos, __repeat_value)\n                };\n                match __seq_res {\n                    Matched(__pos, e) => Matched(__pos, { e }),\n                    Failed => Failed,\n                }\n            };\n            match __seq_res {\n                Matched(__pos, q) => {\n                    let __seq_res = __parse__(__input, __state, __pos, env);\n                    match __seq_res {\n                        Matched(__pos, _) => {\n                            let __seq_res = slice_eq(__input, __state, __pos, \"]\");\n                            match __seq_res {\n                                Matched(__pos, _) => Matched(__pos, { ArrayDeclarator { qualifiers: q, size: ArraySize::Unknown } }),\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                }\n                Failed => Failed,\n            }\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                let __choice_res = {\n                    let __seq_res = {\n                        let __seq_res = {\n                            let mut __repeat_pos = __pos;\n                            let mut __repeat_value = vec![];\n                            loop {\n                                let __pos = __repeat_pos;\n                                let __pos = if __repeat_value.len() > 0 {\n                                    let __sep_res = __parse__(__input, __state, __pos, env);\n                                    match __sep_res {\n                                        Matched(__newpos, _) => __newpos,\n                                        Failed => break,\n                                    }\n                                } else {\n                                    __pos\n                                };\n                                let __step_res = __parse_type_qualifier(__input, __state, __pos, env);\n                                match __step_res {\n                                    Matched(__newpos, __value) => {\n                                        __repeat_pos = __newpos;\n                                        __repeat_value.push(__value);\n                                    }\n                                    Failed => {\n                                        break;\n                                    }\n                                }\n                            }\n                            Matched(__repeat_pos, __repeat_value)\n                        };\n                        match __seq_res {\n                            Matched(__pos, e) => Matched(__pos, { e }),\n                            Failed => Failed,\n                        }\n                    };\n                    match __seq_res {\n                        Matched(__pos, q) => {\n                            let __seq_res = __parse__(__input, __state, __pos, env);\n                            match __seq_res {\n                                Matched(__pos, _) => {\n                                    let __seq_res = __parse_assignment_expression(__input, __state, __pos, env);\n                                    match __seq_res {\n                                        Matched(__pos, e) => {\n                                            let __seq_res = __parse__(__input, __state, __pos, env);\n                                            match __seq_res {\n                                                Matched(__pos, _) => {\n                                                    let __seq_res = slice_eq(__input, __state, __pos, \"]\");\n                                                    match __seq_res {\n                                                        Matched(__pos, _) => Matched(__pos, { ArrayDeclarator { qualifiers: q, size: ArraySize::VariableExpression(e) } }),\n                                                        Failed => Failed,\n                                                    }\n                                                }\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                };\n                match __choice_res {\n                    Matched(__pos, __value) => Matched(__pos, __value),\n                    Failed => {\n                        let __choice_res = {\n                            let __seq_res = {\n                                __state.suppress_fail += 1;\n                                let res = {\n                                    let __seq_res = slice_eq(__input, __state, __pos, \"static\");\n                                    match __seq_res {\n                                        Matched(__pos, e) => {\n                                            let __seq_res = {\n                                                __state.suppress_fail += 1;\n                                                let __assert_res = if __input.len() > __pos {\n                                                    let (__ch, __next) = char_range_at(__input, __pos);\n                                                    match __ch {\n                                                        '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                                        _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                                    }\n                                                } else {\n                                                    __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                                                };\n                                                __state.suppress_fail -= 1;\n                                                match __assert_res {\n                                                    Failed => Matched(__pos, ()),\n                                                    Matched(..) => Failed,\n                                                }\n                                            };\n                                            match __seq_res {\n                                                Matched(__pos, _) => Matched(__pos, { e }),\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                };\n                                __state.suppress_fail -= 1;\n                                res\n                            };\n                            match __seq_res {\n                                Matched(__pos, _) => {\n                                    let __seq_res = __parse__(__input, __state, __pos, env);\n                                    match __seq_res {\n                                        Matched(__pos, _) => {\n                                            let __seq_res = {\n                                                let __seq_res = {\n                                                    let mut __repeat_pos = __pos;\n                                                    let mut __repeat_value = vec![];\n                                                    loop {\n                                                        let __pos = __repeat_pos;\n                                                        let __pos = if __repeat_value.len() > 0 {\n                                                            let __sep_res = __parse__(__input, __state, __pos, env);\n                                                            match __sep_res {\n                                                                Matched(__newpos, _) => __newpos,\n                                                                Failed => break,\n                                                            }\n                                                        } else {\n                                                            __pos\n                                                        };\n                                                        let __step_res = __parse_type_qualifier(__input, __state, __pos, env);\n                                                        match __step_res {\n                                                            Matched(__newpos, __value) => {\n                                                                __repeat_pos = __newpos;\n                                                                __repeat_value.push(__value);\n                                                            }\n                                                            Failed => {\n                                                                break;\n                                                            }\n                                                        }\n                                                    }\n                                                    Matched(__repeat_pos, __repeat_value)\n                                                };\n                                                match __seq_res {\n                                                    Matched(__pos, e) => Matched(__pos, { e }),\n                                                    Failed => Failed,\n                                                }\n                                            };\n                                            match __seq_res {\n                                                Matched(__pos, q) => {\n                                                    let __seq_res = __parse__(__input, __state, __pos, env);\n                                                    match __seq_res {\n                                                        Matched(__pos, _) => {\n                                                            let __seq_res = __parse_assignment_expression(__input, __state, __pos, env);\n                                                            match __seq_res {\n                                                                Matched(__pos, e) => {\n                                                                    let __seq_res = __parse__(__input, __state, __pos, env);\n                                                                    match __seq_res {\n                                                                        Matched(__pos, _) => {\n                                                                            let __seq_res = slice_eq(__input, __state, __pos, \"]\");\n                                                                            match __seq_res {\n                                                                                Matched(__pos, _) => Matched(__pos, { ArrayDeclarator { qualifiers: q, size: ArraySize::StaticExpression(e) } }),\n                                                                                Failed => Failed,\n                                                                            }\n                                                                        }\n                                                                        Failed => Failed,\n                                                                    }\n                                                                }\n                                                                Failed => Failed,\n                                                            }\n                                                        }\n                                                        Failed => Failed,\n                                                    }\n                                                }\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        };\n                        match __choice_res {\n                            Matched(__pos, __value) => Matched(__pos, __value),\n                            Failed => {\n                                let __choice_res = {\n                                    let __seq_res = {\n                                        let __seq_res = {\n                                            let mut __repeat_pos = __pos;\n                                            let mut __repeat_value = vec![];\n                                            loop {\n                                                let __pos = __repeat_pos;\n                                                let __pos = if __repeat_value.len() > 0 {\n                                                    let __sep_res = __parse__(__input, __state, __pos, env);\n                                                    match __sep_res {\n                                                        Matched(__newpos, _) => __newpos,\n                                                        Failed => break,\n                                                    }\n                                                } else {\n                                                    __pos\n                                                };\n                                                let __step_res = __parse_type_qualifier(__input, __state, __pos, env);\n                                                match __step_res {\n                                                    Matched(__newpos, __value) => {\n                                                        __repeat_pos = __newpos;\n                                                        __repeat_value.push(__value);\n                                                    }\n                                                    Failed => {\n                                                        break;\n                                                    }\n                                                }\n                                            }\n                                            if __repeat_value.len() >= 1 {\n                                                Matched(__repeat_pos, __repeat_value)\n                                            } else {\n                                                Failed\n                                            }\n                                        };\n                                        match __seq_res {\n                                            Matched(__pos, e) => Matched(__pos, { e }),\n                                            Failed => Failed,\n                                        }\n                                    };\n                                    match __seq_res {\n                                        Matched(__pos, q) => {\n                                            let __seq_res = __parse__(__input, __state, __pos, env);\n                                            match __seq_res {\n                                                Matched(__pos, _) => {\n                                                    let __seq_res = {\n                                                        __state.suppress_fail += 1;\n                                                        let res = {\n                                                            let __seq_res = slice_eq(__input, __state, __pos, \"static\");\n                                                            match __seq_res {\n                                                                Matched(__pos, e) => {\n                                                                    let __seq_res = {\n                                                                        __state.suppress_fail += 1;\n                                                                        let __assert_res = if __input.len() > __pos {\n                                                                            let (__ch, __next) = char_range_at(__input, __pos);\n                                                                            match __ch {\n                                                                                '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                                                                _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                                                            }\n                                                                        } else {\n                                                                            __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                                                                        };\n                                                                        __state.suppress_fail -= 1;\n                                                                        match __assert_res {\n                                                                            Failed => Matched(__pos, ()),\n                                                                            Matched(..) => Failed,\n                                                                        }\n                                                                    };\n                                                                    match __seq_res {\n                                                                        Matched(__pos, _) => Matched(__pos, { e }),\n                                                                        Failed => Failed,\n                                                                    }\n                                                                }\n                                                                Failed => Failed,\n                                                            }\n                                                        };\n                                                        __state.suppress_fail -= 1;\n                                                        res\n                                                    };\n                                                    match __seq_res {\n                                                        Matched(__pos, _) => {\n                                                            let __seq_res = __parse__(__input, __state, __pos, env);\n                                                            match __seq_res {\n                                                                Matched(__pos, _) => {\n                                                                    let __seq_res = __parse_assignment_expression(__input, __state, __pos, env);\n                                                                    match __seq_res {\n                                                                        Matched(__pos, e) => {\n                                                                            let __seq_res = __parse__(__input, __state, __pos, env);\n                                                                            match __seq_res {\n                                                                                Matched(__pos, _) => {\n                                                                                    let __seq_res = slice_eq(__input, __state, __pos, \"]\");\n                                                                                    match __seq_res {\n                                                                                        Matched(__pos, _) => Matched(__pos, { ArrayDeclarator { qualifiers: q, size: ArraySize::StaticExpression(e) } }),\n                                                                                        Failed => Failed,\n                                                                                    }\n                                                                                }\n                                                                                Failed => Failed,\n                                                                            }\n                                                                        }\n                                                                        Failed => Failed,\n                                                                    }\n                                                                }\n                                                                Failed => Failed,\n                                                            }\n                                                        }\n                                                        Failed => Failed,\n                                                    }\n                                                }\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                };\n                                match __choice_res {\n                                    Matched(__pos, __value) => Matched(__pos, __value),\n                                    Failed => {\n                                        let __seq_res = slice_eq(__input, __state, __pos, \"*\");\n                                        match __seq_res {\n                                            Matched(__pos, _) => {\n                                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                                match __seq_res {\n                                                    Matched(__pos, _) => {\n                                                        let __seq_res = slice_eq(__input, __state, __pos, \"]\");\n                                                        match __seq_res {\n                                                            Matched(__pos, _) => Matched(__pos, { ArrayDeclarator { qualifiers: Vec::new(), size: ArraySize::VariableUnknown } }),\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n\nfn __parse_abstract_function_declarator<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<FunctionDeclarator> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            let __seq_res = {\n                let __seq_res = {\n                    let mut __repeat_pos = __pos;\n                    let mut __repeat_value = vec![];\n                    loop {\n                        let __pos = __repeat_pos;\n                        let __pos = if __repeat_value.len() > 0 {\n                            let __sep_res = {\n                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                match __seq_res {\n                                    Matched(__pos, _) => {\n                                        let __seq_res = slice_eq(__input, __state, __pos, \",\");\n                                        match __seq_res {\n                                            Matched(__pos, _) => __parse__(__input, __state, __pos, env),\n                                            Failed => Failed,\n                                        }\n                                    }\n                                    Failed => Failed,\n                                }\n                            };\n                            match __sep_res {\n                                Matched(__newpos, _) => __newpos,\n                                Failed => break,\n                            }\n                        } else {\n                            __pos\n                        };\n                        let __step_res = __parse_parameter_declaration(__input, __state, __pos, env);\n                        match __step_res {\n                            Matched(__newpos, __value) => {\n                                __repeat_pos = __newpos;\n                                __repeat_value.push(__value);\n                            }\n                            Failed => {\n                                break;\n                            }\n                        }\n                    }\n                    if __repeat_value.len() >= 1 {\n                        Matched(__repeat_pos, __repeat_value)\n                    } else {\n                        Failed\n                    }\n                };\n                match __seq_res {\n                    Matched(__pos, e) => Matched(__pos, { e }),\n                    Failed => Failed,\n                }\n            };\n            match __seq_res {\n                Matched(__pos, p) => {\n                    let __seq_res = __parse__(__input, __state, __pos, env);\n                    match __seq_res {\n                        Matched(__pos, _) => {\n                            let __seq_res = __parse_ellipsis(__input, __state, __pos, env);\n                            match __seq_res {\n                                Matched(__pos, e) => Matched(__pos, { FunctionDeclarator { parameters: p, ellipsis: e } }),\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                }\n                Failed => Failed,\n            }\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => Matched(__pos, { FunctionDeclarator { parameters: Vec::new(), ellipsis: Ellipsis::None } }),\n        }\n    }\n}\n\nfn __parse_typedef_name<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Node<Identifier>> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            __state.suppress_fail += 1;\n            let res = __parse_typedef_name0(__input, __state, __pos, env);\n            __state.suppress_fail -= 1;\n            res\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                __state.mark_failure(__pos, \"<typedef_name>\");\n                Failed\n            }\n        }\n    }\n}\n\nfn __parse_typedef_name0<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Node<Identifier>> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = __parse_identifier(__input, __state, __pos, env);\n        match __seq_res {\n            Matched(__pos, i) => {\n                match {\n                    if env.is_typename(&i.node.name) {\n                        Ok(i)\n                    } else {\n                        Err(\"<unused>\")\n                    }\n                } {\n                    Ok(res) => Matched(__pos, res),\n                    Err(expected) => {\n                        __state.mark_failure(__pos, expected);\n                        Failed\n                    }\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_initializer<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Initializer> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            let __seq_res = __parse_assignment_expression(__input, __state, __pos, env);\n            match __seq_res {\n                Matched(__pos, e) => Matched(__pos, { Initializer::Expression(e) }),\n                Failed => Failed,\n            }\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                let __choice_res = {\n                    let __seq_res = slice_eq(__input, __state, __pos, \"{\");\n                    match __seq_res {\n                        Matched(__pos, _) => {\n                            let __seq_res = __parse__(__input, __state, __pos, env);\n                            match __seq_res {\n                                Matched(__pos, _) => {\n                                    let __seq_res = {\n                                        let __seq_res = {\n                                            let mut __repeat_pos = __pos;\n                                            let mut __repeat_value = vec![];\n                                            loop {\n                                                let __pos = __repeat_pos;\n                                                let __pos = if __repeat_value.len() > 0 {\n                                                    let __sep_res = {\n                                                        let __seq_res = __parse__(__input, __state, __pos, env);\n                                                        match __seq_res {\n                                                            Matched(__pos, _) => {\n                                                                let __seq_res = slice_eq(__input, __state, __pos, \",\");\n                                                                match __seq_res {\n                                                                    Matched(__pos, _) => __parse__(__input, __state, __pos, env),\n                                                                    Failed => Failed,\n                                                                }\n                                                            }\n                                                            Failed => Failed,\n                                                        }\n                                                    };\n                                                    match __sep_res {\n                                                        Matched(__newpos, _) => __newpos,\n                                                        Failed => break,\n                                                    }\n                                                } else {\n                                                    __pos\n                                                };\n                                                let __step_res = {\n                                                    let __seq_res = Matched(__pos, __pos);\n                                                    match __seq_res {\n                                                        Matched(__pos, l) => {\n                                                            let __seq_res = __parse_initializer_list_item(__input, __state, __pos, env);\n                                                            match __seq_res {\n                                                                Matched(__pos, e) => {\n                                                                    let __seq_res = Matched(__pos, __pos);\n                                                                    match __seq_res {\n                                                                        Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                                        Failed => Failed,\n                                                                    }\n                                                                }\n                                                                Failed => Failed,\n                                                            }\n                                                        }\n                                                        Failed => Failed,\n                                                    }\n                                                };\n                                                match __step_res {\n                                                    Matched(__newpos, __value) => {\n                                                        __repeat_pos = __newpos;\n                                                        __repeat_value.push(__value);\n                                                    }\n                                                    Failed => {\n                                                        break;\n                                                    }\n                                                }\n                                            }\n                                            if __repeat_value.len() >= 1 {\n                                                Matched(__repeat_pos, __repeat_value)\n                                            } else {\n                                                Failed\n                                            }\n                                        };\n                                        match __seq_res {\n                                            Matched(__pos, e) => Matched(__pos, { e }),\n                                            Failed => Failed,\n                                        }\n                                    };\n                                    match __seq_res {\n                                        Matched(__pos, i) => {\n                                            let __seq_res = __parse__(__input, __state, __pos, env);\n                                            match __seq_res {\n                                                Matched(__pos, _) => {\n                                                    let __seq_res = match slice_eq(__input, __state, __pos, \",\") {\n                                                        Matched(__newpos, _) => Matched(__newpos, ()),\n                                                        Failed => Matched(__pos, ()),\n                                                    };\n                                                    match __seq_res {\n                                                        Matched(__pos, _) => {\n                                                            let __seq_res = __parse__(__input, __state, __pos, env);\n                                                            match __seq_res {\n                                                                Matched(__pos, _) => {\n                                                                    let __seq_res = slice_eq(__input, __state, __pos, \"}\");\n                                                                    match __seq_res {\n                                                                        Matched(__pos, _) => Matched(__pos, { Initializer::List(i) }),\n                                                                        Failed => Failed,\n                                                                    }\n                                                                }\n                                                                Failed => Failed,\n                                                            }\n                                                        }\n                                                        Failed => Failed,\n                                                    }\n                                                }\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                };\n                match __choice_res {\n                    Matched(__pos, __value) => Matched(__pos, __value),\n                    Failed => {\n                        let __seq_res = {\n                            let __seq_res = {\n                                __state.suppress_fail += 1;\n                                let __assert_res = __parse_gnu_guard(__input, __state, __pos, env);\n                                __state.suppress_fail -= 1;\n                                match __assert_res {\n                                    Matched(_, __value) => Matched(__pos, __value),\n                                    Failed => Failed,\n                                }\n                            };\n                            match __seq_res {\n                                Matched(__pos, _) => {\n                                    let __seq_res = {\n                                        let __seq_res = slice_eq(__input, __state, __pos, \"{\");\n                                        match __seq_res {\n                                            Matched(__pos, _) => {\n                                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                                match __seq_res {\n                                                    Matched(__pos, _) => slice_eq(__input, __state, __pos, \"}\"),\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    };\n                                    match __seq_res {\n                                        Matched(__pos, e) => Matched(__pos, { e }),\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        };\n                        match __seq_res {\n                            Matched(__pos, _) => Matched(__pos, { Initializer::List(Vec::new()) }),\n                            Failed => Failed,\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n\nfn __parse_initializer_list_item<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<InitializerListItem> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = match __parse_designation(__input, __state, __pos, env) {\n            Matched(__newpos, __value) => Matched(__newpos, Some(__value)),\n            Failed => Matched(__pos, None),\n        };\n        match __seq_res {\n            Matched(__pos, d) => {\n                let __seq_res = __parse__(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = {\n                            let __seq_res = Matched(__pos, __pos);\n                            match __seq_res {\n                                Matched(__pos, l) => {\n                                    let __seq_res = __parse_initializer(__input, __state, __pos, env);\n                                    match __seq_res {\n                                        Matched(__pos, e) => {\n                                            let __seq_res = Matched(__pos, __pos);\n                                            match __seq_res {\n                                                Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        };\n                        match __seq_res {\n                            Matched(__pos, i) => Matched(__pos, { InitializerListItem { designation: d.unwrap_or_default(), initializer: Box::new(i) } }),\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_designation<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Vec<Node<Designator>>> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            let __seq_res = {\n                let __seq_res = {\n                    let mut __repeat_pos = __pos;\n                    let mut __repeat_value = vec![];\n                    loop {\n                        let __pos = __repeat_pos;\n                        let __pos = if __repeat_value.len() > 0 {\n                            let __sep_res = __parse__(__input, __state, __pos, env);\n                            match __sep_res {\n                                Matched(__newpos, _) => __newpos,\n                                Failed => break,\n                            }\n                        } else {\n                            __pos\n                        };\n                        let __step_res = {\n                            let __seq_res = Matched(__pos, __pos);\n                            match __seq_res {\n                                Matched(__pos, l) => {\n                                    let __seq_res = __parse_designator(__input, __state, __pos, env);\n                                    match __seq_res {\n                                        Matched(__pos, e) => {\n                                            let __seq_res = Matched(__pos, __pos);\n                                            match __seq_res {\n                                                Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        };\n                        match __step_res {\n                            Matched(__newpos, __value) => {\n                                __repeat_pos = __newpos;\n                                __repeat_value.push(__value);\n                            }\n                            Failed => {\n                                break;\n                            }\n                        }\n                    }\n                    if __repeat_value.len() >= 1 {\n                        Matched(__repeat_pos, __repeat_value)\n                    } else {\n                        Failed\n                    }\n                };\n                match __seq_res {\n                    Matched(__pos, e) => Matched(__pos, { e }),\n                    Failed => Failed,\n                }\n            };\n            match __seq_res {\n                Matched(__pos, d) => {\n                    let __seq_res = __parse__(__input, __state, __pos, env);\n                    match __seq_res {\n                        Matched(__pos, _) => {\n                            let __seq_res = slice_eq(__input, __state, __pos, \"=\");\n                            match __seq_res {\n                                Matched(__pos, _) => Matched(__pos, { d }),\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                }\n                Failed => Failed,\n            }\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                let __choice_res = {\n                    let __seq_res = {\n                        let __seq_res = {\n                            __state.suppress_fail += 1;\n                            let __assert_res = __parse_gnu_guard(__input, __state, __pos, env);\n                            __state.suppress_fail -= 1;\n                            match __assert_res {\n                                Matched(_, __value) => Matched(__pos, __value),\n                                Failed => Failed,\n                            }\n                        };\n                        match __seq_res {\n                            Matched(__pos, _) => {\n                                let __seq_res = {\n                                    let __seq_res = Matched(__pos, __pos);\n                                    match __seq_res {\n                                        Matched(__pos, l) => {\n                                            let __seq_res = __parse_colon_designation(__input, __state, __pos, env);\n                                            match __seq_res {\n                                                Matched(__pos, e) => {\n                                                    let __seq_res = Matched(__pos, __pos);\n                                                    match __seq_res {\n                                                        Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                        Failed => Failed,\n                                                    }\n                                                }\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                };\n                                match __seq_res {\n                                    Matched(__pos, e) => Matched(__pos, { e }),\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    };\n                    match __seq_res {\n                        Matched(__pos, d) => Matched(__pos, { vec![d] }),\n                        Failed => Failed,\n                    }\n                };\n                match __choice_res {\n                    Matched(__pos, __value) => Matched(__pos, __value),\n                    Failed => {\n                        let __seq_res = {\n                            let __seq_res = {\n                                __state.suppress_fail += 1;\n                                let __assert_res = __parse_gnu_guard(__input, __state, __pos, env);\n                                __state.suppress_fail -= 1;\n                                match __assert_res {\n                                    Matched(_, __value) => Matched(__pos, __value),\n                                    Failed => Failed,\n                                }\n                            };\n                            match __seq_res {\n                                Matched(__pos, _) => {\n                                    let __seq_res = {\n                                        let __seq_res = Matched(__pos, __pos);\n                                        match __seq_res {\n                                            Matched(__pos, l) => {\n                                                let __seq_res = __parse_array_designator(__input, __state, __pos, env);\n                                                match __seq_res {\n                                                    Matched(__pos, e) => {\n                                                        let __seq_res = Matched(__pos, __pos);\n                                                        match __seq_res {\n                                                            Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    };\n                                    match __seq_res {\n                                        Matched(__pos, e) => Matched(__pos, { e }),\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        };\n                        match __seq_res {\n                            Matched(__pos, d) => Matched(__pos, { vec![d] }),\n                            Failed => Failed,\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n\nfn __parse_colon_designation<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Designator> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = __parse_identifier(__input, __state, __pos, env);\n        match __seq_res {\n            Matched(__pos, i) => {\n                let __seq_res = __parse__(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = slice_eq(__input, __state, __pos, \":\");\n                        match __seq_res {\n                            Matched(__pos, _) => Matched(__pos, { Designator::Member(i) }),\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_designator<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Designator> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            let __seq_res = __parse_array_designator(__input, __state, __pos, env);\n            match __seq_res {\n                Matched(__pos, d) => Matched(__pos, { d }),\n                Failed => Failed,\n            }\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                let __seq_res = slice_eq(__input, __state, __pos, \".\");\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = __parse__(__input, __state, __pos, env);\n                        match __seq_res {\n                            Matched(__pos, _) => {\n                                let __seq_res = __parse_identifier(__input, __state, __pos, env);\n                                match __seq_res {\n                                    Matched(__pos, i) => Matched(__pos, { Designator::Member(i) }),\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n        }\n    }\n}\n\nfn __parse_array_designator<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Designator> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = slice_eq(__input, __state, __pos, \"[\");\n        match __seq_res {\n            Matched(__pos, _) => {\n                let __seq_res = __parse__(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = {\n                            let __seq_res = Matched(__pos, __pos);\n                            match __seq_res {\n                                Matched(__pos, l) => {\n                                    let __seq_res = __parse_constant_expression0(__input, __state, __pos, env);\n                                    match __seq_res {\n                                        Matched(__pos, e) => {\n                                            let __seq_res = Matched(__pos, __pos);\n                                            match __seq_res {\n                                                Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        };\n                        match __seq_res {\n                            Matched(__pos, a) => {\n                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                match __seq_res {\n                                    Matched(__pos, _) => {\n                                        let __seq_res = match {\n                                            let __seq_res = {\n                                                __state.suppress_fail += 1;\n                                                let __assert_res = __parse_gnu_guard(__input, __state, __pos, env);\n                                                __state.suppress_fail -= 1;\n                                                match __assert_res {\n                                                    Matched(_, __value) => Matched(__pos, __value),\n                                                    Failed => Failed,\n                                                }\n                                            };\n                                            match __seq_res {\n                                                Matched(__pos, _) => {\n                                                    let __seq_res = __parse_range_suffix(__input, __state, __pos, env);\n                                                    match __seq_res {\n                                                        Matched(__pos, e) => Matched(__pos, { e }),\n                                                        Failed => Failed,\n                                                    }\n                                                }\n                                                Failed => Failed,\n                                            }\n                                        } {\n                                            Matched(__newpos, __value) => Matched(__newpos, Some(__value)),\n                                            Failed => Matched(__pos, None),\n                                        };\n                                        match __seq_res {\n                                            Matched(__pos, b) => {\n                                                let __seq_res = slice_eq(__input, __state, __pos, \"]\");\n                                                match __seq_res {\n                                                    Matched(__pos, _) => Matched(__pos, {\n                                                        match b {\n                                                            Some(b) => {\n                                                                let span = Span::span(a.span.start, b.span.end);\n                                                                Designator::Range(Node::new(RangeDesignator { from: a, to: b }, span))\n                                                            }\n                                                            None => Designator::Index(a),\n                                                        }\n                                                    }),\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    }\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_range_suffix<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Node<Expression>> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = slice_eq(__input, __state, __pos, \"...\");\n        match __seq_res {\n            Matched(__pos, _) => {\n                let __seq_res = __parse__(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = {\n                            let __seq_res = Matched(__pos, __pos);\n                            match __seq_res {\n                                Matched(__pos, l) => {\n                                    let __seq_res = __parse_constant_expression0(__input, __state, __pos, env);\n                                    match __seq_res {\n                                        Matched(__pos, e) => {\n                                            let __seq_res = Matched(__pos, __pos);\n                                            match __seq_res {\n                                                Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        };\n                        match __seq_res {\n                            Matched(__pos, e) => Matched(__pos, { e }),\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_static_assert<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Node<StaticAssert>> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = Matched(__pos, __pos);\n        match __seq_res {\n            Matched(__pos, l) => {\n                let __seq_res = __parse_static_assert0(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, e) => {\n                        let __seq_res = Matched(__pos, __pos);\n                        match __seq_res {\n                            Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_static_assert0<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<StaticAssert> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = match {\n            let __seq_res = {\n                __state.suppress_fail += 1;\n                let __assert_res = __parse_gnu_guard(__input, __state, __pos, env);\n                __state.suppress_fail -= 1;\n                match __assert_res {\n                    Matched(_, __value) => Matched(__pos, __value),\n                    Failed => Failed,\n                }\n            };\n            match __seq_res {\n                Matched(__pos, _) => {\n                    let __seq_res = {\n                        __state.suppress_fail += 1;\n                        let res = {\n                            let __seq_res = slice_eq(__input, __state, __pos, \"__extension__\");\n                            match __seq_res {\n                                Matched(__pos, e) => {\n                                    let __seq_res = {\n                                        __state.suppress_fail += 1;\n                                        let __assert_res = if __input.len() > __pos {\n                                            let (__ch, __next) = char_range_at(__input, __pos);\n                                            match __ch {\n                                                '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                                _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                            }\n                                        } else {\n                                            __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                                        };\n                                        __state.suppress_fail -= 1;\n                                        match __assert_res {\n                                            Failed => Matched(__pos, ()),\n                                            Matched(..) => Failed,\n                                        }\n                                    };\n                                    match __seq_res {\n                                        Matched(__pos, _) => Matched(__pos, { e }),\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        };\n                        __state.suppress_fail -= 1;\n                        res\n                    };\n                    match __seq_res {\n                        Matched(__pos, e) => Matched(__pos, { e }),\n                        Failed => Failed,\n                    }\n                }\n                Failed => Failed,\n            }\n        } {\n            Matched(__newpos, _) => Matched(__newpos, ()),\n            Failed => Matched(__pos, ()),\n        };\n        match __seq_res {\n            Matched(__pos, _) => {\n                let __seq_res = __parse__(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = {\n                            __state.suppress_fail += 1;\n                            let res = {\n                                let __seq_res = slice_eq(__input, __state, __pos, \"_Static_assert\");\n                                match __seq_res {\n                                    Matched(__pos, e) => {\n                                        let __seq_res = {\n                                            __state.suppress_fail += 1;\n                                            let __assert_res = if __input.len() > __pos {\n                                                let (__ch, __next) = char_range_at(__input, __pos);\n                                                match __ch {\n                                                    '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                                    _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                                }\n                                            } else {\n                                                __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                                            };\n                                            __state.suppress_fail -= 1;\n                                            match __assert_res {\n                                                Failed => Matched(__pos, ()),\n                                                Matched(..) => Failed,\n                                            }\n                                        };\n                                        match __seq_res {\n                                            Matched(__pos, _) => Matched(__pos, { e }),\n                                            Failed => Failed,\n                                        }\n                                    }\n                                    Failed => Failed,\n                                }\n                            };\n                            __state.suppress_fail -= 1;\n                            res\n                        };\n                        match __seq_res {\n                            Matched(__pos, _) => {\n                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                match __seq_res {\n                                    Matched(__pos, _) => {\n                                        let __seq_res = slice_eq(__input, __state, __pos, \"(\");\n                                        match __seq_res {\n                                            Matched(__pos, _) => {\n                                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                                match __seq_res {\n                                                    Matched(__pos, _) => {\n                                                        let __seq_res = __parse_constant_expression(__input, __state, __pos, env);\n                                                        match __seq_res {\n                                                            Matched(__pos, e) => {\n                                                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                                                match __seq_res {\n                                                                    Matched(__pos, _) => {\n                                                                        let __seq_res = slice_eq(__input, __state, __pos, \",\");\n                                                                        match __seq_res {\n                                                                            Matched(__pos, _) => {\n                                                                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                                                                match __seq_res {\n                                                                                    Matched(__pos, _) => {\n                                                                                        let __seq_res = __parse_string_literal(__input, __state, __pos, env);\n                                                                                        match __seq_res {\n                                                                                            Matched(__pos, s) => {\n                                                                                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                                                                                match __seq_res {\n                                                                                                    Matched(__pos, _) => {\n                                                                                                        let __seq_res = slice_eq(__input, __state, __pos, \")\");\n                                                                                                        match __seq_res {\n                                                                                                            Matched(__pos, _) => {\n                                                                                                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                                                                                                match __seq_res {\n                                                                                                                    Matched(__pos, _) => {\n                                                                                                                        let __seq_res = slice_eq(__input, __state, __pos, \";\");\n                                                                                                                        match __seq_res {\n                                                                                                                            Matched(__pos, _) => Matched(__pos, { StaticAssert { expression: e, message: s } }),\n                                                                                                                            Failed => Failed,\n                                                                                                                        }\n                                                                                                                    }\n                                                                                                                    Failed => Failed,\n                                                                                                                }\n                                                                                                            }\n                                                                                                            Failed => Failed,\n                                                                                                        }\n                                                                                                    }\n                                                                                                    Failed => Failed,\n                                                                                                }\n                                                                                            }\n                                                                                            Failed => Failed,\n                                                                                        }\n                                                                                    }\n                                                                                    Failed => Failed,\n                                                                                }\n                                                                            }\n                                                                            Failed => Failed,\n                                                                        }\n                                                                    }\n                                                                    Failed => Failed,\n                                                                }\n                                                            }\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    }\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_statement<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Box<Node<Statement>>> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = {\n            let __seq_res = Matched(__pos, __pos);\n            match __seq_res {\n                Matched(__pos, l) => {\n                    let __seq_res = __parse_statement0(__input, __state, __pos, env);\n                    match __seq_res {\n                        Matched(__pos, e) => {\n                            let __seq_res = Matched(__pos, __pos);\n                            match __seq_res {\n                                Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                }\n                Failed => Failed,\n            }\n        };\n        match __seq_res {\n            Matched(__pos, e) => Matched(__pos, { Box::new(e) }),\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_statement0<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Statement> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            let __seq_res = {\n                let __seq_res = Matched(__pos, __pos);\n                match __seq_res {\n                    Matched(__pos, l) => {\n                        let __seq_res = __parse_labeled_statement(__input, __state, __pos, env);\n                        match __seq_res {\n                            Matched(__pos, e) => {\n                                let __seq_res = Matched(__pos, __pos);\n                                match __seq_res {\n                                    Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            };\n            match __seq_res {\n                Matched(__pos, s) => Matched(__pos, { Statement::Labeled(s) }),\n                Failed => Failed,\n            }\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                let __choice_res = {\n                    let __seq_res = Matched(__pos, {\n                        env.enter_scope();\n                    });\n                    match __seq_res {\n                        Matched(__pos, _) => {\n                            let __seq_res = match __parse_compound_statement(__input, __state, __pos, env) {\n                                Matched(__newpos, __value) => Matched(__newpos, Some(__value)),\n                                Failed => Matched(__pos, None),\n                            };\n                            match __seq_res {\n                                Matched(__pos, e) => {\n                                    match {\n                                        env.leave_scope();\n                                        e.ok_or(\"\")\n                                    } {\n                                        Ok(res) => Matched(__pos, res),\n                                        Err(expected) => {\n                                            __state.mark_failure(__pos, expected);\n                                            Failed\n                                        }\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                };\n                match __choice_res {\n                    Matched(__pos, __value) => Matched(__pos, __value),\n                    Failed => {\n                        let __choice_res = __parse_expression_statement(__input, __state, __pos, env);\n                        match __choice_res {\n                            Matched(__pos, __value) => Matched(__pos, __value),\n                            Failed => {\n                                let __choice_res = {\n                                    let __seq_res = Matched(__pos, {\n                                        env.enter_scope();\n                                    });\n                                    match __seq_res {\n                                        Matched(__pos, _) => {\n                                            let __seq_res = match __parse_selection_statement(__input, __state, __pos, env) {\n                                                Matched(__newpos, __value) => Matched(__newpos, Some(__value)),\n                                                Failed => Matched(__pos, None),\n                                            };\n                                            match __seq_res {\n                                                Matched(__pos, e) => {\n                                                    match {\n                                                        env.leave_scope();\n                                                        e.ok_or(\"\")\n                                                    } {\n                                                        Ok(res) => Matched(__pos, res),\n                                                        Err(expected) => {\n                                                            __state.mark_failure(__pos, expected);\n                                                            Failed\n                                                        }\n                                                    }\n                                                }\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                };\n                                match __choice_res {\n                                    Matched(__pos, __value) => Matched(__pos, __value),\n                                    Failed => {\n                                        let __choice_res = {\n                                            let __seq_res = Matched(__pos, {\n                                                env.enter_scope();\n                                            });\n                                            match __seq_res {\n                                                Matched(__pos, _) => {\n                                                    let __seq_res = match __parse_iteration_statement(__input, __state, __pos, env) {\n                                                        Matched(__newpos, __value) => Matched(__newpos, Some(__value)),\n                                                        Failed => Matched(__pos, None),\n                                                    };\n                                                    match __seq_res {\n                                                        Matched(__pos, e) => {\n                                                            match {\n                                                                env.leave_scope();\n                                                                e.ok_or(\"\")\n                                                            } {\n                                                                Ok(res) => Matched(__pos, res),\n                                                                Err(expected) => {\n                                                                    __state.mark_failure(__pos, expected);\n                                                                    Failed\n                                                                }\n                                                            }\n                                                        }\n                                                        Failed => Failed,\n                                                    }\n                                                }\n                                                Failed => Failed,\n                                            }\n                                        };\n                                        match __choice_res {\n                                            Matched(__pos, __value) => Matched(__pos, __value),\n                                            Failed => {\n                                                let __choice_res = __parse_jump_statement(__input, __state, __pos, env);\n                                                match __choice_res {\n                                                    Matched(__pos, __value) => Matched(__pos, __value),\n                                                    Failed => {\n                                                        let __seq_res = {\n                                                            __state.suppress_fail += 1;\n                                                            let __assert_res = __parse_gnu_guard(__input, __state, __pos, env);\n                                                            __state.suppress_fail -= 1;\n                                                            match __assert_res {\n                                                                Matched(_, __value) => Matched(__pos, __value),\n                                                                Failed => Failed,\n                                                            }\n                                                        };\n                                                        match __seq_res {\n                                                            Matched(__pos, _) => {\n                                                                let __seq_res = __parse_asm_statement(__input, __state, __pos, env);\n                                                                match __seq_res {\n                                                                    Matched(__pos, e) => Matched(__pos, { e }),\n                                                                    Failed => Failed,\n                                                                }\n                                                            }\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                }\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n\nfn __parse_labeled_statement<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<LabeledStatement> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = {\n            let __seq_res = Matched(__pos, __pos);\n            match __seq_res {\n                Matched(__pos, l) => {\n                    let __seq_res = __parse_label(__input, __state, __pos, env);\n                    match __seq_res {\n                        Matched(__pos, e) => {\n                            let __seq_res = Matched(__pos, __pos);\n                            match __seq_res {\n                                Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                }\n                Failed => Failed,\n            }\n        };\n        match __seq_res {\n            Matched(__pos, l) => {\n                let __seq_res = __parse__(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = slice_eq(__input, __state, __pos, \":\");\n                        match __seq_res {\n                            Matched(__pos, _) => {\n                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                match __seq_res {\n                                    Matched(__pos, _) => {\n                                        let __seq_res = __parse_statement(__input, __state, __pos, env);\n                                        match __seq_res {\n                                            Matched(__pos, s) => Matched(__pos, { LabeledStatement { label: l, statement: s } }),\n                                            Failed => Failed,\n                                        }\n                                    }\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_label<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Label> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            let __seq_res = __parse_identifier(__input, __state, __pos, env);\n            match __seq_res {\n                Matched(__pos, i) => Matched(__pos, { Label::Identifier(i) }),\n                Failed => Failed,\n            }\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                let __choice_res = {\n                    let __seq_res = {\n                        __state.suppress_fail += 1;\n                        let res = {\n                            let __seq_res = slice_eq(__input, __state, __pos, \"case\");\n                            match __seq_res {\n                                Matched(__pos, e) => {\n                                    let __seq_res = {\n                                        __state.suppress_fail += 1;\n                                        let __assert_res = if __input.len() > __pos {\n                                            let (__ch, __next) = char_range_at(__input, __pos);\n                                            match __ch {\n                                                '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                                _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                            }\n                                        } else {\n                                            __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                                        };\n                                        __state.suppress_fail -= 1;\n                                        match __assert_res {\n                                            Failed => Matched(__pos, ()),\n                                            Matched(..) => Failed,\n                                        }\n                                    };\n                                    match __seq_res {\n                                        Matched(__pos, _) => Matched(__pos, { e }),\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        };\n                        __state.suppress_fail -= 1;\n                        res\n                    };\n                    match __seq_res {\n                        Matched(__pos, _) => {\n                            let __seq_res = __parse__(__input, __state, __pos, env);\n                            match __seq_res {\n                                Matched(__pos, _) => {\n                                    let __seq_res = __parse_constant_expression(__input, __state, __pos, env);\n                                    match __seq_res {\n                                        Matched(__pos, a) => {\n                                            let __seq_res = __parse__(__input, __state, __pos, env);\n                                            match __seq_res {\n                                                Matched(__pos, _) => {\n                                                    let __seq_res = match {\n                                                        let __seq_res = {\n                                                            __state.suppress_fail += 1;\n                                                            let __assert_res = __parse_gnu_guard(__input, __state, __pos, env);\n                                                            __state.suppress_fail -= 1;\n                                                            match __assert_res {\n                                                                Matched(_, __value) => Matched(__pos, __value),\n                                                                Failed => Failed,\n                                                            }\n                                                        };\n                                                        match __seq_res {\n                                                            Matched(__pos, _) => {\n                                                                let __seq_res = __parse_range_suffix(__input, __state, __pos, env);\n                                                                match __seq_res {\n                                                                    Matched(__pos, e) => Matched(__pos, { e }),\n                                                                    Failed => Failed,\n                                                                }\n                                                            }\n                                                            Failed => Failed,\n                                                        }\n                                                    } {\n                                                        Matched(__newpos, __value) => Matched(__newpos, Some(__value)),\n                                                        Failed => Matched(__pos, None),\n                                                    };\n                                                    match __seq_res {\n                                                        Matched(__pos, b) => Matched(__pos, {\n                                                            match b {\n                                                                Some(b) => {\n                                                                    let span = Span::span(a.span.start, b.span.end);\n                                                                    Label::CaseRange(Node::new(CaseRange { low: a, high: Box::new(b) }, span))\n                                                                }\n                                                                None => Label::Case(a),\n                                                            }\n                                                        }),\n                                                        Failed => Failed,\n                                                    }\n                                                }\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                };\n                match __choice_res {\n                    Matched(__pos, __value) => Matched(__pos, __value),\n                    Failed => {\n                        let __seq_res = {\n                            __state.suppress_fail += 1;\n                            let res = {\n                                let __seq_res = slice_eq(__input, __state, __pos, \"default\");\n                                match __seq_res {\n                                    Matched(__pos, e) => {\n                                        let __seq_res = {\n                                            __state.suppress_fail += 1;\n                                            let __assert_res = if __input.len() > __pos {\n                                                let (__ch, __next) = char_range_at(__input, __pos);\n                                                match __ch {\n                                                    '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                                    _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                                }\n                                            } else {\n                                                __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                                            };\n                                            __state.suppress_fail -= 1;\n                                            match __assert_res {\n                                                Failed => Matched(__pos, ()),\n                                                Matched(..) => Failed,\n                                            }\n                                        };\n                                        match __seq_res {\n                                            Matched(__pos, _) => Matched(__pos, { e }),\n                                            Failed => Failed,\n                                        }\n                                    }\n                                    Failed => Failed,\n                                }\n                            };\n                            __state.suppress_fail -= 1;\n                            res\n                        };\n                        match __seq_res {\n                            Matched(__pos, _) => Matched(__pos, { Label::Default }),\n                            Failed => Failed,\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n\nfn __parse_compound_statement<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Statement> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = slice_eq(__input, __state, __pos, \"{\");\n        match __seq_res {\n            Matched(__pos, _) => {\n                let __seq_res = __parse__(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = {\n                            let __seq_res = {\n                                let mut __repeat_pos = __pos;\n                                let mut __repeat_value = vec![];\n                                loop {\n                                    let __pos = __repeat_pos;\n                                    let __pos = if __repeat_value.len() > 0 {\n                                        let __sep_res = __parse__(__input, __state, __pos, env);\n                                        match __sep_res {\n                                            Matched(__newpos, _) => __newpos,\n                                            Failed => break,\n                                        }\n                                    } else {\n                                        __pos\n                                    };\n                                    let __step_res = {\n                                        let __seq_res = Matched(__pos, __pos);\n                                        match __seq_res {\n                                            Matched(__pos, l) => {\n                                                let __seq_res = __parse_block_item(__input, __state, __pos, env);\n                                                match __seq_res {\n                                                    Matched(__pos, e) => {\n                                                        let __seq_res = Matched(__pos, __pos);\n                                                        match __seq_res {\n                                                            Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    };\n                                    match __step_res {\n                                        Matched(__newpos, __value) => {\n                                            __repeat_pos = __newpos;\n                                            __repeat_value.push(__value);\n                                        }\n                                        Failed => {\n                                            break;\n                                        }\n                                    }\n                                }\n                                Matched(__repeat_pos, __repeat_value)\n                            };\n                            match __seq_res {\n                                Matched(__pos, e) => Matched(__pos, { e }),\n                                Failed => Failed,\n                            }\n                        };\n                        match __seq_res {\n                            Matched(__pos, b) => {\n                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                match __seq_res {\n                                    Matched(__pos, _) => {\n                                        let __seq_res = slice_eq(__input, __state, __pos, \"}\");\n                                        match __seq_res {\n                                            Matched(__pos, _) => Matched(__pos, { Statement::Compound(b) }),\n                                            Failed => Failed,\n                                        }\n                                    }\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_block_item<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<BlockItem> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            let __seq_res = __parse_declaration(__input, __state, __pos, env);\n            match __seq_res {\n                Matched(__pos, d) => Matched(__pos, { BlockItem::Declaration(d) }),\n                Failed => Failed,\n            }\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                let __choice_res = {\n                    let __seq_res = __parse_static_assert(__input, __state, __pos, env);\n                    match __seq_res {\n                        Matched(__pos, s) => Matched(__pos, { BlockItem::StaticAssert(s) }),\n                        Failed => Failed,\n                    }\n                };\n                match __choice_res {\n                    Matched(__pos, __value) => Matched(__pos, __value),\n                    Failed => {\n                        let __seq_res = {\n                            let __seq_res = Matched(__pos, __pos);\n                            match __seq_res {\n                                Matched(__pos, l) => {\n                                    let __seq_res = __parse_statement0(__input, __state, __pos, env);\n                                    match __seq_res {\n                                        Matched(__pos, e) => {\n                                            let __seq_res = Matched(__pos, __pos);\n                                            match __seq_res {\n                                                Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        };\n                        match __seq_res {\n                            Matched(__pos, s) => Matched(__pos, { BlockItem::Statement(s) }),\n                            Failed => Failed,\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n\nfn __parse_expression_statement<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Statement> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = match __parse_expression(__input, __state, __pos, env) {\n            Matched(__newpos, __value) => Matched(__newpos, Some(__value)),\n            Failed => Matched(__pos, None),\n        };\n        match __seq_res {\n            Matched(__pos, e) => {\n                let __seq_res = __parse__(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = slice_eq(__input, __state, __pos, \";\");\n                        match __seq_res {\n                            Matched(__pos, _) => Matched(__pos, { Statement::Expression(e) }),\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_selection_statement<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Statement> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            let __seq_res = {\n                let __seq_res = Matched(__pos, __pos);\n                match __seq_res {\n                    Matched(__pos, l) => {\n                        let __seq_res = __parse_if_statement(__input, __state, __pos, env);\n                        match __seq_res {\n                            Matched(__pos, e) => {\n                                let __seq_res = Matched(__pos, __pos);\n                                match __seq_res {\n                                    Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            };\n            match __seq_res {\n                Matched(__pos, s) => Matched(__pos, { Statement::If(s) }),\n                Failed => Failed,\n            }\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                let __seq_res = {\n                    let __seq_res = Matched(__pos, __pos);\n                    match __seq_res {\n                        Matched(__pos, l) => {\n                            let __seq_res = __parse_switch_statement(__input, __state, __pos, env);\n                            match __seq_res {\n                                Matched(__pos, e) => {\n                                    let __seq_res = Matched(__pos, __pos);\n                                    match __seq_res {\n                                        Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                };\n                match __seq_res {\n                    Matched(__pos, s) => Matched(__pos, { Statement::Switch(s) }),\n                    Failed => Failed,\n                }\n            }\n        }\n    }\n}\n\nfn __parse_if_statement<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<IfStatement> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = {\n            __state.suppress_fail += 1;\n            let res = {\n                let __seq_res = slice_eq(__input, __state, __pos, \"if\");\n                match __seq_res {\n                    Matched(__pos, e) => {\n                        let __seq_res = {\n                            __state.suppress_fail += 1;\n                            let __assert_res = if __input.len() > __pos {\n                                let (__ch, __next) = char_range_at(__input, __pos);\n                                match __ch {\n                                    '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                    _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                }\n                            } else {\n                                __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                            };\n                            __state.suppress_fail -= 1;\n                            match __assert_res {\n                                Failed => Matched(__pos, ()),\n                                Matched(..) => Failed,\n                            }\n                        };\n                        match __seq_res {\n                            Matched(__pos, _) => Matched(__pos, { e }),\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            };\n            __state.suppress_fail -= 1;\n            res\n        };\n        match __seq_res {\n            Matched(__pos, _) => {\n                let __seq_res = __parse__(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = slice_eq(__input, __state, __pos, \"(\");\n                        match __seq_res {\n                            Matched(__pos, _) => {\n                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                match __seq_res {\n                                    Matched(__pos, _) => {\n                                        let __seq_res = __parse_expression(__input, __state, __pos, env);\n                                        match __seq_res {\n                                            Matched(__pos, e) => {\n                                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                                match __seq_res {\n                                                    Matched(__pos, _) => {\n                                                        let __seq_res = slice_eq(__input, __state, __pos, \")\");\n                                                        match __seq_res {\n                                                            Matched(__pos, _) => {\n                                                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                                                match __seq_res {\n                                                                    Matched(__pos, _) => {\n                                                                        let __seq_res = __parse_statement(__input, __state, __pos, env);\n                                                                        match __seq_res {\n                                                                            Matched(__pos, a) => {\n                                                                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                                                                match __seq_res {\n                                                                                    Matched(__pos, _) => {\n                                                                                        let __seq_res = match __parse_else_statement(__input, __state, __pos, env) {\n                                                                                            Matched(__newpos, __value) => Matched(__newpos, Some(__value)),\n                                                                                            Failed => Matched(__pos, None),\n                                                                                        };\n                                                                                        match __seq_res {\n                                                                                            Matched(__pos, b) => Matched(__pos, { IfStatement { condition: e, then_statement: a, else_statement: b } }),\n                                                                                            Failed => Failed,\n                                                                                        }\n                                                                                    }\n                                                                                    Failed => Failed,\n                                                                                }\n                                                                            }\n                                                                            Failed => Failed,\n                                                                        }\n                                                                    }\n                                                                    Failed => Failed,\n                                                                }\n                                                            }\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    }\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_else_statement<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Box<Node<Statement>>> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = {\n            __state.suppress_fail += 1;\n            let res = {\n                let __seq_res = slice_eq(__input, __state, __pos, \"else\");\n                match __seq_res {\n                    Matched(__pos, e) => {\n                        let __seq_res = {\n                            __state.suppress_fail += 1;\n                            let __assert_res = if __input.len() > __pos {\n                                let (__ch, __next) = char_range_at(__input, __pos);\n                                match __ch {\n                                    '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                    _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                }\n                            } else {\n                                __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                            };\n                            __state.suppress_fail -= 1;\n                            match __assert_res {\n                                Failed => Matched(__pos, ()),\n                                Matched(..) => Failed,\n                            }\n                        };\n                        match __seq_res {\n                            Matched(__pos, _) => Matched(__pos, { e }),\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            };\n            __state.suppress_fail -= 1;\n            res\n        };\n        match __seq_res {\n            Matched(__pos, _) => {\n                let __seq_res = __parse__(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = __parse_statement(__input, __state, __pos, env);\n                        match __seq_res {\n                            Matched(__pos, s) => Matched(__pos, { s }),\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_switch_statement<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<SwitchStatement> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = {\n            __state.suppress_fail += 1;\n            let res = {\n                let __seq_res = slice_eq(__input, __state, __pos, \"switch\");\n                match __seq_res {\n                    Matched(__pos, e) => {\n                        let __seq_res = {\n                            __state.suppress_fail += 1;\n                            let __assert_res = if __input.len() > __pos {\n                                let (__ch, __next) = char_range_at(__input, __pos);\n                                match __ch {\n                                    '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                    _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                }\n                            } else {\n                                __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                            };\n                            __state.suppress_fail -= 1;\n                            match __assert_res {\n                                Failed => Matched(__pos, ()),\n                                Matched(..) => Failed,\n                            }\n                        };\n                        match __seq_res {\n                            Matched(__pos, _) => Matched(__pos, { e }),\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            };\n            __state.suppress_fail -= 1;\n            res\n        };\n        match __seq_res {\n            Matched(__pos, _) => {\n                let __seq_res = __parse__(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = slice_eq(__input, __state, __pos, \"(\");\n                        match __seq_res {\n                            Matched(__pos, _) => {\n                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                match __seq_res {\n                                    Matched(__pos, _) => {\n                                        let __seq_res = __parse_expression(__input, __state, __pos, env);\n                                        match __seq_res {\n                                            Matched(__pos, e) => {\n                                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                                match __seq_res {\n                                                    Matched(__pos, _) => {\n                                                        let __seq_res = slice_eq(__input, __state, __pos, \")\");\n                                                        match __seq_res {\n                                                            Matched(__pos, _) => {\n                                                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                                                match __seq_res {\n                                                                    Matched(__pos, _) => {\n                                                                        let __seq_res = __parse_statement(__input, __state, __pos, env);\n                                                                        match __seq_res {\n                                                                            Matched(__pos, s) => Matched(__pos, { SwitchStatement { expression: e, statement: s } }),\n                                                                            Failed => Failed,\n                                                                        }\n                                                                    }\n                                                                    Failed => Failed,\n                                                                }\n                                                            }\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    }\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_iteration_statement<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Statement> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            let __seq_res = {\n                let __seq_res = Matched(__pos, __pos);\n                match __seq_res {\n                    Matched(__pos, l) => {\n                        let __seq_res = __parse_while_statement(__input, __state, __pos, env);\n                        match __seq_res {\n                            Matched(__pos, e) => {\n                                let __seq_res = Matched(__pos, __pos);\n                                match __seq_res {\n                                    Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            };\n            match __seq_res {\n                Matched(__pos, s) => Matched(__pos, { Statement::While(s) }),\n                Failed => Failed,\n            }\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                let __choice_res = {\n                    let __seq_res = {\n                        let __seq_res = Matched(__pos, __pos);\n                        match __seq_res {\n                            Matched(__pos, l) => {\n                                let __seq_res = __parse_do_while_statement(__input, __state, __pos, env);\n                                match __seq_res {\n                                    Matched(__pos, e) => {\n                                        let __seq_res = Matched(__pos, __pos);\n                                        match __seq_res {\n                                            Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                            Failed => Failed,\n                                        }\n                                    }\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    };\n                    match __seq_res {\n                        Matched(__pos, s) => Matched(__pos, { Statement::DoWhile(s) }),\n                        Failed => Failed,\n                    }\n                };\n                match __choice_res {\n                    Matched(__pos, __value) => Matched(__pos, __value),\n                    Failed => {\n                        let __seq_res = {\n                            let __seq_res = Matched(__pos, __pos);\n                            match __seq_res {\n                                Matched(__pos, l) => {\n                                    let __seq_res = __parse_for_statement(__input, __state, __pos, env);\n                                    match __seq_res {\n                                        Matched(__pos, e) => {\n                                            let __seq_res = Matched(__pos, __pos);\n                                            match __seq_res {\n                                                Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        };\n                        match __seq_res {\n                            Matched(__pos, s) => Matched(__pos, { Statement::For(s) }),\n                            Failed => Failed,\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n\nfn __parse_while_statement<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<WhileStatement> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = {\n            __state.suppress_fail += 1;\n            let res = {\n                let __seq_res = slice_eq(__input, __state, __pos, \"while\");\n                match __seq_res {\n                    Matched(__pos, e) => {\n                        let __seq_res = {\n                            __state.suppress_fail += 1;\n                            let __assert_res = if __input.len() > __pos {\n                                let (__ch, __next) = char_range_at(__input, __pos);\n                                match __ch {\n                                    '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                    _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                }\n                            } else {\n                                __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                            };\n                            __state.suppress_fail -= 1;\n                            match __assert_res {\n                                Failed => Matched(__pos, ()),\n                                Matched(..) => Failed,\n                            }\n                        };\n                        match __seq_res {\n                            Matched(__pos, _) => Matched(__pos, { e }),\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            };\n            __state.suppress_fail -= 1;\n            res\n        };\n        match __seq_res {\n            Matched(__pos, _) => {\n                let __seq_res = __parse__(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = slice_eq(__input, __state, __pos, \"(\");\n                        match __seq_res {\n                            Matched(__pos, _) => {\n                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                match __seq_res {\n                                    Matched(__pos, _) => {\n                                        let __seq_res = __parse_expression(__input, __state, __pos, env);\n                                        match __seq_res {\n                                            Matched(__pos, e) => {\n                                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                                match __seq_res {\n                                                    Matched(__pos, _) => {\n                                                        let __seq_res = slice_eq(__input, __state, __pos, \")\");\n                                                        match __seq_res {\n                                                            Matched(__pos, _) => {\n                                                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                                                match __seq_res {\n                                                                    Matched(__pos, _) => {\n                                                                        let __seq_res = __parse_statement(__input, __state, __pos, env);\n                                                                        match __seq_res {\n                                                                            Matched(__pos, s) => Matched(__pos, { WhileStatement { expression: e, statement: s } }),\n                                                                            Failed => Failed,\n                                                                        }\n                                                                    }\n                                                                    Failed => Failed,\n                                                                }\n                                                            }\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    }\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_do_while_statement<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<DoWhileStatement> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = {\n            __state.suppress_fail += 1;\n            let res = {\n                let __seq_res = slice_eq(__input, __state, __pos, \"do\");\n                match __seq_res {\n                    Matched(__pos, e) => {\n                        let __seq_res = {\n                            __state.suppress_fail += 1;\n                            let __assert_res = if __input.len() > __pos {\n                                let (__ch, __next) = char_range_at(__input, __pos);\n                                match __ch {\n                                    '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                    _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                }\n                            } else {\n                                __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                            };\n                            __state.suppress_fail -= 1;\n                            match __assert_res {\n                                Failed => Matched(__pos, ()),\n                                Matched(..) => Failed,\n                            }\n                        };\n                        match __seq_res {\n                            Matched(__pos, _) => Matched(__pos, { e }),\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            };\n            __state.suppress_fail -= 1;\n            res\n        };\n        match __seq_res {\n            Matched(__pos, _) => {\n                let __seq_res = __parse__(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = __parse_statement(__input, __state, __pos, env);\n                        match __seq_res {\n                            Matched(__pos, s) => {\n                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                match __seq_res {\n                                    Matched(__pos, _) => {\n                                        let __seq_res = {\n                                            __state.suppress_fail += 1;\n                                            let res = {\n                                                let __seq_res = slice_eq(__input, __state, __pos, \"while\");\n                                                match __seq_res {\n                                                    Matched(__pos, e) => {\n                                                        let __seq_res = {\n                                                            __state.suppress_fail += 1;\n                                                            let __assert_res = if __input.len() > __pos {\n                                                                let (__ch, __next) = char_range_at(__input, __pos);\n                                                                match __ch {\n                                                                    '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                                                    _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                                                }\n                                                            } else {\n                                                                __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                                                            };\n                                                            __state.suppress_fail -= 1;\n                                                            match __assert_res {\n                                                                Failed => Matched(__pos, ()),\n                                                                Matched(..) => Failed,\n                                                            }\n                                                        };\n                                                        match __seq_res {\n                                                            Matched(__pos, _) => Matched(__pos, { e }),\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            };\n                                            __state.suppress_fail -= 1;\n                                            res\n                                        };\n                                        match __seq_res {\n                                            Matched(__pos, _) => {\n                                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                                match __seq_res {\n                                                    Matched(__pos, _) => {\n                                                        let __seq_res = slice_eq(__input, __state, __pos, \"(\");\n                                                        match __seq_res {\n                                                            Matched(__pos, _) => {\n                                                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                                                match __seq_res {\n                                                                    Matched(__pos, _) => {\n                                                                        let __seq_res = __parse_expression(__input, __state, __pos, env);\n                                                                        match __seq_res {\n                                                                            Matched(__pos, e) => {\n                                                                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                                                                match __seq_res {\n                                                                                    Matched(__pos, _) => {\n                                                                                        let __seq_res = slice_eq(__input, __state, __pos, \")\");\n                                                                                        match __seq_res {\n                                                                                            Matched(__pos, _) => {\n                                                                                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                                                                                match __seq_res {\n                                                                                                    Matched(__pos, _) => {\n                                                                                                        let __seq_res = slice_eq(__input, __state, __pos, \";\");\n                                                                                                        match __seq_res {\n                                                                                                            Matched(__pos, _) => Matched(__pos, { DoWhileStatement { statement: s, expression: e } }),\n                                                                                                            Failed => Failed,\n                                                                                                        }\n                                                                                                    }\n                                                                                                    Failed => Failed,\n                                                                                                }\n                                                                                            }\n                                                                                            Failed => Failed,\n                                                                                        }\n                                                                                    }\n                                                                                    Failed => Failed,\n                                                                                }\n                                                                            }\n                                                                            Failed => Failed,\n                                                                        }\n                                                                    }\n                                                                    Failed => Failed,\n                                                                }\n                                                            }\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    }\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_for_statement<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<ForStatement> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = {\n            __state.suppress_fail += 1;\n            let res = {\n                let __seq_res = slice_eq(__input, __state, __pos, \"for\");\n                match __seq_res {\n                    Matched(__pos, e) => {\n                        let __seq_res = {\n                            __state.suppress_fail += 1;\n                            let __assert_res = if __input.len() > __pos {\n                                let (__ch, __next) = char_range_at(__input, __pos);\n                                match __ch {\n                                    '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                    _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                }\n                            } else {\n                                __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                            };\n                            __state.suppress_fail -= 1;\n                            match __assert_res {\n                                Failed => Matched(__pos, ()),\n                                Matched(..) => Failed,\n                            }\n                        };\n                        match __seq_res {\n                            Matched(__pos, _) => Matched(__pos, { e }),\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            };\n            __state.suppress_fail -= 1;\n            res\n        };\n        match __seq_res {\n            Matched(__pos, _) => {\n                let __seq_res = __parse__(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = slice_eq(__input, __state, __pos, \"(\");\n                        match __seq_res {\n                            Matched(__pos, _) => {\n                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                match __seq_res {\n                                    Matched(__pos, _) => {\n                                        let __seq_res = {\n                                            let __seq_res = Matched(__pos, __pos);\n                                            match __seq_res {\n                                                Matched(__pos, l) => {\n                                                    let __seq_res = __parse_for_initializer(__input, __state, __pos, env);\n                                                    match __seq_res {\n                                                        Matched(__pos, e) => {\n                                                            let __seq_res = Matched(__pos, __pos);\n                                                            match __seq_res {\n                                                                Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                                Failed => Failed,\n                                                            }\n                                                        }\n                                                        Failed => Failed,\n                                                    }\n                                                }\n                                                Failed => Failed,\n                                            }\n                                        };\n                                        match __seq_res {\n                                            Matched(__pos, a) => {\n                                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                                match __seq_res {\n                                                    Matched(__pos, _) => {\n                                                        let __seq_res = match __parse_expression(__input, __state, __pos, env) {\n                                                            Matched(__newpos, __value) => Matched(__newpos, Some(__value)),\n                                                            Failed => Matched(__pos, None),\n                                                        };\n                                                        match __seq_res {\n                                                            Matched(__pos, b) => {\n                                                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                                                match __seq_res {\n                                                                    Matched(__pos, _) => {\n                                                                        let __seq_res = slice_eq(__input, __state, __pos, \";\");\n                                                                        match __seq_res {\n                                                                            Matched(__pos, _) => {\n                                                                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                                                                match __seq_res {\n                                                                                    Matched(__pos, _) => {\n                                                                                        let __seq_res = match __parse_expression(__input, __state, __pos, env) {\n                                                                                            Matched(__newpos, __value) => Matched(__newpos, Some(__value)),\n                                                                                            Failed => Matched(__pos, None),\n                                                                                        };\n                                                                                        match __seq_res {\n                                                                                            Matched(__pos, c) => {\n                                                                                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                                                                                match __seq_res {\n                                                                                                    Matched(__pos, _) => {\n                                                                                                        let __seq_res = slice_eq(__input, __state, __pos, \")\");\n                                                                                                        match __seq_res {\n                                                                                                            Matched(__pos, _) => {\n                                                                                                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                                                                                                match __seq_res {\n                                                                                                                    Matched(__pos, _) => {\n                                                                                                                        let __seq_res = __parse_statement(__input, __state, __pos, env);\n                                                                                                                        match __seq_res {\n                                                                                                                            Matched(__pos, s) => Matched(__pos, { ForStatement { initializer: a, condition: b, step: c, statement: s } }),\n                                                                                                                            Failed => Failed,\n                                                                                                                        }\n                                                                                                                    }\n                                                                                                                    Failed => Failed,\n                                                                                                                }\n                                                                                                            }\n                                                                                                            Failed => Failed,\n                                                                                                        }\n                                                                                                    }\n                                                                                                    Failed => Failed,\n                                                                                                }\n                                                                                            }\n                                                                                            Failed => Failed,\n                                                                                        }\n                                                                                    }\n                                                                                    Failed => Failed,\n                                                                                }\n                                                                            }\n                                                                            Failed => Failed,\n                                                                        }\n                                                                    }\n                                                                    Failed => Failed,\n                                                                }\n                                                            }\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    }\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_for_initializer<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<ForInitializer> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            let __seq_res = __parse_expression(__input, __state, __pos, env);\n            match __seq_res {\n                Matched(__pos, e) => {\n                    let __seq_res = __parse__(__input, __state, __pos, env);\n                    match __seq_res {\n                        Matched(__pos, _) => {\n                            let __seq_res = slice_eq(__input, __state, __pos, \";\");\n                            match __seq_res {\n                                Matched(__pos, _) => Matched(__pos, { ForInitializer::Expression(e) }),\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                }\n                Failed => Failed,\n            }\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                let __choice_res = {\n                    let __seq_res = __parse_declaration(__input, __state, __pos, env);\n                    match __seq_res {\n                        Matched(__pos, d) => Matched(__pos, { ForInitializer::Declaration(d) }),\n                        Failed => Failed,\n                    }\n                };\n                match __choice_res {\n                    Matched(__pos, __value) => Matched(__pos, __value),\n                    Failed => {\n                        let __choice_res = {\n                            let __seq_res = __parse_static_assert(__input, __state, __pos, env);\n                            match __seq_res {\n                                Matched(__pos, s) => Matched(__pos, { ForInitializer::StaticAssert(s) }),\n                                Failed => Failed,\n                            }\n                        };\n                        match __choice_res {\n                            Matched(__pos, __value) => Matched(__pos, __value),\n                            Failed => {\n                                let __seq_res = slice_eq(__input, __state, __pos, \";\");\n                                match __seq_res {\n                                    Matched(__pos, _) => Matched(__pos, { ForInitializer::Empty }),\n                                    Failed => Failed,\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n\nfn __parse_jump_statement<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Statement> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            let __seq_res = {\n                __state.suppress_fail += 1;\n                let res = {\n                    let __seq_res = slice_eq(__input, __state, __pos, \"goto\");\n                    match __seq_res {\n                        Matched(__pos, e) => {\n                            let __seq_res = {\n                                __state.suppress_fail += 1;\n                                let __assert_res = if __input.len() > __pos {\n                                    let (__ch, __next) = char_range_at(__input, __pos);\n                                    match __ch {\n                                        '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                        _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                    }\n                                } else {\n                                    __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                                };\n                                __state.suppress_fail -= 1;\n                                match __assert_res {\n                                    Failed => Matched(__pos, ()),\n                                    Matched(..) => Failed,\n                                }\n                            };\n                            match __seq_res {\n                                Matched(__pos, _) => Matched(__pos, { e }),\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                };\n                __state.suppress_fail -= 1;\n                res\n            };\n            match __seq_res {\n                Matched(__pos, _) => {\n                    let __seq_res = __parse__(__input, __state, __pos, env);\n                    match __seq_res {\n                        Matched(__pos, _) => {\n                            let __seq_res = __parse_identifier(__input, __state, __pos, env);\n                            match __seq_res {\n                                Matched(__pos, i) => {\n                                    let __seq_res = __parse__(__input, __state, __pos, env);\n                                    match __seq_res {\n                                        Matched(__pos, _) => {\n                                            let __seq_res = slice_eq(__input, __state, __pos, \";\");\n                                            match __seq_res {\n                                                Matched(__pos, _) => Matched(__pos, { Statement::Goto(i) }),\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                }\n                Failed => Failed,\n            }\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                let __choice_res = {\n                    let __seq_res = {\n                        __state.suppress_fail += 1;\n                        let res = {\n                            let __seq_res = slice_eq(__input, __state, __pos, \"continue\");\n                            match __seq_res {\n                                Matched(__pos, e) => {\n                                    let __seq_res = {\n                                        __state.suppress_fail += 1;\n                                        let __assert_res = if __input.len() > __pos {\n                                            let (__ch, __next) = char_range_at(__input, __pos);\n                                            match __ch {\n                                                '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                                _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                            }\n                                        } else {\n                                            __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                                        };\n                                        __state.suppress_fail -= 1;\n                                        match __assert_res {\n                                            Failed => Matched(__pos, ()),\n                                            Matched(..) => Failed,\n                                        }\n                                    };\n                                    match __seq_res {\n                                        Matched(__pos, _) => Matched(__pos, { e }),\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        };\n                        __state.suppress_fail -= 1;\n                        res\n                    };\n                    match __seq_res {\n                        Matched(__pos, _) => {\n                            let __seq_res = __parse__(__input, __state, __pos, env);\n                            match __seq_res {\n                                Matched(__pos, _) => {\n                                    let __seq_res = slice_eq(__input, __state, __pos, \";\");\n                                    match __seq_res {\n                                        Matched(__pos, _) => Matched(__pos, { Statement::Continue }),\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                };\n                match __choice_res {\n                    Matched(__pos, __value) => Matched(__pos, __value),\n                    Failed => {\n                        let __choice_res = {\n                            let __seq_res = {\n                                __state.suppress_fail += 1;\n                                let res = {\n                                    let __seq_res = slice_eq(__input, __state, __pos, \"break\");\n                                    match __seq_res {\n                                        Matched(__pos, e) => {\n                                            let __seq_res = {\n                                                __state.suppress_fail += 1;\n                                                let __assert_res = if __input.len() > __pos {\n                                                    let (__ch, __next) = char_range_at(__input, __pos);\n                                                    match __ch {\n                                                        '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                                        _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                                    }\n                                                } else {\n                                                    __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                                                };\n                                                __state.suppress_fail -= 1;\n                                                match __assert_res {\n                                                    Failed => Matched(__pos, ()),\n                                                    Matched(..) => Failed,\n                                                }\n                                            };\n                                            match __seq_res {\n                                                Matched(__pos, _) => Matched(__pos, { e }),\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                };\n                                __state.suppress_fail -= 1;\n                                res\n                            };\n                            match __seq_res {\n                                Matched(__pos, _) => {\n                                    let __seq_res = __parse__(__input, __state, __pos, env);\n                                    match __seq_res {\n                                        Matched(__pos, _) => {\n                                            let __seq_res = slice_eq(__input, __state, __pos, \";\");\n                                            match __seq_res {\n                                                Matched(__pos, _) => Matched(__pos, { Statement::Break }),\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        };\n                        match __choice_res {\n                            Matched(__pos, __value) => Matched(__pos, __value),\n                            Failed => {\n                                let __seq_res = {\n                                    __state.suppress_fail += 1;\n                                    let res = {\n                                        let __seq_res = slice_eq(__input, __state, __pos, \"return\");\n                                        match __seq_res {\n                                            Matched(__pos, e) => {\n                                                let __seq_res = {\n                                                    __state.suppress_fail += 1;\n                                                    let __assert_res = if __input.len() > __pos {\n                                                        let (__ch, __next) = char_range_at(__input, __pos);\n                                                        match __ch {\n                                                            '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                                            _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                                        }\n                                                    } else {\n                                                        __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                                                    };\n                                                    __state.suppress_fail -= 1;\n                                                    match __assert_res {\n                                                        Failed => Matched(__pos, ()),\n                                                        Matched(..) => Failed,\n                                                    }\n                                                };\n                                                match __seq_res {\n                                                    Matched(__pos, _) => Matched(__pos, { e }),\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    };\n                                    __state.suppress_fail -= 1;\n                                    res\n                                };\n                                match __seq_res {\n                                    Matched(__pos, _) => {\n                                        let __seq_res = __parse__(__input, __state, __pos, env);\n                                        match __seq_res {\n                                            Matched(__pos, _) => {\n                                                let __seq_res = match __parse_expression(__input, __state, __pos, env) {\n                                                    Matched(__newpos, __value) => Matched(__newpos, Some(__value)),\n                                                    Failed => Matched(__pos, None),\n                                                };\n                                                match __seq_res {\n                                                    Matched(__pos, e) => {\n                                                        let __seq_res = __parse__(__input, __state, __pos, env);\n                                                        match __seq_res {\n                                                            Matched(__pos, _) => {\n                                                                let __seq_res = slice_eq(__input, __state, __pos, \";\");\n                                                                match __seq_res {\n                                                                    Matched(__pos, _) => Matched(__pos, { Statement::Return(e) }),\n                                                                    Failed => Failed,\n                                                                }\n                                                            }\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    }\n                                    Failed => Failed,\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n\nfn __parse_translation_unit<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<TranslationUnit> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = match __parse_directive(__input, __state, __pos, env) {\n            Matched(__newpos, _) => Matched(__newpos, ()),\n            Failed => Matched(__pos, ()),\n        };\n        match __seq_res {\n            Matched(__pos, _) => {\n                let __seq_res = __parse__(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = {\n                            let __seq_res = {\n                                let mut __repeat_pos = __pos;\n                                let mut __repeat_value = vec![];\n                                loop {\n                                    let __pos = __repeat_pos;\n                                    let __pos = if __repeat_value.len() > 0 {\n                                        let __sep_res = __parse__(__input, __state, __pos, env);\n                                        match __sep_res {\n                                            Matched(__newpos, _) => __newpos,\n                                            Failed => break,\n                                        }\n                                    } else {\n                                        __pos\n                                    };\n                                    let __step_res = {\n                                        let __seq_res = Matched(__pos, __pos);\n                                        match __seq_res {\n                                            Matched(__pos, l) => {\n                                                let __seq_res = __parse_external_declaration(__input, __state, __pos, env);\n                                                match __seq_res {\n                                                    Matched(__pos, e) => {\n                                                        let __seq_res = Matched(__pos, __pos);\n                                                        match __seq_res {\n                                                            Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    };\n                                    match __step_res {\n                                        Matched(__newpos, __value) => {\n                                            __repeat_pos = __newpos;\n                                            __repeat_value.push(__value);\n                                        }\n                                        Failed => {\n                                            break;\n                                        }\n                                    }\n                                }\n                                Matched(__repeat_pos, __repeat_value)\n                            };\n                            match __seq_res {\n                                Matched(__pos, e) => Matched(__pos, { e }),\n                                Failed => Failed,\n                            }\n                        };\n                        match __seq_res {\n                            Matched(__pos, d) => {\n                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                match __seq_res {\n                                    Matched(__pos, _) => Matched(__pos, { TranslationUnit(d) }),\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_external_declaration<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<ExternalDeclaration> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = __parse_external_declaration0(__input, __state, __pos, env);\n        match __seq_res {\n            Matched(__pos, d) => {\n                let __seq_res = match {\n                    let __seq_res = {\n                        __state.suppress_fail += 1;\n                        let __assert_res = __parse_gnu_guard(__input, __state, __pos, env);\n                        __state.suppress_fail -= 1;\n                        match __assert_res {\n                            Matched(_, __value) => Matched(__pos, __value),\n                            Failed => Failed,\n                        }\n                    };\n                    match __seq_res {\n                        Matched(__pos, _) => {\n                            let __seq_res = {\n                                let mut __repeat_pos = __pos;\n                                let mut __repeat_value = vec![];\n                                loop {\n                                    let __pos = __repeat_pos;\n                                    let __step_res = {\n                                        let __seq_res = __parse__(__input, __state, __pos, env);\n                                        match __seq_res {\n                                            Matched(__pos, _) => slice_eq(__input, __state, __pos, \";\"),\n                                            Failed => Failed,\n                                        }\n                                    };\n                                    match __step_res {\n                                        Matched(__newpos, __value) => {\n                                            __repeat_pos = __newpos;\n                                            __repeat_value.push(__value);\n                                        }\n                                        Failed => {\n                                            break;\n                                        }\n                                    }\n                                }\n                                Matched(__repeat_pos, __repeat_value)\n                            };\n                            match __seq_res {\n                                Matched(__pos, e) => Matched(__pos, { e }),\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                } {\n                    Matched(__newpos, _) => Matched(__newpos, ()),\n                    Failed => Matched(__pos, ()),\n                };\n                match __seq_res {\n                    Matched(__pos, _) => Matched(__pos, { d }),\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_external_declaration0<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<ExternalDeclaration> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            let __seq_res = __parse_declaration(__input, __state, __pos, env);\n            match __seq_res {\n                Matched(__pos, d) => Matched(__pos, { ExternalDeclaration::Declaration(d) }),\n                Failed => Failed,\n            }\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                let __choice_res = {\n                    let __seq_res = __parse_static_assert(__input, __state, __pos, env);\n                    match __seq_res {\n                        Matched(__pos, s) => Matched(__pos, { ExternalDeclaration::StaticAssert(s) }),\n                        Failed => Failed,\n                    }\n                };\n                match __choice_res {\n                    Matched(__pos, __value) => Matched(__pos, __value),\n                    Failed => {\n                        let __seq_res = {\n                            let __seq_res = Matched(__pos, {\n                                env.enter_scope();\n                            });\n                            match __seq_res {\n                                Matched(__pos, _) => {\n                                    let __seq_res = match {\n                                        let __seq_res = Matched(__pos, __pos);\n                                        match __seq_res {\n                                            Matched(__pos, l) => {\n                                                let __seq_res = __parse_function_definition(__input, __state, __pos, env);\n                                                match __seq_res {\n                                                    Matched(__pos, e) => {\n                                                        let __seq_res = Matched(__pos, __pos);\n                                                        match __seq_res {\n                                                            Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    } {\n                                        Matched(__newpos, __value) => Matched(__newpos, Some(__value)),\n                                        Failed => Matched(__pos, None),\n                                    };\n                                    match __seq_res {\n                                        Matched(__pos, e) => {\n                                            match {\n                                                env.leave_scope();\n                                                e.ok_or(\"\")\n                                            } {\n                                                Ok(res) => Matched(__pos, res),\n                                                Err(expected) => {\n                                                    __state.mark_failure(__pos, expected);\n                                                    Failed\n                                                }\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        };\n                        match __seq_res {\n                            Matched(__pos, d) => Matched(__pos, { ExternalDeclaration::FunctionDefinition(d) }),\n                            Failed => Failed,\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n\nfn __parse_function_definition<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<FunctionDefinition> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = match {\n            let __seq_res = {\n                __state.suppress_fail += 1;\n                let __assert_res = __parse_gnu_guard(__input, __state, __pos, env);\n                __state.suppress_fail -= 1;\n                match __assert_res {\n                    Matched(_, __value) => Matched(__pos, __value),\n                    Failed => Failed,\n                }\n            };\n            match __seq_res {\n                Matched(__pos, _) => {\n                    let __seq_res = {\n                        __state.suppress_fail += 1;\n                        let res = {\n                            let __seq_res = slice_eq(__input, __state, __pos, \"__extension__\");\n                            match __seq_res {\n                                Matched(__pos, e) => {\n                                    let __seq_res = {\n                                        __state.suppress_fail += 1;\n                                        let __assert_res = if __input.len() > __pos {\n                                            let (__ch, __next) = char_range_at(__input, __pos);\n                                            match __ch {\n                                                '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                                _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                            }\n                                        } else {\n                                            __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                                        };\n                                        __state.suppress_fail -= 1;\n                                        match __assert_res {\n                                            Failed => Matched(__pos, ()),\n                                            Matched(..) => Failed,\n                                        }\n                                    };\n                                    match __seq_res {\n                                        Matched(__pos, _) => Matched(__pos, { e }),\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        };\n                        __state.suppress_fail -= 1;\n                        res\n                    };\n                    match __seq_res {\n                        Matched(__pos, e) => Matched(__pos, { e }),\n                        Failed => Failed,\n                    }\n                }\n                Failed => Failed,\n            }\n        } {\n            Matched(__newpos, _) => Matched(__newpos, ()),\n            Failed => Matched(__pos, ()),\n        };\n        match __seq_res {\n            Matched(__pos, _) => {\n                let __seq_res = __parse__(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = __parse_declaration_specifiers(__input, __state, __pos, env);\n                        match __seq_res {\n                            Matched(__pos, a) => {\n                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                match __seq_res {\n                                    Matched(__pos, _) => {\n                                        let __seq_res = __parse_declarator(__input, __state, __pos, env);\n                                        match __seq_res {\n                                            Matched(__pos, b) => {\n                                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                                match __seq_res {\n                                                    Matched(__pos, _) => {\n                                                        let __seq_res = {\n                                                            let __seq_res = {\n                                                                let mut __repeat_pos = __pos;\n                                                                let mut __repeat_value = vec![];\n                                                                loop {\n                                                                    let __pos = __repeat_pos;\n                                                                    let __pos = if __repeat_value.len() > 0 {\n                                                                        let __sep_res = __parse__(__input, __state, __pos, env);\n                                                                        match __sep_res {\n                                                                            Matched(__newpos, _) => __newpos,\n                                                                            Failed => break,\n                                                                        }\n                                                                    } else {\n                                                                        __pos\n                                                                    };\n                                                                    let __step_res = __parse_declaration(__input, __state, __pos, env);\n                                                                    match __step_res {\n                                                                        Matched(__newpos, __value) => {\n                                                                            __repeat_pos = __newpos;\n                                                                            __repeat_value.push(__value);\n                                                                        }\n                                                                        Failed => {\n                                                                            break;\n                                                                        }\n                                                                    }\n                                                                }\n                                                                Matched(__repeat_pos, __repeat_value)\n                                                            };\n                                                            match __seq_res {\n                                                                Matched(__pos, e) => Matched(__pos, { e }),\n                                                                Failed => Failed,\n                                                            }\n                                                        };\n                                                        match __seq_res {\n                                                            Matched(__pos, c) => {\n                                                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                                                match __seq_res {\n                                                                    Matched(__pos, _) => {\n                                                                        let __seq_res = {\n                                                                            let __seq_res = Matched(__pos, __pos);\n                                                                            match __seq_res {\n                                                                                Matched(__pos, l) => {\n                                                                                    let __seq_res = __parse_compound_statement(__input, __state, __pos, env);\n                                                                                    match __seq_res {\n                                                                                        Matched(__pos, e) => {\n                                                                                            let __seq_res = Matched(__pos, __pos);\n                                                                                            match __seq_res {\n                                                                                                Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                                                                Failed => Failed,\n                                                                                            }\n                                                                                        }\n                                                                                        Failed => Failed,\n                                                                                    }\n                                                                                }\n                                                                                Failed => Failed,\n                                                                            }\n                                                                        };\n                                                                        match __seq_res {\n                                                                            Matched(__pos, d) => Matched(__pos, { FunctionDefinition { specifiers: a, declarator: b, declarations: c, statement: d } }),\n                                                                            Failed => Failed,\n                                                                        }\n                                                                    }\n                                                                    Failed => Failed,\n                                                                }\n                                                            }\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    }\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_gnu_guard<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<()> {\n    #![allow(non_snake_case, unused)]\n    match {\n        if env.extensions_gnu {\n            Ok(())\n        } else {\n            Err(\"gnu extensions disabled\")\n        }\n    } {\n        Ok(res) => Matched(__pos, res),\n        Err(expected) => {\n            __state.mark_failure(__pos, expected);\n            Failed\n        }\n    }\n}\n\nfn __parse_attribute_specifier_list<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Vec<Node<Extension>>> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = {\n            let __seq_res = {\n                let mut __repeat_pos = __pos;\n                let mut __repeat_value = vec![];\n                loop {\n                    let __pos = __repeat_pos;\n                    let __pos = if __repeat_value.len() > 0 {\n                        let __sep_res = __parse__(__input, __state, __pos, env);\n                        match __sep_res {\n                            Matched(__newpos, _) => __newpos,\n                            Failed => break,\n                        }\n                    } else {\n                        __pos\n                    };\n                    let __step_res = __parse_attribute_specifier(__input, __state, __pos, env);\n                    match __step_res {\n                        Matched(__newpos, __value) => {\n                            __repeat_pos = __newpos;\n                            __repeat_value.push(__value);\n                        }\n                        Failed => {\n                            break;\n                        }\n                    }\n                }\n                Matched(__repeat_pos, __repeat_value)\n            };\n            match __seq_res {\n                Matched(__pos, e) => Matched(__pos, { e }),\n                Failed => Failed,\n            }\n        };\n        match __seq_res {\n            Matched(__pos, a) => Matched(__pos, { a.into_iter().flat_map(|v| v).collect() }),\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_attribute_specifier<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Vec<Node<Extension>>> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = {\n            __state.suppress_fail += 1;\n            let res = {\n                let __seq_res = {\n                    let __seq_res = slice_eq(__input, __state, __pos, \"__attribute\");\n                    match __seq_res {\n                        Matched(__pos, _) => match slice_eq(__input, __state, __pos, \"__\") {\n                            Matched(__newpos, _) => Matched(__newpos, ()),\n                            Failed => Matched(__pos, ()),\n                        },\n                        Failed => Failed,\n                    }\n                };\n                match __seq_res {\n                    Matched(__pos, e) => {\n                        let __seq_res = {\n                            __state.suppress_fail += 1;\n                            let __assert_res = if __input.len() > __pos {\n                                let (__ch, __next) = char_range_at(__input, __pos);\n                                match __ch {\n                                    '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                    _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                }\n                            } else {\n                                __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                            };\n                            __state.suppress_fail -= 1;\n                            match __assert_res {\n                                Failed => Matched(__pos, ()),\n                                Matched(..) => Failed,\n                            }\n                        };\n                        match __seq_res {\n                            Matched(__pos, _) => Matched(__pos, { e }),\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            };\n            __state.suppress_fail -= 1;\n            res\n        };\n        match __seq_res {\n            Matched(__pos, _) => {\n                let __seq_res = __parse__(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = slice_eq(__input, __state, __pos, \"((\");\n                        match __seq_res {\n                            Matched(__pos, _) => {\n                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                match __seq_res {\n                                    Matched(__pos, _) => {\n                                        let __seq_res = {\n                                            let __seq_res = {\n                                                let mut __repeat_pos = __pos;\n                                                let mut __repeat_value = vec![];\n                                                loop {\n                                                    let __pos = __repeat_pos;\n                                                    let __pos = if __repeat_value.len() > 0 {\n                                                        let __sep_res = {\n                                                            let __seq_res = __parse__(__input, __state, __pos, env);\n                                                            match __seq_res {\n                                                                Matched(__pos, _) => {\n                                                                    let __seq_res = slice_eq(__input, __state, __pos, \",\");\n                                                                    match __seq_res {\n                                                                        Matched(__pos, _) => __parse__(__input, __state, __pos, env),\n                                                                        Failed => Failed,\n                                                                    }\n                                                                }\n                                                                Failed => Failed,\n                                                            }\n                                                        };\n                                                        match __sep_res {\n                                                            Matched(__newpos, _) => __newpos,\n                                                            Failed => break,\n                                                        }\n                                                    } else {\n                                                        __pos\n                                                    };\n                                                    let __step_res = {\n                                                        let __seq_res = Matched(__pos, __pos);\n                                                        match __seq_res {\n                                                            Matched(__pos, l) => {\n                                                                let __seq_res = __parse_attribute(__input, __state, __pos, env);\n                                                                match __seq_res {\n                                                                    Matched(__pos, e) => {\n                                                                        let __seq_res = Matched(__pos, __pos);\n                                                                        match __seq_res {\n                                                                            Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                                            Failed => Failed,\n                                                                        }\n                                                                    }\n                                                                    Failed => Failed,\n                                                                }\n                                                            }\n                                                            Failed => Failed,\n                                                        }\n                                                    };\n                                                    match __step_res {\n                                                        Matched(__newpos, __value) => {\n                                                            __repeat_pos = __newpos;\n                                                            __repeat_value.push(__value);\n                                                        }\n                                                        Failed => {\n                                                            break;\n                                                        }\n                                                    }\n                                                }\n                                                Matched(__repeat_pos, __repeat_value)\n                                            };\n                                            match __seq_res {\n                                                Matched(__pos, e) => Matched(__pos, { e }),\n                                                Failed => Failed,\n                                            }\n                                        };\n                                        match __seq_res {\n                                            Matched(__pos, a) => {\n                                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                                match __seq_res {\n                                                    Matched(__pos, _) => {\n                                                        let __seq_res = slice_eq(__input, __state, __pos, \"))\");\n                                                        match __seq_res {\n                                                            Matched(__pos, _) => Matched(__pos, { a }),\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    }\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_attribute<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Extension> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            let __seq_res = {\n                let __seq_res = {\n                    __state.suppress_fail += 1;\n                    let __assert_res = __parse_clang_guard(__input, __state, __pos, env);\n                    __state.suppress_fail -= 1;\n                    match __assert_res {\n                        Matched(_, __value) => Matched(__pos, __value),\n                        Failed => Failed,\n                    }\n                };\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = {\n                            let __seq_res = Matched(__pos, __pos);\n                            match __seq_res {\n                                Matched(__pos, l) => {\n                                    let __seq_res = __parse_attr_availability(__input, __state, __pos, env);\n                                    match __seq_res {\n                                        Matched(__pos, e) => {\n                                            let __seq_res = Matched(__pos, __pos);\n                                            match __seq_res {\n                                                Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        };\n                        match __seq_res {\n                            Matched(__pos, e) => Matched(__pos, { e }),\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            };\n            match __seq_res {\n                Matched(__pos, c) => Matched(__pos, { Extension::AvailabilityAttribute(c) }),\n                Failed => Failed,\n            }\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                let __seq_res = {\n                    let __seq_res = Matched(__pos, __pos);\n                    match __seq_res {\n                        Matched(__pos, l) => {\n                            let __seq_res = __parse_attribute_name(__input, __state, __pos, env);\n                            match __seq_res {\n                                Matched(__pos, e) => {\n                                    let __seq_res = Matched(__pos, __pos);\n                                    match __seq_res {\n                                        Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                };\n                match __seq_res {\n                    Matched(__pos, n) => {\n                        let __seq_res = __parse__(__input, __state, __pos, env);\n                        match __seq_res {\n                            Matched(__pos, _) => {\n                                let __seq_res = match __parse_attribute_parameters(__input, __state, __pos, env) {\n                                    Matched(__newpos, __value) => Matched(__newpos, Some(__value)),\n                                    Failed => Matched(__pos, None),\n                                };\n                                match __seq_res {\n                                    Matched(__pos, p) => Matched(__pos, { Extension::Attribute(Attribute { name: n, arguments: p.unwrap_or_default() }) }),\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n        }\n    }\n}\n\nfn __parse_attribute_name<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<String> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = {\n            let str_start = __pos;\n            match {\n                __state.suppress_fail += 1;\n                let res = {\n                    let __seq_res = if __input.len() > __pos {\n                        let (__ch, __next) = char_range_at(__input, __pos);\n                        match __ch {\n                            '_' | 'a'...'z' | 'A'...'Z' => Matched(__next, ()),\n                            _ => __state.mark_failure(__pos, \"[_a-zA-Z]\"),\n                        }\n                    } else {\n                        __state.mark_failure(__pos, \"[_a-zA-Z]\")\n                    };\n                    match __seq_res {\n                        Matched(__pos, _) => {\n                            let mut __repeat_pos = __pos;\n                            loop {\n                                let __pos = __repeat_pos;\n                                let __step_res = if __input.len() > __pos {\n                                    let (__ch, __next) = char_range_at(__input, __pos);\n                                    match __ch {\n                                        '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                        _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                    }\n                                } else {\n                                    __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                                };\n                                match __step_res {\n                                    Matched(__newpos, __value) => {\n                                        __repeat_pos = __newpos;\n                                    }\n                                    Failed => {\n                                        break;\n                                    }\n                                }\n                            }\n                            Matched(__repeat_pos, ())\n                        }\n                        Failed => Failed,\n                    }\n                };\n                __state.suppress_fail -= 1;\n                res\n            } {\n                Matched(__newpos, _) => Matched(__newpos, &__input[str_start..__newpos]),\n                Failed => Failed,\n            }\n        };\n        match __seq_res {\n            Matched(__pos, n) => Matched(__pos, { String::from(n) }),\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_attribute_parameters<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Vec<Node<Expression>>> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = slice_eq(__input, __state, __pos, \"(\");\n        match __seq_res {\n            Matched(__pos, _) => {\n                let __seq_res = __parse__(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = {\n                            let __seq_res = {\n                                let mut __repeat_pos = __pos;\n                                let mut __repeat_value = vec![];\n                                loop {\n                                    let __pos = __repeat_pos;\n                                    let __pos = if __repeat_value.len() > 0 {\n                                        let __sep_res = {\n                                            let __seq_res = __parse__(__input, __state, __pos, env);\n                                            match __seq_res {\n                                                Matched(__pos, _) => {\n                                                    let __seq_res = slice_eq(__input, __state, __pos, \",\");\n                                                    match __seq_res {\n                                                        Matched(__pos, _) => __parse__(__input, __state, __pos, env),\n                                                        Failed => Failed,\n                                                    }\n                                                }\n                                                Failed => Failed,\n                                            }\n                                        };\n                                        match __sep_res {\n                                            Matched(__newpos, _) => __newpos,\n                                            Failed => break,\n                                        }\n                                    } else {\n                                        __pos\n                                    };\n                                    let __step_res = {\n                                        let __seq_res = Matched(__pos, __pos);\n                                        match __seq_res {\n                                            Matched(__pos, l) => {\n                                                let __seq_res = __parse_assignment_expression0(__input, __state, __pos, env);\n                                                match __seq_res {\n                                                    Matched(__pos, e) => {\n                                                        let __seq_res = Matched(__pos, __pos);\n                                                        match __seq_res {\n                                                            Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    };\n                                    match __step_res {\n                                        Matched(__newpos, __value) => {\n                                            __repeat_pos = __newpos;\n                                            __repeat_value.push(__value);\n                                        }\n                                        Failed => {\n                                            break;\n                                        }\n                                    }\n                                }\n                                Matched(__repeat_pos, __repeat_value)\n                            };\n                            match __seq_res {\n                                Matched(__pos, e) => Matched(__pos, { e }),\n                                Failed => Failed,\n                            }\n                        };\n                        match __seq_res {\n                            Matched(__pos, e) => {\n                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                match __seq_res {\n                                    Matched(__pos, _) => {\n                                        let __seq_res = slice_eq(__input, __state, __pos, \")\");\n                                        match __seq_res {\n                                            Matched(__pos, _) => Matched(__pos, { e }),\n                                            Failed => Failed,\n                                        }\n                                    }\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_attr_availability<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<AvailabilityAttribute> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = {\n            __state.suppress_fail += 1;\n            let res = {\n                let __seq_res = slice_eq(__input, __state, __pos, \"availability\");\n                match __seq_res {\n                    Matched(__pos, e) => {\n                        let __seq_res = {\n                            __state.suppress_fail += 1;\n                            let __assert_res = if __input.len() > __pos {\n                                let (__ch, __next) = char_range_at(__input, __pos);\n                                match __ch {\n                                    '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                    _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                }\n                            } else {\n                                __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                            };\n                            __state.suppress_fail -= 1;\n                            match __assert_res {\n                                Failed => Matched(__pos, ()),\n                                Matched(..) => Failed,\n                            }\n                        };\n                        match __seq_res {\n                            Matched(__pos, _) => Matched(__pos, { e }),\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            };\n            __state.suppress_fail -= 1;\n            res\n        };\n        match __seq_res {\n            Matched(__pos, _) => {\n                let __seq_res = __parse__(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = slice_eq(__input, __state, __pos, \"(\");\n                        match __seq_res {\n                            Matched(__pos, _) => {\n                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                match __seq_res {\n                                    Matched(__pos, _) => {\n                                        let __seq_res = __parse_identifier(__input, __state, __pos, env);\n                                        match __seq_res {\n                                            Matched(__pos, p) => {\n                                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                                match __seq_res {\n                                                    Matched(__pos, _) => {\n                                                        let __seq_res = slice_eq(__input, __state, __pos, \",\");\n                                                        match __seq_res {\n                                                            Matched(__pos, _) => {\n                                                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                                                match __seq_res {\n                                                                    Matched(__pos, _) => {\n                                                                        let __seq_res = {\n                                                                            let __seq_res = {\n                                                                                let mut __repeat_pos = __pos;\n                                                                                let mut __repeat_value = vec![];\n                                                                                loop {\n                                                                                    let __pos = __repeat_pos;\n                                                                                    let __pos = if __repeat_value.len() > 0 {\n                                                                                        let __sep_res = {\n                                                                                            let __seq_res = __parse__(__input, __state, __pos, env);\n                                                                                            match __seq_res {\n                                                                                                Matched(__pos, _) => {\n                                                                                                    let __seq_res = slice_eq(__input, __state, __pos, \",\");\n                                                                                                    match __seq_res {\n                                                                                                        Matched(__pos, _) => __parse__(__input, __state, __pos, env),\n                                                                                                        Failed => Failed,\n                                                                                                    }\n                                                                                                }\n                                                                                                Failed => Failed,\n                                                                                            }\n                                                                                        };\n                                                                                        match __sep_res {\n                                                                                            Matched(__newpos, _) => __newpos,\n                                                                                            Failed => break,\n                                                                                        }\n                                                                                    } else {\n                                                                                        __pos\n                                                                                    };\n                                                                                    let __step_res = {\n                                                                                        let __seq_res = Matched(__pos, __pos);\n                                                                                        match __seq_res {\n                                                                                            Matched(__pos, l) => {\n                                                                                                let __seq_res = __parse_attr_availability_clause(__input, __state, __pos, env);\n                                                                                                match __seq_res {\n                                                                                                    Matched(__pos, e) => {\n                                                                                                        let __seq_res = Matched(__pos, __pos);\n                                                                                                        match __seq_res {\n                                                                                                            Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                                                                            Failed => Failed,\n                                                                                                        }\n                                                                                                    }\n                                                                                                    Failed => Failed,\n                                                                                                }\n                                                                                            }\n                                                                                            Failed => Failed,\n                                                                                        }\n                                                                                    };\n                                                                                    match __step_res {\n                                                                                        Matched(__newpos, __value) => {\n                                                                                            __repeat_pos = __newpos;\n                                                                                            __repeat_value.push(__value);\n                                                                                        }\n                                                                                        Failed => {\n                                                                                            break;\n                                                                                        }\n                                                                                    }\n                                                                                }\n                                                                                if __repeat_value.len() >= 1 {\n                                                                                    Matched(__repeat_pos, __repeat_value)\n                                                                                } else {\n                                                                                    Failed\n                                                                                }\n                                                                            };\n                                                                            match __seq_res {\n                                                                                Matched(__pos, e) => Matched(__pos, { e }),\n                                                                                Failed => Failed,\n                                                                            }\n                                                                        };\n                                                                        match __seq_res {\n                                                                            Matched(__pos, c) => {\n                                                                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                                                                match __seq_res {\n                                                                                    Matched(__pos, _) => {\n                                                                                        let __seq_res = slice_eq(__input, __state, __pos, \")\");\n                                                                                        match __seq_res {\n                                                                                            Matched(__pos, _) => Matched(__pos, { AvailabilityAttribute { platform: p, clauses: c } }),\n                                                                                            Failed => Failed,\n                                                                                        }\n                                                                                    }\n                                                                                    Failed => Failed,\n                                                                                }\n                                                                            }\n                                                                            Failed => Failed,\n                                                                        }\n                                                                    }\n                                                                    Failed => Failed,\n                                                                }\n                                                            }\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    }\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_attr_availability_clause<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<AvailabilityClause> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            let __seq_res = {\n                __state.suppress_fail += 1;\n                let res = {\n                    let __seq_res = slice_eq(__input, __state, __pos, \"introduced\");\n                    match __seq_res {\n                        Matched(__pos, e) => {\n                            let __seq_res = {\n                                __state.suppress_fail += 1;\n                                let __assert_res = if __input.len() > __pos {\n                                    let (__ch, __next) = char_range_at(__input, __pos);\n                                    match __ch {\n                                        '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                        _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                    }\n                                } else {\n                                    __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                                };\n                                __state.suppress_fail -= 1;\n                                match __assert_res {\n                                    Failed => Matched(__pos, ()),\n                                    Matched(..) => Failed,\n                                }\n                            };\n                            match __seq_res {\n                                Matched(__pos, _) => Matched(__pos, { e }),\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                };\n                __state.suppress_fail -= 1;\n                res\n            };\n            match __seq_res {\n                Matched(__pos, _) => {\n                    let __seq_res = __parse__(__input, __state, __pos, env);\n                    match __seq_res {\n                        Matched(__pos, _) => {\n                            let __seq_res = slice_eq(__input, __state, __pos, \"=\");\n                            match __seq_res {\n                                Matched(__pos, _) => {\n                                    let __seq_res = __parse__(__input, __state, __pos, env);\n                                    match __seq_res {\n                                        Matched(__pos, _) => {\n                                            let __seq_res = {\n                                                let __seq_res = Matched(__pos, __pos);\n                                                match __seq_res {\n                                                    Matched(__pos, l) => {\n                                                        let __seq_res = __parse_attr_availability_version(__input, __state, __pos, env);\n                                                        match __seq_res {\n                                                            Matched(__pos, e) => {\n                                                                let __seq_res = Matched(__pos, __pos);\n                                                                match __seq_res {\n                                                                    Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                                    Failed => Failed,\n                                                                }\n                                                            }\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            };\n                                            match __seq_res {\n                                                Matched(__pos, v) => Matched(__pos, { AvailabilityClause::Introduced(v) }),\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                }\n                Failed => Failed,\n            }\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                let __choice_res = {\n                    let __seq_res = {\n                        __state.suppress_fail += 1;\n                        let res = {\n                            let __seq_res = slice_eq(__input, __state, __pos, \"deprecated\");\n                            match __seq_res {\n                                Matched(__pos, e) => {\n                                    let __seq_res = {\n                                        __state.suppress_fail += 1;\n                                        let __assert_res = if __input.len() > __pos {\n                                            let (__ch, __next) = char_range_at(__input, __pos);\n                                            match __ch {\n                                                '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                                _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                            }\n                                        } else {\n                                            __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                                        };\n                                        __state.suppress_fail -= 1;\n                                        match __assert_res {\n                                            Failed => Matched(__pos, ()),\n                                            Matched(..) => Failed,\n                                        }\n                                    };\n                                    match __seq_res {\n                                        Matched(__pos, _) => Matched(__pos, { e }),\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        };\n                        __state.suppress_fail -= 1;\n                        res\n                    };\n                    match __seq_res {\n                        Matched(__pos, _) => {\n                            let __seq_res = __parse__(__input, __state, __pos, env);\n                            match __seq_res {\n                                Matched(__pos, _) => {\n                                    let __seq_res = slice_eq(__input, __state, __pos, \"=\");\n                                    match __seq_res {\n                                        Matched(__pos, _) => {\n                                            let __seq_res = __parse__(__input, __state, __pos, env);\n                                            match __seq_res {\n                                                Matched(__pos, _) => {\n                                                    let __seq_res = {\n                                                        let __seq_res = Matched(__pos, __pos);\n                                                        match __seq_res {\n                                                            Matched(__pos, l) => {\n                                                                let __seq_res = __parse_attr_availability_version(__input, __state, __pos, env);\n                                                                match __seq_res {\n                                                                    Matched(__pos, e) => {\n                                                                        let __seq_res = Matched(__pos, __pos);\n                                                                        match __seq_res {\n                                                                            Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                                            Failed => Failed,\n                                                                        }\n                                                                    }\n                                                                    Failed => Failed,\n                                                                }\n                                                            }\n                                                            Failed => Failed,\n                                                        }\n                                                    };\n                                                    match __seq_res {\n                                                        Matched(__pos, v) => Matched(__pos, { AvailabilityClause::Deprecated(v) }),\n                                                        Failed => Failed,\n                                                    }\n                                                }\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                };\n                match __choice_res {\n                    Matched(__pos, __value) => Matched(__pos, __value),\n                    Failed => {\n                        let __choice_res = {\n                            let __seq_res = {\n                                __state.suppress_fail += 1;\n                                let res = {\n                                    let __seq_res = slice_eq(__input, __state, __pos, \"obsoleted\");\n                                    match __seq_res {\n                                        Matched(__pos, e) => {\n                                            let __seq_res = {\n                                                __state.suppress_fail += 1;\n                                                let __assert_res = if __input.len() > __pos {\n                                                    let (__ch, __next) = char_range_at(__input, __pos);\n                                                    match __ch {\n                                                        '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                                        _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                                    }\n                                                } else {\n                                                    __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                                                };\n                                                __state.suppress_fail -= 1;\n                                                match __assert_res {\n                                                    Failed => Matched(__pos, ()),\n                                                    Matched(..) => Failed,\n                                                }\n                                            };\n                                            match __seq_res {\n                                                Matched(__pos, _) => Matched(__pos, { e }),\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                };\n                                __state.suppress_fail -= 1;\n                                res\n                            };\n                            match __seq_res {\n                                Matched(__pos, _) => {\n                                    let __seq_res = __parse__(__input, __state, __pos, env);\n                                    match __seq_res {\n                                        Matched(__pos, _) => {\n                                            let __seq_res = slice_eq(__input, __state, __pos, \"=\");\n                                            match __seq_res {\n                                                Matched(__pos, _) => {\n                                                    let __seq_res = __parse__(__input, __state, __pos, env);\n                                                    match __seq_res {\n                                                        Matched(__pos, _) => {\n                                                            let __seq_res = {\n                                                                let __seq_res = Matched(__pos, __pos);\n                                                                match __seq_res {\n                                                                    Matched(__pos, l) => {\n                                                                        let __seq_res = __parse_attr_availability_version(__input, __state, __pos, env);\n                                                                        match __seq_res {\n                                                                            Matched(__pos, e) => {\n                                                                                let __seq_res = Matched(__pos, __pos);\n                                                                                match __seq_res {\n                                                                                    Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                                                    Failed => Failed,\n                                                                                }\n                                                                            }\n                                                                            Failed => Failed,\n                                                                        }\n                                                                    }\n                                                                    Failed => Failed,\n                                                                }\n                                                            };\n                                                            match __seq_res {\n                                                                Matched(__pos, v) => Matched(__pos, { AvailabilityClause::Obsoleted(v) }),\n                                                                Failed => Failed,\n                                                            }\n                                                        }\n                                                        Failed => Failed,\n                                                    }\n                                                }\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        };\n                        match __choice_res {\n                            Matched(__pos, __value) => Matched(__pos, __value),\n                            Failed => {\n                                let __choice_res = {\n                                    let __seq_res = {\n                                        __state.suppress_fail += 1;\n                                        let res = {\n                                            let __seq_res = slice_eq(__input, __state, __pos, \"unavailable\");\n                                            match __seq_res {\n                                                Matched(__pos, e) => {\n                                                    let __seq_res = {\n                                                        __state.suppress_fail += 1;\n                                                        let __assert_res = if __input.len() > __pos {\n                                                            let (__ch, __next) = char_range_at(__input, __pos);\n                                                            match __ch {\n                                                                '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                                                _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                                            }\n                                                        } else {\n                                                            __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                                                        };\n                                                        __state.suppress_fail -= 1;\n                                                        match __assert_res {\n                                                            Failed => Matched(__pos, ()),\n                                                            Matched(..) => Failed,\n                                                        }\n                                                    };\n                                                    match __seq_res {\n                                                        Matched(__pos, _) => Matched(__pos, { e }),\n                                                        Failed => Failed,\n                                                    }\n                                                }\n                                                Failed => Failed,\n                                            }\n                                        };\n                                        __state.suppress_fail -= 1;\n                                        res\n                                    };\n                                    match __seq_res {\n                                        Matched(__pos, _) => Matched(__pos, { AvailabilityClause::Unavailable }),\n                                        Failed => Failed,\n                                    }\n                                };\n                                match __choice_res {\n                                    Matched(__pos, __value) => Matched(__pos, __value),\n                                    Failed => {\n                                        let __choice_res = {\n                                            let __seq_res = {\n                                                __state.suppress_fail += 1;\n                                                let res = {\n                                                    let __seq_res = slice_eq(__input, __state, __pos, \"message\");\n                                                    match __seq_res {\n                                                        Matched(__pos, e) => {\n                                                            let __seq_res = {\n                                                                __state.suppress_fail += 1;\n                                                                let __assert_res = if __input.len() > __pos {\n                                                                    let (__ch, __next) = char_range_at(__input, __pos);\n                                                                    match __ch {\n                                                                        '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                                                        _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                                                    }\n                                                                } else {\n                                                                    __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                                                                };\n                                                                __state.suppress_fail -= 1;\n                                                                match __assert_res {\n                                                                    Failed => Matched(__pos, ()),\n                                                                    Matched(..) => Failed,\n                                                                }\n                                                            };\n                                                            match __seq_res {\n                                                                Matched(__pos, _) => Matched(__pos, { e }),\n                                                                Failed => Failed,\n                                                            }\n                                                        }\n                                                        Failed => Failed,\n                                                    }\n                                                };\n                                                __state.suppress_fail -= 1;\n                                                res\n                                            };\n                                            match __seq_res {\n                                                Matched(__pos, _) => {\n                                                    let __seq_res = __parse__(__input, __state, __pos, env);\n                                                    match __seq_res {\n                                                        Matched(__pos, _) => {\n                                                            let __seq_res = slice_eq(__input, __state, __pos, \"=\");\n                                                            match __seq_res {\n                                                                Matched(__pos, _) => {\n                                                                    let __seq_res = __parse__(__input, __state, __pos, env);\n                                                                    match __seq_res {\n                                                                        Matched(__pos, _) => {\n                                                                            let __seq_res = __parse_string_literal(__input, __state, __pos, env);\n                                                                            match __seq_res {\n                                                                                Matched(__pos, s) => Matched(__pos, { AvailabilityClause::Message(s) }),\n                                                                                Failed => Failed,\n                                                                            }\n                                                                        }\n                                                                        Failed => Failed,\n                                                                    }\n                                                                }\n                                                                Failed => Failed,\n                                                            }\n                                                        }\n                                                        Failed => Failed,\n                                                    }\n                                                }\n                                                Failed => Failed,\n                                            }\n                                        };\n                                        match __choice_res {\n                                            Matched(__pos, __value) => Matched(__pos, __value),\n                                            Failed => {\n                                                let __seq_res = {\n                                                    __state.suppress_fail += 1;\n                                                    let res = {\n                                                        let __seq_res = slice_eq(__input, __state, __pos, \"replacement\");\n                                                        match __seq_res {\n                                                            Matched(__pos, e) => {\n                                                                let __seq_res = {\n                                                                    __state.suppress_fail += 1;\n                                                                    let __assert_res = if __input.len() > __pos {\n                                                                        let (__ch, __next) = char_range_at(__input, __pos);\n                                                                        match __ch {\n                                                                            '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                                                            _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                                                        }\n                                                                    } else {\n                                                                        __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                                                                    };\n                                                                    __state.suppress_fail -= 1;\n                                                                    match __assert_res {\n                                                                        Failed => Matched(__pos, ()),\n                                                                        Matched(..) => Failed,\n                                                                    }\n                                                                };\n                                                                match __seq_res {\n                                                                    Matched(__pos, _) => Matched(__pos, { e }),\n                                                                    Failed => Failed,\n                                                                }\n                                                            }\n                                                            Failed => Failed,\n                                                        }\n                                                    };\n                                                    __state.suppress_fail -= 1;\n                                                    res\n                                                };\n                                                match __seq_res {\n                                                    Matched(__pos, _) => {\n                                                        let __seq_res = __parse__(__input, __state, __pos, env);\n                                                        match __seq_res {\n                                                            Matched(__pos, _) => {\n                                                                let __seq_res = slice_eq(__input, __state, __pos, \"=\");\n                                                                match __seq_res {\n                                                                    Matched(__pos, _) => {\n                                                                        let __seq_res = __parse__(__input, __state, __pos, env);\n                                                                        match __seq_res {\n                                                                            Matched(__pos, _) => {\n                                                                                let __seq_res = __parse_string_literal(__input, __state, __pos, env);\n                                                                                match __seq_res {\n                                                                                    Matched(__pos, s) => Matched(__pos, { AvailabilityClause::Replacement(s) }),\n                                                                                    Failed => Failed,\n                                                                                }\n                                                                            }\n                                                                            Failed => Failed,\n                                                                        }\n                                                                    }\n                                                                    Failed => Failed,\n                                                                }\n                                                            }\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n\nfn __parse_attr_availability_version<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<AvailabilityVersion> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = {\n            let str_start = __pos;\n            match {\n                let mut __repeat_pos = __pos;\n                let mut __repeat_value = vec![];\n                loop {\n                    let __pos = __repeat_pos;\n                    let __step_res = __parse_dec(__input, __state, __pos, env);\n                    match __step_res {\n                        Matched(__newpos, __value) => {\n                            __repeat_pos = __newpos;\n                            __repeat_value.push(__value);\n                        }\n                        Failed => {\n                            break;\n                        }\n                    }\n                }\n                if __repeat_value.len() >= 1 {\n                    Matched(__repeat_pos, ())\n                } else {\n                    Failed\n                }\n            } {\n                Matched(__newpos, _) => Matched(__newpos, &__input[str_start..__newpos]),\n                Failed => Failed,\n            }\n        };\n        match __seq_res {\n            Matched(__pos, a) => {\n                let __seq_res = match {\n                    let __seq_res = slice_eq(__input, __state, __pos, \".\");\n                    match __seq_res {\n                        Matched(__pos, _) => {\n                            let str_start = __pos;\n                            match {\n                                let mut __repeat_pos = __pos;\n                                let mut __repeat_value = vec![];\n                                loop {\n                                    let __pos = __repeat_pos;\n                                    let __step_res = __parse_dec(__input, __state, __pos, env);\n                                    match __step_res {\n                                        Matched(__newpos, __value) => {\n                                            __repeat_pos = __newpos;\n                                            __repeat_value.push(__value);\n                                        }\n                                        Failed => {\n                                            break;\n                                        }\n                                    }\n                                }\n                                if __repeat_value.len() >= 1 {\n                                    Matched(__repeat_pos, ())\n                                } else {\n                                    Failed\n                                }\n                            } {\n                                Matched(__newpos, _) => Matched(__newpos, &__input[str_start..__newpos]),\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                } {\n                    Matched(__newpos, __value) => Matched(__newpos, Some(__value)),\n                    Failed => Matched(__pos, None),\n                };\n                match __seq_res {\n                    Matched(__pos, b) => {\n                        let __seq_res = match {\n                            let __seq_res = slice_eq(__input, __state, __pos, \".\");\n                            match __seq_res {\n                                Matched(__pos, _) => {\n                                    let str_start = __pos;\n                                    match {\n                                        let mut __repeat_pos = __pos;\n                                        let mut __repeat_value = vec![];\n                                        loop {\n                                            let __pos = __repeat_pos;\n                                            let __step_res = __parse_dec(__input, __state, __pos, env);\n                                            match __step_res {\n                                                Matched(__newpos, __value) => {\n                                                    __repeat_pos = __newpos;\n                                                    __repeat_value.push(__value);\n                                                }\n                                                Failed => {\n                                                    break;\n                                                }\n                                            }\n                                        }\n                                        if __repeat_value.len() >= 1 {\n                                            Matched(__repeat_pos, ())\n                                        } else {\n                                            Failed\n                                        }\n                                    } {\n                                        Matched(__newpos, _) => Matched(__newpos, &__input[str_start..__newpos]),\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        } {\n                            Matched(__newpos, __value) => Matched(__newpos, Some(__value)),\n                            Failed => Matched(__pos, None),\n                        };\n                        match __seq_res {\n                            Matched(__pos, c) => Matched(__pos, { AvailabilityVersion { major: a.into(), minor: b.map(str::to_owned), subminor: c.map(str::to_owned) } }),\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_asm_label<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Node<Extension>> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = Matched(__pos, __pos);\n        match __seq_res {\n            Matched(__pos, l) => {\n                let __seq_res = __parse_asm_label0(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, e) => {\n                        let __seq_res = Matched(__pos, __pos);\n                        match __seq_res {\n                            Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_asm_label0<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Extension> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = __parse_asm_label_keyword(__input, __state, __pos, env);\n        match __seq_res {\n            Matched(__pos, _) => {\n                let __seq_res = __parse__(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = slice_eq(__input, __state, __pos, \"(\");\n                        match __seq_res {\n                            Matched(__pos, _) => {\n                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                match __seq_res {\n                                    Matched(__pos, _) => {\n                                        let __seq_res = __parse_string_literal(__input, __state, __pos, env);\n                                        match __seq_res {\n                                            Matched(__pos, s) => {\n                                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                                match __seq_res {\n                                                    Matched(__pos, _) => {\n                                                        let __seq_res = slice_eq(__input, __state, __pos, \")\");\n                                                        match __seq_res {\n                                                            Matched(__pos, _) => Matched(__pos, { Extension::AsmLabel(s) }),\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    }\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_asm_label_keyword<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<()> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            __state.suppress_fail += 1;\n            let res = {\n                let __choice_res = {\n                    __state.suppress_fail += 1;\n                    let res = {\n                        let __seq_res = slice_eq(__input, __state, __pos, \"asm\");\n                        match __seq_res {\n                            Matched(__pos, e) => {\n                                let __seq_res = {\n                                    __state.suppress_fail += 1;\n                                    let __assert_res = if __input.len() > __pos {\n                                        let (__ch, __next) = char_range_at(__input, __pos);\n                                        match __ch {\n                                            '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                            _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                        }\n                                    } else {\n                                        __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                                    };\n                                    __state.suppress_fail -= 1;\n                                    match __assert_res {\n                                        Failed => Matched(__pos, ()),\n                                        Matched(..) => Failed,\n                                    }\n                                };\n                                match __seq_res {\n                                    Matched(__pos, _) => Matched(__pos, { e }),\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    };\n                    __state.suppress_fail -= 1;\n                    res\n                };\n                match __choice_res {\n                    Matched(__pos, __value) => Matched(__pos, __value),\n                    Failed => {\n                        __state.suppress_fail += 1;\n                        let res = {\n                            let __seq_res = {\n                                let __seq_res = slice_eq(__input, __state, __pos, \"__asm\");\n                                match __seq_res {\n                                    Matched(__pos, _) => match slice_eq(__input, __state, __pos, \"__\") {\n                                        Matched(__newpos, _) => Matched(__newpos, ()),\n                                        Failed => Matched(__pos, ()),\n                                    },\n                                    Failed => Failed,\n                                }\n                            };\n                            match __seq_res {\n                                Matched(__pos, e) => {\n                                    let __seq_res = {\n                                        __state.suppress_fail += 1;\n                                        let __assert_res = if __input.len() > __pos {\n                                            let (__ch, __next) = char_range_at(__input, __pos);\n                                            match __ch {\n                                                '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                                _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                            }\n                                        } else {\n                                            __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                                        };\n                                        __state.suppress_fail -= 1;\n                                        match __assert_res {\n                                            Failed => Matched(__pos, ()),\n                                            Matched(..) => Failed,\n                                        }\n                                    };\n                                    match __seq_res {\n                                        Matched(__pos, _) => Matched(__pos, { e }),\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        };\n                        __state.suppress_fail -= 1;\n                        res\n                    }\n                }\n            };\n            __state.suppress_fail -= 1;\n            res\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                __state.mark_failure(__pos, \"asm\");\n                Failed\n            }\n        }\n    }\n}\n\nfn __parse_asm_statement<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Statement> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = {\n            let __seq_res = Matched(__pos, __pos);\n            match __seq_res {\n                Matched(__pos, l) => {\n                    let __seq_res = __parse_asm_statement0(__input, __state, __pos, env);\n                    match __seq_res {\n                        Matched(__pos, e) => {\n                            let __seq_res = Matched(__pos, __pos);\n                            match __seq_res {\n                                Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                }\n                Failed => Failed,\n            }\n        };\n        match __seq_res {\n            Matched(__pos, s) => Matched(__pos, { Statement::Asm(s) }),\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_asm_statement0<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<AsmStatement> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = {\n            __state.suppress_fail += 1;\n            let res = {\n                let __seq_res = {\n                    let __choice_res = slice_eq(__input, __state, __pos, \"asm\");\n                    match __choice_res {\n                        Matched(__pos, __value) => Matched(__pos, __value),\n                        Failed => {\n                            let __seq_res = slice_eq(__input, __state, __pos, \"__asm\");\n                            match __seq_res {\n                                Matched(__pos, _) => match slice_eq(__input, __state, __pos, \"__\") {\n                                    Matched(__newpos, _) => Matched(__newpos, ()),\n                                    Failed => Matched(__pos, ()),\n                                },\n                                Failed => Failed,\n                            }\n                        }\n                    }\n                };\n                match __seq_res {\n                    Matched(__pos, e) => {\n                        let __seq_res = {\n                            __state.suppress_fail += 1;\n                            let __assert_res = if __input.len() > __pos {\n                                let (__ch, __next) = char_range_at(__input, __pos);\n                                match __ch {\n                                    '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                    _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                }\n                            } else {\n                                __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                            };\n                            __state.suppress_fail -= 1;\n                            match __assert_res {\n                                Failed => Matched(__pos, ()),\n                                Matched(..) => Failed,\n                            }\n                        };\n                        match __seq_res {\n                            Matched(__pos, _) => Matched(__pos, { e }),\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            };\n            __state.suppress_fail -= 1;\n            res\n        };\n        match __seq_res {\n            Matched(__pos, _) => {\n                let __seq_res = __parse__(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = match __parse_type_qualifier(__input, __state, __pos, env) {\n                            Matched(__newpos, __value) => Matched(__newpos, Some(__value)),\n                            Failed => Matched(__pos, None),\n                        };\n                        match __seq_res {\n                            Matched(__pos, q) => {\n                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                match __seq_res {\n                                    Matched(__pos, _) => {\n                                        let __seq_res = slice_eq(__input, __state, __pos, \"(\");\n                                        match __seq_res {\n                                            Matched(__pos, _) => {\n                                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                                match __seq_res {\n                                                    Matched(__pos, _) => {\n                                                        let __seq_res = __parse_string_literal(__input, __state, __pos, env);\n                                                        match __seq_res {\n                                                            Matched(__pos, a) => {\n                                                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                                                match __seq_res {\n                                                                    Matched(__pos, _) => {\n                                                                        let __seq_res = match {\n                                                                            let __seq_res = slice_eq(__input, __state, __pos, \":\");\n                                                                            match __seq_res {\n                                                                                Matched(__pos, _) => {\n                                                                                    let __seq_res = __parse__(__input, __state, __pos, env);\n                                                                                    match __seq_res {\n                                                                                        Matched(__pos, _) => {\n                                                                                            let __seq_res = __parse_asm_operand_list(__input, __state, __pos, env);\n                                                                                            match __seq_res {\n                                                                                                Matched(__pos, e) => {\n                                                                                                    let __seq_res = __parse__(__input, __state, __pos, env);\n                                                                                                    match __seq_res {\n                                                                                                        Matched(__pos, _) => {\n                                                                                                            let __seq_res = match {\n                                                                                                                let __seq_res = slice_eq(__input, __state, __pos, \":\");\n                                                                                                                match __seq_res {\n                                                                                                                    Matched(__pos, _) => {\n                                                                                                                        let __seq_res = __parse__(__input, __state, __pos, env);\n                                                                                                                        match __seq_res {\n                                                                                                                            Matched(__pos, _) => {\n                                                                                                                                let __seq_res = __parse_asm_operand_list(__input, __state, __pos, env);\n                                                                                                                                match __seq_res {\n                                                                                                                                    Matched(__pos, e) => {\n                                                                                                                                        let __seq_res = __parse__(__input, __state, __pos, env);\n                                                                                                                                        match __seq_res {\n                                                                                                                                            Matched(__pos, _) => {\n                                                                                                                                                let __seq_res = match {\n                                                                                                                                                    let __seq_res = slice_eq(__input, __state, __pos, \":\");\n                                                                                                                                                    match __seq_res {\n                                                                                                                                                        Matched(__pos, _) => {\n                                                                                                                                                            let __seq_res = __parse__(__input, __state, __pos, env);\n                                                                                                                                                            match __seq_res {\n                                                                                                                                                                Matched(__pos, _) => {\n                                                                                                                                                                    let __seq_res = {\n                                                                                                                                                                        let __seq_res = {\n                                                                                                                                                                            let mut __repeat_pos = __pos;\n                                                                                                                                                                            let mut __repeat_value = vec![];\n                                                                                                                                                                            loop {\n                                                                                                                                                                                let __pos = __repeat_pos;\n                                                                                                                                                                                let __pos = if __repeat_value.len() > 0 {\n                                                                                                                                                                                    let __sep_res = {\n                                                                                                                                                                                        let __seq_res = __parse__(__input, __state, __pos, env);\n                                                                                                                                                                                        match __seq_res {\n                                                                                                                                                                                            Matched(__pos, _) => {\n                                                                                                                                                                                                let __seq_res = slice_eq(__input, __state, __pos, \",\");\n                                                                                                                                                                                                match __seq_res {\n                                                                                                                                                                                                    Matched(__pos, _) => __parse__(__input, __state, __pos, env),\n                                                                                                                                                                                                    Failed => Failed,\n                                                                                                                                                                                                }\n                                                                                                                                                                                            }\n                                                                                                                                                                                            Failed => Failed,\n                                                                                                                                                                                        }\n                                                                                                                                                                                    };\n                                                                                                                                                                                    match __sep_res {\n                                                                                                                                                                                        Matched(__newpos, _) => __newpos,\n                                                                                                                                                                                        Failed => break,\n                                                                                                                                                                                    }\n                                                                                                                                                                                } else {\n                                                                                                                                                                                    __pos\n                                                                                                                                                                                };\n                                                                                                                                                                                let __step_res = __parse_string_literal(__input, __state, __pos, env);\n                                                                                                                                                                                match __step_res {\n                                                                                                                                                                                    Matched(__newpos, __value) => {\n                                                                                                                                                                                        __repeat_pos = __newpos;\n                                                                                                                                                                                        __repeat_value.push(__value);\n                                                                                                                                                                                    }\n                                                                                                                                                                                    Failed => {\n                                                                                                                                                                                        break;\n                                                                                                                                                                                    }\n                                                                                                                                                                                }\n                                                                                                                                                                            }\n                                                                                                                                                                            Matched(__repeat_pos, __repeat_value)\n                                                                                                                                                                        };\n                                                                                                                                                                        match __seq_res {\n                                                                                                                                                                            Matched(__pos, e) => Matched(__pos, { e }),\n                                                                                                                                                                            Failed => Failed,\n                                                                                                                                                                        }\n                                                                                                                                                                    };\n                                                                                                                                                                    match __seq_res {\n                                                                                                                                                                        Matched(__pos, e) => {\n                                                                                                                                                                            let __seq_res = __parse__(__input, __state, __pos, env);\n                                                                                                                                                                            match __seq_res {\n                                                                                                                                                                                Matched(__pos, _) => {\n                                                                                                                                                                                    let __seq_res = match Matched(__pos, ()) {\n                                                                                                                                                                                        Matched(__newpos, __value) => Matched(__newpos, Some(__value)),\n                                                                                                                                                                                        Failed => Matched(__pos, None),\n                                                                                                                                                                                    };\n                                                                                                                                                                                    match __seq_res {\n                                                                                                                                                                                        Matched(__pos, t) => Matched(__pos, { (e, t.unwrap_or_default()) }),\n                                                                                                                                                                                        Failed => Failed,\n                                                                                                                                                                                    }\n                                                                                                                                                                                }\n                                                                                                                                                                                Failed => Failed,\n                                                                                                                                                                            }\n                                                                                                                                                                        }\n                                                                                                                                                                        Failed => Failed,\n                                                                                                                                                                    }\n                                                                                                                                                                }\n                                                                                                                                                                Failed => Failed,\n                                                                                                                                                            }\n                                                                                                                                                        }\n                                                                                                                                                        Failed => Failed,\n                                                                                                                                                    }\n                                                                                                                                                } {\n                                                                                                                                                    Matched(__newpos, __value) => Matched(__newpos, Some(__value)),\n                                                                                                                                                    Failed => Matched(__pos, None),\n                                                                                                                                                };\n                                                                                                                                                match __seq_res {\n                                                                                                                                                    Matched(__pos, t) => Matched(__pos, { (e, t.unwrap_or_default()) }),\n                                                                                                                                                    Failed => Failed,\n                                                                                                                                                }\n                                                                                                                                            }\n                                                                                                                                            Failed => Failed,\n                                                                                                                                        }\n                                                                                                                                    }\n                                                                                                                                    Failed => Failed,\n                                                                                                                                }\n                                                                                                                            }\n                                                                                                                            Failed => Failed,\n                                                                                                                        }\n                                                                                                                    }\n                                                                                                                    Failed => Failed,\n                                                                                                                }\n                                                                                                            } {\n                                                                                                                Matched(__newpos, __value) => Matched(__newpos, Some(__value)),\n                                                                                                                Failed => Matched(__pos, None),\n                                                                                                            };\n                                                                                                            match __seq_res {\n                                                                                                                Matched(__pos, t) => Matched(__pos, { (e, t.unwrap_or_default()) }),\n                                                                                                                Failed => Failed,\n                                                                                                            }\n                                                                                                        }\n                                                                                                        Failed => Failed,\n                                                                                                    }\n                                                                                                }\n                                                                                                Failed => Failed,\n                                                                                            }\n                                                                                        }\n                                                                                        Failed => Failed,\n                                                                                    }\n                                                                                }\n                                                                                Failed => Failed,\n                                                                            }\n                                                                        } {\n                                                                            Matched(__newpos, __value) => Matched(__newpos, Some(__value)),\n                                                                            Failed => Matched(__pos, None),\n                                                                        };\n                                                                        match __seq_res {\n                                                                            Matched(__pos, o) => {\n                                                                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                                                                match __seq_res {\n                                                                                    Matched(__pos, _) => {\n                                                                                        let __seq_res = slice_eq(__input, __state, __pos, \")\");\n                                                                                        match __seq_res {\n                                                                                            Matched(__pos, _) => {\n                                                                                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                                                                                match __seq_res {\n                                                                                                    Matched(__pos, _) => {\n                                                                                                        let __seq_res = slice_eq(__input, __state, __pos, \";\");\n                                                                                                        match __seq_res {\n                                                                                                            Matched(__pos, _) => Matched(__pos, {\n                                                                                                                if let Some((o, (i, (c, ())))) = o {\n                                                                                                                    AsmStatement::GnuExtended(GnuExtendedAsmStatement { qualifier: q, template: a, outputs: o, inputs: i, clobbers: c })\n                                                                                                                } else {\n                                                                                                                    AsmStatement::GnuBasic(a)\n                                                                                                                }\n                                                                                                            }),\n                                                                                                            Failed => Failed,\n                                                                                                        }\n                                                                                                    }\n                                                                                                    Failed => Failed,\n                                                                                                }\n                                                                                            }\n                                                                                            Failed => Failed,\n                                                                                        }\n                                                                                    }\n                                                                                    Failed => Failed,\n                                                                                }\n                                                                            }\n                                                                            Failed => Failed,\n                                                                        }\n                                                                    }\n                                                                    Failed => Failed,\n                                                                }\n                                                            }\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    }\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_asm_operand_list<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Vec<Node<GnuAsmOperand>>> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = {\n            let mut __repeat_pos = __pos;\n            let mut __repeat_value = vec![];\n            loop {\n                let __pos = __repeat_pos;\n                let __pos = if __repeat_value.len() > 0 {\n                    let __sep_res = {\n                        let __seq_res = __parse__(__input, __state, __pos, env);\n                        match __seq_res {\n                            Matched(__pos, _) => {\n                                let __seq_res = slice_eq(__input, __state, __pos, \",\");\n                                match __seq_res {\n                                    Matched(__pos, _) => __parse__(__input, __state, __pos, env),\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    };\n                    match __sep_res {\n                        Matched(__newpos, _) => __newpos,\n                        Failed => break,\n                    }\n                } else {\n                    __pos\n                };\n                let __step_res = {\n                    let __seq_res = Matched(__pos, __pos);\n                    match __seq_res {\n                        Matched(__pos, l) => {\n                            let __seq_res = __parse_asm_operand(__input, __state, __pos, env);\n                            match __seq_res {\n                                Matched(__pos, e) => {\n                                    let __seq_res = Matched(__pos, __pos);\n                                    match __seq_res {\n                                        Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                };\n                match __step_res {\n                    Matched(__newpos, __value) => {\n                        __repeat_pos = __newpos;\n                        __repeat_value.push(__value);\n                    }\n                    Failed => {\n                        break;\n                    }\n                }\n            }\n            Matched(__repeat_pos, __repeat_value)\n        };\n        match __seq_res {\n            Matched(__pos, e) => Matched(__pos, { e }),\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_asm_operand<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<GnuAsmOperand> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = match {\n            let __seq_res = slice_eq(__input, __state, __pos, \"[\");\n            match __seq_res {\n                Matched(__pos, _) => {\n                    let __seq_res = __parse__(__input, __state, __pos, env);\n                    match __seq_res {\n                        Matched(__pos, _) => {\n                            let __seq_res = __parse_identifier(__input, __state, __pos, env);\n                            match __seq_res {\n                                Matched(__pos, i) => {\n                                    let __seq_res = __parse__(__input, __state, __pos, env);\n                                    match __seq_res {\n                                        Matched(__pos, _) => {\n                                            let __seq_res = slice_eq(__input, __state, __pos, \"]\");\n                                            match __seq_res {\n                                                Matched(__pos, _) => {\n                                                    let __seq_res = __parse__(__input, __state, __pos, env);\n                                                    match __seq_res {\n                                                        Matched(__pos, _) => Matched(__pos, { i }),\n                                                        Failed => Failed,\n                                                    }\n                                                }\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                }\n                Failed => Failed,\n            }\n        } {\n            Matched(__newpos, __value) => Matched(__newpos, Some(__value)),\n            Failed => Matched(__pos, None),\n        };\n        match __seq_res {\n            Matched(__pos, i) => {\n                let __seq_res = __parse_string_literal(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, s) => {\n                        let __seq_res = __parse__(__input, __state, __pos, env);\n                        match __seq_res {\n                            Matched(__pos, _) => {\n                                let __seq_res = slice_eq(__input, __state, __pos, \"(\");\n                                match __seq_res {\n                                    Matched(__pos, _) => {\n                                        let __seq_res = __parse__(__input, __state, __pos, env);\n                                        match __seq_res {\n                                            Matched(__pos, _) => {\n                                                let __seq_res = {\n                                                    let __seq_res = Matched(__pos, __pos);\n                                                    match __seq_res {\n                                                        Matched(__pos, l) => {\n                                                            let __seq_res = __parse_expression0(__input, __state, __pos, env);\n                                                            match __seq_res {\n                                                                Matched(__pos, e) => {\n                                                                    let __seq_res = Matched(__pos, __pos);\n                                                                    match __seq_res {\n                                                                        Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                                        Failed => Failed,\n                                                                    }\n                                                                }\n                                                                Failed => Failed,\n                                                            }\n                                                        }\n                                                        Failed => Failed,\n                                                    }\n                                                };\n                                                match __seq_res {\n                                                    Matched(__pos, e) => {\n                                                        let __seq_res = __parse__(__input, __state, __pos, env);\n                                                        match __seq_res {\n                                                            Matched(__pos, _) => {\n                                                                let __seq_res = slice_eq(__input, __state, __pos, \")\");\n                                                                match __seq_res {\n                                                                    Matched(__pos, _) => Matched(__pos, { GnuAsmOperand { symbolic_name: i, constraints: s, variable_name: e } }),\n                                                                    Failed => Failed,\n                                                                }\n                                                            }\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    }\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_gnu_primary_expression<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Expression> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = __parse_statement_expression(__input, __state, __pos, env);\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                let __choice_res = __parse_offsetof_expression(__input, __state, __pos, env);\n                match __choice_res {\n                    Matched(__pos, __value) => Matched(__pos, __value),\n                    Failed => {\n                        let __choice_res = __parse_va_arg_expression(__input, __state, __pos, env);\n                        match __choice_res {\n                            Matched(__pos, __value) => Matched(__pos, __value),\n                            Failed => __parse_keyword_expression(__input, __state, __pos, env),\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n\nfn __parse_statement_expression<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Expression> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = slice_eq(__input, __state, __pos, \"(\");\n        match __seq_res {\n            Matched(__pos, _) => {\n                let __seq_res = __parse__(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = {\n                            let __seq_res = Matched(__pos, {\n                                env.enter_scope();\n                            });\n                            match __seq_res {\n                                Matched(__pos, _) => {\n                                    let __seq_res = match {\n                                        let __seq_res = Matched(__pos, __pos);\n                                        match __seq_res {\n                                            Matched(__pos, l) => {\n                                                let __seq_res = __parse_compound_statement(__input, __state, __pos, env);\n                                                match __seq_res {\n                                                    Matched(__pos, e) => {\n                                                        let __seq_res = Matched(__pos, __pos);\n                                                        match __seq_res {\n                                                            Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    } {\n                                        Matched(__newpos, __value) => Matched(__newpos, Some(__value)),\n                                        Failed => Matched(__pos, None),\n                                    };\n                                    match __seq_res {\n                                        Matched(__pos, e) => {\n                                            match {\n                                                env.leave_scope();\n                                                e.ok_or(\"\")\n                                            } {\n                                                Ok(res) => Matched(__pos, res),\n                                                Err(expected) => {\n                                                    __state.mark_failure(__pos, expected);\n                                                    Failed\n                                                }\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        };\n                        match __seq_res {\n                            Matched(__pos, s) => {\n                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                match __seq_res {\n                                    Matched(__pos, _) => {\n                                        let __seq_res = slice_eq(__input, __state, __pos, \")\");\n                                        match __seq_res {\n                                            Matched(__pos, _) => Matched(__pos, { Expression::Statement(Box::new(s)) }),\n                                            Failed => Failed,\n                                        }\n                                    }\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_va_arg_expression<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Expression> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = {\n            let __seq_res = Matched(__pos, __pos);\n            match __seq_res {\n                Matched(__pos, l) => {\n                    let __seq_res = __parse_va_arg_expression_inner(__input, __state, __pos, env);\n                    match __seq_res {\n                        Matched(__pos, e) => {\n                            let __seq_res = Matched(__pos, __pos);\n                            match __seq_res {\n                                Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                }\n                Failed => Failed,\n            }\n        };\n        match __seq_res {\n            Matched(__pos, n) => Matched(__pos, { Expression::VaArg(Box::new(n)) }),\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_va_arg_expression_inner<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<VaArgExpression> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = {\n            __state.suppress_fail += 1;\n            let res = {\n                let __seq_res = slice_eq(__input, __state, __pos, \"__builtin_va_arg\");\n                match __seq_res {\n                    Matched(__pos, e) => {\n                        let __seq_res = {\n                            __state.suppress_fail += 1;\n                            let __assert_res = if __input.len() > __pos {\n                                let (__ch, __next) = char_range_at(__input, __pos);\n                                match __ch {\n                                    '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                    _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                }\n                            } else {\n                                __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                            };\n                            __state.suppress_fail -= 1;\n                            match __assert_res {\n                                Failed => Matched(__pos, ()),\n                                Matched(..) => Failed,\n                            }\n                        };\n                        match __seq_res {\n                            Matched(__pos, _) => Matched(__pos, { e }),\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            };\n            __state.suppress_fail -= 1;\n            res\n        };\n        match __seq_res {\n            Matched(__pos, _) => {\n                let __seq_res = __parse__(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = slice_eq(__input, __state, __pos, \"(\");\n                        match __seq_res {\n                            Matched(__pos, _) => {\n                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                match __seq_res {\n                                    Matched(__pos, _) => {\n                                        let __seq_res = __parse_assignment_expression(__input, __state, __pos, env);\n                                        match __seq_res {\n                                            Matched(__pos, e) => {\n                                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                                match __seq_res {\n                                                    Matched(__pos, _) => {\n                                                        let __seq_res = slice_eq(__input, __state, __pos, \",\");\n                                                        match __seq_res {\n                                                            Matched(__pos, _) => {\n                                                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                                                match __seq_res {\n                                                                    Matched(__pos, _) => {\n                                                                        let __seq_res = __parse_type_name(__input, __state, __pos, env);\n                                                                        match __seq_res {\n                                                                            Matched(__pos, t) => {\n                                                                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                                                                match __seq_res {\n                                                                                    Matched(__pos, _) => {\n                                                                                        let __seq_res = slice_eq(__input, __state, __pos, \")\");\n                                                                                        match __seq_res {\n                                                                                            Matched(__pos, _) => Matched(__pos, { VaArgExpression { va_list: e, type_name: t } }),\n                                                                                            Failed => Failed,\n                                                                                        }\n                                                                                    }\n                                                                                    Failed => Failed,\n                                                                                }\n                                                                            }\n                                                                            Failed => Failed,\n                                                                        }\n                                                                    }\n                                                                    Failed => Failed,\n                                                                }\n                                                            }\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    }\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_keyword_expression<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Expression> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = {\n            let __seq_res = Matched(__pos, __pos);\n            match __seq_res {\n                Matched(__pos, l) => {\n                    let __seq_res = {\n                        let str_start = __pos;\n                        match __parse_keyword_expression0(__input, __state, __pos, env) {\n                            Matched(__newpos, _) => Matched(__newpos, &__input[str_start..__newpos]),\n                            Failed => Failed,\n                        }\n                    };\n                    match __seq_res {\n                        Matched(__pos, e) => {\n                            let __seq_res = Matched(__pos, __pos);\n                            match __seq_res {\n                                Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                }\n                Failed => Failed,\n            }\n        };\n        match __seq_res {\n            Matched(__pos, k) => Matched(__pos, {\n                let ident = Identifier { name: k.node.to_string() };\n                Expression::Identifier(Box::new(Node::new(ident, k.span)))\n            }),\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_keyword_expression0<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<()> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            __state.suppress_fail += 1;\n            let res = {\n                let __seq_res = slice_eq(__input, __state, __pos, \"__func__\");\n                match __seq_res {\n                    Matched(__pos, e) => {\n                        let __seq_res = {\n                            __state.suppress_fail += 1;\n                            let __assert_res = if __input.len() > __pos {\n                                let (__ch, __next) = char_range_at(__input, __pos);\n                                match __ch {\n                                    '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                    _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                }\n                            } else {\n                                __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                            };\n                            __state.suppress_fail -= 1;\n                            match __assert_res {\n                                Failed => Matched(__pos, ()),\n                                Matched(..) => Failed,\n                            }\n                        };\n                        match __seq_res {\n                            Matched(__pos, _) => Matched(__pos, { e }),\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            };\n            __state.suppress_fail -= 1;\n            res\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                let __choice_res = {\n                    __state.suppress_fail += 1;\n                    let res = {\n                        let __seq_res = slice_eq(__input, __state, __pos, \"__FUNCTION__\");\n                        match __seq_res {\n                            Matched(__pos, e) => {\n                                let __seq_res = {\n                                    __state.suppress_fail += 1;\n                                    let __assert_res = if __input.len() > __pos {\n                                        let (__ch, __next) = char_range_at(__input, __pos);\n                                        match __ch {\n                                            '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                            _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                        }\n                                    } else {\n                                        __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                                    };\n                                    __state.suppress_fail -= 1;\n                                    match __assert_res {\n                                        Failed => Matched(__pos, ()),\n                                        Matched(..) => Failed,\n                                    }\n                                };\n                                match __seq_res {\n                                    Matched(__pos, _) => Matched(__pos, { e }),\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    };\n                    __state.suppress_fail -= 1;\n                    res\n                };\n                match __choice_res {\n                    Matched(__pos, __value) => Matched(__pos, __value),\n                    Failed => {\n                        __state.suppress_fail += 1;\n                        let res = {\n                            let __seq_res = slice_eq(__input, __state, __pos, \"__PRETTY_FUNCTION__\");\n                            match __seq_res {\n                                Matched(__pos, e) => {\n                                    let __seq_res = {\n                                        __state.suppress_fail += 1;\n                                        let __assert_res = if __input.len() > __pos {\n                                            let (__ch, __next) = char_range_at(__input, __pos);\n                                            match __ch {\n                                                '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                                _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                            }\n                                        } else {\n                                            __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                                        };\n                                        __state.suppress_fail -= 1;\n                                        match __assert_res {\n                                            Failed => Matched(__pos, ()),\n                                            Matched(..) => Failed,\n                                        }\n                                    };\n                                    match __seq_res {\n                                        Matched(__pos, _) => Matched(__pos, { e }),\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        };\n                        __state.suppress_fail -= 1;\n                        res\n                    }\n                }\n            }\n        }\n    }\n}\n\nfn __parse_offsetof_expression<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<Expression> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = {\n            let __seq_res = Matched(__pos, __pos);\n            match __seq_res {\n                Matched(__pos, l) => {\n                    let __seq_res = __parse_offsetof_expression_inner(__input, __state, __pos, env);\n                    match __seq_res {\n                        Matched(__pos, e) => {\n                            let __seq_res = Matched(__pos, __pos);\n                            match __seq_res {\n                                Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                }\n                Failed => Failed,\n            }\n        };\n        match __seq_res {\n            Matched(__pos, n) => Matched(__pos, { Expression::OffsetOf(Box::new(n)) }),\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_offsetof_expression_inner<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<OffsetOfExpression> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = {\n            __state.suppress_fail += 1;\n            let res = {\n                let __seq_res = slice_eq(__input, __state, __pos, \"__builtin_offsetof\");\n                match __seq_res {\n                    Matched(__pos, e) => {\n                        let __seq_res = {\n                            __state.suppress_fail += 1;\n                            let __assert_res = if __input.len() > __pos {\n                                let (__ch, __next) = char_range_at(__input, __pos);\n                                match __ch {\n                                    '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                    _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                }\n                            } else {\n                                __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                            };\n                            __state.suppress_fail -= 1;\n                            match __assert_res {\n                                Failed => Matched(__pos, ()),\n                                Matched(..) => Failed,\n                            }\n                        };\n                        match __seq_res {\n                            Matched(__pos, _) => Matched(__pos, { e }),\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            };\n            __state.suppress_fail -= 1;\n            res\n        };\n        match __seq_res {\n            Matched(__pos, _) => {\n                let __seq_res = __parse__(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = slice_eq(__input, __state, __pos, \"(\");\n                        match __seq_res {\n                            Matched(__pos, _) => {\n                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                match __seq_res {\n                                    Matched(__pos, _) => {\n                                        let __seq_res = __parse_type_name(__input, __state, __pos, env);\n                                        match __seq_res {\n                                            Matched(__pos, t) => {\n                                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                                match __seq_res {\n                                                    Matched(__pos, _) => {\n                                                        let __seq_res = slice_eq(__input, __state, __pos, \",\");\n                                                        match __seq_res {\n                                                            Matched(__pos, _) => {\n                                                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                                                match __seq_res {\n                                                                    Matched(__pos, _) => {\n                                                                        let __seq_res = {\n                                                                            let __seq_res = Matched(__pos, __pos);\n                                                                            match __seq_res {\n                                                                                Matched(__pos, l) => {\n                                                                                    let __seq_res = __parse_offsetof_designator(__input, __state, __pos, env);\n                                                                                    match __seq_res {\n                                                                                        Matched(__pos, e) => {\n                                                                                            let __seq_res = Matched(__pos, __pos);\n                                                                                            match __seq_res {\n                                                                                                Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                                                                Failed => Failed,\n                                                                                            }\n                                                                                        }\n                                                                                        Failed => Failed,\n                                                                                    }\n                                                                                }\n                                                                                Failed => Failed,\n                                                                            }\n                                                                        };\n                                                                        match __seq_res {\n                                                                            Matched(__pos, d) => {\n                                                                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                                                                match __seq_res {\n                                                                                    Matched(__pos, _) => {\n                                                                                        let __seq_res = slice_eq(__input, __state, __pos, \")\");\n                                                                                        match __seq_res {\n                                                                                            Matched(__pos, _) => Matched(__pos, { OffsetOfExpression { type_name: t, designator: d } }),\n                                                                                            Failed => Failed,\n                                                                                        }\n                                                                                    }\n                                                                                    Failed => Failed,\n                                                                                }\n                                                                            }\n                                                                            Failed => Failed,\n                                                                        }\n                                                                    }\n                                                                    Failed => Failed,\n                                                                }\n                                                            }\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    }\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_offsetof_designator<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<OffsetDesignator> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = __parse_identifier(__input, __state, __pos, env);\n        match __seq_res {\n            Matched(__pos, i) => {\n                let __seq_res = __parse__(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = {\n                            let __seq_res = {\n                                let mut __repeat_pos = __pos;\n                                let mut __repeat_value = vec![];\n                                loop {\n                                    let __pos = __repeat_pos;\n                                    let __pos = if __repeat_value.len() > 0 {\n                                        let __sep_res = __parse__(__input, __state, __pos, env);\n                                        match __sep_res {\n                                            Matched(__newpos, _) => __newpos,\n                                            Failed => break,\n                                        }\n                                    } else {\n                                        __pos\n                                    };\n                                    let __step_res = {\n                                        let __seq_res = Matched(__pos, __pos);\n                                        match __seq_res {\n                                            Matched(__pos, l) => {\n                                                let __seq_res = __parse_offsetof_member(__input, __state, __pos, env);\n                                                match __seq_res {\n                                                    Matched(__pos, e) => {\n                                                        let __seq_res = Matched(__pos, __pos);\n                                                        match __seq_res {\n                                                            Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    };\n                                    match __step_res {\n                                        Matched(__newpos, __value) => {\n                                            __repeat_pos = __newpos;\n                                            __repeat_value.push(__value);\n                                        }\n                                        Failed => {\n                                            break;\n                                        }\n                                    }\n                                }\n                                Matched(__repeat_pos, __repeat_value)\n                            };\n                            match __seq_res {\n                                Matched(__pos, e) => Matched(__pos, { e }),\n                                Failed => Failed,\n                            }\n                        };\n                        match __seq_res {\n                            Matched(__pos, d) => Matched(__pos, { OffsetDesignator { base: i, members: d } }),\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_offsetof_member<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<OffsetMember> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            let __seq_res = slice_eq(__input, __state, __pos, \".\");\n            match __seq_res {\n                Matched(__pos, _) => {\n                    let __seq_res = __parse__(__input, __state, __pos, env);\n                    match __seq_res {\n                        Matched(__pos, _) => {\n                            let __seq_res = __parse_identifier(__input, __state, __pos, env);\n                            match __seq_res {\n                                Matched(__pos, i) => Matched(__pos, { OffsetMember::Member(i) }),\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                }\n                Failed => Failed,\n            }\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                let __choice_res = {\n                    let __seq_res = slice_eq(__input, __state, __pos, \"->\");\n                    match __seq_res {\n                        Matched(__pos, _) => {\n                            let __seq_res = __parse__(__input, __state, __pos, env);\n                            match __seq_res {\n                                Matched(__pos, _) => {\n                                    let __seq_res = __parse_identifier(__input, __state, __pos, env);\n                                    match __seq_res {\n                                        Matched(__pos, i) => Matched(__pos, { OffsetMember::IndirectMember(i) }),\n                                        Failed => Failed,\n                                    }\n                                }\n                                Failed => Failed,\n                            }\n                        }\n                        Failed => Failed,\n                    }\n                };\n                match __choice_res {\n                    Matched(__pos, __value) => Matched(__pos, __value),\n                    Failed => {\n                        let __seq_res = slice_eq(__input, __state, __pos, \"[\");\n                        match __seq_res {\n                            Matched(__pos, _) => {\n                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                match __seq_res {\n                                    Matched(__pos, _) => {\n                                        let __seq_res = {\n                                            let __seq_res = Matched(__pos, __pos);\n                                            match __seq_res {\n                                                Matched(__pos, l) => {\n                                                    let __seq_res = __parse_expression0(__input, __state, __pos, env);\n                                                    match __seq_res {\n                                                        Matched(__pos, e) => {\n                                                            let __seq_res = Matched(__pos, __pos);\n                                                            match __seq_res {\n                                                                Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                                Failed => Failed,\n                                                            }\n                                                        }\n                                                        Failed => Failed,\n                                                    }\n                                                }\n                                                Failed => Failed,\n                                            }\n                                        };\n                                        match __seq_res {\n                                            Matched(__pos, e) => {\n                                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                                match __seq_res {\n                                                    Matched(__pos, _) => {\n                                                        let __seq_res = slice_eq(__input, __state, __pos, \"]\");\n                                                        match __seq_res {\n                                                            Matched(__pos, _) => Matched(__pos, { OffsetMember::Index(e) }),\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    }\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n\nfn __parse_typeof_specifier<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<TypeSpecifier> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = {\n            __state.suppress_fail += 1;\n            let res = {\n                let __seq_res = {\n                    let __choice_res = slice_eq(__input, __state, __pos, \"typeof\");\n                    match __choice_res {\n                        Matched(__pos, __value) => Matched(__pos, __value),\n                        Failed => {\n                            let __seq_res = slice_eq(__input, __state, __pos, \"__typeof\");\n                            match __seq_res {\n                                Matched(__pos, _) => match slice_eq(__input, __state, __pos, \"__\") {\n                                    Matched(__newpos, _) => Matched(__newpos, ()),\n                                    Failed => Matched(__pos, ()),\n                                },\n                                Failed => Failed,\n                            }\n                        }\n                    }\n                };\n                match __seq_res {\n                    Matched(__pos, e) => {\n                        let __seq_res = {\n                            __state.suppress_fail += 1;\n                            let __assert_res = if __input.len() > __pos {\n                                let (__ch, __next) = char_range_at(__input, __pos);\n                                match __ch {\n                                    '_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => Matched(__next, ()),\n                                    _ => __state.mark_failure(__pos, \"[_a-zA-Z0-9]\"),\n                                }\n                            } else {\n                                __state.mark_failure(__pos, \"[_a-zA-Z0-9]\")\n                            };\n                            __state.suppress_fail -= 1;\n                            match __assert_res {\n                                Failed => Matched(__pos, ()),\n                                Matched(..) => Failed,\n                            }\n                        };\n                        match __seq_res {\n                            Matched(__pos, _) => Matched(__pos, { e }),\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            };\n            __state.suppress_fail -= 1;\n            res\n        };\n        match __seq_res {\n            Matched(__pos, _) => {\n                let __seq_res = __parse__(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, _) => {\n                        let __seq_res = slice_eq(__input, __state, __pos, \"(\");\n                        match __seq_res {\n                            Matched(__pos, _) => {\n                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                match __seq_res {\n                                    Matched(__pos, _) => {\n                                        let __seq_res = {\n                                            let __seq_res = Matched(__pos, __pos);\n                                            match __seq_res {\n                                                Matched(__pos, l) => {\n                                                    let __seq_res = __parse_typeof_specifier0(__input, __state, __pos, env);\n                                                    match __seq_res {\n                                                        Matched(__pos, e) => {\n                                                            let __seq_res = Matched(__pos, __pos);\n                                                            match __seq_res {\n                                                                Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                                                Failed => Failed,\n                                                            }\n                                                        }\n                                                        Failed => Failed,\n                                                    }\n                                                }\n                                                Failed => Failed,\n                                            }\n                                        };\n                                        match __seq_res {\n                                            Matched(__pos, e) => {\n                                                let __seq_res = __parse__(__input, __state, __pos, env);\n                                                match __seq_res {\n                                                    Matched(__pos, _) => {\n                                                        let __seq_res = slice_eq(__input, __state, __pos, \")\");\n                                                        match __seq_res {\n                                                            Matched(__pos, _) => Matched(__pos, { TypeSpecifier::TypeOf(e) }),\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    }\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_typeof_specifier0<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<TypeOf> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            let __seq_res = {\n                let __seq_res = Matched(__pos, __pos);\n                match __seq_res {\n                    Matched(__pos, l) => {\n                        let __seq_res = __parse_expression0(__input, __state, __pos, env);\n                        match __seq_res {\n                            Matched(__pos, e) => {\n                                let __seq_res = Matched(__pos, __pos);\n                                match __seq_res {\n                                    Matched(__pos, r) => Matched(__pos, { Node::new(e, Span::span(l, r)) }),\n                                    Failed => Failed,\n                                }\n                            }\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            };\n            match __seq_res {\n                Matched(__pos, e) => Matched(__pos, { TypeOf::Expression(e) }),\n                Failed => Failed,\n            }\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                let __seq_res = __parse_type_name(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, t) => Matched(__pos, { TypeOf::Type(t) }),\n                    Failed => Failed,\n                }\n            }\n        }\n    }\n}\n\nfn __parse_ts18661_float_type_specifier<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<TS18661FloatType> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = __parse_ts18661_binary_float(__input, __state, __pos, env);\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => __parse_ts18661_decimal_float(__input, __state, __pos, env),\n        }\n    }\n}\n\nfn __parse_ts18661_binary_float<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<TS18661FloatType> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = slice_eq(__input, __state, __pos, \"_Float\");\n        match __seq_res {\n            Matched(__pos, _) => {\n                let __seq_res = __parse_ts18661_binary_width(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, width) => {\n                        let __seq_res = match slice_eq(__input, __state, __pos, \"x\") {\n                            Matched(__newpos, __value) => Matched(__newpos, Some(__value)),\n                            Failed => Matched(__pos, None),\n                        };\n                        match __seq_res {\n                            Matched(__pos, extended) => Matched(__pos, { ts18661_float(true, width, extended.is_some()) }),\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_ts18661_binary_width<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<usize> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = {\n            let str_start = __pos;\n            match {\n                let __choice_res = slice_eq(__input, __state, __pos, \"16\");\n                match __choice_res {\n                    Matched(__pos, __value) => Matched(__pos, __value),\n                    Failed => {\n                        let __choice_res = slice_eq(__input, __state, __pos, \"32\");\n                        match __choice_res {\n                            Matched(__pos, __value) => Matched(__pos, __value),\n                            Failed => {\n                                let __choice_res = slice_eq(__input, __state, __pos, \"64\");\n                                match __choice_res {\n                                    Matched(__pos, __value) => Matched(__pos, __value),\n                                    Failed => slice_eq(__input, __state, __pos, \"128\"),\n                                }\n                            }\n                        }\n                    }\n                }\n            } {\n                Matched(__newpos, _) => Matched(__newpos, &__input[str_start..__newpos]),\n                Failed => Failed,\n            }\n        };\n        match __seq_res {\n            Matched(__pos, n) => Matched(__pos, { n.parse().unwrap() }),\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_ts18661_decimal_float<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<TS18661FloatType> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = slice_eq(__input, __state, __pos, \"_Decimal\");\n        match __seq_res {\n            Matched(__pos, _) => {\n                let __seq_res = __parse_ts18661_decimal_width(__input, __state, __pos, env);\n                match __seq_res {\n                    Matched(__pos, width) => {\n                        let __seq_res = match slice_eq(__input, __state, __pos, \"x\") {\n                            Matched(__newpos, __value) => Matched(__newpos, Some(__value)),\n                            Failed => Matched(__pos, None),\n                        };\n                        match __seq_res {\n                            Matched(__pos, extended) => Matched(__pos, { ts18661_float(false, width, extended.is_some()) }),\n                            Failed => Failed,\n                        }\n                    }\n                    Failed => Failed,\n                }\n            }\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_ts18661_decimal_width<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<usize> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __seq_res = {\n            let str_start = __pos;\n            match {\n                let __choice_res = slice_eq(__input, __state, __pos, \"32\");\n                match __choice_res {\n                    Matched(__pos, __value) => Matched(__pos, __value),\n                    Failed => {\n                        let __choice_res = slice_eq(__input, __state, __pos, \"64\");\n                        match __choice_res {\n                            Matched(__pos, __value) => Matched(__pos, __value),\n                            Failed => slice_eq(__input, __state, __pos, \"128\"),\n                        }\n                    }\n                }\n            } {\n                Matched(__newpos, _) => Matched(__newpos, &__input[str_start..__newpos]),\n                Failed => Failed,\n            }\n        };\n        match __seq_res {\n            Matched(__pos, n) => Matched(__pos, { n.parse().unwrap() }),\n            Failed => Failed,\n        }\n    }\n}\n\nfn __parse_ts18661_float_suffix<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<TS18661FloatType> {\n    #![allow(non_snake_case, unused)]\n    {\n        let __choice_res = {\n            let __seq_res = {\n                let __choice_res = slice_eq(__input, __state, __pos, \"df\");\n                match __choice_res {\n                    Matched(__pos, __value) => Matched(__pos, __value),\n                    Failed => slice_eq(__input, __state, __pos, \"DF\"),\n                }\n            };\n            match __seq_res {\n                Matched(__pos, _) => Matched(__pos, { ts18661_float(false, 32, false) }),\n                Failed => Failed,\n            }\n        };\n        match __choice_res {\n            Matched(__pos, __value) => Matched(__pos, __value),\n            Failed => {\n                let __choice_res = {\n                    let __seq_res = {\n                        let __choice_res = slice_eq(__input, __state, __pos, \"dd\");\n                        match __choice_res {\n                            Matched(__pos, __value) => Matched(__pos, __value),\n                            Failed => slice_eq(__input, __state, __pos, \"DD\"),\n                        }\n                    };\n                    match __seq_res {\n                        Matched(__pos, _) => Matched(__pos, { ts18661_float(false, 64, false) }),\n                        Failed => Failed,\n                    }\n                };\n                match __choice_res {\n                    Matched(__pos, __value) => Matched(__pos, __value),\n                    Failed => {\n                        let __choice_res = {\n                            let __seq_res = {\n                                let __choice_res = slice_eq(__input, __state, __pos, \"dl\");\n                                match __choice_res {\n                                    Matched(__pos, __value) => Matched(__pos, __value),\n                                    Failed => slice_eq(__input, __state, __pos, \"DL\"),\n                                }\n                            };\n                            match __seq_res {\n                                Matched(__pos, _) => Matched(__pos, { ts18661_float(false, 128, false) }),\n                                Failed => Failed,\n                            }\n                        };\n                        match __choice_res {\n                            Matched(__pos, __value) => Matched(__pos, __value),\n                            Failed => {\n                                let __choice_res = {\n                                    let __seq_res = if __input.len() > __pos {\n                                        let (__ch, __next) = char_range_at(__input, __pos);\n                                        match __ch {\n                                            'f' | 'F' => Matched(__next, ()),\n                                            _ => __state.mark_failure(__pos, \"[fF]\"),\n                                        }\n                                    } else {\n                                        __state.mark_failure(__pos, \"[fF]\")\n                                    };\n                                    match __seq_res {\n                                        Matched(__pos, _) => {\n                                            let __seq_res = __parse_ts18661_binary_width(__input, __state, __pos, env);\n                                            match __seq_res {\n                                                Matched(__pos, width) => {\n                                                    let __seq_res = match slice_eq(__input, __state, __pos, \"x\") {\n                                                        Matched(__newpos, __value) => Matched(__newpos, Some(__value)),\n                                                        Failed => Matched(__pos, None),\n                                                    };\n                                                    match __seq_res {\n                                                        Matched(__pos, extended) => Matched(__pos, { ts18661_float(true, width, extended.is_some()) }),\n                                                        Failed => Failed,\n                                                    }\n                                                }\n                                                Failed => Failed,\n                                            }\n                                        }\n                                        Failed => Failed,\n                                    }\n                                };\n                                match __choice_res {\n                                    Matched(__pos, __value) => Matched(__pos, __value),\n                                    Failed => {\n                                        let __seq_res = if __input.len() > __pos {\n                                            let (__ch, __next) = char_range_at(__input, __pos);\n                                            match __ch {\n                                                'd' | 'D' => Matched(__next, ()),\n                                                _ => __state.mark_failure(__pos, \"[dD]\"),\n                                            }\n                                        } else {\n                                            __state.mark_failure(__pos, \"[dD]\")\n                                        };\n                                        match __seq_res {\n                                            Matched(__pos, _) => {\n                                                let __seq_res = __parse_ts18661_decimal_width(__input, __state, __pos, env);\n                                                match __seq_res {\n                                                    Matched(__pos, width) => {\n                                                        let __seq_res = match slice_eq(__input, __state, __pos, \"x\") {\n                                                            Matched(__newpos, __value) => Matched(__newpos, Some(__value)),\n                                                            Failed => Matched(__pos, None),\n                                                        };\n                                                        match __seq_res {\n                                                            Matched(__pos, extended) => Matched(__pos, { ts18661_float(false, width, extended.is_some()) }),\n                                                            Failed => Failed,\n                                                        }\n                                                    }\n                                                    Failed => Failed,\n                                                }\n                                            }\n                                            Failed => Failed,\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n\nfn __parse_clang_guard<'input>(__input: &'input str, __state: &mut ParseState<'input>, __pos: usize, env: &mut Env) -> RuleResult<()> {\n    #![allow(non_snake_case, unused)]\n    match {\n        if env.extensions_clang {\n            Ok(())\n        } else {\n            Err(\"clang extensions disabled\")\n        }\n    } {\n        Ok(res) => Matched(__pos, res),\n        Err(expected) => {\n            __state.mark_failure(__pos, expected);\n            Failed\n        }\n    }\n}\n\npub fn constant<'input>(__input: &'input str, env: &mut Env) -> ParseResult<Constant> {\n    #![allow(non_snake_case, unused)]\n    let mut __state = ParseState::new();\n    match __parse_constant(__input, &mut __state, 0, env) {\n        Matched(__pos, __value) => {\n            if __pos == __input.len() {\n                return Ok(__value);\n            }\n        }\n        _ => {}\n    }\n    let (__line, __col) = pos_to_line(__input, __state.max_err_pos);\n    Err(ParseError { line: __line, column: __col, offset: __state.max_err_pos, expected: __state.expected })\n}\n\npub fn string_literal<'input>(__input: &'input str, env: &mut Env) -> ParseResult<Node<Vec<String>>> {\n    #![allow(non_snake_case, unused)]\n    let mut __state = ParseState::new();\n    match __parse_string_literal(__input, &mut __state, 0, env) {\n        Matched(__pos, __value) => {\n            if __pos == __input.len() {\n                return Ok(__value);\n            }\n        }\n        _ => {}\n    }\n    let (__line, __col) = pos_to_line(__input, __state.max_err_pos);\n    Err(ParseError { line: __line, column: __col, offset: __state.max_err_pos, expected: __state.expected })\n}\n\npub fn expression<'input>(__input: &'input str, env: &mut Env) -> ParseResult<Box<Node<Expression>>> {\n    #![allow(non_snake_case, unused)]\n    let mut __state = ParseState::new();\n    match __parse_expression(__input, &mut __state, 0, env) {\n        Matched(__pos, __value) => {\n            if __pos == __input.len() {\n                return Ok(__value);\n            }\n        }\n        _ => {}\n    }\n    let (__line, __col) = pos_to_line(__input, __state.max_err_pos);\n    Err(ParseError { line: __line, column: __col, offset: __state.max_err_pos, expected: __state.expected })\n}\n\npub fn declaration<'input>(__input: &'input str, env: &mut Env) -> ParseResult<Node<Declaration>> {\n    #![allow(non_snake_case, unused)]\n    let mut __state = ParseState::new();\n    match __parse_declaration(__input, &mut __state, 0, env) {\n        Matched(__pos, __value) => {\n            if __pos == __input.len() {\n                return Ok(__value);\n            }\n        }\n        _ => {}\n    }\n    let (__line, __col) = pos_to_line(__input, __state.max_err_pos);\n    Err(ParseError { line: __line, column: __col, offset: __state.max_err_pos, expected: __state.expected })\n}\n\npub fn statement<'input>(__input: &'input str, env: &mut Env) -> ParseResult<Box<Node<Statement>>> {\n    #![allow(non_snake_case, unused)]\n    let mut __state = ParseState::new();\n    match __parse_statement(__input, &mut __state, 0, env) {\n        Matched(__pos, __value) => {\n            if __pos == __input.len() {\n                return Ok(__value);\n            }\n        }\n        _ => {}\n    }\n    let (__line, __col) = pos_to_line(__input, __state.max_err_pos);\n    Err(ParseError { line: __line, column: __col, offset: __state.max_err_pos, expected: __state.expected })\n}\n\npub fn translation_unit<'input>(__input: &'input str, env: &mut Env) -> ParseResult<TranslationUnit> {\n    #![allow(non_snake_case, unused)]\n    let mut __state = ParseState::new();\n    match __parse_translation_unit(__input, &mut __state, 0, env) {\n        Matched(__pos, __value) => {\n            if __pos == __input.len() {\n                return Ok(__value);\n            }\n        }\n        _ => {}\n    }\n    let (__line, __col) = pos_to_line(__input, __state.max_err_pos);\n    Err(ParseError { line: __line, column: __col, offset: __state.max_err_pos, expected: __state.expected })\n}\n"
  },
  {
    "path": "src/print.rs",
    "content": "#![allow(unknown_lints)]\n#![allow(bare_trait_objects)]\n\n//! Debug printer for abstract syntax tree\n//!\n//! ```no_run\n//! # use lang_c::print::Printer;\n//! use lang_c::visit::Visit;\n//! # let unit = panic!();\n//! let s = &mut String::new();\n//! Printer::new(s).visit_translation_unit(unit);\n//! ```\nuse std::fmt;\n\nuse ast::*;\nuse span::Span;\nuse visit::*;\n\n/// Printing visitor\n///\n/// Recursively prints the AST tree as indented list of AST nodes, one node per line.\n/// Each line contains name of the AST node type, followed by the enum variant\n/// (when it does not match name of contained node), and primitive fields.\npub struct Printer<'a> {\n    w: &'a mut fmt::Write,\n    offset: usize,\n}\n\nimpl<'a> Printer<'a> {\n    pub fn new(w: &mut fmt::Write) -> Printer {\n        Printer { w: w, offset: 0 }\n    }\n\n    fn block(&mut self) -> Printer {\n        writeln!(&mut self.w, \"\").unwrap();\n        Printer {\n            w: &mut self.w,\n            offset: self.offset + 1,\n        }\n    }\n\n    fn name(&mut self, name: &str) {\n        write!(&mut self.w, \"{2:1$}{0}\", name, self.offset * 4, \"\").unwrap();\n    }\n\n    fn field<T: fmt::Display>(&mut self, s: T) {\n        write!(&mut self.w, \" {}\", s).unwrap();\n    }\n\n    fn field_str(&mut self, s: &str) {\n        self.field_str_ext(\" \", s);\n    }\n\n    fn field_str_ext(&mut self, prefix: &str, str: &str) {\n        write!(&mut self.w, \"{}\\\"{}\\\"\", prefix, Escape(str)).unwrap();\n    }\n}\n\nimpl<'ast, 'a> Visit<'ast> for Printer<'a> {\n    fn visit_identifier(&mut self, n: &'ast Identifier, span: &'ast Span) {\n        self.name(\"Identifier\");\n        self.field_str(&n.name);\n        visit_identifier(&mut self.block(), n, span);\n    }\n    fn visit_constant(&mut self, n: &'ast Constant, span: &'ast Span) {\n        self.name(\"Constant\");\n        match *n {\n            Constant::Character(ref c) => {\n                self.field(\"Character\");\n                self.field(c);\n            }\n            _ => {},\n        }\n\n        visit_constant(&mut self.block(), n, span);\n    }\n    fn visit_integer(&mut self, n: &'ast Integer, span: &'ast Span) {\n        self.name(\"Integer\");\n        self.field_str(&n.number);\n        visit_integer(&mut self.block(), n, span);\n    }\n    fn visit_integer_base(&mut self, n: &'ast IntegerBase, span: &'ast Span) {\n        self.name(\"IntegerBase\");\n        self.field(match *n {\n            IntegerBase::Decimal => \"Decimal\",\n            IntegerBase::Octal => \"Octal\",\n            IntegerBase::Hexadecimal => \"Hexadecimal\",\n            IntegerBase::Binary => \"Binary\",\n        });\n        visit_integer_base(&mut self.block(), n, span);\n    }\n    fn visit_integer_suffix(&mut self, n: &'ast IntegerSuffix, span: &'ast Span) {\n        self.name(\"IntegerSuffix\");\n        self.field(n.unsigned);\n        self.field(n.imaginary);\n        visit_integer_suffix(&mut self.block(), n, span);\n    }\n    fn visit_integer_size(&mut self, n: &'ast IntegerSize, span: &'ast Span) {\n        self.name(\"IntegerSize\");\n        self.field(match *n {\n            IntegerSize::Int => \"Int\",\n            IntegerSize::Long => \"Long\",\n            IntegerSize::LongLong => \"LongLong\",\n        });\n        visit_integer_size(&mut self.block(), n, span);\n    }\n    fn visit_float(&mut self, n: &'ast Float, span: &'ast Span) {\n        self.name(\"Float\");\n        self.field_str(&n.number);\n        visit_float(&mut self.block(), n, span);\n    }\n    fn visit_float_base(&mut self, n: &'ast FloatBase, span: &'ast Span) {\n        self.name(\"FloatBase\");\n        self.field(match *n {\n            FloatBase::Decimal => \"Decimal\",\n            FloatBase::Hexadecimal => \"Hexadecimal\",\n        });\n        visit_float_base(&mut self.block(), n, span);\n    }\n    fn visit_float_suffix(&mut self, n: &'ast FloatSuffix, span: &'ast Span) {\n        self.name(\"FloatSuffix\");\n        self.field(n.imaginary);\n        visit_float_suffix(&mut self.block(), n, span);\n    }\n    fn visit_float_format(&mut self, n: &'ast FloatFormat, span: &'ast Span) {\n        self.name(\"FloatFormat\");\n        print_float_format(self, n);\n        visit_float_format(&mut self.block(), n, span);\n    }\n    fn visit_string_literal(&mut self, n: &'ast StringLiteral, span: &'ast Span) {\n        self.name(\"StringLiteral\");\n\n        self.w.write_str(\" [\").unwrap();\n        let mut comma = false;\n        for p in n {\n            self.field_str_ext(if comma { \", \" } else { \"\" }, p);\n            comma = true;\n        }\n        self.w.write_str(\"]\").unwrap();\n\n        visit_string_literal(&mut self.block(), n, span);\n    }\n    fn visit_expression(&mut self, n: &'ast Expression, span: &'ast Span) {\n        self.name(\"Expression\");\n        visit_expression(&mut self.block(), n, span);\n    }\n    fn visit_member_operator(&mut self, n: &'ast MemberOperator, span: &'ast Span) {\n        self.name(\"MemberOperator\");\n        self.field(match *n {\n            MemberOperator::Direct => \"Direct\",\n            MemberOperator::Indirect => \"Indirect\",\n        });\n        visit_member_operator(&mut self.block(), n, span);\n    }\n    fn visit_generic_selection(&mut self, n: &'ast GenericSelection, span: &'ast Span) {\n        self.name(\"GenericSelection\");\n        visit_generic_selection(&mut self.block(), n, span);\n    }\n    fn visit_generic_association(&mut self, n: &'ast GenericAssociation, span: &'ast Span) {\n        self.name(\"GenericAssociation\");\n        visit_generic_association(&mut self.block(), n, span);\n    }\n    fn visit_generic_association_type(\n        &mut self,\n        n: &'ast GenericAssociationType,\n        span: &'ast Span,\n    ) {\n        self.name(\"GenericAssociationType\");\n        visit_generic_association_type(&mut self.block(), n, span);\n    }\n    fn visit_member_expression(&mut self, n: &'ast MemberExpression, span: &'ast Span) {\n        self.name(\"MemberExpression\");\n        visit_member_expression(&mut self.block(), n, span);\n    }\n    fn visit_call_expression(&mut self, n: &'ast CallExpression, span: &'ast Span) {\n        self.name(\"CallExpression\");\n        visit_call_expression(&mut self.block(), n, span);\n    }\n    fn visit_compound_literal(&mut self, n: &'ast CompoundLiteral, span: &'ast Span) {\n        self.name(\"CompoundLiteral\");\n        visit_compound_literal(&mut self.block(), n, span);\n    }\n    fn visit_sizeofty(&mut self, n: &'ast SizeOfTy, span: &'ast Span) {\n        self.name(\"SizeOfTy\");\n        visit_sizeofty(&mut self.block(), n, span);\n    }\n    fn visit_sizeofval(&mut self, n: &'ast SizeOfVal, span: &'ast Span) {\n        self.name(\"SizeOfVal\");\n        visit_sizeofval(&mut self.block(), n, span);\n    }\n    fn visit_alignof(&mut self, n: &'ast AlignOf, span: &'ast Span) {\n        self.name(\"AlignOf\");\n        visit_alignof(&mut self.block(), n, span);\n    }\n    fn visit_unary_operator(&mut self, n: &'ast UnaryOperator, span: &'ast Span) {\n        self.name(\"UnaryOperator\");\n        self.field(match *n {\n            UnaryOperator::PostIncrement => \"PostIncrement\",\n            UnaryOperator::PostDecrement => \"PostDecrement\",\n            UnaryOperator::PreIncrement => \"PreIncrement\",\n            UnaryOperator::PreDecrement => \"PreDecrement\",\n            UnaryOperator::Address => \"Address\",\n            UnaryOperator::Indirection => \"Indirection\",\n            UnaryOperator::Plus => \"Plus\",\n            UnaryOperator::Minus => \"Minus\",\n            UnaryOperator::Complement => \"Complement\",\n            UnaryOperator::Negate => \"Negate\",\n        });\n        visit_unary_operator(&mut self.block(), n, span);\n    }\n    fn visit_unary_operator_expression(\n        &mut self,\n        n: &'ast UnaryOperatorExpression,\n        span: &'ast Span,\n    ) {\n        self.name(\"UnaryOperatorExpression\");\n        visit_unary_operator_expression(&mut self.block(), n, span);\n    }\n    fn visit_cast_expression(&mut self, n: &'ast CastExpression, span: &'ast Span) {\n        self.name(\"CastExpression\");\n        visit_cast_expression(&mut self.block(), n, span);\n    }\n    fn visit_binary_operator(&mut self, n: &'ast BinaryOperator, span: &'ast Span) {\n        self.name(\"BinaryOperator\");\n        self.field(match *n {\n            BinaryOperator::Index => \"Index\",\n            BinaryOperator::Multiply => \"Multiply\",\n            BinaryOperator::Divide => \"Divide\",\n            BinaryOperator::Modulo => \"Modulo\",\n            BinaryOperator::Plus => \"Plus\",\n            BinaryOperator::Minus => \"Minus\",\n            BinaryOperator::ShiftLeft => \"ShiftLeft\",\n            BinaryOperator::ShiftRight => \"ShiftRight\",\n            BinaryOperator::Less => \"Less\",\n            BinaryOperator::Greater => \"Greater\",\n            BinaryOperator::LessOrEqual => \"LessOrEqual\",\n            BinaryOperator::GreaterOrEqual => \"GreaterOrEqual\",\n            BinaryOperator::Equals => \"Equals\",\n            BinaryOperator::NotEquals => \"NotEquals\",\n            BinaryOperator::BitwiseAnd => \"BitwiseAnd\",\n            BinaryOperator::BitwiseXor => \"BitwiseXor\",\n            BinaryOperator::BitwiseOr => \"BitwiseOr\",\n            BinaryOperator::LogicalAnd => \"LogicalAnd\",\n            BinaryOperator::LogicalOr => \"LogicalOr\",\n            BinaryOperator::Assign => \"Assign\",\n            BinaryOperator::AssignMultiply => \"AssignMultiply\",\n            BinaryOperator::AssignDivide => \"AssignDivide\",\n            BinaryOperator::AssignModulo => \"AssignModulo\",\n            BinaryOperator::AssignPlus => \"AssignPlus\",\n            BinaryOperator::AssignMinus => \"AssignMinus\",\n            BinaryOperator::AssignShiftLeft => \"AssignShiftLeft\",\n            BinaryOperator::AssignShiftRight => \"AssignShiftRight\",\n            BinaryOperator::AssignBitwiseAnd => \"AssignBitwiseAnd\",\n            BinaryOperator::AssignBitwiseXor => \"AssignBitwiseXor\",\n            BinaryOperator::AssignBitwiseOr => \"AssignBitwiseOr\",\n        });\n        visit_binary_operator(&mut self.block(), n, span);\n    }\n    fn visit_binary_operator_expression(\n        &mut self,\n        n: &'ast BinaryOperatorExpression,\n        span: &'ast Span,\n    ) {\n        self.name(\"BinaryOperatorExpression\");\n        visit_binary_operator_expression(&mut self.block(), n, span);\n    }\n    fn visit_conditional_expression(&mut self, n: &'ast ConditionalExpression, span: &'ast Span) {\n        self.name(\"ConditionalExpression\");\n        visit_conditional_expression(&mut self.block(), n, span);\n    }\n    fn visit_va_arg_expression(&mut self, n: &'ast VaArgExpression, span: &'ast Span) {\n        self.name(\"VaArgExpression\");\n        visit_va_arg_expression(&mut self.block(), n, span);\n    }\n    fn visit_offset_of_expression(&mut self, n: &'ast OffsetOfExpression, span: &'ast Span) {\n        self.name(\"OffsetOfExpression\");\n        visit_offset_of_expression(&mut self.block(), n, span);\n    }\n    fn visit_offset_designator(&mut self, n: &'ast OffsetDesignator, span: &'ast Span) {\n        self.name(\"OffsetDesignator\");\n        visit_offset_designator(&mut self.block(), n, span);\n    }\n    fn visit_offset_member(&mut self, n: &'ast OffsetMember, span: &'ast Span) {\n        self.name(\"OffsetMember\");\n        print_offset_member(self, n);\n        visit_offset_member(&mut self.block(), n, span);\n    }\n    fn visit_declaration(&mut self, n: &'ast Declaration, span: &'ast Span) {\n        self.name(\"Declaration\");\n        visit_declaration(&mut self.block(), n, span);\n    }\n    fn visit_declaration_specifier(&mut self, n: &'ast DeclarationSpecifier, span: &'ast Span) {\n        self.name(\"DeclarationSpecifier\");\n        visit_declaration_specifier(&mut self.block(), n, span);\n    }\n    fn visit_init_declarator(&mut self, n: &'ast InitDeclarator, span: &'ast Span) {\n        self.name(\"InitDeclarator\");\n        visit_init_declarator(&mut self.block(), n, span);\n    }\n    fn visit_storage_class_specifier(&mut self, n: &'ast StorageClassSpecifier, span: &'ast Span) {\n        self.name(\"StorageClassSpecifier\");\n        self.field(match *n {\n            StorageClassSpecifier::Typedef => \"Typedef\",\n            StorageClassSpecifier::Extern => \"Extern\",\n            StorageClassSpecifier::Static => \"Static\",\n            StorageClassSpecifier::ThreadLocal => \"ThreadLocal\",\n            StorageClassSpecifier::Auto => \"Auto\",\n            StorageClassSpecifier::Register => \"Register\",\n        });\n        visit_storage_class_specifier(&mut self.block(), n, span);\n    }\n    fn visit_type_specifier(&mut self, n: &'ast TypeSpecifier, span: &'ast Span) {\n        self.name(\"TypeSpecifier\");\n        print_type_specifier(self, n);\n        visit_type_specifier(&mut self.block(), n, span);\n    }\n    fn visit_ts18661_float_type(&mut self, n: &'ast TS18661FloatType, span: &'ast Span) {\n        self.name(\"TS18661FloatType\");\n        self.field(n.width);\n        visit_ts18661_float_type(&mut self.block(), n, span);\n    }\n    fn visit_ts18661_float_format(&mut self, n: &'ast TS18661FloatFormat, span: &'ast Span) {\n        self.name(\"TS18661FloatFormat\");\n        self.field(match *n {\n            TS18661FloatFormat::BinaryInterchange => \"BinaryInterchange\",\n            TS18661FloatFormat::BinaryExtended => \"BinaryExtended\",\n            TS18661FloatFormat::DecimalInterchange => \"DecimalInterchange\",\n            TS18661FloatFormat::DecimalExtended => \"DecimalExtended\",\n        });\n        visit_ts18661_float_format(&mut self.block(), n, span);\n    }\n    fn visit_struct_type(&mut self, n: &'ast StructType, span: &'ast Span) {\n        self.name(\"StructType\");\n        visit_struct_type(&mut self.block(), n, span);\n    }\n    fn visit_struct_kind(&mut self, n: &'ast StructKind, span: &'ast Span) {\n        self.name(\"StructKind\");\n        self.field(match *n {\n            StructKind::Struct => \"Struct\",\n            StructKind::Union => \"Union\",\n        });\n        visit_struct_kind(&mut self.block(), n, span);\n    }\n    fn visit_struct_declaration(&mut self, n: &'ast StructDeclaration, span: &'ast Span) {\n        self.name(\"StructDeclaration\");\n        visit_struct_declaration(&mut self.block(), n, span);\n    }\n    fn visit_struct_field(&mut self, n: &'ast StructField, span: &'ast Span) {\n        self.name(\"StructField\");\n        visit_struct_field(&mut self.block(), n, span);\n    }\n    fn visit_specifier_qualifier(&mut self, n: &'ast SpecifierQualifier, span: &'ast Span) {\n        self.name(\"SpecifierQualifier\");\n        visit_specifier_qualifier(&mut self.block(), n, span);\n    }\n    fn visit_struct_declarator(&mut self, n: &'ast StructDeclarator, span: &'ast Span) {\n        self.name(\"StructDeclarator\");\n        visit_struct_declarator(&mut self.block(), n, span);\n    }\n    fn visit_enum_type(&mut self, n: &'ast EnumType, span: &'ast Span) {\n        self.name(\"EnumType\");\n        visit_enum_type(&mut self.block(), n, span);\n    }\n    fn visit_enumerator(&mut self, n: &'ast Enumerator, span: &'ast Span) {\n        self.name(\"Enumerator\");\n        visit_enumerator(&mut self.block(), n, span);\n    }\n    fn visit_type_qualifier(&mut self, n: &'ast TypeQualifier, span: &'ast Span) {\n        self.name(\"TypeQualifier\");\n        self.field(match *n {\n            TypeQualifier::Const => \"Const\",\n            TypeQualifier::Restrict => \"Restrict\",\n            TypeQualifier::Volatile => \"Volatile\",\n            TypeQualifier::Nonnull => \"Nonnull\",\n            TypeQualifier::NullUnspecified => \"NullUnspecified\",\n            TypeQualifier::Nullable => \"Nullable\",\n            TypeQualifier::Atomic => \"Atomic\",\n        });\n        visit_type_qualifier(&mut self.block(), n, span);\n    }\n    fn visit_function_specifier(&mut self, n: &'ast FunctionSpecifier, span: &'ast Span) {\n        self.name(\"FunctionSpecifier\");\n        self.field(match *n {\n            FunctionSpecifier::Inline => \"Inline\",\n            FunctionSpecifier::Noreturn => \"Noreturn\",\n        });\n        visit_function_specifier(&mut self.block(), n, span);\n    }\n    fn visit_alignment_specifier(&mut self, n: &'ast AlignmentSpecifier, span: &'ast Span) {\n        self.name(\"AlignmentSpecifier\");\n        visit_alignment_specifier(&mut self.block(), n, span);\n    }\n    fn visit_declarator(&mut self, n: &'ast Declarator, span: &'ast Span) {\n        self.name(\"Declarator\");\n        visit_declarator(&mut self.block(), n, span);\n    }\n    fn visit_declarator_kind(&mut self, n: &'ast DeclaratorKind, span: &'ast Span) {\n        self.name(\"DeclaratorKind\");\n        print_declarator_kind(self, n);\n        visit_declarator_kind(&mut self.block(), n, span);\n    }\n    fn visit_derived_declarator(&mut self, n: &'ast DerivedDeclarator, span: &'ast Span) {\n        self.name(\"DerivedDeclarator\");\n        print_derived_declarator(self, n);\n        visit_derived_declarator(&mut self.block(), n, span);\n    }\n    fn visit_array_declarator(&mut self, n: &'ast ArrayDeclarator, span: &'ast Span) {\n        self.name(\"ArrayDeclarator\");\n        visit_array_declarator(&mut self.block(), n, span);\n    }\n    fn visit_function_declarator(&mut self, n: &'ast FunctionDeclarator, span: &'ast Span) {\n        self.name(\"FunctionDeclarator\");\n        visit_function_declarator(&mut self.block(), n, span);\n    }\n    fn visit_pointer_qualifier(&mut self, n: &'ast PointerQualifier, span: &'ast Span) {\n        self.name(\"PointerQualifier\");\n        visit_pointer_qualifier(&mut self.block(), n, span);\n    }\n    fn visit_array_size(&mut self, n: &'ast ArraySize, span: &'ast Span) {\n        self.name(\"ArraySize\");\n        print_array_size(self, n);\n        visit_array_size(&mut self.block(), n, span);\n    }\n    fn visit_parameter_declaration(&mut self, n: &'ast ParameterDeclaration, span: &'ast Span) {\n        self.name(\"ParameterDeclaration\");\n        visit_parameter_declaration(&mut self.block(), n, span);\n    }\n    fn visit_ellipsis(&mut self, n: &'ast Ellipsis, span: &'ast Span) {\n        self.name(\"Ellipsis\");\n        self.field(match *n {\n            Ellipsis::Some => \"Some\",\n            Ellipsis::None => \"None\",\n        });\n        visit_ellipsis(&mut self.block(), n, span);\n    }\n    fn visit_type_name(&mut self, n: &'ast TypeName, span: &'ast Span) {\n        self.name(\"TypeName\");\n        visit_type_name(&mut self.block(), n, span);\n    }\n    fn visit_initializer(&mut self, n: &'ast Initializer, span: &'ast Span) {\n        self.name(\"Initializer\");\n        visit_initializer(&mut self.block(), n, span);\n    }\n    fn visit_initializer_list_item(&mut self, n: &'ast InitializerListItem, span: &'ast Span) {\n        self.name(\"InitializerListItem\");\n        visit_initializer_list_item(&mut self.block(), n, span);\n    }\n    fn visit_designator(&mut self, n: &'ast Designator, span: &'ast Span) {\n        self.name(\"Designator\");\n        visit_designator(&mut self.block(), n, span);\n    }\n    fn visit_range_designator(&mut self, n: &'ast RangeDesignator, span: &'ast Span) {\n        self.name(\"RangeDesignator\");\n        visit_range_designator(&mut self.block(), n, span);\n    }\n    fn visit_static_assert(&mut self, n: &'ast StaticAssert, span: &'ast Span) {\n        self.name(\"StaticAssert\");\n        visit_static_assert(&mut self.block(), n, span);\n    }\n    fn visit_statement(&mut self, n: &'ast Statement, span: &'ast Span) {\n        self.name(\"Statement\");\n        print_statement(self, n);\n        visit_statement(&mut self.block(), n, span);\n    }\n    fn visit_labeled_statement(&mut self, n: &'ast LabeledStatement, span: &'ast Span) {\n        self.name(\"LabeledStatement\");\n        visit_labeled_statement(&mut self.block(), n, span);\n    }\n    fn visit_if_statement(&mut self, n: &'ast IfStatement, span: &'ast Span) {\n        self.name(\"IfStatement\");\n        visit_if_statement(&mut self.block(), n, span);\n    }\n    fn visit_switch_statement(&mut self, n: &'ast SwitchStatement, span: &'ast Span) {\n        self.name(\"SwitchStatement\");\n        visit_switch_statement(&mut self.block(), n, span);\n    }\n    fn visit_while_statement(&mut self, n: &'ast WhileStatement, span: &'ast Span) {\n        self.name(\"WhileStatement\");\n        visit_while_statement(&mut self.block(), n, span);\n    }\n    fn visit_do_while_statement(&mut self, n: &'ast DoWhileStatement, span: &'ast Span) {\n        self.name(\"DoWhileStatement\");\n        visit_do_while_statement(&mut self.block(), n, span);\n    }\n    fn visit_for_statement(&mut self, n: &'ast ForStatement, span: &'ast Span) {\n        self.name(\"ForStatement\");\n        visit_for_statement(&mut self.block(), n, span);\n    }\n    fn visit_label(&mut self, n: &'ast Label, span: &'ast Span) {\n        self.name(\"Label\");\n        print_label(self, n);\n        visit_label(&mut self.block(), n, span);\n    }\n    fn visit_case_range(&mut self, n: &'ast CaseRange, span: &'ast Span) {\n        self.name(\"CaseRange\");\n        visit_case_range(&mut self.block(), n, span);\n    }\n    fn visit_for_initializer(&mut self, n: &'ast ForInitializer, span: &'ast Span) {\n        self.name(\"ForInitializer\");\n        print_for_initializer(self, n);\n        visit_for_initializer(&mut self.block(), n, span);\n    }\n    fn visit_block_item(&mut self, n: &'ast BlockItem, span: &'ast Span) {\n        self.name(\"BlockItem\");\n        visit_block_item(&mut self.block(), n, span);\n    }\n    fn visit_external_declaration(&mut self, n: &'ast ExternalDeclaration, span: &'ast Span) {\n        self.name(\"ExternalDeclaration\");\n        visit_external_declaration(&mut self.block(), n, span);\n    }\n    fn visit_function_definition(&mut self, n: &'ast FunctionDefinition, span: &'ast Span) {\n        self.name(\"FunctionDefinition\");\n        visit_function_definition(&mut self.block(), n, span);\n    }\n    fn visit_extension(&mut self, n: &'ast Extension, span: &'ast Span) {\n        self.name(\"Extension\");\n        visit_extension(&mut self.block(), n, span);\n    }\n    fn visit_attribute(&mut self, n: &'ast Attribute, span: &'ast Span) {\n        self.name(\"Attribute\");\n        self.field_str(&n.name.node);\n        visit_attribute(&mut self.block(), n, span);\n    }\n    fn visit_asm_statement(&mut self, n: &'ast AsmStatement, span: &'ast Span) {\n        self.name(\"AsmStatement\");\n        visit_asm_statement(&mut self.block(), n, span);\n    }\n    fn visit_availability_attribute(&mut self, n: &'ast AvailabilityAttribute, span: &'ast Span) {\n        self.name(\"AvailabilityAttribute\");\n        visit_availability_attribute(&mut self.block(), n, span);\n    }\n    fn visit_gnu_extended_asm_statement(\n        &mut self,\n        n: &'ast GnuExtendedAsmStatement,\n        span: &'ast Span,\n    ) {\n        self.name(\"GnuExtendedAsmStatement\");\n        visit_gnu_extended_asm_statement(&mut self.block(), n, span);\n    }\n    fn visit_gnu_asm_operand(&mut self, n: &'ast GnuAsmOperand, span: &'ast Span) {\n        self.name(\"GnuAsmOperand\");\n        visit_gnu_asm_operand(&mut self.block(), n, span);\n    }\n    fn visit_type_of(&mut self, n: &'ast TypeOf, span: &'ast Span) {\n        self.name(\"TypeOf\");\n        visit_type_of(&mut self.block(), n, span);\n    }\n    fn visit_translation_unit(&mut self, translation_unit: &'ast TranslationUnit) {\n        self.name(\"TranslationUnit\");\n        visit_translation_unit(&mut self.block(), translation_unit);\n    }\n}\n\nfn print_float_format<'ast>(p: &mut Printer, n: &'ast FloatFormat) {\n    match *n {\n        FloatFormat::Float => p.w.write_str(\" Float\").unwrap(),\n        FloatFormat::Double => p.w.write_str(\" Double\").unwrap(),\n        FloatFormat::LongDouble => p.w.write_str(\" LongDouble\").unwrap(),\n        _ => {}\n    }\n}\nfn print_declarator_kind<'ast>(p: &mut Printer, n: &'ast DeclaratorKind) {\n    match *n {\n        DeclaratorKind::Abstract => p.w.write_str(\" Abstract\").unwrap(),\n        _ => {}\n    }\n}\nfn print_derived_declarator<'ast>(p: &mut Printer, n: &'ast DerivedDeclarator) {\n    match *n {\n        DerivedDeclarator::Pointer(_) => p.w.write_str(\" Pointer\").unwrap(),\n        DerivedDeclarator::KRFunction(_) => p.w.write_str(\" KRFunction\").unwrap(),\n        DerivedDeclarator::Block(_) => p.w.write_str(\" Block\").unwrap(),\n        _ => {}\n    }\n}\nfn print_array_size<'ast>(p: &mut Printer, n: &'ast ArraySize) {\n    match *n {\n        ArraySize::Unknown => p.w.write_str(\" Unknown\").unwrap(),\n        ArraySize::VariableUnknown => p.w.write_str(\" VariableUnknown\").unwrap(),\n        ArraySize::VariableExpression(_) => p.w.write_str(\" VariableExpression\").unwrap(),\n        ArraySize::StaticExpression(_) => p.w.write_str(\" StaticExpression\").unwrap(),\n    }\n}\nfn print_statement<'ast>(p: &mut Printer, n: &'ast Statement) {\n    match *n {\n        Statement::Compound(_) => p.w.write_str(\" Compound\").unwrap(),\n        Statement::Goto(_) => p.w.write_str(\" Goto\").unwrap(),\n        Statement::Continue => p.w.write_str(\" Continue\").unwrap(),\n        Statement::Break => p.w.write_str(\" Break\").unwrap(),\n        Statement::Return(_) => p.w.write_str(\" Return\").unwrap(),\n        _ => {}\n    }\n}\nfn print_offset_member<'ast>(p: &mut Printer, n: &'ast OffsetMember) {\n    match *n {\n        OffsetMember::Member(_) => p.w.write_str(\" Member\").unwrap(),\n        OffsetMember::IndirectMember(_) => p.w.write_str(\" IndirectMember\").unwrap(),\n        _ => {}\n    }\n}\nfn print_label<'ast>(p: &mut Printer, n: &'ast Label) {\n    match *n {\n        Label::Default => p.w.write_str(\" Default\").unwrap(),\n        _ => {}\n    }\n}\nfn print_for_initializer<'ast>(p: &mut Printer, n: &'ast ForInitializer) {\n    match *n {\n        ForInitializer::Empty => p.w.write_str(\" Empty\").unwrap(),\n        _ => {}\n    }\n}\nfn print_type_specifier<'ast>(p: &mut Printer, n: &'ast TypeSpecifier) {\n    match *n {\n        TypeSpecifier::Void => p.w.write_str(\" Void\").unwrap(),\n        TypeSpecifier::Char => p.w.write_str(\" Char\").unwrap(),\n        TypeSpecifier::Short => p.w.write_str(\" Short\").unwrap(),\n        TypeSpecifier::Int => p.w.write_str(\" Int\").unwrap(),\n        TypeSpecifier::Long => p.w.write_str(\" Long\").unwrap(),\n        TypeSpecifier::Float => p.w.write_str(\" Float\").unwrap(),\n        TypeSpecifier::Double => p.w.write_str(\" Double\").unwrap(),\n        TypeSpecifier::Signed => p.w.write_str(\" Signed\").unwrap(),\n        TypeSpecifier::Unsigned => p.w.write_str(\" Unsigned\").unwrap(),\n        TypeSpecifier::Complex => p.w.write_str(\" Complex\").unwrap(),\n        TypeSpecifier::Atomic(_) => p.w.write_str(\" Atomic\").unwrap(),\n        TypeSpecifier::TypedefName(_) => p.w.write_str(\" TypedefName\").unwrap(),\n        _ => {}\n    }\n}\n\nstruct Escape<'a>(&'a str);\n\nimpl<'a> fmt::Display for Escape<'a> {\n    fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {\n        use std::fmt::Write;\n\n        for c in self.0.chars() {\n            match c {\n                '\"' | '\\'' | '\\\\' => try!(write!(fmt, \"\\\\{}\", c)),\n                ' '...'~' => try!(fmt.write_char(c)),\n                _ => try!(write!(fmt, \"\\\\u{{{:04x}}}\", c as u32)),\n            }\n        }\n\n        Ok(())\n    }\n}\n\n#[test]\nfn test_escape() {\n    let s = format!(\"{}\", Escape(r#\"a'\"\\ あ \\'\"#));\n    assert_eq!(s, r#\"a\\'\\\"\\\\ \\u{3042} \\\\\\'\"#);\n}\n"
  },
  {
    "path": "src/span.rs",
    "content": "//! Source text location tracking\nuse std::usize::MAX;\nuse std::{cmp, fmt};\n\n/// Byte offset of a node start and end positions in the input stream\n#[derive(Copy, Clone)]\npub struct Span {\n    pub start: usize,\n    pub end: usize,\n}\n\nimpl Span {\n    /// Create a new span for a specific location\n    pub fn span(start: usize, end: usize) -> Span {\n        Span {\n            start: start,\n            end: end,\n        }\n    }\n\n    /// Create a new undefined span that is equal to any other span\n    pub fn none() -> Span {\n        Span {\n            start: MAX,\n            end: MAX,\n        }\n    }\n\n    /// Test if span is undefined\n    pub fn is_none(&self) -> bool {\n        self.start == MAX && self.end == MAX\n    }\n}\n\nimpl cmp::PartialEq for Span {\n    fn eq(&self, other: &Self) -> bool {\n        (self.start == other.start && self.end == other.end) || self.is_none() || other.is_none()\n    }\n}\n\nimpl fmt::Debug for Span {\n    fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {\n        if !self.is_none() {\n            write!(fmt, \"{}…{}\", self.start, self.end)\n        } else {\n            write!(fmt, \"…\")\n        }\n    }\n}\n\n/// Associate a span with an arbitrary type\n#[derive(Debug, PartialEq, Clone)]\npub struct Node<T> {\n    pub node: T,\n    pub span: Span,\n}\n\nimpl<T> Node<T> {\n    /// Create new node\n    pub fn new(node: T, span: Span) -> Node<T> {\n        Node {\n            node: node,\n            span: span,\n        }\n    }\n}\n"
  },
  {
    "path": "src/strings.rs",
    "content": "pub const RESERVED_C11: &'static [&'static str] = &[\n    \"auto\",\n    \"break\",\n    \"case\",\n    \"char\",\n    \"const\",\n    \"continue\",\n    \"default\",\n    \"do\",\n    \"double\",\n    \"else\",\n    \"enum\",\n    \"extern\",\n    \"float\",\n    \"for\",\n    \"goto\",\n    \"if\",\n    \"inline\",\n    \"int\",\n    \"long\",\n    \"register\",\n    \"restrict\",\n    \"return\",\n    \"short\",\n    \"signed\",\n    \"sizeof\",\n    \"static\",\n    \"struct\",\n    \"switch\",\n    \"typedef\",\n    \"union\",\n    \"unsigned\",\n    \"void\",\n    \"volatile\",\n    \"while\",\n    \"_Alignas\",\n    \"_Alignof\",\n    \"_Atomic\",\n    \"_Bool\",\n    \"_Complex\",\n    \"_Generic\",\n    \"_Imaginary\",\n    \"_Noreturn\",\n    \"_Static_assert\",\n    \"_Thread_local\",\n    \"_Float16\",\n    \"_Float16x\",\n    \"_Float32\",\n    \"_Float32x\",\n    \"_Float64\",\n    \"_Float64x\",\n    \"_Float128\",\n    \"_Float128x\",\n    \"_Decimal32\",\n    \"_Decimal32x\",\n    \"_Decimal64\",\n    \"_Decimal64x\",\n    \"_Decimal128\",\n    \"_Decimal128x\",\n];\n\npub const RESERVED_GNU: &'static [&'static str] = &[\n    \"__FUNCTION__\",\n    \"__PRETTY_FUNCTION__\",\n    \"__alignof\",\n    \"__alignof__\",\n    \"__asm\",\n    \"__asm__\",\n    \"__attribute\",\n    \"__attribute__\",\n    \"__builtin_offsetof\",\n    \"__builtin_va_arg\",\n    \"__complex\",\n    \"__complex__\",\n    \"__const\",\n    \"__extension__\",\n    \"__func__\",\n    \"__imag\",\n    \"__imag__\",\n    \"__inline\",\n    \"__inline__\",\n    \"__label__\",\n    \"__null\",\n    \"__real\",\n    \"__real__\",\n    \"__restrict\",\n    \"__restrict__\",\n    \"__signed\",\n    \"__signed__\",\n    \"__thread\",\n    \"__typeof\",\n    \"__volatile\",\n    \"__volatile__\",\n];\n\n// Ref: https://clang.llvm.org/docs/AttributeReference.html\npub const RESERVED_CLANG: &'static [&'static str] = &[\n    // Only enabled with -fms-extensions and only affect *-*-win32 targets\n    \"__single_inheritance\",\n    \"__multiple_inheritance\",\n    \"__virtual_inheritance\",\n    \"__unspecified_inheritance\",\n    // Calling conventions\n    \"__fastcall\",\n    \"__regcall\",\n    \"__stdcall\",\n    \"__thiscall\",\n    \"__vectorcall\",\n    // Nullability attributes\n    \"_Nonnull\",\n    \"_Null_unspecified\",\n    \"_Nullable\",\n];\n"
  },
  {
    "path": "src/tests.rs",
    "content": "use std::env;\nuse std::ffi::{OsStr, OsString};\nuse std::fs;\nuse std::fs::DirEntry;\nuse std::fs::File;\nuse std::io;\nuse std::io::stdout;\nuse std::io::{BufRead, BufReader, BufWriter, Write};\nuse std::mem;\nuse std::path::PathBuf;\n\nuse env::Env;\nuse parser;\nuse print::Printer;\nuse span::Span;\nuse visit::Visit;\n\nstruct Case {\n    path: PathBuf,\n    name: String,\n    kind: Kind,\n    pragma: Vec<Pragma>,\n    source: String,\n    expect: String,\n}\n\nconst OUTPUT_START: &'static str = \"/*===\";\nconst OUTPUT_END: &'static str = \"===*/\";\n\nimpl Case {\n    fn from_path(entry: &DirEntry) -> io::Result<Case> {\n        let name = entry.file_name();\n        let name = name.to_str().expect(\"path to string\");\n        let kind = name.split(\"-\").next().expect(\"case contains hyphen\");\n        let kind = Kind::from_str(&kind).expect(\"unknown test case kind\");\n\n        let file = BufReader::new(try!(File::open(entry.path())));\n\n        let mut pragma = Vec::new();\n        let mut expect = String::new();\n        let mut source = String::new();\n        let mut in_exp = false;\n\n        for line in file.lines() {\n            let target = if in_exp { &mut expect } else { &mut source };\n\n            let line = try!(line);\n            let line = line.trim_right();\n            if line.is_empty() || line.starts_with(\"//\") {\n                continue;\n            } else if line.starts_with(\"#pragma\") {\n                pragma.push(Pragma::from_str(line).expect(\"unknown pragma\"));\n            } else if line == OUTPUT_START {\n                in_exp = true;\n            } else if line == OUTPUT_END {\n                in_exp = false;\n            } else {\n                target.push_str(line);\n                target.push_str(\"\\n\");\n            }\n        }\n\n        Ok(Case {\n            path: entry.path(),\n            name: name.to_owned(),\n            kind: kind,\n            pragma: pragma,\n            source: source,\n            expect: expect,\n        })\n    }\n\n    fn run(&self) -> bool {\n        let mut env = None;\n\n        for pragma in &self.pragma {\n            match *pragma {\n                Pragma::Gnu => env = Some(Env::with_gnu()),\n                Pragma::Clang => env = Some(Env::with_clang()),\n                _ => {}\n            }\n        }\n\n        let mut env = env.unwrap_or_else(Env::with_core);\n\n        for pragma in &self.pragma {\n            match *pragma {\n                Pragma::Typedef(ref name) => env.add_typename(&name),\n                _ => {}\n            }\n        }\n\n        pegviz::marker_start(&self.source);\n\n        let (actual, error) = match self.kind.parse_and_print(&self.source, &mut env) {\n            Ok(s) => (s, None),\n            Err(e) => (\"~ERROR\\n\".to_string(), Some(e)),\n        };\n\n        pegviz::marker_stop();\n\n        let pragma_fail = self\n            .pragma\n            .iter()\n            .filter(|p| match **p {\n                Pragma::IsTypename(ref name) => !env.is_typename(name),\n                _ => false,\n            })\n            .collect::<Vec<_>>();\n\n        let output_matches = actual == self.expect;\n        let success = output_matches && pragma_fail.is_empty();\n\n        if !success {\n            writeln!(stdout(), \"\\n{}:\", self.name).unwrap();\n            writeln!(stdout(), \"{}\", self.source).unwrap();\n            if let Some(e) = error {\n                writeln!(stdout(), \"ERROR:\\n{}\", e).unwrap();\n            }\n        }\n\n        if !pragma_fail.is_empty() {\n            writeln!(stdout(), \"Failed checks: \").unwrap();\n            for failed in &pragma_fail {\n                writeln!(stdout(), \"    {:?}\", failed).unwrap();\n            }\n        }\n\n        if !output_matches {\n            let width = self.expect.lines().map(|s| s.len()).max().unwrap_or(25);\n            let mut alines = Some(self.expect.lines());\n            let mut blines = Some(actual.lines());\n            while alines.is_some() || blines.is_some() {\n                let a = match alines.as_mut().and_then(|i| i.next()) {\n                    Some(l) => l,\n                    None => {\n                        alines = None;\n                        \"\"\n                    }\n                };\n                let b = match blines.as_mut().and_then(|i| i.next()) {\n                    Some(l) => l,\n                    None => {\n                        blines = None;\n                        \"\"\n                    }\n                };\n                writeln!(stdout(), \"{:w$} | {}\", a, b, w = width).unwrap();\n            }\n\n            if env::var_os(\"TEST_UPDATE\").is_some() {\n                self.save(&actual).expect(\"failed to update test output\");\n            }\n        }\n\n        success\n    }\n\n    fn save(&self, actual: &str) -> io::Result<()> {\n        let mut buf = String::new();\n        let mut file = BufReader::new(try!(File::open(&self.path)));\n        let mut content = Vec::new();\n        while try!(file.read_line(&mut buf)) > 0 {\n            content.push(mem::replace(&mut buf, String::new()));\n        }\n\n        let mut file = BufWriter::new(try!(File::create(&self.path)));\n        let mut lines = content.into_iter();\n\n        for line in &mut lines {\n            if line.trim_right() == OUTPUT_START {\n                break;\n            }\n            try!(file.write_all(line.as_bytes()));\n        }\n\n        try!(write!(\n            &mut file,\n            \"{}\\n{}{}\\n\",\n            OUTPUT_START, actual, OUTPUT_END\n        ));\n\n        for line in &mut lines {\n            if line.trim_right() == OUTPUT_END {\n                break;\n            }\n        }\n        for line in &mut lines {\n            try!(file.write_all(line.as_bytes()));\n        }\n\n        Ok(())\n    }\n}\n\nenum Kind {\n    Constant,\n    Declaration,\n    Expression,\n    Statement,\n    TranslationUnit,\n}\n\nimpl Kind {\n    fn from_str(kind: &str) -> Option<Kind> {\n        Some(match kind {\n            \"constant\" => Kind::Constant,\n            \"declaration\" => Kind::Declaration,\n            \"expression\" => Kind::Expression,\n            \"statement\" => Kind::Statement,\n            \"translation_unit\" => Kind::TranslationUnit,\n            _ => return None,\n        })\n    }\n\n    fn parse_and_print(&self, source: &str, env: &mut Env) -> Result<String, parser::ParseError> {\n        let source = source.trim_right();\n\n        let mut s = \"\".to_string();\n        {\n            let mut p = Printer::new(&mut s);\n            match *self {\n                Kind::Constant => {\n                    let n = try!(parser::constant(source, env));\n                    p.visit_constant(&n, &Span::none());\n                }\n                Kind::Declaration => {\n                    let n = try!(parser::declaration(source, env));\n                    p.visit_declaration(&n.node, &n.span);\n                }\n                Kind::Statement => {\n                    let n = try!(parser::statement(source, env));\n                    p.visit_statement(&n.node, &n.span);\n                }\n                Kind::Expression => {\n                    let n = try!(parser::expression(source, env));\n                    p.visit_expression(&n.node, &n.span);\n                }\n                Kind::TranslationUnit => {\n                    let n = try!(parser::translation_unit(source, env));\n                    p.visit_translation_unit(&n);\n                }\n            }\n        }\n\n        Ok(s)\n    }\n}\n\n#[derive(Debug)]\nenum Pragma {\n    /// Enable gnu extensions\n    Gnu,\n    // Enable clang extensions\n    Clang,\n    /// Define typename\n    Typedef(String),\n    /// Assert argument is a typename\n    IsTypename(String),\n}\n\nimpl Pragma {\n    fn from_str(line: &str) -> Option<Pragma> {\n        let mut line = line\n            .split(\" \")\n            .skip(1)\n            .map(|w| w.trim().to_owned())\n            .collect::<Vec<_>>();\n        Some(match line[0].trim() {\n            \"gnu\" => Pragma::Gnu,\n            \"clang\" => Pragma::Clang,\n            \"typedef\" => Pragma::Typedef(match line.pop() {\n                Some(v) => v,\n                None => return None,\n            }),\n            \"is_typename\" => Pragma::IsTypename(match line.pop() {\n                Some(v) => v,\n                None => return None,\n            }),\n            _ => return None,\n        })\n    }\n}\n\nfn filter_entry(a: &DirEntry, filter: Option<&OsString>) -> bool {\n    let path = a.path();\n    let name = match path.file_name().and_then(OsStr::to_str) {\n        Some(name) => name,\n        None => return false,\n    };\n    if name.starts_with('.') || name.ends_with('~') {\n        return false;\n    }\n    if let Some(filter) = filter.and_then(|s| s.to_str()) {\n        return name.starts_with(filter);\n    }\n\n    true\n}\n\n#[test]\nfn reftest_main() {\n    let mut cases = Vec::new();\n    let filter = env::var_os(\"TEST_FILTER\");\n    for entry in fs::read_dir(\"reftests\").expect(\"listing reftests/\") {\n        let entry = entry.expect(\"failed to read reftests/ entry\");\n        if !filter_entry(&entry, filter.as_ref()) {\n            continue;\n        }\n        let case = match Case::from_path(&entry) {\n            Ok(case) => case,\n            Err(err) => {\n                panic!(\"{}: {}\", entry.path().to_string_lossy(), err);\n            }\n        };\n        cases.push(case);\n    }\n\n    let failed = cases.iter().filter(|c| !c.run()).count();\n    if failed > 0 {\n        panic!(\"{} cases failed\", failed);\n    }\n}\n\n#[cfg(feature = \"dev-pegviz\")]\nmod pegviz {\n    pub fn marker_start(source: &str) {\n        println!(\"[PEG_INPUT_START]\\n{}\\n[PEG_TRACE_START]\", source);\n    }\n    pub fn marker_stop() {\n        println!(\"[PEG_TRACE_STOP]\");\n    }\n}\n\n#[cfg(not(feature = \"dev-pegviz\"))]\nmod pegviz {\n    pub fn marker_start(_: &str) {}\n    pub fn marker_stop() {}\n}\n"
  },
  {
    "path": "src/visit.rs",
    "content": "//! Recursive abstract syntax tree traversal\n//!\n//! ```rust\n//! # use lang_c::{ast, span, visit};\n//! struct ExprCount(usize);\n//!\n//! impl<'ast> visit::Visit<'ast> for ExprCount {\n//!     fn visit_expression(&mut self, expr: &'ast ast::Expression, span: &'ast span::Span) {\n//!         self.0 += 1;\n//!         visit::visit_expression(self, expr, span);\n//!     }\n//! }\n//! ```\n//!\n//! The `Visit` trait is a collection of hooks, one for each type of node in the AST (for each type\n//! in the `ast` module). Default implementations will recursively visit the sub-nodes (by calling\n//! a corresponding free function in this module).\n//!\n//! Free functions apply the visitor to sub-nodes of any given AST node.\n\nuse ast::*;\nuse span::Span;\n\npub trait Visit<'ast> {\n    fn visit_identifier(&mut self, identifier: &'ast Identifier, span: &'ast Span) {\n        visit_identifier(self, identifier, span)\n    }\n\n    fn visit_constant(&mut self, constant: &'ast Constant, span: &'ast Span) {\n        visit_constant(self, constant, span)\n    }\n\n    fn visit_integer(&mut self, integer: &'ast Integer, span: &'ast Span) {\n        visit_integer(self, integer, span)\n    }\n\n    fn visit_integer_base(&mut self, integer_base: &'ast IntegerBase, span: &'ast Span) {\n        visit_integer_base(self, integer_base, span)\n    }\n\n    fn visit_integer_suffix(&mut self, integer_suffix: &'ast IntegerSuffix, span: &'ast Span) {\n        visit_integer_suffix(self, integer_suffix, span)\n    }\n\n    fn visit_integer_size(&mut self, integer_size: &'ast IntegerSize, span: &'ast Span) {\n        visit_integer_size(self, integer_size, span)\n    }\n\n    fn visit_float(&mut self, float: &'ast Float, span: &'ast Span) {\n        visit_float(self, float, span)\n    }\n\n    fn visit_float_base(&mut self, float_base: &'ast FloatBase, span: &'ast Span) {\n        visit_float_base(self, float_base, span)\n    }\n\n    fn visit_float_suffix(&mut self, float_suffix: &'ast FloatSuffix, span: &'ast Span) {\n        visit_float_suffix(self, float_suffix, span)\n    }\n\n    fn visit_float_format(&mut self, float_format: &'ast FloatFormat, span: &'ast Span) {\n        visit_float_format(self, float_format, span)\n    }\n\n    fn visit_string_literal(&mut self, string_literal: &'ast StringLiteral, span: &'ast Span) {\n        visit_string_literal(self, string_literal, span)\n    }\n\n    fn visit_expression(&mut self, expression: &'ast Expression, span: &'ast Span) {\n        visit_expression(self, expression, span)\n    }\n\n    fn visit_member_operator(&mut self, member_operator: &'ast MemberOperator, span: &'ast Span) {\n        visit_member_operator(self, member_operator, span)\n    }\n\n    fn visit_generic_selection(\n        &mut self,\n        generic_selection: &'ast GenericSelection,\n        span: &'ast Span,\n    ) {\n        visit_generic_selection(self, generic_selection, span)\n    }\n\n    fn visit_generic_association(\n        &mut self,\n        generic_association: &'ast GenericAssociation,\n        span: &'ast Span,\n    ) {\n        visit_generic_association(self, generic_association, span)\n    }\n\n    fn visit_generic_association_type(\n        &mut self,\n        generic_association_type: &'ast GenericAssociationType,\n        span: &'ast Span,\n    ) {\n        visit_generic_association_type(self, generic_association_type, span)\n    }\n\n    fn visit_member_expression(\n        &mut self,\n        member_expression: &'ast MemberExpression,\n        span: &'ast Span,\n    ) {\n        visit_member_expression(self, member_expression, span)\n    }\n\n    fn visit_call_expression(&mut self, call_expression: &'ast CallExpression, span: &'ast Span) {\n        visit_call_expression(self, call_expression, span)\n    }\n\n    fn visit_compound_literal(\n        &mut self,\n        compound_literal: &'ast CompoundLiteral,\n        span: &'ast Span,\n    ) {\n        visit_compound_literal(self, compound_literal, span)\n    }\n\n    fn visit_sizeofty(&mut self, sizeofty: &'ast SizeOfTy, span: &'ast Span) {\n        visit_sizeofty(self, sizeofty, span)\n    }\n    fn visit_sizeofval(&mut self, sizeofval: &'ast SizeOfVal, span: &'ast Span) {\n        visit_sizeofval(self, sizeofval, span)\n    }\n\n    fn visit_alignof(&mut self, alignofty: &'ast AlignOf, span: &'ast Span) {\n        visit_alignof(self, alignofty, span)\n    }\n\n    fn visit_unary_operator(&mut self, unary_operator: &'ast UnaryOperator, span: &'ast Span) {\n        visit_unary_operator(self, unary_operator, span)\n    }\n\n    fn visit_unary_operator_expression(\n        &mut self,\n        unary_operator_expression: &'ast UnaryOperatorExpression,\n        span: &'ast Span,\n    ) {\n        visit_unary_operator_expression(self, unary_operator_expression, span)\n    }\n\n    fn visit_cast_expression(&mut self, cast_expression: &'ast CastExpression, span: &'ast Span) {\n        visit_cast_expression(self, cast_expression, span)\n    }\n\n    fn visit_binary_operator(&mut self, binary_operator: &'ast BinaryOperator, span: &'ast Span) {\n        visit_binary_operator(self, binary_operator, span)\n    }\n\n    fn visit_binary_operator_expression(\n        &mut self,\n        binary_operator_expression: &'ast BinaryOperatorExpression,\n        span: &'ast Span,\n    ) {\n        visit_binary_operator_expression(self, binary_operator_expression, span)\n    }\n\n    fn visit_conditional_expression(\n        &mut self,\n        conditional_expression: &'ast ConditionalExpression,\n        span: &'ast Span,\n    ) {\n        visit_conditional_expression(self, conditional_expression, span)\n    }\n\n    fn visit_va_arg_expression(\n        &mut self,\n        va_arg_expression: &'ast VaArgExpression,\n        span: &'ast Span,\n    ) {\n        visit_va_arg_expression(self, va_arg_expression, span)\n    }\n\n    fn visit_offset_of_expression(\n        &mut self,\n        offset_of_expression: &'ast OffsetOfExpression,\n        span: &'ast Span,\n    ) {\n        visit_offset_of_expression(self, offset_of_expression, span)\n    }\n\n    fn visit_offset_designator(\n        &mut self,\n        offset_designator: &'ast OffsetDesignator,\n        span: &'ast Span,\n    ) {\n        visit_offset_designator(self, offset_designator, span)\n    }\n\n    fn visit_offset_member(&mut self, offset_member: &'ast OffsetMember, span: &'ast Span) {\n        visit_offset_member(self, offset_member, span)\n    }\n\n    fn visit_declaration(&mut self, declaration: &'ast Declaration, span: &'ast Span) {\n        visit_declaration(self, declaration, span)\n    }\n\n    fn visit_declaration_specifier(\n        &mut self,\n        declaration_specifier: &'ast DeclarationSpecifier,\n        span: &'ast Span,\n    ) {\n        visit_declaration_specifier(self, declaration_specifier, span)\n    }\n\n    fn visit_init_declarator(&mut self, init_declarator: &'ast InitDeclarator, span: &'ast Span) {\n        visit_init_declarator(self, init_declarator, span)\n    }\n\n    fn visit_storage_class_specifier(\n        &mut self,\n        storage_class_specifier: &'ast StorageClassSpecifier,\n        span: &'ast Span,\n    ) {\n        visit_storage_class_specifier(self, storage_class_specifier, span)\n    }\n\n    fn visit_type_specifier(&mut self, type_specifier: &'ast TypeSpecifier, span: &'ast Span) {\n        visit_type_specifier(self, type_specifier, span)\n    }\n\n    fn visit_ts18661_float_type(\n        &mut self,\n        ts18661_float_type: &'ast TS18661FloatType,\n        span: &'ast Span,\n    ) {\n        visit_ts18661_float_type(self, ts18661_float_type, span)\n    }\n\n    fn visit_ts18661_float_format(\n        &mut self,\n        ts18661_float_format: &'ast TS18661FloatFormat,\n        span: &'ast Span,\n    ) {\n        visit_ts18661_float_format(self, ts18661_float_format, span)\n    }\n\n    fn visit_struct_type(&mut self, struct_type: &'ast StructType, span: &'ast Span) {\n        visit_struct_type(self, struct_type, span)\n    }\n\n    fn visit_struct_kind(&mut self, struct_kind: &'ast StructKind, span: &'ast Span) {\n        visit_struct_kind(self, struct_kind, span)\n    }\n\n    fn visit_struct_declaration(\n        &mut self,\n        struct_declaration: &'ast StructDeclaration,\n        span: &'ast Span,\n    ) {\n        visit_struct_declaration(self, struct_declaration, span)\n    }\n\n    fn visit_struct_field(&mut self, struct_field: &'ast StructField, span: &'ast Span) {\n        visit_struct_field(self, struct_field, span)\n    }\n\n    fn visit_specifier_qualifier(\n        &mut self,\n        specifier_qualifier: &'ast SpecifierQualifier,\n        span: &'ast Span,\n    ) {\n        visit_specifier_qualifier(self, specifier_qualifier, span)\n    }\n\n    fn visit_struct_declarator(\n        &mut self,\n        struct_declarator: &'ast StructDeclarator,\n        span: &'ast Span,\n    ) {\n        visit_struct_declarator(self, struct_declarator, span)\n    }\n\n    fn visit_enum_type(&mut self, enum_type: &'ast EnumType, span: &'ast Span) {\n        visit_enum_type(self, enum_type, span)\n    }\n\n    fn visit_enumerator(&mut self, enumerator: &'ast Enumerator, span: &'ast Span) {\n        visit_enumerator(self, enumerator, span)\n    }\n\n    fn visit_type_qualifier(&mut self, type_qualifier: &'ast TypeQualifier, span: &'ast Span) {\n        visit_type_qualifier(self, type_qualifier, span)\n    }\n\n    fn visit_function_specifier(\n        &mut self,\n        function_specifier: &'ast FunctionSpecifier,\n        span: &'ast Span,\n    ) {\n        visit_function_specifier(self, function_specifier, span)\n    }\n\n    fn visit_alignment_specifier(\n        &mut self,\n        alignment_specifier: &'ast AlignmentSpecifier,\n        span: &'ast Span,\n    ) {\n        visit_alignment_specifier(self, alignment_specifier, span)\n    }\n\n    fn visit_declarator(&mut self, declarator: &'ast Declarator, span: &'ast Span) {\n        visit_declarator(self, declarator, span)\n    }\n\n    fn visit_declarator_kind(&mut self, declarator_kind: &'ast DeclaratorKind, span: &'ast Span) {\n        visit_declarator_kind(self, declarator_kind, span)\n    }\n\n    fn visit_derived_declarator(\n        &mut self,\n        derived_declarator: &'ast DerivedDeclarator,\n        span: &'ast Span,\n    ) {\n        visit_derived_declarator(self, derived_declarator, span)\n    }\n\n    fn visit_array_declarator(\n        &mut self,\n        array_declarator: &'ast ArrayDeclarator,\n        span: &'ast Span,\n    ) {\n        visit_array_declarator(self, array_declarator, span)\n    }\n\n    fn visit_function_declarator(\n        &mut self,\n        function_declarator: &'ast FunctionDeclarator,\n        span: &'ast Span,\n    ) {\n        visit_function_declarator(self, function_declarator, span)\n    }\n\n    fn visit_pointer_qualifier(\n        &mut self,\n        pointer_qualifier: &'ast PointerQualifier,\n        span: &'ast Span,\n    ) {\n        visit_pointer_qualifier(self, pointer_qualifier, span)\n    }\n\n    fn visit_array_size(&mut self, array_size: &'ast ArraySize, span: &'ast Span) {\n        visit_array_size(self, array_size, span)\n    }\n\n    fn visit_parameter_declaration(\n        &mut self,\n        parameter_declaration: &'ast ParameterDeclaration,\n        span: &'ast Span,\n    ) {\n        visit_parameter_declaration(self, parameter_declaration, span)\n    }\n\n    fn visit_ellipsis(&mut self, ellipsis: &'ast Ellipsis, span: &'ast Span) {\n        visit_ellipsis(self, ellipsis, span)\n    }\n\n    fn visit_type_name(&mut self, type_name: &'ast TypeName, span: &'ast Span) {\n        visit_type_name(self, type_name, span)\n    }\n\n    fn visit_initializer(&mut self, initializer: &'ast Initializer, span: &'ast Span) {\n        visit_initializer(self, initializer, span)\n    }\n\n    fn visit_initializer_list_item(\n        &mut self,\n        initializer_list_item: &'ast InitializerListItem,\n        span: &'ast Span,\n    ) {\n        visit_initializer_list_item(self, initializer_list_item, span)\n    }\n\n    fn visit_designator(&mut self, designator: &'ast Designator, span: &'ast Span) {\n        visit_designator(self, designator, span)\n    }\n\n    fn visit_range_designator(\n        &mut self,\n        range_designator: &'ast RangeDesignator,\n        span: &'ast Span,\n    ) {\n        visit_range_designator(self, range_designator, span)\n    }\n\n    fn visit_static_assert(&mut self, static_assert: &'ast StaticAssert, span: &'ast Span) {\n        visit_static_assert(self, static_assert, span)\n    }\n\n    fn visit_statement(&mut self, statement: &'ast Statement, span: &'ast Span) {\n        visit_statement(self, statement, span)\n    }\n\n    fn visit_labeled_statement(\n        &mut self,\n        labeled_statement: &'ast LabeledStatement,\n        span: &'ast Span,\n    ) {\n        visit_labeled_statement(self, labeled_statement, span)\n    }\n\n    fn visit_if_statement(&mut self, if_statement: &'ast IfStatement, span: &'ast Span) {\n        visit_if_statement(self, if_statement, span)\n    }\n\n    fn visit_switch_statement(\n        &mut self,\n        switch_statement: &'ast SwitchStatement,\n        span: &'ast Span,\n    ) {\n        visit_switch_statement(self, switch_statement, span)\n    }\n\n    fn visit_while_statement(&mut self, while_statement: &'ast WhileStatement, span: &'ast Span) {\n        visit_while_statement(self, while_statement, span)\n    }\n\n    fn visit_do_while_statement(\n        &mut self,\n        do_while_statement: &'ast DoWhileStatement,\n        span: &'ast Span,\n    ) {\n        visit_do_while_statement(self, do_while_statement, span)\n    }\n\n    fn visit_for_statement(&mut self, for_statement: &'ast ForStatement, span: &'ast Span) {\n        visit_for_statement(self, for_statement, span)\n    }\n\n    fn visit_label(&mut self, label: &'ast Label, span: &'ast Span) {\n        visit_label(self, label, span)\n    }\n\n    fn visit_case_range(&mut self, range: &'ast CaseRange, span: &'ast Span) {\n        visit_case_range(self, range, span)\n    }\n\n    fn visit_for_initializer(&mut self, for_initializer: &'ast ForInitializer, span: &'ast Span) {\n        visit_for_initializer(self, for_initializer, span)\n    }\n\n    fn visit_block_item(&mut self, block_item: &'ast BlockItem, span: &'ast Span) {\n        visit_block_item(self, block_item, span)\n    }\n\n    fn visit_translation_unit(&mut self, translation_unit: &'ast TranslationUnit) {\n        visit_translation_unit(self, translation_unit)\n    }\n\n    fn visit_external_declaration(\n        &mut self,\n        external_declaration: &'ast ExternalDeclaration,\n        span: &'ast Span,\n    ) {\n        visit_external_declaration(self, external_declaration, span)\n    }\n\n    fn visit_function_definition(\n        &mut self,\n        function_definition: &'ast FunctionDefinition,\n        span: &'ast Span,\n    ) {\n        visit_function_definition(self, function_definition, span)\n    }\n\n    fn visit_extension(&mut self, extension: &'ast Extension, span: &'ast Span) {\n        visit_extension(self, extension, span)\n    }\n\n    fn visit_attribute(&mut self, attribute: &'ast Attribute, span: &'ast Span) {\n        visit_attribute(self, attribute, span)\n    }\n\n    fn visit_asm_statement(&mut self, asm_statement: &'ast AsmStatement, span: &'ast Span) {\n        visit_asm_statement(self, asm_statement, span)\n    }\n\n    fn visit_availability_attribute(\n        &mut self,\n        availability: &'ast AvailabilityAttribute,\n        span: &'ast Span,\n    ) {\n        visit_availability_attribute(self, availability, span)\n    }\n\n    fn visit_availability_clause(&mut self, _clause: &'ast AvailabilityClause, _span: &'ast Span) {}\n\n    fn visit_gnu_extended_asm_statement(\n        &mut self,\n        gnu_extended_asm_statement: &'ast GnuExtendedAsmStatement,\n        span: &'ast Span,\n    ) {\n        visit_gnu_extended_asm_statement(self, gnu_extended_asm_statement, span)\n    }\n\n    fn visit_gnu_asm_operand(&mut self, gnu_asm_operand: &'ast GnuAsmOperand, span: &'ast Span) {\n        visit_gnu_asm_operand(self, gnu_asm_operand, span)\n    }\n\n    fn visit_type_of(&mut self, type_of: &'ast TypeOf, span: &'ast Span) {\n        visit_type_of(self, type_of, span)\n    }\n}\n\npub fn visit_identifier<'ast, V: Visit<'ast> + ?Sized>(\n    _visitor: &mut V,\n    _identifier: &'ast Identifier,\n    _span: &'ast Span,\n) {\n}\n\npub fn visit_constant<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    constant: &'ast Constant,\n    span: &'ast Span,\n) {\n    match *constant {\n        Constant::Integer(ref i) => visitor.visit_integer(i, span),\n        Constant::Float(ref f) => visitor.visit_float(f, span),\n        Constant::Character(_) => {}\n    }\n}\n\npub fn visit_integer<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    integer: &'ast Integer,\n    span: &'ast Span,\n) {\n    visitor.visit_integer_base(&integer.base, span);\n    visitor.visit_integer_suffix(&integer.suffix, span);\n}\n\npub fn visit_integer_base<'ast, V: Visit<'ast> + ?Sized>(\n    _visitor: &mut V,\n    _integer_base: &'ast IntegerBase,\n    _span: &'ast Span,\n) {\n}\n\npub fn visit_integer_suffix<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    integer_suffix: &'ast IntegerSuffix,\n    span: &'ast Span,\n) {\n    visitor.visit_integer_size(&integer_suffix.size, span);\n}\n\npub fn visit_integer_size<'ast, V: Visit<'ast> + ?Sized>(\n    _visitor: &mut V,\n    _integer_size: &'ast IntegerSize,\n    _span: &'ast Span,\n) {\n}\n\npub fn visit_float<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    float: &'ast Float,\n    span: &'ast Span,\n) {\n    visitor.visit_float_base(&float.base, span);\n    visitor.visit_float_suffix(&float.suffix, span);\n}\n\npub fn visit_float_base<'ast, V: Visit<'ast> + ?Sized>(\n    _visitor: &mut V,\n    _float_base: &'ast FloatBase,\n    _span: &'ast Span,\n) {\n}\n\npub fn visit_float_suffix<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    float_suffix: &'ast FloatSuffix,\n    span: &'ast Span,\n) {\n    visitor.visit_float_format(&float_suffix.format, span);\n}\n\npub fn visit_float_format<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    float_format: &'ast FloatFormat,\n    span: &'ast Span,\n) {\n    match *float_format {\n        FloatFormat::TS18661Format(ref f) => visitor.visit_ts18661_float_type(f, span),\n        _ => {}\n    }\n}\n\npub fn visit_string_literal<'ast, V: Visit<'ast> + ?Sized>(\n    _visitor: &mut V,\n    _string_literal: &'ast StringLiteral,\n    _span: &'ast Span,\n) {\n}\n\npub fn visit_expression<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    expression: &'ast Expression,\n    _span: &'ast Span,\n) {\n    match *expression {\n        Expression::Identifier(ref i) => visitor.visit_identifier(&i.node, &i.span),\n        Expression::Constant(ref c) => visitor.visit_constant(&c.node, &c.span),\n        Expression::StringLiteral(ref s) => visitor.visit_string_literal(&s.node, &s.span),\n        Expression::GenericSelection(ref g) => visitor.visit_generic_selection(&g.node, &g.span),\n        Expression::Member(ref m) => visitor.visit_member_expression(&m.node, &m.span),\n        Expression::Call(ref c) => visitor.visit_call_expression(&c.node, &c.span),\n        Expression::CompoundLiteral(ref c) => visitor.visit_compound_literal(&c.node, &c.span),\n        Expression::SizeOfTy(ref s) => visitor.visit_sizeofty(&s.node, &s.span),\n        Expression::SizeOfVal(ref s) => visitor.visit_sizeofval(&s.node, &s.span),\n        Expression::AlignOf(ref a) => visitor.visit_alignof(&a.node, &a.span),\n        Expression::UnaryOperator(ref u) => {\n            visitor.visit_unary_operator_expression(&u.node, &u.span)\n        }\n        Expression::Cast(ref c) => visitor.visit_cast_expression(&c.node, &c.span),\n        Expression::BinaryOperator(ref b) => {\n            visitor.visit_binary_operator_expression(&b.node, &b.span)\n        }\n        Expression::Conditional(ref c) => visitor.visit_conditional_expression(&c.node, &c.span),\n        Expression::Comma(ref comma) => {\n            for c in comma.iter() {\n                visitor.visit_expression(&c.node, &c.span);\n            }\n        }\n        Expression::OffsetOf(ref o) => visitor.visit_offset_of_expression(&o.node, &o.span),\n        Expression::VaArg(ref v) => visitor.visit_va_arg_expression(&v.node, &v.span),\n        Expression::Statement(ref s) => visitor.visit_statement(&s.node, &s.span),\n    }\n}\n\npub fn visit_member_operator<'ast, V: Visit<'ast> + ?Sized>(\n    _visitor: &mut V,\n    _member_operator: &'ast MemberOperator,\n    _span: &'ast Span,\n) {\n}\n\npub fn visit_generic_selection<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    generic_selection: &'ast GenericSelection,\n    _span: &'ast Span,\n) {\n    visitor.visit_expression(\n        &generic_selection.expression.node,\n        &generic_selection.expression.span,\n    );\n    for association in &generic_selection.associations {\n        visitor.visit_generic_association(&association.node, &association.span);\n    }\n}\n\npub fn visit_generic_association<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    generic_association: &'ast GenericAssociation,\n    _span: &'ast Span,\n) {\n    match *generic_association {\n        GenericAssociation::Type(ref t) => visitor.visit_generic_association_type(&t.node, &t.span),\n        GenericAssociation::Default(ref d) => visitor.visit_expression(&d.node, &d.span),\n    }\n}\n\npub fn visit_generic_association_type<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    generic_association_type: &'ast GenericAssociationType,\n    _span: &'ast Span,\n) {\n    visitor.visit_type_name(\n        &generic_association_type.type_name.node,\n        &generic_association_type.type_name.span,\n    );\n    visitor.visit_expression(\n        &generic_association_type.expression.node,\n        &generic_association_type.expression.span,\n    );\n}\n\npub fn visit_member_expression<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    member_expression: &'ast MemberExpression,\n    _span: &'ast Span,\n) {\n    visitor.visit_member_operator(\n        &member_expression.operator.node,\n        &member_expression.operator.span,\n    );\n    visitor.visit_expression(\n        &member_expression.expression.node,\n        &member_expression.expression.span,\n    );\n    visitor.visit_identifier(\n        &member_expression.identifier.node,\n        &member_expression.identifier.span,\n    );\n}\n\npub fn visit_call_expression<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    call_expression: &'ast CallExpression,\n    _span: &'ast Span,\n) {\n    visitor.visit_expression(&call_expression.callee.node, &call_expression.callee.span);\n    for argument in &call_expression.arguments {\n        visitor.visit_expression(&argument.node, &argument.span);\n    }\n}\n\npub fn visit_compound_literal<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    compound_literal: &'ast CompoundLiteral,\n    _span: &'ast Span,\n) {\n    visitor.visit_type_name(\n        &compound_literal.type_name.node,\n        &compound_literal.type_name.span,\n    );\n    for initializer in &compound_literal.initializer_list {\n        visitor.visit_initializer_list_item(&initializer.node, &initializer.span);\n    }\n}\n\npub fn visit_sizeofty<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    sizeofty: &'ast SizeOfTy,\n    _span: &'ast Span,\n) {\n    visitor.visit_type_name(&sizeofty.0.node, &sizeofty.0.span);\n}\n\npub fn visit_sizeofval<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    sizeofval: &'ast SizeOfVal,\n    _span: &'ast Span,\n) {\n    visitor.visit_expression(&sizeofval.0.node, &sizeofval.0.span);\n}\n\npub fn visit_alignof<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    alignofty: &'ast AlignOf,\n    _span: &'ast Span,\n) {\n    visitor.visit_type_name(&alignofty.0.node, &alignofty.0.span);\n}\n\npub fn visit_unary_operator<'ast, V: Visit<'ast> + ?Sized>(\n    _visitor: &mut V,\n    _unary_operator: &'ast UnaryOperator,\n    _span: &'ast Span,\n) {\n}\n\npub fn visit_unary_operator_expression<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    unary_operator_expression: &'ast UnaryOperatorExpression,\n    _span: &'ast Span,\n) {\n    match unary_operator_expression.operator.node {\n        UnaryOperator::PostIncrement | UnaryOperator::PostDecrement => {\n            visitor.visit_expression(\n                &unary_operator_expression.operand.node,\n                &unary_operator_expression.operand.span,\n            );\n            visitor.visit_unary_operator(\n                &unary_operator_expression.operator.node,\n                &unary_operator_expression.operator.span,\n            );\n        }\n        _ => {\n            visitor.visit_unary_operator(\n                &unary_operator_expression.operator.node,\n                &unary_operator_expression.operator.span,\n            );\n            visitor.visit_expression(\n                &unary_operator_expression.operand.node,\n                &unary_operator_expression.operand.span,\n            );\n        }\n    }\n}\n\npub fn visit_cast_expression<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    cast_expression: &'ast CastExpression,\n    _span: &'ast Span,\n) {\n    visitor.visit_type_name(\n        &cast_expression.type_name.node,\n        &cast_expression.type_name.span,\n    );\n    visitor.visit_expression(\n        &cast_expression.expression.node,\n        &cast_expression.expression.span,\n    );\n}\n\npub fn visit_binary_operator<'ast, V: Visit<'ast> + ?Sized>(\n    _visitor: &mut V,\n    _binary_operator: &'ast BinaryOperator,\n    _span: &'ast Span,\n) {\n}\n\npub fn visit_binary_operator_expression<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    binary_operator_expression: &'ast BinaryOperatorExpression,\n    _span: &'ast Span,\n) {\n    visitor.visit_expression(\n        &binary_operator_expression.lhs.node,\n        &binary_operator_expression.lhs.span,\n    );\n    visitor.visit_expression(\n        &binary_operator_expression.rhs.node,\n        &binary_operator_expression.rhs.span,\n    );\n    visitor.visit_binary_operator(\n        &binary_operator_expression.operator.node,\n        &binary_operator_expression.operator.span,\n    );\n}\n\npub fn visit_conditional_expression<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    conditional_expression: &'ast ConditionalExpression,\n    _span: &'ast Span,\n) {\n    visitor.visit_expression(\n        &conditional_expression.condition.node,\n        &conditional_expression.condition.span,\n    );\n    visitor.visit_expression(\n        &conditional_expression.then_expression.node,\n        &conditional_expression.then_expression.span,\n    );\n    visitor.visit_expression(\n        &conditional_expression.else_expression.node,\n        &conditional_expression.else_expression.span,\n    );\n}\n\npub fn visit_va_arg_expression<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    va_arg_expression: &'ast VaArgExpression,\n    _span: &'ast Span,\n) {\n    visitor.visit_expression(\n        &va_arg_expression.va_list.node,\n        &va_arg_expression.va_list.span,\n    );\n    visitor.visit_type_name(\n        &va_arg_expression.type_name.node,\n        &va_arg_expression.type_name.span,\n    );\n}\n\npub fn visit_offset_of_expression<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    offset_of_expression: &'ast OffsetOfExpression,\n    _span: &'ast Span,\n) {\n    visitor.visit_type_name(\n        &offset_of_expression.type_name.node,\n        &offset_of_expression.type_name.span,\n    );\n    visitor.visit_offset_designator(\n        &offset_of_expression.designator.node,\n        &offset_of_expression.designator.span,\n    );\n}\n\npub fn visit_offset_designator<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    offset_designator: &'ast OffsetDesignator,\n    _span: &'ast Span,\n) {\n    visitor.visit_identifier(&offset_designator.base.node, &offset_designator.base.span);\n    for member in &offset_designator.members {\n        visitor.visit_offset_member(&member.node, &member.span);\n    }\n}\n\npub fn visit_offset_member<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    offset_member: &'ast OffsetMember,\n    _span: &'ast Span,\n) {\n    match *offset_member {\n        OffsetMember::Member(ref m) => visitor.visit_identifier(&m.node, &m.span),\n        OffsetMember::IndirectMember(ref m) => visitor.visit_identifier(&m.node, &m.span),\n        OffsetMember::Index(ref i) => visitor.visit_expression(&i.node, &i.span),\n    }\n}\n\npub fn visit_declaration<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    declaration: &'ast Declaration,\n    _span: &'ast Span,\n) {\n    for specifier in &declaration.specifiers {\n        visitor.visit_declaration_specifier(&specifier.node, &specifier.span);\n    }\n\n    for declarator in &declaration.declarators {\n        visitor.visit_init_declarator(&declarator.node, &declarator.span);\n    }\n}\n\npub fn visit_declaration_specifier<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    declaration_specifier: &'ast DeclarationSpecifier,\n    _span: &'ast Span,\n) {\n    match *declaration_specifier {\n        DeclarationSpecifier::StorageClass(ref s) => {\n            visitor.visit_storage_class_specifier(&s.node, &s.span)\n        }\n        DeclarationSpecifier::TypeSpecifier(ref t) => {\n            visitor.visit_type_specifier(&t.node, &t.span)\n        }\n        DeclarationSpecifier::TypeQualifier(ref t) => {\n            visitor.visit_type_qualifier(&t.node, &t.span)\n        }\n        DeclarationSpecifier::Function(ref f) => visitor.visit_function_specifier(&f.node, &f.span),\n        DeclarationSpecifier::Alignment(ref a) => {\n            visitor.visit_alignment_specifier(&a.node, &a.span)\n        }\n        DeclarationSpecifier::Extension(ref e) => {\n            for extension in e {\n                visitor.visit_extension(&extension.node, &extension.span);\n            }\n        }\n    }\n}\n\npub fn visit_init_declarator<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    init_declarator: &'ast InitDeclarator,\n    _span: &'ast Span,\n) {\n    visitor.visit_declarator(\n        &init_declarator.declarator.node,\n        &init_declarator.declarator.span,\n    );\n    if let Some(ref initializer) = init_declarator.initializer {\n        visitor.visit_initializer(&initializer.node, &initializer.span);\n    }\n}\n\npub fn visit_storage_class_specifier<'ast, V: Visit<'ast> + ?Sized>(\n    _visitor: &mut V,\n    _storage_class_specifier: &'ast StorageClassSpecifier,\n    _span: &'ast Span,\n) {\n}\n\npub fn visit_type_specifier<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    type_specifier: &'ast TypeSpecifier,\n    span: &'ast Span,\n) {\n    match *type_specifier {\n        TypeSpecifier::Atomic(ref a) => visitor.visit_type_name(&a.node, &a.span),\n        TypeSpecifier::Struct(ref s) => visitor.visit_struct_type(&s.node, &s.span),\n        TypeSpecifier::Enum(ref e) => visitor.visit_enum_type(&e.node, &e.span),\n        TypeSpecifier::TypedefName(ref t) => visitor.visit_identifier(&t.node, &t.span),\n        TypeSpecifier::TypeOf(ref t) => visitor.visit_type_of(&t.node, &t.span),\n        TypeSpecifier::TS18661Float(ref t) => visitor.visit_ts18661_float_type(t, span),\n        _ => {}\n    }\n}\n\npub fn visit_ts18661_float_type<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    ts18661_float_type: &'ast TS18661FloatType,\n    span: &'ast Span,\n) {\n    visitor.visit_ts18661_float_format(&ts18661_float_type.format, span);\n}\n\npub fn visit_ts18661_float_format<'ast, V: Visit<'ast> + ?Sized>(\n    _visitor: &mut V,\n    _ts18661_float_format: &'ast TS18661FloatFormat,\n    _span: &'ast Span,\n) {\n}\n\npub fn visit_struct_type<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    struct_type: &'ast StructType,\n    _span: &'ast Span,\n) {\n    visitor.visit_struct_kind(&struct_type.kind.node, &struct_type.kind.span);\n    if let Some(ref identifier) = struct_type.identifier {\n        visitor.visit_identifier(&identifier.node, &identifier.span);\n    }\n    if let Some(ref declarations) = struct_type.declarations {\n        for declaration in declarations {\n            visitor.visit_struct_declaration(&declaration.node, &declaration.span);\n        }\n    }\n}\n\npub fn visit_struct_kind<'ast, V: Visit<'ast> + ?Sized>(\n    _visitor: &mut V,\n    _struct_kind: &'ast StructKind,\n    _span: &'ast Span,\n) {\n}\n\npub fn visit_struct_declaration<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    struct_declaration: &'ast StructDeclaration,\n    _span: &'ast Span,\n) {\n    match *struct_declaration {\n        StructDeclaration::Field(ref f) => visitor.visit_struct_field(&f.node, &f.span),\n        StructDeclaration::StaticAssert(ref s) => visitor.visit_static_assert(&s.node, &s.span),\n    }\n}\n\npub fn visit_struct_field<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    struct_field: &'ast StructField,\n    _span: &'ast Span,\n) {\n    for specifier in &struct_field.specifiers {\n        visitor.visit_specifier_qualifier(&specifier.node, &specifier.span);\n    }\n    for declarator in &struct_field.declarators {\n        visitor.visit_struct_declarator(&declarator.node, &declarator.span);\n    }\n}\n\npub fn visit_specifier_qualifier<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    specifier_qualifier: &'ast SpecifierQualifier,\n    _span: &'ast Span,\n) {\n    match *specifier_qualifier {\n        SpecifierQualifier::TypeSpecifier(ref t) => visitor.visit_type_specifier(&t.node, &t.span),\n        SpecifierQualifier::TypeQualifier(ref t) => visitor.visit_type_qualifier(&t.node, &t.span),\n        SpecifierQualifier::Extension(ref e) => {\n            for n in e {\n                visitor.visit_extension(&n.node, &n.span);\n            }\n        }\n    }\n}\n\npub fn visit_struct_declarator<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    struct_declarator: &'ast StructDeclarator,\n    _span: &'ast Span,\n) {\n    if let Some(ref declarator) = struct_declarator.declarator {\n        visitor.visit_declarator(&declarator.node, &declarator.span);\n    }\n    if let Some(ref bit_width) = struct_declarator.bit_width {\n        visitor.visit_expression(&bit_width.node, &bit_width.span);\n    }\n}\n\npub fn visit_enum_type<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    enum_type: &'ast EnumType,\n    _span: &'ast Span,\n) {\n    if let Some(ref identifier) = enum_type.identifier {\n        visitor.visit_identifier(&identifier.node, &identifier.span);\n    }\n    for enumerator in &enum_type.enumerators {\n        visitor.visit_enumerator(&enumerator.node, &enumerator.span);\n    }\n}\n\npub fn visit_enumerator<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    enumerator: &'ast Enumerator,\n    _span: &'ast Span,\n) {\n    visitor.visit_identifier(&enumerator.identifier.node, &enumerator.identifier.span);\n    if let Some(ref expression) = enumerator.expression {\n        visitor.visit_expression(&expression.node, &expression.span);\n    }\n    for extension in &enumerator.extensions {\n        visitor.visit_extension(&extension.node, &extension.span);\n    }\n}\n\npub fn visit_type_qualifier<'ast, V: Visit<'ast> + ?Sized>(\n    _visitor: &mut V,\n    _type_qualifier: &'ast TypeQualifier,\n    _span: &'ast Span,\n) {\n}\n\npub fn visit_function_specifier<'ast, V: Visit<'ast> + ?Sized>(\n    _visitor: &mut V,\n    _function_specifier: &'ast FunctionSpecifier,\n    _span: &'ast Span,\n) {\n}\n\npub fn visit_alignment_specifier<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    alignment_specifier: &'ast AlignmentSpecifier,\n    _span: &'ast Span,\n) {\n    match *alignment_specifier {\n        AlignmentSpecifier::Type(ref t) => visitor.visit_type_name(&t.node, &t.span),\n        AlignmentSpecifier::Constant(ref c) => visitor.visit_expression(&c.node, &c.span),\n    }\n}\n\npub fn visit_declarator<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    declarator: &'ast Declarator,\n    _span: &'ast Span,\n) {\n    visitor.visit_declarator_kind(&declarator.kind.node, &declarator.kind.span);\n    for derived in &declarator.derived {\n        visitor.visit_derived_declarator(&derived.node, &derived.span);\n    }\n    for extension in &declarator.extensions {\n        visitor.visit_extension(&extension.node, &extension.span);\n    }\n}\n\npub fn visit_declarator_kind<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    declarator_kind: &'ast DeclaratorKind,\n    _span: &'ast Span,\n) {\n    match *declarator_kind {\n        DeclaratorKind::Identifier(ref i) => visitor.visit_identifier(&i.node, &i.span),\n        DeclaratorKind::Declarator(ref d) => visitor.visit_declarator(&d.node, &d.span),\n        _ => {}\n    }\n}\n\npub fn visit_derived_declarator<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    derived_declarator: &'ast DerivedDeclarator,\n    _span: &'ast Span,\n) {\n    match *derived_declarator {\n        DerivedDeclarator::Pointer(ref p) => {\n            for pointer in p {\n                visitor.visit_pointer_qualifier(&pointer.node, &pointer.span);\n            }\n        }\n        DerivedDeclarator::Array(ref a) => visitor.visit_array_declarator(&a.node, &a.span),\n        DerivedDeclarator::Function(ref f) => visitor.visit_function_declarator(&f.node, &f.span),\n        DerivedDeclarator::KRFunction(ref k) => {\n            for identifier in k {\n                visitor.visit_identifier(&identifier.node, &identifier.span);\n            }\n        }\n        DerivedDeclarator::Block(ref qs) => {\n            for q in qs {\n                visitor.visit_pointer_qualifier(&q.node, &q.span);\n            }\n        }\n    }\n}\n\npub fn visit_array_declarator<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    array_declarator: &'ast ArrayDeclarator,\n    span: &'ast Span,\n) {\n    for qualifier in &array_declarator.qualifiers {\n        visitor.visit_type_qualifier(&qualifier.node, &qualifier.span);\n    }\n    visitor.visit_array_size(&array_declarator.size, span)\n}\n\npub fn visit_function_declarator<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    function_declarator: &'ast FunctionDeclarator,\n    span: &'ast Span,\n) {\n    for parameter in &function_declarator.parameters {\n        visitor.visit_parameter_declaration(&parameter.node, &parameter.span);\n    }\n    visitor.visit_ellipsis(&function_declarator.ellipsis, span);\n}\n\npub fn visit_pointer_qualifier<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    pointer_qualifier: &'ast PointerQualifier,\n    _span: &'ast Span,\n) {\n    match *pointer_qualifier {\n        PointerQualifier::TypeQualifier(ref t) => visitor.visit_type_qualifier(&t.node, &t.span),\n        PointerQualifier::Extension(ref e) => {\n            for extension in e {\n                visitor.visit_extension(&extension.node, &extension.span);\n            }\n        }\n    }\n}\n\npub fn visit_array_size<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    array_size: &'ast ArraySize,\n    _span: &'ast Span,\n) {\n    match *array_size {\n        ArraySize::VariableExpression(ref e) => visitor.visit_expression(&e.node, &e.span),\n        ArraySize::StaticExpression(ref s) => visitor.visit_expression(&s.node, &s.span),\n        _ => {}\n    }\n}\n\npub fn visit_parameter_declaration<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    parameter_declaration: &'ast ParameterDeclaration,\n    _span: &'ast Span,\n) {\n    for specifier in &parameter_declaration.specifiers {\n        visitor.visit_declaration_specifier(&specifier.node, &specifier.span);\n    }\n    if let Some(ref declarator) = parameter_declaration.declarator {\n        visitor.visit_declarator(&declarator.node, &declarator.span);\n    }\n    for extension in &parameter_declaration.extensions {\n        visitor.visit_extension(&extension.node, &extension.span);\n    }\n}\n\npub fn visit_ellipsis<'ast, V: Visit<'ast> + ?Sized>(\n    _visitor: &mut V,\n    _ellipsis: &'ast Ellipsis,\n    _span: &'ast Span,\n) {\n}\n\npub fn visit_type_name<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    type_name: &'ast TypeName,\n    _span: &'ast Span,\n) {\n    for specifier in &type_name.specifiers {\n        visitor.visit_specifier_qualifier(&specifier.node, &specifier.span);\n    }\n    if let Some(ref declarator) = type_name.declarator {\n        visitor.visit_declarator(&declarator.node, &declarator.span);\n    }\n}\n\npub fn visit_initializer<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    initializer: &'ast Initializer,\n    _span: &'ast Span,\n) {\n    match *initializer {\n        Initializer::Expression(ref e) => visitor.visit_expression(&e.node, &e.span),\n        Initializer::List(ref l) => {\n            for item in l {\n                visitor.visit_initializer_list_item(&item.node, &item.span);\n            }\n        }\n    }\n}\n\npub fn visit_initializer_list_item<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    initializer_list_item: &'ast InitializerListItem,\n    _span: &'ast Span,\n) {\n    for designation in &initializer_list_item.designation {\n        visitor.visit_designator(&designation.node, &designation.span);\n    }\n    visitor.visit_initializer(\n        &initializer_list_item.initializer.node,\n        &initializer_list_item.initializer.span,\n    );\n}\n\npub fn visit_designator<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    designator: &'ast Designator,\n    _span: &'ast Span,\n) {\n    match *designator {\n        Designator::Index(ref i) => visitor.visit_expression(&i.node, &i.span),\n        Designator::Member(ref m) => visitor.visit_identifier(&m.node, &m.span),\n        Designator::Range(ref r) => visitor.visit_range_designator(&r.node, &r.span),\n    }\n}\n\npub fn visit_range_designator<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    range_designator: &'ast RangeDesignator,\n    _span: &'ast Span,\n) {\n    visitor.visit_expression(&range_designator.from.node, &range_designator.from.span);\n    visitor.visit_expression(&range_designator.to.node, &range_designator.to.span);\n}\n\npub fn visit_static_assert<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    static_assert: &'ast StaticAssert,\n    _span: &'ast Span,\n) {\n    visitor.visit_expression(\n        &static_assert.expression.node,\n        &static_assert.expression.span,\n    );\n    visitor.visit_string_literal(&static_assert.message.node, &static_assert.message.span);\n}\n\npub fn visit_statement<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    statement: &'ast Statement,\n    _span: &'ast Span,\n) {\n    match *statement {\n        Statement::Labeled(ref l) => visitor.visit_labeled_statement(&l.node, &l.span),\n        Statement::Compound(ref c) => {\n            for item in c {\n                visitor.visit_block_item(&item.node, &item.span);\n            }\n        }\n        Statement::Expression(Some(ref e)) => {\n            visitor.visit_expression(&e.node, &e.span);\n        }\n        Statement::If(ref i) => visitor.visit_if_statement(&i.node, &i.span),\n        Statement::Switch(ref s) => visitor.visit_switch_statement(&s.node, &s.span),\n        Statement::While(ref w) => visitor.visit_while_statement(&w.node, &w.span),\n        Statement::DoWhile(ref d) => visitor.visit_do_while_statement(&d.node, &d.span),\n        Statement::For(ref f) => visitor.visit_for_statement(&f.node, &f.span),\n        Statement::Goto(ref g) => visitor.visit_identifier(&g.node, &g.span),\n        Statement::Return(Some(ref r)) => {\n            visitor.visit_expression(&r.node, &r.span);\n        }\n        Statement::Asm(ref a) => visitor.visit_asm_statement(&a.node, &a.span),\n        _ => {}\n    }\n}\n\npub fn visit_labeled_statement<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    labeled_statement: &'ast LabeledStatement,\n    _span: &'ast Span,\n) {\n    visitor.visit_label(&labeled_statement.label.node, &labeled_statement.label.span);\n    visitor.visit_statement(\n        &labeled_statement.statement.node,\n        &labeled_statement.statement.span,\n    );\n}\n\npub fn visit_if_statement<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    if_statement: &'ast IfStatement,\n    _span: &'ast Span,\n) {\n    visitor.visit_expression(&if_statement.condition.node, &if_statement.condition.span);\n    visitor.visit_statement(\n        &if_statement.then_statement.node,\n        &if_statement.then_statement.span,\n    );\n    if let Some(ref e) = if_statement.else_statement {\n        visitor.visit_statement(&e.node, &e.span);\n    }\n}\n\npub fn visit_switch_statement<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    switch_statement: &'ast SwitchStatement,\n    _span: &'ast Span,\n) {\n    visitor.visit_expression(\n        &switch_statement.expression.node,\n        &switch_statement.expression.span,\n    );\n    visitor.visit_statement(\n        &switch_statement.statement.node,\n        &switch_statement.statement.span,\n    );\n}\n\npub fn visit_while_statement<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    while_statement: &'ast WhileStatement,\n    _span: &'ast Span,\n) {\n    visitor.visit_expression(\n        &while_statement.expression.node,\n        &while_statement.expression.span,\n    );\n    visitor.visit_statement(\n        &while_statement.statement.node,\n        &while_statement.statement.span,\n    );\n}\n\npub fn visit_do_while_statement<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    do_while_statement: &'ast DoWhileStatement,\n    _span: &'ast Span,\n) {\n    visitor.visit_statement(\n        &do_while_statement.statement.node,\n        &do_while_statement.statement.span,\n    );\n    visitor.visit_expression(\n        &do_while_statement.expression.node,\n        &do_while_statement.expression.span,\n    );\n}\n\npub fn visit_for_statement<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    for_statement: &'ast ForStatement,\n    _span: &'ast Span,\n) {\n    visitor.visit_for_initializer(\n        &for_statement.initializer.node,\n        &for_statement.initializer.span,\n    );\n    if let Some(ref c) = for_statement.condition {\n        visitor.visit_expression(&c.node, &c.span);\n    }\n    if let Some(ref s) = for_statement.step {\n        visitor.visit_expression(&s.node, &s.span);\n    }\n    visitor.visit_statement(&for_statement.statement.node, &for_statement.statement.span);\n}\n\npub fn visit_label<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    label: &'ast Label,\n    _span: &'ast Span,\n) {\n    match *label {\n        Label::Identifier(ref i) => visitor.visit_identifier(&i.node, &i.span),\n        Label::Case(ref c) => visitor.visit_expression(&c.node, &c.span),\n        Label::CaseRange(ref c) => visitor.visit_case_range(&c.node, &c.span),\n        Label::Default => {}\n    }\n}\n\npub fn visit_case_range<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    range: &'ast CaseRange,\n    _span: &'ast Span,\n) {\n    visitor.visit_expression(&range.low.node, &range.low.span);\n    visitor.visit_expression(&range.high.node, &range.high.span);\n}\n\npub fn visit_for_initializer<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    for_initializer: &'ast ForInitializer,\n    _span: &'ast Span,\n) {\n    match *for_initializer {\n        ForInitializer::Empty => {}\n        ForInitializer::Expression(ref e) => visitor.visit_expression(&e.node, &e.span),\n        ForInitializer::Declaration(ref d) => visitor.visit_declaration(&d.node, &d.span),\n        ForInitializer::StaticAssert(ref s) => visitor.visit_static_assert(&s.node, &s.span),\n    }\n}\n\npub fn visit_block_item<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    block_item: &'ast BlockItem,\n    _span: &'ast Span,\n) {\n    match *block_item {\n        BlockItem::Declaration(ref d) => visitor.visit_declaration(&d.node, &d.span),\n        BlockItem::StaticAssert(ref s) => visitor.visit_static_assert(&s.node, &s.span),\n        BlockItem::Statement(ref s) => visitor.visit_statement(&s.node, &s.span),\n    }\n}\n\npub fn visit_translation_unit<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    translation_unit: &'ast TranslationUnit,\n) {\n    for element in &translation_unit.0 {\n        visitor.visit_external_declaration(&element.node, &element.span);\n    }\n}\n\npub fn visit_external_declaration<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    external_declaration: &'ast ExternalDeclaration,\n    _span: &'ast Span,\n) {\n    match *external_declaration {\n        ExternalDeclaration::Declaration(ref d) => visitor.visit_declaration(&d.node, &d.span),\n        ExternalDeclaration::StaticAssert(ref s) => visitor.visit_static_assert(&s.node, &s.span),\n        ExternalDeclaration::FunctionDefinition(ref f) => {\n            visitor.visit_function_definition(&f.node, &f.span)\n        }\n    }\n}\n\npub fn visit_function_definition<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    function_definition: &'ast FunctionDefinition,\n    _span: &'ast Span,\n) {\n    for specifier in &function_definition.specifiers {\n        visitor.visit_declaration_specifier(&specifier.node, &specifier.span);\n    }\n    visitor.visit_declarator(\n        &function_definition.declarator.node,\n        &function_definition.declarator.span,\n    );\n    for declaration in &function_definition.declarations {\n        visitor.visit_declaration(&declaration.node, &declaration.span);\n    }\n    visitor.visit_statement(\n        &function_definition.statement.node,\n        &function_definition.statement.span,\n    );\n}\n\npub fn visit_extension<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    extension: &'ast Extension,\n    span: &'ast Span,\n) {\n    match *extension {\n        Extension::Attribute(ref a) => visitor.visit_attribute(a, span),\n        Extension::AsmLabel(ref a) => visitor.visit_string_literal(&a.node, &a.span),\n        Extension::AvailabilityAttribute(ref a) => {\n            visitor.visit_availability_attribute(&a.node, &a.span)\n        }\n    }\n}\n\npub fn visit_attribute<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    attribute: &'ast Attribute,\n    _span: &'ast Span,\n) {\n    for argument in &attribute.arguments {\n        visitor.visit_expression(&argument.node, &argument.span);\n    }\n}\n\npub fn visit_asm_statement<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    asm_statement: &'ast AsmStatement,\n    span: &'ast Span,\n) {\n    match *asm_statement {\n        AsmStatement::GnuBasic(ref g) => visitor.visit_string_literal(&g.node, &g.span),\n        AsmStatement::GnuExtended(ref g) => visitor.visit_gnu_extended_asm_statement(g, span),\n    }\n}\n\npub fn visit_availability_attribute<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    availability: &'ast AvailabilityAttribute,\n    _span: &'ast Span,\n) {\n    for clause in &availability.clauses {\n        visitor.visit_availability_clause(&clause.node, &clause.span);\n    }\n}\n\npub fn visit_gnu_extended_asm_statement<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    gnu_extended_asm_statement: &'ast GnuExtendedAsmStatement,\n    _span: &'ast Span,\n) {\n    if let Some(ref qualifier) = gnu_extended_asm_statement.qualifier {\n        visitor.visit_type_qualifier(&qualifier.node, &qualifier.span);\n    }\n    visitor.visit_string_literal(\n        &gnu_extended_asm_statement.template.node,\n        &gnu_extended_asm_statement.template.span,\n    );\n    for output in &gnu_extended_asm_statement.outputs {\n        visitor.visit_gnu_asm_operand(&output.node, &output.span);\n    }\n    for input in &gnu_extended_asm_statement.inputs {\n        visitor.visit_gnu_asm_operand(&input.node, &input.span);\n    }\n    for clobber in &gnu_extended_asm_statement.clobbers {\n        visitor.visit_string_literal(&clobber.node, &clobber.span);\n    }\n}\n\npub fn visit_gnu_asm_operand<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    gnu_asm_operand: &'ast GnuAsmOperand,\n    _span: &'ast Span,\n) {\n    if let Some(ref name) = gnu_asm_operand.symbolic_name {\n        visitor.visit_identifier(&name.node, &name.span);\n    }\n    visitor.visit_string_literal(\n        &gnu_asm_operand.constraints.node,\n        &gnu_asm_operand.constraints.span,\n    );\n    visitor.visit_expression(\n        &gnu_asm_operand.variable_name.node,\n        &gnu_asm_operand.variable_name.span,\n    );\n}\n\npub fn visit_type_of<'ast, V: Visit<'ast> + ?Sized>(\n    visitor: &mut V,\n    type_of: &'ast TypeOf,\n    _span: &'ast Span,\n) {\n    match *type_of {\n        TypeOf::Expression(ref e) => visitor.visit_expression(&e.node, &e.span),\n        TypeOf::Type(ref t) => visitor.visit_type_name(&t.node, &t.span),\n    }\n}\n"
  }
]