[
  {
    "path": ".editorconfig",
    "content": "root = true\n\n[*]\ncharset = utf-8\n\n[*.{json,toml,yml,gyp}]\nindent_style = space\nindent_size = 2\n\n[*.js]\nindent_style = space\nindent_size = 2\n\n[*.scm]\nindent_style = space\nindent_size = 2\n\n[*.{c,cc,h}]\nindent_style = space\nindent_size = 4\n\n[*.rs]\nindent_style = space\nindent_size = 4\n\n[*.{py,pyi}]\nindent_style = space\nindent_size = 4\n\n[*.swift]\nindent_style = space\nindent_size = 4\n\n[*.go]\nindent_style = tab\nindent_size = 8\n\n[Makefile]\nindent_style = tab\nindent_size = 8\n\n[parser.c]\nindent_size = 2\n\n[{alloc,array,parser}.h]\nindent_size = 2\n"
  },
  {
    "path": ".gitattributes",
    "content": "* text=auto eol=lf\n\n# Generated source files\nsrc/*.json linguist-generated\nsrc/parser.c linguist-generated\nsrc/tree_sitter/* linguist-generated\n\n# C bindings\nbindings/c/* linguist-generated\nCMakeLists.txt linguist-generated\nMakefile linguist-generated\n\n# Rust bindings\nbindings/rust/* linguist-generated\nCargo.toml linguist-generated\nCargo.lock linguist-generated\n\n# Node.js bindings\nbindings/node/* linguist-generated\nbinding.gyp linguist-generated\npackage.json linguist-generated\npackage-lock.json linguist-generated\n\n# Python bindings\nbindings/python/** linguist-generated\nsetup.py linguist-generated\npyproject.toml linguist-generated\n\n# Go bindings\nbindings/go/* linguist-generated\ngo.mod linguist-generated\ngo.sum linguist-generated\n\n# Swift bindings\nbindings/swift/** linguist-generated\nPackage.swift linguist-generated\nPackage.resolved linguist-generated\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.yml",
    "content": "name: Bug Report\ndescription: File a bug or issue\ntitle: \"bug: \"\nlabels: [bug]\nbody:\n  - type: markdown\n    attributes:\n      value: |\n        **Before** reporting an issue, make sure to search [existing issues](https://github.com/tree-sitter/tree-sitter-c/issues). Usage questions such as ***\"How do I...?\"*** either belong in [Discussions](https://github.com/tree-sitter/tree-sitter/discussions) upstream or in our [Discord server](https://discord.gg/w7nTvsVJhm) and will be closed.\n        If your issue is related to a bug in your editor-experience because your editor *leverages* tree-sitter and this parser, then it is likely your issue does *NOT* belong here and belongs in the relevant editor's repository.\n  - type: checkboxes\n    attributes:\n      label: Did you check existing issues?\n      description: Make sure you've checked all of the below before submitting an issue\n      options:\n        - label: I have read all the [tree-sitter docs](https://tree-sitter.github.io/tree-sitter/using-parsers) if it relates to using the parser\n          required: false\n        - label: I have searched the existing issues of tree-sitter-c\n          required: true\n  - type: input\n    attributes:\n      label: \"Tree-Sitter CLI Version, if relevant (output of `tree-sitter --version`)\"\n      placeholder: \"tree-sitter 0.20.8 (6bbb50bef8249e6460e7d69e42cc8146622fa4fd)\"\n    validations:\n      required: false\n  - type: textarea\n    attributes:\n      label: Describe the bug\n      description: A clear and concise description of what the bug is. Please include any related errors you see such as parsing errors or tree-sitter cli errors.\n    validations:\n      required: true\n  - type: textarea\n    attributes:\n      label: Steps To Reproduce/Bad Parse Tree\n      description: Steps to reproduce the behavior. If you have a bad parse tree, please include it here. You can get this by running `tree-sitter parse <path-to-file>` and copying the output.\n      placeholder: |\n        1.\n        2.\n        3.\n    validations:\n      required: true\n  - type: textarea\n    attributes:\n      label: Expected Behavior/Parse Tree\n      description: A concise description of what you expected to happen, or in the case of a bad parse tree, the expected parse tree.\n    validations:\n      required: true\n  - type: textarea\n    attributes:\n      label: Repro\n      description: Minimal code to reproduce this issue. Ideally this should be reproducible with the C library or the tree-sitter cli, do not suggest an editor or external tool.\n      value: |\n        // Example code that causes the issue\n        void foo() {\n          // Code that fails to parse, or causes an error\n        }\n      render: C\n    validations:\n      required: false\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "content": "blank_issues_enabled: false\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.yml",
    "content": "name: Feature Request\ndescription: Suggest a new feature\ntitle: \"feature: \"\nlabels: [enhancement]\nbody:\n  - type: checkboxes\n    attributes:\n      label: Did you check the tree-sitter docs?\n      description: Make sure you read all the docs before submitting a feature request\n      options:\n        - label: I have read all the [tree-sitter docs](https://tree-sitter.github.io/tree-sitter/using-parsers) if it relates to using the parser\n          required: false\n  - type: textarea\n    validations:\n      required: true\n    attributes:\n      label: Is your feature request related to a problem? Please describe.\n      description: A clear and concise description of what the problem is. Ex. I think the grammar models this rule incorrectly and can be improved, or the C spec has officially added a new feature that should be added to the grammar.\n  - type: textarea\n    validations:\n      required: true\n    attributes:\n      label: Describe the solution you'd like\n      description: A clear and concise description of what you want to happen.\n  - type: textarea\n    validations:\n      required: true\n    attributes:\n      label: Describe alternatives you've considered\n      description: A clear and concise description of any alternative solutions or features you've considered.\n  - type: textarea\n    validations:\n      required: false\n    attributes:\n      label: Additional context\n      description: Add any other context or screenshots about the feature request here. If your feature request is related to a new C feature, please include a link to the relevant **official** C documentation.\n"
  },
  {
    "path": ".github/workflows/ci.yml",
    "content": "name: CI\n\non:\n  push:\n    branches: [master]\n    paths:\n      - grammar.js\n      - src/**\n      - test/**\n      - bindings/**\n      - binding.gyp\n  pull_request:\n    paths:\n      - grammar.js\n      - src/**\n      - test/**\n      - bindings/**\n      - binding.gyp\n\nconcurrency:\n  group: ${{github.workflow}}-${{github.ref}}\n  cancel-in-progress: true\n\njobs:\n  test:\n    name: Test parser\n    runs-on: ${{matrix.os}}\n    strategy:\n      fail-fast: false\n      matrix:\n        os: [ubuntu-latest, windows-latest, macos-14]\n    steps:\n      - name: Checkout repository\n        uses: actions/checkout@v4\n      - name: Set up tree-sitter\n        uses: tree-sitter/setup-action/cli@v1\n      - name: Set up examples\n        run: |\n          git clone https://github.com/ruby/spec examples/ruby_spec --single-branch --depth=1 --filter=blob:none\n      - name: Run tests\n        uses: tree-sitter/parser-test-action@v2\n        with:\n          test-rust: true\n          test-node: true\n          test-python: true\n          test-go: true\n          test-swift: true\n      - name: Parse examples\n        uses: tree-sitter/parse-action@v4\n        with:\n          files: |\n            examples/*.rb\n            !examples/ruby_spec/command_line/fixtures/bad_syntax.rb\n            !examples/ruby_spec/command_line/fixtures/freeze_flag_required_diff_enc.rb\n            !examples/ruby_spec/core/enumerable/shared/inject.rb\n            !examples/ruby_spec/language/fixtures/freeze_magic_comment_required_diff_enc.rb\n            !examples/ruby_spec/language/string_spec.rb\n            !examples/ruby_spec/core/proc/ruby2_keywords_spec.rb\n            !examples/ruby_spec/language/fixtures/utf16-be-nobom.rb\n            !examples/ruby_spec/language/fixtures/utf16-le-nobom.rb\n            !examples/ruby_spec/language/lambda_spec.rb\n"
  },
  {
    "path": ".github/workflows/fuzz.yml",
    "content": "name: Fuzz Parser\n\non:\n  push:\n    branches: [master]\n    paths:\n      - src/scanner.c\n  pull_request:\n    paths:\n      - src/scanner.c\n\njobs:\n  fuzz:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout repository\n        uses: actions/checkout@v4\n      - name: Run fuzzer\n        uses: tree-sitter/fuzz-action@v4\n"
  },
  {
    "path": ".github/workflows/lint.yml",
    "content": "name: Lint\n\non:\n  push:\n    branches: [master]\n    paths:\n      - grammar.js\n  pull_request:\n    paths:\n      - grammar.js\n\njobs:\n  lint:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout repository\n        uses: actions/checkout@v4\n      - name: Set up Node.js\n        uses: actions/setup-node@v4\n        with:\n          cache: npm\n          node-version: ${{vars.NODE_VERSION}}\n      - name: Install modules\n        run: npm ci --legacy-peer-deps\n      - name: Run ESLint\n        run: npm run lint\n"
  },
  {
    "path": ".github/workflows/publish.yml",
    "content": "name: Publish packages\n\non:\n  push:\n    tags: [\"*\"]\n\npermissions:\n  contents: write\n  id-token: write\n  attestations: write\n\njobs:\n  github:\n    uses: tree-sitter/workflows/.github/workflows/release.yml@main\n    with:\n      generate: true\n      attestations: true\n  npm:\n    uses: tree-sitter/workflows/.github/workflows/package-npm.yml@main\n    secrets:\n      NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}}\n    with:\n      generate: true\n  crates:\n    uses: tree-sitter/workflows/.github/workflows/package-crates.yml@main\n    secrets:\n      CARGO_REGISTRY_TOKEN: ${{secrets.CARGO_REGISTRY_TOKEN}}\n    with:\n      generate: true\n  pypi:\n    uses: tree-sitter/workflows/.github/workflows/package-pypi.yml@main\n    secrets:\n      PYPI_API_TOKEN: ${{secrets.PYPI_API_TOKEN}}\n    with:\n      generate: true\n"
  },
  {
    "path": ".gitignore",
    "content": "# Rust artifacts\ntarget/\n\n# Node artifacts\nbuild/\nprebuilds/\nnode_modules/\n\n# Swift artifacts\n.build/\n\n# Go artifacts\n_obj/\n\n# Python artifacts\n.venv/\ndist/\n*.egg-info\n*.whl\n\n# C artifacts\n*.a\n*.so\n*.so.*\n*.dylib\n*.dll\n*.pc\n\n# Example dirs\n/examples/*/\n\n# Grammar volatiles\n*.wasm\n*.obj\n*.o\n\n# Archives\n*.tar.gz\n*.tgz\n*.zip\n"
  },
  {
    "path": "CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.13)\n\nproject(tree-sitter-ruby\n        VERSION \"0.23.1\"\n        DESCRIPTION \"Ruby grammar for tree-sitter\"\n        HOMEPAGE_URL \"https://github.com/tree-sitter/tree-sitter-ruby\"\n        LANGUAGES C)\n\noption(BUILD_SHARED_LIBS \"Build using shared libraries\" ON)\noption(TREE_SITTER_REUSE_ALLOCATOR \"Reuse the library allocator\" OFF)\n\nset(TREE_SITTER_ABI_VERSION 14 CACHE STRING \"Tree-sitter ABI version\")\nif(NOT ${TREE_SITTER_ABI_VERSION} MATCHES \"^[0-9]+$\")\n    unset(TREE_SITTER_ABI_VERSION CACHE)\n    message(FATAL_ERROR \"TREE_SITTER_ABI_VERSION must be an integer\")\nendif()\n\nfind_program(TREE_SITTER_CLI tree-sitter DOC \"Tree-sitter CLI\")\n\nadd_custom_command(OUTPUT \"${CMAKE_CURRENT_SOURCE_DIR}/src/parser.c\"\n                   DEPENDS \"${CMAKE_CURRENT_SOURCE_DIR}/src/grammar.json\"\n                   COMMAND \"${TREE_SITTER_CLI}\" generate src/grammar.json\n                            --abi=${TREE_SITTER_ABI_VERSION}\n                   WORKING_DIRECTORY \"${CMAKE_CURRENT_SOURCE_DIR}\"\n                   COMMENT \"Generating parser.c\")\n\nadd_library(tree-sitter-ruby src/parser.c)\nif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/src/scanner.c)\n  target_sources(tree-sitter-ruby PRIVATE src/scanner.c)\nendif()\ntarget_include_directories(tree-sitter-ruby PRIVATE src)\n\ntarget_compile_definitions(tree-sitter-ruby PRIVATE\n                           $<$<BOOL:${TREE_SITTER_REUSE_ALLOCATOR}>:TREE_SITTER_REUSE_ALLOCATOR>\n                           $<$<CONFIG:Debug>:TREE_SITTER_DEBUG>)\n\nset_target_properties(tree-sitter-ruby\n                      PROPERTIES\n                      C_STANDARD 11\n                      POSITION_INDEPENDENT_CODE ON\n                      SOVERSION \"${TREE_SITTER_ABI_VERSION}.${PROJECT_VERSION_MAJOR}\"\n                      DEFINE_SYMBOL \"\")\n\nconfigure_file(bindings/c/tree-sitter-ruby.pc.in\n               \"${CMAKE_CURRENT_BINARY_DIR}/tree-sitter-ruby.pc\" @ONLY)\n\ninclude(GNUInstallDirs)\n\ninstall(FILES bindings/c/tree-sitter-ruby.h\n        DESTINATION \"${CMAKE_INSTALL_INCLUDEDIR}/tree_sitter\")\ninstall(FILES \"${CMAKE_CURRENT_BINARY_DIR}/tree-sitter-ruby.pc\"\n        DESTINATION \"${CMAKE_INSTALL_DATAROOTDIR}/pkgconfig\")\ninstall(TARGETS tree-sitter-ruby\n        LIBRARY DESTINATION \"${CMAKE_INSTALL_LIBDIR}\")\n\nadd_custom_target(ts-test \"${TREE_SITTER_CLI}\" test\n                  WORKING_DIRECTORY \"${CMAKE_CURRENT_SOURCE_DIR}\"\n                  COMMENT \"tree-sitter test\")\n"
  },
  {
    "path": "Cargo.toml",
    "content": "[package]\nname = \"tree-sitter-ruby\"\ndescription = \"Ruby grammar for tree-sitter\"\nversion = \"0.23.1\"\nauthors = [\n  \"Max Brunsfeld <maxbrunsfeld@gmail.com>\",\n  \"Amaan Qureshi <amaanq12@gmail.com>\",\n]\nlicense = \"MIT\"\nreadme = \"README.md\"\nkeywords = [\"incremental\", \"parsing\", \"tree-sitter\", \"ruby\"]\ncategories = [\"parsing\", \"text-editors\"]\nrepository = \"https://github.com/tree-sitter/tree-sitter-ruby\"\nedition = \"2021\"\nautoexamples = false\n\nbuild = \"bindings/rust/build.rs\"\ninclude = [\"LICENSE\", \"bindings/rust/*\", \"grammar.js\", \"queries/*\", \"src/*\", \"tree-sitter.json\"]\n\n[lib]\npath = \"bindings/rust/lib.rs\"\n\n[dependencies]\ntree-sitter-language = \"0.1\"\n\n[build-dependencies]\ncc = \"1.1\"\n\n[dev-dependencies]\ntree-sitter = \"0.24\"\n"
  },
  {
    "path": "LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2016 Rob Rix\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n"
  },
  {
    "path": "Makefile",
    "content": "ifeq ($(OS),Windows_NT)\n$(error Windows is not supported)\nendif\n\nLANGUAGE_NAME := tree-sitter-ruby\nHOMEPAGE_URL := https://github.com/tree-sitter/tree-sitter-ruby\nVERSION := 0.23.1\n\n# repository\nSRC_DIR := src\n\nTS ?= tree-sitter\n\n# install directory layout\nPREFIX ?= /usr/local\nINCLUDEDIR ?= $(PREFIX)/include\nLIBDIR ?= $(PREFIX)/lib\nPCLIBDIR ?= $(LIBDIR)/pkgconfig\n\n# source/object files\nPARSER := $(SRC_DIR)/parser.c\nEXTRAS := $(filter-out $(PARSER),$(wildcard $(SRC_DIR)/*.c))\nOBJS := $(patsubst %.c,%.o,$(PARSER) $(EXTRAS))\n\n# flags\nARFLAGS ?= rcs\noverride CFLAGS += -I$(SRC_DIR) -std=c11 -fPIC\n\n# ABI versioning\nSONAME_MAJOR = $(shell sed -n 's/\\#define LANGUAGE_VERSION //p' $(PARSER))\nSONAME_MINOR = $(word 1,$(subst ., ,$(VERSION)))\n\n# OS-specific bits\nifeq ($(shell uname),Darwin)\n\tSOEXT = dylib\n\tSOEXTVER_MAJOR = $(SONAME_MAJOR).$(SOEXT)\n\tSOEXTVER = $(SONAME_MAJOR).$(SONAME_MINOR).$(SOEXT)\n\tLINKSHARED = -dynamiclib -Wl,-install_name,$(LIBDIR)/lib$(LANGUAGE_NAME).$(SOEXTVER),-rpath,@executable_path/../Frameworks\nelse\n\tSOEXT = so\n\tSOEXTVER_MAJOR = $(SOEXT).$(SONAME_MAJOR)\n\tSOEXTVER = $(SOEXT).$(SONAME_MAJOR).$(SONAME_MINOR)\n\tLINKSHARED = -shared -Wl,-soname,lib$(LANGUAGE_NAME).$(SOEXTVER)\nendif\nifneq ($(filter $(shell uname),FreeBSD NetBSD DragonFly),)\n\tPCLIBDIR := $(PREFIX)/libdata/pkgconfig\nendif\n\nall: lib$(LANGUAGE_NAME).a lib$(LANGUAGE_NAME).$(SOEXT) $(LANGUAGE_NAME).pc\n\nlib$(LANGUAGE_NAME).a: $(OBJS)\n\t$(AR) $(ARFLAGS) $@ $^\n\nlib$(LANGUAGE_NAME).$(SOEXT): $(OBJS)\n\t$(CC) $(LDFLAGS) $(LINKSHARED) $^ $(LDLIBS) -o $@\nifneq ($(STRIP),)\n\t$(STRIP) $@\nendif\n\n$(LANGUAGE_NAME).pc: bindings/c/$(LANGUAGE_NAME).pc.in\n\tsed -e 's|@PROJECT_VERSION@|$(VERSION)|' \\\n\t\t-e 's|@CMAKE_INSTALL_LIBDIR@|$(LIBDIR:$(PREFIX)/%=%)|' \\\n\t\t-e 's|@CMAKE_INSTALL_INCLUDEDIR@|$(INCLUDEDIR:$(PREFIX)/%=%)|' \\\n\t\t-e 's|@PROJECT_DESCRIPTION@|$(DESCRIPTION)|' \\\n\t\t-e 's|@PROJECT_HOMEPAGE_URL@|$(HOMEPAGE_URL)|' \\\n\t\t-e 's|@CMAKE_INSTALL_PREFIX@|$(PREFIX)|' $< > $@\n\n$(PARSER): $(SRC_DIR)/grammar.json\n\t$(TS) generate $^\n\ninstall: all\n\tinstall -d '$(DESTDIR)$(INCLUDEDIR)'/tree_sitter '$(DESTDIR)$(PCLIBDIR)' '$(DESTDIR)$(LIBDIR)'\n\tinstall -m644 bindings/c/$(LANGUAGE_NAME).h '$(DESTDIR)$(INCLUDEDIR)'/tree_sitter/$(LANGUAGE_NAME).h\n\tinstall -m644 $(LANGUAGE_NAME).pc '$(DESTDIR)$(PCLIBDIR)'/$(LANGUAGE_NAME).pc\n\tinstall -m644 lib$(LANGUAGE_NAME).a '$(DESTDIR)$(LIBDIR)'/lib$(LANGUAGE_NAME).a\n\tinstall -m755 lib$(LANGUAGE_NAME).$(SOEXT) '$(DESTDIR)$(LIBDIR)'/lib$(LANGUAGE_NAME).$(SOEXTVER)\n\tln -sf lib$(LANGUAGE_NAME).$(SOEXTVER) '$(DESTDIR)$(LIBDIR)'/lib$(LANGUAGE_NAME).$(SOEXTVER_MAJOR)\n\tln -sf lib$(LANGUAGE_NAME).$(SOEXTVER_MAJOR) '$(DESTDIR)$(LIBDIR)'/lib$(LANGUAGE_NAME).$(SOEXT)\n\nuninstall:\n\t$(RM) '$(DESTDIR)$(LIBDIR)'/lib$(LANGUAGE_NAME).a \\\n\t\t'$(DESTDIR)$(LIBDIR)'/lib$(LANGUAGE_NAME).$(SOEXTVER) \\\n\t\t'$(DESTDIR)$(LIBDIR)'/lib$(LANGUAGE_NAME).$(SOEXTVER_MAJOR) \\\n\t\t'$(DESTDIR)$(LIBDIR)'/lib$(LANGUAGE_NAME).$(SOEXT) \\\n\t\t'$(DESTDIR)$(INCLUDEDIR)'/tree_sitter/$(LANGUAGE_NAME).h \\\n\t\t'$(DESTDIR)$(PCLIBDIR)'/$(LANGUAGE_NAME).pc\n\nclean:\n\t$(RM) $(OBJS) $(LANGUAGE_NAME).pc lib$(LANGUAGE_NAME).a lib$(LANGUAGE_NAME).$(SOEXT)\n\ntest:\n\t$(TS) test\n\n.PHONY: all install uninstall clean test\n"
  },
  {
    "path": "Package.resolved",
    "content": "{\n  \"object\": {\n    \"pins\": [\n      {\n        \"package\": \"SwiftTreeSitter\",\n        \"repositoryURL\": \"https://github.com/ChimeHQ/SwiftTreeSitter\",\n        \"state\": {\n          \"branch\": null,\n          \"revision\": \"2599e95310b3159641469d8a21baf2d3d200e61f\",\n          \"version\": \"0.8.0\"\n        }\n      }\n    ]\n  },\n  \"version\": 1\n}\n"
  },
  {
    "path": "Package.swift",
    "content": "// swift-tools-version:5.3\nimport PackageDescription\n\nlet package = Package(\n    name: \"TreeSitterRuby\",\n    products: [\n        .library(name: \"TreeSitterRuby\", targets: [\"TreeSitterRuby\"]),\n    ],\n    dependencies: [\n        .package(url: \"https://github.com/ChimeHQ/SwiftTreeSitter\", from: \"0.8.0\"),\n    ],\n    targets: [\n        .target(\n            name: \"TreeSitterRuby\",\n            dependencies: [],\n            path: \".\",\n            sources: [\n                \"src/parser.c\",\n                \"src/scanner.c\",\n            ],\n            resources: [\n                .copy(\"queries\")\n            ],\n            publicHeadersPath: \"bindings/swift\",\n            cSettings: [.headerSearchPath(\"src\")]\n        ),\n        .testTarget(\n            name: \"TreeSitterRubyTests\",\n            dependencies: [\n                \"SwiftTreeSitter\",\n                \"TreeSitterRuby\",\n            ],\n            path: \"bindings/swift/TreeSitterRubyTests\"\n        )\n    ],\n    cLanguageStandard: .c11\n)\n"
  },
  {
    "path": "README.md",
    "content": "# tree-sitter-ruby\n\n[![CI][ci]](https://github.com/tree-sitter/tree-sitter-ruby/actions/workflows/ci.yml)\n[![discord][discord]](https://discord.gg/w7nTvsVJhm)\n[![matrix][matrix]](https://matrix.to/#/#tree-sitter-chat:matrix.org)\n[![crates][crates]](https://crates.io/crates/tree-sitter-ruby)\n[![npm][npm]](https://www.npmjs.com/package/tree-sitter-ruby)\n[![pypi][pypi]](https://pypi.org/project/tree-sitter-ruby)\n\nRuby grammar for [tree-sitter](https://github.com/tree-sitter/tree-sitter).\n\n#### References\n\n- [AST Format of the Whitequark parser](https://github.com/whitequark/parser/blob/master/doc/AST_FORMAT.md)\n\n[ci]: https://img.shields.io/github/actions/workflow/status/tree-sitter/tree-sitter-ruby/ci.yml?logo=github&label=CI\n[discord]: https://img.shields.io/discord/1063097320771698699?logo=discord&label=discord\n[matrix]: https://img.shields.io/matrix/tree-sitter-chat%3Amatrix.org?logo=matrix&label=matrix\n[npm]: https://img.shields.io/npm/v/tree-sitter-ruby?logo=npm\n[crates]: https://img.shields.io/crates/v/tree-sitter-ruby?logo=rust\n[pypi]: https://img.shields.io/pypi/v/tree-sitter-ruby?logo=pypi&logoColor=ffd242\n"
  },
  {
    "path": "binding.gyp",
    "content": "{\n  \"targets\": [\n    {\n      \"target_name\": \"tree_sitter_ruby_binding\",\n      \"dependencies\": [\n        \"<!(node -p \\\"require('node-addon-api').targets\\\"):node_addon_api_except\",\n      ],\n      \"include_dirs\": [\n        \"src\",\n      ],\n      \"sources\": [\n        \"bindings/node/binding.cc\",\n        \"src/parser.c\",\n        \"src/scanner.c\",\n      ],\n      \"conditions\": [\n        [\"OS!='win'\", {\n          \"cflags_c\": [\n            \"-std=c11\",\n          ],\n        }, { # OS == \"win\"\n          \"cflags_c\": [\n            \"/std:c11\",\n            \"/utf-8\",\n          ],\n        }],\n      ],\n    }\n  ]\n}\n"
  },
  {
    "path": "bindings/c/tree-sitter-ruby.h",
    "content": "#ifndef TREE_SITTER_RUBY_H_\n#define TREE_SITTER_RUBY_H_\n\ntypedef struct TSLanguage TSLanguage;\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nconst TSLanguage *tree_sitter_ruby(void);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif // TREE_SITTER_RUBY_H_\n"
  },
  {
    "path": "bindings/c/tree-sitter-ruby.pc.in",
    "content": "prefix=@CMAKE_INSTALL_PREFIX@\nlibdir=${prefix}/@CMAKE_INSTALL_LIBDIR@\nincludedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@\n\nName: tree-sitter-ruby\nDescription: @PROJECT_DESCRIPTION@\nURL: @PROJECT_HOMEPAGE_URL@\nVersion: @PROJECT_VERSION@\nLibs: -L${libdir} -ltree-sitter-ruby\nCflags: -I${includedir}\n"
  },
  {
    "path": "bindings/go/binding.go",
    "content": "package tree_sitter_ruby\n\n// #cgo CFLAGS: -std=c11 -fPIC\n// #include \"../../src/parser.c\"\n// #include \"../../src/scanner.c\"\nimport \"C\"\n\nimport \"unsafe\"\n\n// Get the tree-sitter Language for this grammar.\nfunc Language() unsafe.Pointer {\n\treturn unsafe.Pointer(C.tree_sitter_ruby())\n}\n"
  },
  {
    "path": "bindings/go/binding_test.go",
    "content": "package tree_sitter_ruby_test\n\nimport (\n\t\"testing\"\n\n\ttree_sitter \"github.com/tree-sitter/go-tree-sitter\"\n\ttree_sitter_ruby \"github.com/tree-sitter/tree-sitter-ruby/bindings/go\"\n)\n\nfunc TestCanLoadGrammar(t *testing.T) {\n\tlanguage := tree_sitter.NewLanguage(tree_sitter_ruby.Language())\n\tif language == nil {\n\t\tt.Errorf(\"Error loading Ruby grammar\")\n\t}\n}\n"
  },
  {
    "path": "bindings/node/binding.cc",
    "content": "#include <napi.h>\n\ntypedef struct TSLanguage TSLanguage;\n\nextern \"C\" TSLanguage *tree_sitter_ruby();\n\n// \"tree-sitter\", \"language\" hashed with BLAKE2\nconst napi_type_tag LANGUAGE_TYPE_TAG = {\n    0x8AF2E5212AD58ABF, 0xD5006CAD83ABBA16\n};\n\nNapi::Object Init(Napi::Env env, Napi::Object exports) {\n    exports[\"name\"] = Napi::String::New(env, \"ruby\");\n    auto language = Napi::External<TSLanguage>::New(env, tree_sitter_ruby());\n    language.TypeTag(&LANGUAGE_TYPE_TAG);\n    exports[\"language\"] = language;\n    return exports;\n}\n\nNODE_API_MODULE(tree_sitter_ruby_binding, Init)\n"
  },
  {
    "path": "bindings/node/binding_test.js",
    "content": "const assert = require(\"node:assert\");\nconst { test } = require(\"node:test\");\n\nconst Parser = require(\"tree-sitter\");\n\ntest(\"can load grammar\", () => {\n  const parser = new Parser();\n  assert.doesNotThrow(() => parser.setLanguage(require(\".\")));\n});\n"
  },
  {
    "path": "bindings/node/index.d.ts",
    "content": "type BaseNode = {\n  type: string;\n  named: boolean;\n};\n\ntype ChildNode = {\n  multiple: boolean;\n  required: boolean;\n  types: BaseNode[];\n};\n\ntype NodeInfo =\n  | (BaseNode & {\n      subtypes: BaseNode[];\n    })\n  | (BaseNode & {\n      fields: { [name: string]: ChildNode };\n      children: ChildNode[];\n    });\n\ntype Language = {\n  name: string;\n  language: unknown;\n  nodeTypeInfo: NodeInfo[];\n};\n\ndeclare const language: Language;\nexport = language;\n"
  },
  {
    "path": "bindings/node/index.js",
    "content": "const root = require(\"path\").join(__dirname, \"..\", \"..\");\n\nmodule.exports =\n  typeof process.versions.bun === \"string\"\n    // Support `bun build --compile` by being statically analyzable enough to find the .node file at build-time\n    ? require(`../../prebuilds/${process.platform}-${process.arch}/tree-sitter-ruby.node`)\n    : require(\"node-gyp-build\")(root);\n\ntry {\n  module.exports.nodeTypeInfo = require(\"../../src/node-types.json\");\n} catch (_) {}\n"
  },
  {
    "path": "bindings/python/tests/test_binding.py",
    "content": "from unittest import TestCase\n\nimport tree_sitter, tree_sitter_ruby\n\n\nclass TestLanguage(TestCase):\n    def test_can_load_grammar(self):\n        try:\n            tree_sitter.Language(tree_sitter_ruby.language())\n        except Exception:\n            self.fail(\"Error loading Ruby grammar\")\n"
  },
  {
    "path": "bindings/python/tree_sitter_ruby/__init__.py",
    "content": "\"\"\"Ruby grammar for tree-sitter\"\"\"\n\nfrom importlib.resources import files as _files\n\nfrom ._binding import language\n\n\ndef _get_query(name, file):\n    query = _files(f\"{__package__}.queries\") / file\n    globals()[name] = query.read_text()\n    return globals()[name]\n\n\ndef __getattr__(name):\n    if name == \"HIGHLIGHTS_QUERY\":\n        return _get_query(\"HIGHLIGHTS_QUERY\", \"highlights.scm\")\n    if name == \"LOCALS_QUERY\":\n        return _get_query(\"LOCALS_QUERY\", \"locals.scm\")\n    if name == \"TAGS_QUERY\":\n        return _get_query(\"TAGS_QUERY\", \"tags.scm\")\n\n    raise AttributeError(f\"module {__name__!r} has no attribute {name!r}\")\n\n\n__all__ = [\n    \"language\",\n    \"HIGHLIGHTS_QUERY\",\n    \"LOCALS_QUERY\",\n    \"TAGS_QUERY\",\n]\n\n\ndef __dir__():\n    return sorted(__all__ + [\n        \"__all__\", \"__builtins__\", \"__cached__\", \"__doc__\", \"__file__\",\n        \"__loader__\", \"__name__\", \"__package__\", \"__path__\", \"__spec__\",\n    ])\n"
  },
  {
    "path": "bindings/python/tree_sitter_ruby/__init__.pyi",
    "content": "from typing import Final\n\nHIGHLIGHTS_QUERY: Final[str]\nLOCALS_QUERY: Final[str]\nTAGS_QUERY: Final[str]\n\ndef language() -> object: ...\n"
  },
  {
    "path": "bindings/python/tree_sitter_ruby/binding.c",
    "content": "#include <Python.h>\n\ntypedef struct TSLanguage TSLanguage;\n\nTSLanguage *tree_sitter_ruby(void);\n\nstatic PyObject* _binding_language(PyObject *Py_UNUSED(self), PyObject *Py_UNUSED(args)) {\n    return PyCapsule_New(tree_sitter_ruby(), \"tree_sitter.Language\", NULL);\n}\n\nstatic PyMethodDef methods[] = {\n    {\"language\", _binding_language, METH_NOARGS,\n     \"Get the tree-sitter language for this grammar.\"},\n    {NULL, NULL, 0, NULL}\n};\n\nstatic struct PyModuleDef module = {\n    .m_base = PyModuleDef_HEAD_INIT,\n    .m_name = \"_binding\",\n    .m_doc = NULL,\n    .m_size = -1,\n    .m_methods = methods\n};\n\nPyMODINIT_FUNC PyInit__binding(void) {\n    return PyModule_Create(&module);\n}\n"
  },
  {
    "path": "bindings/python/tree_sitter_ruby/py.typed",
    "content": ""
  },
  {
    "path": "bindings/rust/build.rs",
    "content": "fn main() {\n    let src_dir = std::path::Path::new(\"src\");\n\n    let mut c_config = cc::Build::new();\n    c_config\n        .std(\"c11\")\n        .include(src_dir)\n        .flag_if_supported(\"-Wno-unused-value\");\n\n    #[cfg(target_env = \"msvc\")]\n    c_config.flag(\"-utf-8\");\n\n    if std::env::var(\"TARGET\").unwrap() == \"wasm32-unknown-unknown\" {\n        let Ok(wasm_headers) = std::env::var(\"DEP_TREE_SITTER_LANGUAGE_WASM_HEADERS\") else {\n            panic!(\"Environment variable DEP_TREE_SITTER_LANGUAGE_WASM_HEADERS must be set by the language crate\");\n        };\n        let Ok(wasm_src) =\n            std::env::var(\"DEP_TREE_SITTER_LANGUAGE_WASM_SRC\").map(std::path::PathBuf::from)\n        else {\n            panic!(\"Environment variable DEP_TREE_SITTER_LANGUAGE_WASM_SRC must be set by the language crate\");\n        };\n\n        c_config.include(&wasm_headers);\n        c_config.files([\n            wasm_src.join(\"stdio.c\"),\n            wasm_src.join(\"stdlib.c\"),\n            wasm_src.join(\"string.c\"),\n            wasm_src.join(\"wctype.c\"),\n        ]);\n    }\n\n    let parser_path = src_dir.join(\"parser.c\");\n    c_config.file(&parser_path);\n    println!(\"cargo:rerun-if-changed={}\", parser_path.to_str().unwrap());\n\n    let scanner_path = src_dir.join(\"scanner.c\");\n    c_config.file(&scanner_path);\n    println!(\"cargo:rerun-if-changed={}\", scanner_path.to_str().unwrap());\n\n    c_config.compile(\"tree-sitter-ruby\");\n}\n"
  },
  {
    "path": "bindings/rust/lib.rs",
    "content": "//! This crate provides Ruby language support for the [tree-sitter][] parsing library.\n//!\n//! Typically, you will use the [LANGUAGE][] constant to add this language to a\n//! tree-sitter [Parser][], and then use the parser to parse some code:\n//!\n//! ```\n//! use tree_sitter::Parser;\n//!\n//! let code = r#\"\n//! def hello(name)\n//!  puts \"Hello, #{name}!\"\n//! end\n//! \"#;\n//! let mut parser = Parser::new();\n//! let language = tree_sitter_ruby::LANGUAGE;\n//! parser\n//!     .set_language(&language.into())\n//!     .expect(\"Error loading Ruby parser\");\n//! let tree = parser.parse(code, None).unwrap();\n//! assert!(!tree.root_node().has_error());\n//! ```\n//!\n//! [Parser]: https://docs.rs/tree-sitter/*/tree_sitter/struct.Parser.html\n//! [tree-sitter]: https://tree-sitter.github.io/\n\nuse tree_sitter_language::LanguageFn;\n\nextern \"C\" {\n    fn tree_sitter_ruby() -> *const ();\n}\n\n/// The tree-sitter [`LanguageFn`][LanguageFn] for this grammar.\n///\n/// [LanguageFn]: https://docs.rs/tree-sitter-language/*/tree_sitter_language/struct.LanguageFn.html\npub const LANGUAGE: LanguageFn = unsafe { LanguageFn::from_raw(tree_sitter_ruby) };\n\n/// The content of the [`node-types.json`][] file for this grammar.\n///\n/// [`node-types.json`]: https://tree-sitter.github.io/tree-sitter/using-parsers#static-node-types\npub const NODE_TYPES: &str = include_str!(\"../../src/node-types.json\");\n\n/// The syntax highlighting query for this language.\npub const HIGHLIGHTS_QUERY: &str = include_str!(\"../../queries/highlights.scm\");\n\n/// The local-variable syntax highlighting query for this language.\npub const LOCALS_QUERY: &str = include_str!(\"../../queries/locals.scm\");\n\n/// The symbol tagging query for this language.\npub const TAGS_QUERY: &str = include_str!(\"../../queries/tags.scm\");\n\n#[cfg(test)]\nmod tests {\n    #[test]\n    fn test_can_load_grammar() {\n        let mut parser = tree_sitter::Parser::new();\n        parser\n            .set_language(&super::LANGUAGE.into())\n            .expect(\"Error loading Ruby parser\");\n    }\n}\n"
  },
  {
    "path": "bindings/swift/TreeSitterRuby/ruby.h",
    "content": "#ifndef TREE_SITTER_RUBY_H_\n#define TREE_SITTER_RUBY_H_\n\ntypedef struct TSLanguage TSLanguage;\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nconst TSLanguage *tree_sitter_ruby(void);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif // TREE_SITTER_RUBY_H_\n"
  },
  {
    "path": "bindings/swift/TreeSitterRubyTests/TreeSitterRubyTests.swift",
    "content": "import XCTest\nimport SwiftTreeSitter\nimport TreeSitterRuby\n\nfinal class TreeSitterRubyTests: XCTestCase {\n    func testCanLoadGrammar() throws {\n        let parser = Parser()\n        let language = Language(language: tree_sitter_ruby())\n        XCTAssertNoThrow(try parser.setLanguage(language),\n                         \"Error loading Ruby grammar\")\n    }\n}\n"
  },
  {
    "path": "eslint.config.mjs",
    "content": "import treesitter from 'eslint-config-treesitter';\n\nexport default [\n  ...treesitter,\n];\n"
  },
  {
    "path": "go.mod",
    "content": "module github.com/tree-sitter/tree-sitter-ruby\n\ngo 1.22\n\nrequire github.com/tree-sitter/go-tree-sitter v0.24.0\n\nrequire github.com/mattn/go-pointer v0.0.1 // indirect\n"
  },
  {
    "path": "go.sum",
    "content": "github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/mattn/go-pointer v0.0.1 h1:n+XhsuGeVO6MEAp7xyEukFINEa+Quek5psIR/ylA6o0=\ngithub.com/mattn/go-pointer v0.0.1/go.mod h1:2zXcozF6qYGgmsG+SeTZz3oAbFLdD3OWqnUbNvJZAlc=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=\ngithub.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/tree-sitter/go-tree-sitter v0.24.0 h1:kRZb6aBNfcI/u0Qh8XEt3zjNVnmxTisDBN+kXK0xRYQ=\ngithub.com/tree-sitter/go-tree-sitter v0.24.0/go.mod h1:x681iFVoLMEwOSIHA1chaLkXlroXEN7WY+VHGFaoDbk=\ngithub.com/tree-sitter/tree-sitter-c v0.21.5-0.20240818205408-927da1f210eb h1:A8425heRM8mylnv4H58FPUiH+aYivyitre0PzxrfmWs=\ngithub.com/tree-sitter/tree-sitter-c v0.21.5-0.20240818205408-927da1f210eb/go.mod h1:dOF6gtQiF9UwNh995T5OphYmtIypkjsp3ap7r9AN/iA=\ngithub.com/tree-sitter/tree-sitter-cpp v0.22.4-0.20240818224355-b1a4e2b25148 h1:AfFPZwtwGN01BW1jDdqBVqscTwetvMpydqYZz57RSlc=\ngithub.com/tree-sitter/tree-sitter-cpp v0.22.4-0.20240818224355-b1a4e2b25148/go.mod h1:Bh6U3viD57rFXRYIQ+kmiYtr+1Bx0AceypDLJJSyi9s=\ngithub.com/tree-sitter/tree-sitter-embedded-template v0.21.1-0.20240819044651-ffbf64942c33 h1:TwqSV3qLp3tKSqirGLRHnjFk9Tc2oy57LIl+FQ4GjI4=\ngithub.com/tree-sitter/tree-sitter-embedded-template v0.21.1-0.20240819044651-ffbf64942c33/go.mod h1:CvCKCt3v04Ufos1zZnNCelBDeCGRpPucaN8QczoUsN4=\ngithub.com/tree-sitter/tree-sitter-go v0.21.3-0.20240818010209-8c0f0e7a6012 h1:Xvxck3tE5FW7F7bTS97iNM2ADMyCMJztVqn5HYKdJGo=\ngithub.com/tree-sitter/tree-sitter-go v0.21.3-0.20240818010209-8c0f0e7a6012/go.mod h1:T40D0O1cPvUU/+AmiXVXy1cncYQT6wem4Z0g4SfAYvY=\ngithub.com/tree-sitter/tree-sitter-html v0.20.5-0.20240818004741-d11201a263d0 h1:c46K6uh5Dz00zJeU9BfjXdb8I+E4RkUdfnWJpQADXFo=\ngithub.com/tree-sitter/tree-sitter-html v0.20.5-0.20240818004741-d11201a263d0/go.mod h1:hcNt/kOJHcIcuMvouE7LJcYdeFUFbVpBJ6d4wmOA+tU=\ngithub.com/tree-sitter/tree-sitter-java v0.21.1-0.20240824015150-576d8097e495 h1:jrt4qbJVEFs4H93/ITxygHc6u0TGqAkkate7TQ4wFSA=\ngithub.com/tree-sitter/tree-sitter-java v0.21.1-0.20240824015150-576d8097e495/go.mod h1:oyaR7fLnRV0hT9z6qwE9GkaeTom/hTDwK3H2idcOJFc=\ngithub.com/tree-sitter/tree-sitter-javascript v0.21.5-0.20240818005344-15887341e5b5 h1:om4X9AVg3asL8gxNJDcz4e/Wp+VpQj1PY3uJXKr6EOg=\ngithub.com/tree-sitter/tree-sitter-javascript v0.21.5-0.20240818005344-15887341e5b5/go.mod h1:nNqgPoV/h9uYWk6kYEFdEAhNVOacpfpRW5SFmdaP4tU=\ngithub.com/tree-sitter/tree-sitter-json v0.21.1-0.20240818005659-bdd69eb8c8a5 h1:pfV3G3k7NCKqKk8THBmyuh2zA33lgYHS3GVrzRR8ry4=\ngithub.com/tree-sitter/tree-sitter-json v0.21.1-0.20240818005659-bdd69eb8c8a5/go.mod h1:GbMKRjLfk0H+PI7nLi1Sx5lHf5wCpLz9al8tQYSxpEk=\ngithub.com/tree-sitter/tree-sitter-php v0.22.9-0.20240819002312-a552625b56c1 h1:ZXZMDwE+IhUtGug4Brv6NjJWUU3rfkZBKpemf6RY8/g=\ngithub.com/tree-sitter/tree-sitter-php v0.22.9-0.20240819002312-a552625b56c1/go.mod h1:UKCLuYnJ312Mei+3cyTmGOHzn0YAnaPRECgJmHtzrqs=\ngithub.com/tree-sitter/tree-sitter-python v0.21.1-0.20240818005537-55a9b8a4fbfb h1:EXEM82lFM7JjJb6qiKZXkpIDaCcbV2obNn82ghwj9lw=\ngithub.com/tree-sitter/tree-sitter-python v0.21.1-0.20240818005537-55a9b8a4fbfb/go.mod h1:lXCF1nGG5Dr4J3BTS0ObN4xJCCICiSu/b+Xe/VqMV7g=\ngithub.com/tree-sitter/tree-sitter-rust v0.21.3-0.20240818005432-2b43eafe6447 h1:o9alBu1J/WjrcTKEthYtXmdkDc5OVXD+PqlvnEZ0Lzc=\ngithub.com/tree-sitter/tree-sitter-rust v0.21.3-0.20240818005432-2b43eafe6447/go.mod h1:1Oh95COkkTn6Ezp0vcMbvfhRP5gLeqqljR0BYnBzWvc=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\n"
  },
  {
    "path": "grammar.js",
    "content": "/// <reference types=\"tree-sitter-cli/dsl\" />\n// @ts-check\n\nconst PREC = {\n  COMMENT: -2,\n  CURLY_BLOCK: 1,\n  DO_BLOCK: -1,\n\n  AND: -2,\n  OR: -2,\n  NOT: 5,\n  DEFINED: 10,\n  ALIAS: 11,\n  ASSIGN: 15,\n  RESCUE: 16,\n  CONDITIONAL: 20,\n  RANGE: 25,\n  BOOLEAN_OR: 30,\n  BOOLEAN_AND: 35,\n  RELATIONAL: 40,\n  COMPARISON: 45,\n  BITWISE_OR: 50,\n  BITWISE_AND: 55,\n  CALL: 56,\n  SHIFT: 60,\n  ADDITIVE: 65,\n  MULTIPLICATIVE: 70,\n  UNARY_MINUS: 75,\n  EXPONENTIAL: 80,\n  COMPLEMENT: 85,\n};\n\nconst IDENTIFIER_CHARS = /[^\\x00-\\x1F\\s:;`\"'@$#.,|^&<=>+\\-*/\\\\%?!~()\\[\\]{}]*/;\nconst LOWER_ALPHA_CHAR = /[^\\x00-\\x1F\\sA-Z0-9:;`\"'@$#.,|^&<=>+\\-*/\\\\%?!~()\\[\\]{}]/;\nconst ALPHA_CHAR = /[^\\x00-\\x1F\\s0-9:;`\"'@$#.,|^&<=>+\\-*/\\\\%?!~()\\[\\]{}]/;\n\nmodule.exports = grammar({\n  name: 'ruby',\n  inline: $ => [$._arg_rhs, $._call_operator],\n  externals: $ => [\n    $._line_break,\n    $._no_line_break,\n\n    // Delimited literals\n    $.simple_symbol,\n    $._string_start,\n    $._symbol_start,\n    $._subshell_start,\n    $._regex_start,\n    $._string_array_start,\n    $._symbol_array_start,\n    $._heredoc_body_start,\n    $.string_content,\n    $.heredoc_content,\n    $._string_end,\n    $.heredoc_end,\n    $.heredoc_beginning,\n\n    // Tokens that require lookahead\n    '/',\n    $._block_ampersand,\n    $._splat_star,\n    $._unary_minus,\n    $._unary_minus_num,\n    $._binary_minus,\n    $._binary_star,\n    $._singleton_class_left_angle_left_langle,\n    $.hash_key_symbol,\n    $._identifier_suffix,\n    $._constant_suffix,\n    $._hash_splat_star_star,\n    $._binary_star_star,\n    $._element_reference_bracket,\n    $._short_interpolation,\n  ],\n\n  extras: $ => [\n    $.comment,\n    $.heredoc_body,\n    /\\s/,\n    /\\\\\\r?\\n/,\n  ],\n\n  word: $ => $.identifier,\n\n  supertypes: $ => [\n    $._statement,\n    $._arg,\n    $._call_operator,\n    $._method_name,\n    $._expression,\n    $._variable,\n    $._primary,\n    $._simple_numeric,\n    $._lhs,\n    $._nonlocal_variable,\n    $._pattern_top_expr_body,\n    $._pattern_expr,\n    $._pattern_expr_basic,\n    $._pattern_primitive,\n    $._pattern_constant,\n  ],\n\n  rules: {\n    program: $ => seq(\n      optional($._statements),\n      optional(\n        choice(\n          seq(/__END__/, $.uninterpreted),\n        ),\n      ),\n    ),\n\n    uninterpreted: _ => /(.|\\s)*/,\n\n    block_body: $ => $._statements,\n\n    _statements: $ => choice(\n      seq(\n        repeat1(choice(\n          seq($._statement, $._terminator),\n          $.empty_statement,\n        )),\n        optional($._statement),\n      ),\n      $._statement,\n    ),\n\n    begin_block: $ => seq('BEGIN', '{', optional($._statements), '}'),\n    end_block: $ => seq('END', '{', optional($._statements), '}'),\n\n    _statement: $ => choice(\n      $.undef,\n      $.alias,\n      $.if_modifier,\n      $.unless_modifier,\n      $.while_modifier,\n      $.until_modifier,\n      $.rescue_modifier,\n      $.begin_block,\n      $.end_block,\n      $._expression,\n    ),\n\n    method: $ => seq('def', $._method_rest),\n\n    singleton_method: $ => seq(\n      'def',\n      seq(\n        choice(\n          field('object', $._variable),\n          seq('(', field('object', $._arg), ')'),\n        ),\n        choice('.', '::'),\n      ),\n      $._method_rest,\n    ),\n\n    _method_rest: $ => seq(\n      field('name', $._method_name),\n      choice(\n        $._body_expr,\n        seq(\n          field('parameters', alias($.parameters, $.method_parameters)),\n          choice(\n            seq(optional($._terminator), optional(field('body', $.body_statement)), 'end'),\n            $._body_expr,\n          ),\n\n        ),\n        seq(\n          optional(\n            field('parameters', alias($.bare_parameters, $.method_parameters)),\n          ),\n          $._terminator,\n          optional(field('body', $.body_statement)),\n          'end',\n        ),\n      ),\n    ),\n\n    rescue_modifier_arg: $ => prec(PREC.RESCUE,\n      seq(\n        field('body', $._arg),\n        'rescue',\n        field('handler', $._arg),\n      ),\n    ),\n\n    rescue_modifier_expression: $ => prec(PREC.RESCUE,\n      seq(\n        field('body', $._expression),\n        'rescue',\n        field('handler', $._arg),\n      ),\n    ),\n\n    _body_expr: $ =>\n      seq(\n        '=',\n        field('body',\n          choice(\n            $._arg,\n            alias($.rescue_modifier_arg, $.rescue_modifier),\n          )),\n      ),\n\n\n    parameters: $ => seq(\n      '(',\n      commaSep($._formal_parameter),\n      ')',\n    ),\n\n    bare_parameters: $ => seq(\n      $._simple_formal_parameter,\n      repeat(seq(',', $._formal_parameter)),\n    ),\n\n    block_parameters: $ => seq(\n      '|',\n      seq(commaSep($._formal_parameter), optional(',')),\n      optional(seq(';', sep1(field('locals', $.identifier), ','))), // Block shadow args e.g. {|; a, b| ...}\n      '|',\n    ),\n\n    _formal_parameter: $ => choice(\n      $._simple_formal_parameter,\n      alias($.parameters, $.destructured_parameter),\n    ),\n\n    _simple_formal_parameter: $ => choice(\n      $.identifier,\n      $.splat_parameter,\n      $.hash_splat_parameter,\n      $.hash_splat_nil,\n      $.forward_parameter,\n      $.block_parameter,\n      $.keyword_parameter,\n      $.optional_parameter,\n    ),\n\n    forward_parameter: _ => '...',\n\n    splat_parameter: $ => prec.right(-2, seq(\n      '*',\n      field('name', optional($.identifier)),\n    )),\n    hash_splat_parameter: $ => seq(\n      '**',\n      field('name', optional($.identifier)),\n    ),\n    hash_splat_nil: _ => seq('**', 'nil'),\n    block_parameter: $ => seq(\n      '&',\n      field('name', optional($.identifier)),\n    ),\n    keyword_parameter: $ => prec.right(PREC.BITWISE_OR + 1, seq(\n      field('name', $.identifier),\n      token.immediate(':'),\n      field('value', optional($._arg)),\n    )),\n    optional_parameter: $ => prec(PREC.BITWISE_OR + 1, seq(\n      field('name', $.identifier),\n      '=',\n      field('value', $._arg),\n    )),\n\n    class: $ => seq(\n      'class',\n      field('name', choice($.constant, $.scope_resolution)),\n      choice(\n        seq(field('superclass', $.superclass), $._terminator),\n        optional($._terminator),\n      ),\n      optional(field('body', $.body_statement)),\n      'end',\n    ),\n\n    superclass: $ => seq('<', $._expression),\n\n    singleton_class: $ => seq(\n      'class',\n      alias($._singleton_class_left_angle_left_langle, '<<'),\n      field('value', $._arg),\n      $._terminator,\n      optional(field('body', $.body_statement)),\n      'end',\n    ),\n\n    module: $ => seq(\n      'module',\n      field('name', choice($.constant, $.scope_resolution)),\n      optional($._terminator),\n      optional(field('body', $.body_statement)),\n      'end',\n    ),\n\n    return_command: $ => prec.left(seq('return', alias($.command_argument_list, $.argument_list))),\n    yield_command: $ => prec.left(seq('yield', alias($.command_argument_list, $.argument_list))),\n    break_command: $ => prec.left(seq('break', alias($.command_argument_list, $.argument_list))),\n    next_command: $ => prec.left(seq('next', alias($.command_argument_list, $.argument_list))),\n    return: $ => prec.left(seq('return', optional($.argument_list))),\n    yield: $ => prec.left(seq('yield', optional($.argument_list))),\n    break: $ => prec.left(seq('break', optional($.argument_list))),\n    next: $ => prec.left(seq('next', optional($.argument_list))),\n    redo: $ => prec.left(seq('redo', optional($.argument_list))),\n    retry: $ => prec.left(seq('retry', optional($.argument_list))),\n\n    if_modifier: $ => prec(PREC.RESCUE, seq(\n      field('body', $._statement),\n      'if',\n      field('condition', $._expression),\n    )),\n\n    unless_modifier: $ => prec(PREC.RESCUE, seq(\n      field('body', $._statement),\n      'unless',\n      field('condition', $._expression),\n    )),\n\n    while_modifier: $ => prec(PREC.RESCUE, seq(\n      field('body', $._statement),\n      'while',\n      field('condition', $._expression),\n    )),\n\n    until_modifier: $ => prec(PREC.RESCUE, seq(\n      field('body', $._statement),\n      'until',\n      field('condition', $._expression),\n    )),\n\n    rescue_modifier: $ => prec(PREC.RESCUE, seq(\n      field('body', $._statement),\n      'rescue',\n      field('handler', $._expression),\n    )),\n\n    while: $ => seq(\n      'while',\n      field('condition', $._statement),\n      field('body', $.do),\n    ),\n\n    until: $ => seq(\n      'until',\n      field('condition', $._statement),\n      field('body', $.do),\n    ),\n\n    for: $ => seq(\n      'for',\n      field('pattern', choice($._lhs, $.left_assignment_list)),\n      field('value', $.in),\n      field('body', $.do),\n    ),\n\n    in: $ => seq('in', $._arg),\n    do: $ => seq(\n      choice('do', $._terminator),\n      optional($._statements),\n      'end',\n    ),\n\n    case: $ => seq(\n      'case',\n      optional(seq(optional($._line_break), field('value', $._statement))),\n      optional($._terminator),\n      repeat($.when),\n      optional($.else),\n      'end',\n    ),\n\n    case_match: $ => seq(\n      'case',\n      seq(optional($._line_break), field('value', $._statement)),\n      optional($._terminator),\n      repeat1(field('clauses', $.in_clause)),\n      optional(field('else', $.else)),\n      'end',\n    ),\n\n    when: $ => seq(\n      'when',\n      commaSep1(field('pattern', $.pattern)),\n      choice($._terminator, field('body', $.then)),\n    ),\n\n    in_clause: $ => seq(\n      'in',\n      field('pattern', $._pattern_top_expr_body),\n      field('guard', optional($._guard)),\n      choice($._terminator, field('body', $.then)),\n    ),\n\n    pattern: $ => choice($._arg, $.splat_argument),\n\n    _guard: $ => choice(\n      $.if_guard,\n      $.unless_guard,\n    ),\n\n    if_guard: $ => seq(\n      'if',\n      field('condition', $._expression),\n    ),\n\n    unless_guard: $ => seq(\n      'unless',\n      field('condition', $._expression),\n    ),\n\n    _pattern_top_expr_body: $ => prec(-1, choice(\n      $._pattern_expr,\n      alias($._array_pattern_n, $.array_pattern),\n      alias($._find_pattern_body, $.find_pattern),\n      alias($._hash_pattern_body, $.hash_pattern),\n    )),\n\n    _array_pattern_n: $ => prec.right(choice(\n      seq($._pattern_expr, alias(',', $.splat_parameter)),\n      seq($._pattern_expr, ',', choice($._pattern_expr, $._array_pattern_n)),\n      seq($.splat_parameter, repeat(seq(',', $._pattern_expr))),\n    )),\n\n    _pattern_expr: $ => choice(\n      $.as_pattern,\n      $._pattern_expr_alt,\n    ),\n\n    as_pattern: $ => seq(field('value', $._pattern_expr), '=>', field('name', $.identifier)),\n\n    _pattern_expr_alt: $ => choice(\n      $.alternative_pattern,\n      $._pattern_expr_basic,\n    ),\n\n    alternative_pattern: $ => seq(field('alternatives', $._pattern_expr_basic), repeat1(seq('|', field('alternatives', $._pattern_expr_basic)))),\n\n    _array_pattern_body: $ => choice(\n      $._pattern_expr,\n      $._array_pattern_n,\n    ),\n\n    array_pattern: $ => prec.right(-1, choice(\n      seq('[', optional($._array_pattern_body), ']'),\n      seq(field('class', $._pattern_constant), token.immediate('['), optional($._array_pattern_body), ']'),\n      seq(field('class', $._pattern_constant), token.immediate('('), optional($._array_pattern_body), ')'),\n    )),\n\n    _find_pattern_body: $ => seq($.splat_parameter, repeat1(seq(',', $._pattern_expr)), ',', $.splat_parameter),\n    find_pattern: $ => choice(\n      seq('[', $._find_pattern_body, ']'),\n      seq(field('class', $._pattern_constant), token.immediate('['), $._find_pattern_body, ']'),\n      seq(field('class', $._pattern_constant), token.immediate('('), $._find_pattern_body, ')'),\n    ),\n\n    _hash_pattern_body: $ => prec.right(choice(\n      seq(commaSep1($.keyword_pattern), optional(',')),\n      seq(commaSep1($.keyword_pattern), ',', $._hash_pattern_any_rest),\n      $._hash_pattern_any_rest,\n    )),\n\n    keyword_pattern: $ => prec.right(-1, seq(\n      field('key',\n        choice(\n          alias($.identifier, $.hash_key_symbol),\n          alias($.constant, $.hash_key_symbol),\n          alias($.identifier_suffix, $.hash_key_symbol),\n          alias($.constant_suffix, $.hash_key_symbol),\n          $.string,\n        ),\n      ),\n      token.immediate(':'),\n      optional(field('value', $._pattern_expr)),\n    )),\n\n    _hash_pattern_any_rest: $ => choice($.hash_splat_parameter, $.hash_splat_nil),\n\n    hash_pattern: $ => prec.right(-1, choice(\n      seq('{', optional($._hash_pattern_body), '}'),\n      seq(field('class', $._pattern_constant), token.immediate('['), $._hash_pattern_body, ']'),\n      seq(field('class', $._pattern_constant), token.immediate('('), $._hash_pattern_body, ')'),\n    )),\n\n    _pattern_expr_basic: $ => prec.right(-1, choice(\n      $._pattern_value,\n      $.identifier,\n      $.array_pattern,\n      $.find_pattern,\n      $.hash_pattern,\n      $.parenthesized_pattern,\n    )),\n\n    parenthesized_pattern: $ => seq('(', $._pattern_expr, ')'),\n\n    _pattern_value: $ => prec.right(-1, choice(\n      $._pattern_primitive,\n      alias($._pattern_range, $.range),\n      $.variable_reference_pattern,\n      $.expression_reference_pattern,\n      $._pattern_constant,\n    )),\n\n    _pattern_range: $ => {\n      const begin = field('begin', $._pattern_primitive);\n      const end = field('end', $._pattern_primitive);\n      const operator = field('operator', choice('..', '...'));\n      return choice(\n        seq(begin, operator, end),\n        seq(operator, end),\n        seq(begin, operator),\n      );\n    },\n\n    _pattern_primitive: $ => choice(\n      $._pattern_literal,\n      $._pattern_lambda,\n    ),\n\n    _pattern_lambda: $ => prec.right(-1, $.lambda),\n\n    _pattern_literal: $ => prec.right(-1, choice(\n      $._literal,\n      $.string,\n      $.subshell,\n      $.heredoc_beginning,\n      $.regex,\n      $.string_array,\n      $.symbol_array,\n      $._keyword_variable,\n    )),\n\n    _keyword_variable: $ => prec.right(-1, choice(\n      $.nil,\n      $.self,\n      $.true,\n      $.false,\n      $.line,\n      $.file,\n      $.encoding,\n    )),\n\n    line: _ => '__LINE__',\n    file: _ => '__FILE__',\n    encoding: _ => '__ENCODING__',\n\n    variable_reference_pattern: $ => seq('^', field('name', choice($.identifier, $._nonlocal_variable))),\n\n    expression_reference_pattern: $ => seq('^', '(', field('value', $._expression), ')'),\n\n    _pattern_constant: $ => prec.right(-1, choice(\n      $.constant,\n      alias($._pattern_constant_resolution, $.scope_resolution),\n    )),\n\n    _pattern_constant_resolution: $ => seq(\n      optional(field('scope', $._pattern_constant)),\n      '::',\n      field('name', $.constant),\n    ),\n\n    if: $ => seq(\n      'if',\n      field('condition', $._statement),\n      choice($._terminator, field('consequence', $.then)),\n      field('alternative', optional(choice($.else, $.elsif))),\n      'end',\n    ),\n\n    unless: $ => seq(\n      'unless',\n      field('condition', $._statement),\n      choice($._terminator, field('consequence', $.then)),\n      field('alternative', optional(choice($.else, $.elsif))),\n      'end',\n    ),\n\n    elsif: $ => seq(\n      'elsif',\n      field('condition', $._statement),\n      choice($._terminator, field('consequence', $.then)),\n      field('alternative', optional(choice($.else, $.elsif))),\n    ),\n\n    else: $ => seq(\n      'else',\n      optional($._terminator),\n      optional($._statements),\n    ),\n\n    then: $ => choice(\n      seq(\n        $._terminator,\n        $._statements,\n      ),\n      seq(\n        optional($._terminator),\n        'then',\n        optional($._statements),\n      ),\n    ),\n\n    begin: $ => seq('begin', optional($._terminator), optional($._body_statement), 'end'),\n\n    ensure: $ => seq('ensure', optional($._statements)),\n\n    rescue: $ => seq(\n      'rescue',\n      field('exceptions', optional($.exceptions)),\n      field('variable', optional($.exception_variable)),\n      choice(\n        $._terminator,\n        field('body', $.then),\n      ),\n    ),\n\n    exceptions: $ => commaSep1(choice($._arg, $.splat_argument)),\n\n    exception_variable: $ => seq('=>', $._lhs),\n\n    body_statement: $ => $._body_statement,\n\n    _body_statement: $ => choice(\n      seq($._statements, repeat(choice($.rescue, $.else, $.ensure))),\n      seq(optional($._statements), repeat1(choice($.rescue, $.else, $.ensure))),\n    ),\n\n    // Method calls without parentheses (aka \"command calls\") are only allowed\n    // in certain positions, like the top-level of a statement, the condition\n    // of a postfix control-flow operator like `if`, or as the value of a\n    // control-flow statement like `return`. In many other places, they're not\n    // allowed.\n    //\n    // Because of this distinction, a lot of rules have two variants: the\n    // normal variant, which can appear anywhere that an expression is valid,\n    // and the \"command\" varaint, which is only valid in a more limited set of\n    // positions, because it can contain \"command calls\".\n    //\n    // The `_expression` rule can appear in relatively few places, but can\n    // contain command calls. The `_arg` rule can appear in many more places,\n    // but cannot contain command calls (unless they are wrapped in parens).\n    // This naming convention is based on Ruby's standard grammar.\n    _expression: $ => choice(\n      alias($.command_binary, $.binary),\n      alias($.command_unary, $.unary),\n      alias($.command_assignment, $.assignment),\n      alias($.command_operator_assignment, $.operator_assignment),\n      alias($.command_call, $.call),\n      alias($.command_call_with_block, $.call),\n      prec.left(alias($._chained_command_call, $.call)),\n      alias($.return_command, $.return),\n      alias($.yield_command, $.yield),\n      alias($.break_command, $.break),\n      alias($.next_command, $.next),\n      $.match_pattern,\n      $.test_pattern,\n      $._arg,\n    ),\n\n    match_pattern: $ => prec(100, seq(field('value', $._arg), '=>', field('pattern', $._pattern_top_expr_body))),\n\n    test_pattern: $ => prec(100, seq(field('value', $._arg), 'in', field('pattern', $._pattern_top_expr_body))),\n\n    _arg: $ => choice(\n      alias($._unary_minus_pow, $.unary),\n      $._primary,\n      $.assignment,\n      $.operator_assignment,\n      $.conditional,\n      $.range,\n      $.binary,\n      $.unary,\n    ),\n\n    _unary_minus_pow: $ => seq(field('operator', alias($._unary_minus_num, '-')), field('operand', alias($._pow, $.binary))),\n    _pow: $ => prec.right(PREC.EXPONENTIAL, seq(field('left', $._simple_numeric), field('operator', alias($._binary_star_star, '**')), field('right', $._arg))),\n\n    _primary: $ => choice(\n      $.parenthesized_statements,\n      $._lhs,\n      alias($._function_identifier_call, $.call),\n      $.call,\n      $.array,\n      $.string_array,\n      $.symbol_array,\n      $.hash,\n      $.subshell,\n      $._literal,\n      $.string,\n      $.character,\n      $.chained_string,\n      $.regex,\n      $.lambda,\n      $.method,\n      $.singleton_method,\n      $.class,\n      $.singleton_class,\n      $.module,\n      $.begin,\n      $.while,\n      $.until,\n      $.if,\n      $.unless,\n      $.for,\n      $.case,\n      $.case_match,\n      $.return,\n      $.yield,\n      $.break,\n      $.next,\n      $.redo,\n      $.retry,\n      alias($.parenthesized_unary, $.unary),\n      $.heredoc_beginning,\n    ),\n\n    parenthesized_statements: $ => seq('(', optional($._statements), ')'),\n\n    element_reference: $ => prec.left(1, seq(\n      field('object', $._primary),\n      alias($._element_reference_bracket, '['),\n      optional($._argument_list_with_trailing_comma),\n      ']',\n      optional(field('block', choice($.block, $.do_block))),\n    )),\n\n    scope_resolution: $ => prec.left(PREC.CALL + 1, seq(\n      choice(\n        '::',\n        seq(field('scope', $._primary), token.immediate('::')),\n      ),\n      field('name', $.constant),\n    )),\n\n    _call_operator: _ => choice('.', '&.', token.immediate('::')),\n    _call: $ => prec.left(PREC.CALL, seq(\n      field('receiver', $._primary),\n      field('operator', $._call_operator),\n      field('method', choice($.identifier, $.operator, $.constant, $._function_identifier)),\n    )),\n\n    command_call: $ => seq(\n      choice(\n        $._call,\n        $._chained_command_call,\n        field('method', choice(\n          $._variable,\n          $._function_identifier,\n        )),\n      ),\n      field('arguments', alias($.command_argument_list, $.argument_list)),\n    ),\n\n    command_call_with_block: $ => {\n      const receiver = choice(\n        $._call,\n        field('method', choice($._variable, $._function_identifier)),\n      );\n      const args = field('arguments', alias($.command_argument_list, $.argument_list));\n      const block = field('block', $.block);\n      const doBlock = field('block', $.do_block);\n      return choice(\n        seq(receiver, prec(PREC.CURLY_BLOCK, seq(args, block))),\n        seq(receiver, prec(PREC.DO_BLOCK, seq(args, doBlock))),\n      );\n    },\n\n    _chained_command_call: $ => seq(\n      field('receiver', alias($.command_call_with_block, $.call)),\n      field('operator', $._call_operator),\n      field('method', choice($.identifier, $._function_identifier, $.operator, $.constant)),\n    ),\n\n    call: $ => {\n      const receiver = choice(\n        $._call,\n        field('method', choice(\n          $._variable, $._function_identifier,\n        )),\n      );\n\n      const args = field('arguments', $.argument_list);\n      const receiverArguments =\n        seq(\n          choice(\n            receiver,\n            prec.left(PREC.CALL, seq(\n              field('receiver', $._primary),\n              field('operator', $._call_operator),\n            )),\n          ),\n          args,\n        );\n\n      const block = field('block', $.block);\n      const doBlock = field('block', $.do_block);\n      return choice(\n        receiverArguments,\n        prec(PREC.CURLY_BLOCK, seq(receiverArguments, block)),\n        prec(PREC.DO_BLOCK, seq(receiverArguments, doBlock)),\n        prec(PREC.CURLY_BLOCK, seq(receiver, block)),\n        prec(PREC.DO_BLOCK, seq(receiver, doBlock)),\n      );\n    },\n\n    command_argument_list: $ => prec.right(commaSep1($._argument)),\n\n    argument_list: $ => prec.right(seq(\n      token.immediate('('),\n      optional($._argument_list_with_trailing_comma),\n      ')',\n    )),\n\n    _argument_list_with_trailing_comma: $ => prec.right(seq(\n      commaSep1($._argument),\n      optional(','),\n    )),\n\n    _argument: $ => prec.left(choice(\n      $._expression,\n      $.splat_argument,\n      $.hash_splat_argument,\n      $.forward_argument,\n      $.block_argument,\n      $.pair,\n    )),\n\n    forward_argument: _ => '...',\n    splat_argument: $ => prec.right(seq(alias($._splat_star, '*'), optional($._arg))),\n    hash_splat_argument: $ => prec.right(seq(alias($._hash_splat_star_star, '**'), optional($._arg))),\n    block_argument: $ => prec.right(seq(alias($._block_ampersand, '&'), optional($._arg))),\n\n    do_block: $ => seq(\n      'do',\n      optional($._terminator),\n      optional(seq(\n        field('parameters', $.block_parameters),\n        optional($._terminator),\n      )),\n      optional(field('body', $.body_statement)),\n      'end',\n    ),\n\n    block: $ => prec(PREC.CURLY_BLOCK, seq(\n      '{',\n      field('parameters', optional($.block_parameters)),\n      optional(field('body', $.block_body)),\n      '}',\n    )),\n\n    _arg_rhs: $ => choice($._arg, alias($.rescue_modifier_arg, $.rescue_modifier)),\n    assignment: $ => prec.right(PREC.ASSIGN, choice(\n      seq(\n        field('left', choice($._lhs, $.left_assignment_list)),\n        '=',\n        field('right', choice(\n          $._arg_rhs,\n          $.splat_argument,\n          $.right_assignment_list,\n        )),\n      ),\n    )),\n\n    command_assignment: $ => prec.right(PREC.ASSIGN,\n      seq(\n        field('left', choice($._lhs, $.left_assignment_list)),\n        '=',\n        field('right', choice($._expression, alias($.rescue_modifier_expression, $.rescue_modifier))),\n      ),\n    ),\n\n    operator_assignment: $ => prec.right(PREC.ASSIGN, seq(\n      field('left', $._lhs),\n      field('operator', choice('+=', '-=', '*=', '**=', '/=', '||=', '|=', '&&=', '&=', '%=', '>>=', '<<=', '^=')),\n      field('right', $._arg_rhs),\n    )),\n\n    command_operator_assignment: $ => prec.right(PREC.ASSIGN, seq(\n      field('left', $._lhs),\n      field('operator', choice('+=', '-=', '*=', '**=', '/=', '||=', '|=', '&&=', '&=', '%=', '>>=', '<<=', '^=')),\n      field('right', choice($._expression, alias($.rescue_modifier_expression, $.rescue_modifier))),\n    )),\n\n    conditional: $ => prec.right(PREC.CONDITIONAL, seq(\n      field('condition', $._arg),\n      '?',\n      field('consequence', $._arg),\n      ':',\n      field('alternative', $._arg),\n    )),\n\n    range: $ => {\n      const begin = field('begin', $._arg);\n      const end = field('end', $._arg);\n      const operator = field('operator', choice('..', '...'));\n      return prec.right(PREC.RANGE, choice(\n        seq(begin, operator, end),\n        seq(operator, end),\n        seq(begin, operator),\n      ));\n    },\n\n    binary: $ => {\n      const operators = [\n        [prec.left, PREC.AND, 'and'],\n        [prec.left, PREC.OR, 'or'],\n        [prec.left, PREC.BOOLEAN_OR, '||'],\n        [prec.left, PREC.BOOLEAN_AND, '&&'],\n        [prec.left, PREC.SHIFT, choice('<<', '>>')],\n        [prec.left, PREC.COMPARISON, choice('<', '<=', '>', '>=')],\n        [prec.left, PREC.BITWISE_AND, '&'],\n        [prec.left, PREC.BITWISE_OR, choice('^', '|')],\n        [prec.left, PREC.ADDITIVE, choice('+', alias($._binary_minus, '-'))],\n        [prec.left, PREC.MULTIPLICATIVE, choice('/', '%', alias($._binary_star, '*'))],\n        [prec.right, PREC.RELATIONAL, choice('==', '!=', '===', '<=>', '=~', '!~')],\n        [prec.right, PREC.EXPONENTIAL, alias($._binary_star_star, '**')],\n      ];\n\n      // @ts-ignore\n      return choice(...operators.map(([fn, precedence, operator]) => fn(precedence, seq(\n        field('left', $._arg),\n        // @ts-ignore\n        field('operator', operator),\n        field('right', $._arg),\n      ))));\n    },\n\n    command_binary: $ => prec.left(seq(\n      field('left', $._expression),\n      field('operator', choice('or', 'and')),\n      field('right', $._expression),\n    )),\n\n    unary: $ => {\n      const operators = [\n        [prec, PREC.DEFINED, 'defined?'],\n        [prec.right, PREC.NOT, 'not'],\n        [prec.right, PREC.UNARY_MINUS, choice(alias($._unary_minus, '-'), alias($._binary_minus, '-'), '+')],\n        [prec.right, PREC.COMPLEMENT, choice('!', '~')],\n      ];\n      // @ts-ignore\n      return choice(...operators.map(([fn, precedence, operator]) => fn(precedence, seq(\n        // @ts-ignore\n        field('operator', operator),\n        field('operand', $._arg),\n      ))));\n    },\n\n    command_unary: $ => {\n      const operators = [\n        [prec, PREC.DEFINED, 'defined?'],\n        [prec.right, PREC.NOT, 'not'],\n        [prec.right, PREC.UNARY_MINUS, choice(alias($._unary_minus, '-'), '+')],\n        [prec.right, PREC.COMPLEMENT, choice('!', '~')],\n      ];\n      // @ts-ignore\n      return choice(...operators.map(([fn, precedence, operator]) => fn(precedence, seq(\n        // @ts-ignore\n        field('operator', operator),\n        field('operand', $._expression),\n      ))));\n    },\n\n    parenthesized_unary: $ => prec(PREC.CALL, seq(\n      field('operator', choice('defined?', 'not')),\n      field('operand', $.parenthesized_statements),\n    )),\n\n    unary_literal: $ => prec.right(PREC.UNARY_MINUS, seq(\n      field('operator', choice(alias($._unary_minus_num, '-'), '+')),\n      field('operand', $._simple_numeric),\n    )),\n\n    _literal: $ => choice(\n      $.simple_symbol,\n      $.delimited_symbol,\n      $._numeric,\n    ),\n\n    _numeric: $ => choice(\n      $._simple_numeric,\n      alias($.unary_literal, $.unary),\n    ),\n\n    _simple_numeric: $ =>\n      choice(\n        $.integer,\n        $.float,\n        $.complex,\n        $.rational,\n      ),\n\n    right_assignment_list: $ => prec(-1, commaSep1(choice($._arg, $.splat_argument))),\n\n    left_assignment_list: $ => $._mlhs,\n    _mlhs: $ => prec.left(-1, seq(\n      commaSep1(choice($._lhs, $.rest_assignment, $.destructured_left_assignment)),\n      optional(','),\n    )),\n    destructured_left_assignment: $ => prec(-1, seq('(', $._mlhs, ')')),\n\n    rest_assignment: $ => prec(-1, seq('*', optional($._lhs))),\n\n    _function_identifier: $ => choice(alias($.identifier_suffix, $.identifier), alias($.constant_suffix, $.constant)),\n    _function_identifier_call: $ => prec.left(field('method', $._function_identifier)),\n    _lhs: $ => prec.left(choice(\n      $._variable,\n      $.true,\n      $.false,\n      $.nil,\n      $.scope_resolution,\n      $.element_reference,\n      alias($._call, $.call),\n    )),\n\n    _variable: $ => prec.right(choice(\n      $.self,\n      $.super,\n      $._nonlocal_variable,\n      $.identifier,\n      $.constant,\n    )),\n\n    operator: _ => choice(\n      '..', '|', '^', '&', '<=>', '==', '===', '=~', '>', '>=', '<', '<=', '+', '!=',\n      '-', '*', '/', '%', '!', '!~', '**', '<<', '>>', '~', '+@', '-@', '~@', '[]', '[]=', '`',\n    ),\n\n    _method_name: $ => choice(\n      $.identifier,\n      $._function_identifier,\n      $.constant,\n      $.setter,\n      $.simple_symbol,\n      $.delimited_symbol,\n      $.operator,\n      $._nonlocal_variable,\n    ),\n\n    _nonlocal_variable: $ => choice(\n      $.instance_variable,\n      $.class_variable,\n      $.global_variable,\n    ),\n\n    setter: $ => seq(field('name', $.identifier), token.immediate('=')),\n\n    undef: $ => seq('undef', commaSep1($._method_name)),\n    alias: $ => seq(\n      'alias',\n      field('name', $._method_name),\n      field('alias', $._method_name),\n    ),\n\n    comment: _ => token(prec(PREC.COMMENT, choice(\n      seq('#', /.*/),\n      seq(\n        /=begin.*\\r?\\n/,\n        repeat(choice(\n          /[^=]/,\n          /=[^e]/,\n          /=e[^n]/,\n          /=en[^d]/,\n        )),\n        /[\\s*]*=end.*/,\n      ),\n    ))),\n\n    integer: _ => /0[bB][01](_?[01])*|0[oO]?[0-7](_?[0-7])*|(0[dD])?\\d(_?\\d)*|0[xX][0-9a-fA-F](_?[0-9a-fA-F])*/,\n    _int_or_float: $ => choice($.integer, $.float),\n    float: _ => /\\d(_?\\d)*(\\.\\d)?(_?\\d)*([eE][\\+-]?\\d(_?\\d)*)?/,\n    complex: $ => choice(\n      seq($._int_or_float, token.immediate('i')),\n      seq(alias($._int_or_float, $.rational), token.immediate('ri')),\n    ),\n    rational: $ => seq($._int_or_float, token.immediate('r')),\n    super: _ => 'super',\n    self: _ => 'self',\n    true: _ => 'true',\n    false: _ => 'false',\n    nil: _ => 'nil',\n\n    constant: _ => token(seq(/[A-Z]/, IDENTIFIER_CHARS)),\n    constant_suffix: $ => choice(token(seq(/[A-Z]/, IDENTIFIER_CHARS, /[?]/)), $._constant_suffix),\n    identifier: _ => token(seq(LOWER_ALPHA_CHAR, IDENTIFIER_CHARS)),\n    identifier_suffix: $ => choice(token(seq(LOWER_ALPHA_CHAR, IDENTIFIER_CHARS, /[?]/)), $._identifier_suffix),\n    instance_variable: _ => token(seq('@', ALPHA_CHAR, IDENTIFIER_CHARS)),\n    class_variable: _ => token(seq('@@', ALPHA_CHAR, IDENTIFIER_CHARS)),\n\n    global_variable: _ => /\\$(-[a-zA-Z0-9_]|[!@&`'+~=/\\\\,;.<>*$?:\"]|[0-9]+|[a-zA-Z_][a-zA-Z0-9_]*)/,\n\n    chained_string: $ => seq($.string, repeat1($.string)),\n\n    character: _ => /\\?(\\\\\\S(\\{[0-9A-Fa-f]*\\}|[0-9A-Fa-f]*|-\\S([MC]-\\S)?)?|\\S)/,\n\n    interpolation: $ => choice(\n      seq('#{', optional($._statements), '}'),\n      seq($._short_interpolation, $._nonlocal_variable),\n    ),\n\n    string: $ => seq(\n      alias($._string_start, '\"'),\n      optional($._literal_contents),\n      alias($._string_end, '\"'),\n    ),\n\n    subshell: $ => seq(\n      alias($._subshell_start, '`'),\n      optional($._literal_contents),\n      alias($._string_end, '`'),\n    ),\n\n    string_array: $ => seq(\n      alias($._string_array_start, '%w('),\n      optional(/\\s+/),\n      sep(alias($._literal_contents, $.bare_string), /\\s+/),\n      optional(/\\s+/),\n      alias($._string_end, ')'),\n    ),\n\n    symbol_array: $ => seq(\n      alias($._symbol_array_start, '%i('),\n      optional(/\\s+/),\n      sep(alias($._literal_contents, $.bare_symbol), /\\s+/),\n      optional(/\\s+/),\n      alias($._string_end, ')'),\n    ),\n\n    delimited_symbol: $ => seq(\n      alias($._symbol_start, ':\"'),\n      optional($._literal_contents),\n      alias($._string_end, '\"'),\n    ),\n\n    regex: $ => seq(\n      alias($._regex_start, '/'),\n      optional($._literal_contents),\n      alias($._string_end, '/'),\n    ),\n\n    heredoc_body: $ => seq(\n      $._heredoc_body_start,\n      repeat(choice(\n        $.heredoc_content,\n        $.interpolation,\n        $.escape_sequence,\n      )),\n      $.heredoc_end,\n    ),\n\n    _literal_contents: $ => repeat1(choice(\n      $.string_content,\n      $.interpolation,\n      $.escape_sequence,\n    )),\n\n    // https://ruby-doc.org/core-2.5.0/doc/syntax/literals_rdoc.html#label-Strings\n    escape_sequence: _ => token(seq(\n      '\\\\',\n      choice(\n        /[^ux0-7]/, // single character\n        /x[0-9a-fA-F]{1,2}/, // hex code\n        /[0-7]{1,3}/, // octal\n        /u[0-9a-fA-F]{4}/, // single unicode\n        /u\\{[0-9a-fA-F ]+\\}/, // multiple unicode\n      ),\n    )),\n\n    array: $ => seq(\n      '[',\n      optional($._argument_list_with_trailing_comma),\n      ']',\n    ),\n\n    hash: $ => seq(\n      '{',\n      optional(seq(\n        commaSep1(choice($.pair, $.hash_splat_argument)),\n        optional(','),\n      )),\n      '}',\n    ),\n\n    pair: $ => prec.right(choice(\n      seq(\n        field('key', $._arg),\n        '=>',\n        field('value', $._arg),\n      ),\n      seq(\n        field('key', choice(\n          $.string,\n        )),\n        token.immediate(':'),\n        field('value', $._arg),\n      ),\n      seq(\n        field('key', choice(\n          $.hash_key_symbol,\n          alias($.identifier, $.hash_key_symbol),\n          alias($.constant, $.hash_key_symbol),\n          alias($.identifier_suffix, $.hash_key_symbol),\n          alias($.constant_suffix, $.hash_key_symbol),\n        )),\n        token.immediate(':'),\n        choice(\n          field('value', optional($._arg)),\n          // This alternative never matches, because '_no_line_break' tokens do not exist.\n          // The purpose is give a hint to the scanner that it should not produce any line-break\n          // terminators at this point.\n          $._no_line_break),\n      ),\n    )),\n\n    lambda: $ => seq(\n      '->',\n      field('parameters', optional(choice(\n        alias($.parameters, $.lambda_parameters),\n        alias($.bare_parameters, $.lambda_parameters),\n      ))),\n      field('body', choice($.block, $.do_block)),\n    ),\n\n    empty_statement: _ => prec(-1, ';'),\n\n    _terminator: $ => choice(\n      $._line_break,\n      ';',\n    ),\n  },\n});\n\n/**\n * Creates a rule to optionally match one or more of the rules separated by `separator`\n *\n * @param {RuleOrLiteral} rule\n *\n * @param {RuleOrLiteral} separator\n *\n * @returns {ChoiceRule}\n */\nfunction sep(rule, separator) {\n  return optional(sep1(rule, separator));\n}\n\n/**\n * Creates a rule to match one or more of the rules separated by `separator`\n *\n * @param {RuleOrLiteral} rule\n *\n * @param {RuleOrLiteral} separator\n *\n * @returns {SeqRule}\n */\nfunction sep1(rule, separator) {\n  return seq(rule, repeat(seq(separator, rule)));\n}\n\n/**\n * Creates a rule to match one or more of the rules separated by a comma\n *\n * @param {RuleOrLiteral} rule\n *\n * @returns {SeqRule}\n */\nfunction commaSep1(rule) {\n  return sep1(rule, ',');\n}\n\n/**\n * Creates a rule to optionally match one or more of the rules separated by a comma\n *\n * @param {RuleOrLiteral} rule\n *\n * @returns {ChoiceRule}\n */\nfunction commaSep(rule) {\n  return optional(commaSep1(rule));\n}\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"tree-sitter-ruby\",\n  \"version\": \"0.23.1\",\n  \"description\": \"Ruby grammar for tree-sitter\",\n  \"repository\": \"https://github.com/tree-sitter/tree-sitter-ruby\",\n  \"license\": \"MIT\",\n  \"author\": {\n    \"name\": \"Rob Rix\",\n    \"email\": \"rob.rix@gmail.com\"\n  },\n  \"contributors\": [\n    {\n      \"name\": \"Timothy Clem\",\n      \"email\": \"timothy.clem@gmail.com\"\n    },\n    {\n      \"name\": \"Max Brunsfeld\",\n      \"email\": \"maxbrunsfeld@gmail.com\"\n    },\n    {\n      \"name\": \"Arthur Baars\",\n      \"email\": \"aibaars@github.com\"\n    },\n    {\n      \"name\": \"Amaan Qureshi\",\n      \"email\": \"amaanq12@gmail.com\"\n    }\n  ],\n  \"maintainers\": [\n    {\n      \"name\": \"Amaan Qureshi\",\n      \"email\": \"amaanq12@gmail.com\"\n    }\n  ],\n  \"main\": \"bindings/node\",\n  \"types\": \"bindings/node\",\n  \"keywords\": [\n    \"incremental\",\n    \"parsing\",\n    \"tree-sitter\",\n    \"ruby\"\n  ],\n  \"files\": [\n    \"grammar.js\",\n    \"tree-sitter.json\",\n    \"binding.gyp\",\n    \"prebuilds/**\",\n    \"bindings/node/*\",\n    \"queries/*\",\n    \"src/**\",\n    \"*.wasm\"\n  ],\n  \"dependencies\": {\n    \"node-addon-api\": \"^8.2.2\",\n    \"node-gyp-build\": \"^4.8.2\"\n  },\n  \"devDependencies\": {\n    \"eslint\": \">=9.14.0\",\n    \"eslint-config-treesitter\": \"^1.0.2\",\n    \"prebuildify\": \"^6.0.1\",\n    \"tree-sitter-cli\": \"^0.24.4\"\n  },\n  \"peerDependencies\": {\n    \"tree-sitter\": \"^0.21.1\"\n  },\n  \"peerDependenciesMeta\": {\n    \"tree-sitter\": {\n      \"optional\": true\n    }\n  },\n  \"scripts\": {\n    \"install\": \"node-gyp-build\",\n    \"prestart\": \"tree-sitter build --wasm\",\n    \"start\": \"tree-sitter playground\",\n    \"test\": \"node --test bindings/node/*_test.js\"\n  }\n}\n"
  },
  {
    "path": "pyproject.toml",
    "content": "[build-system]\nrequires = [\"setuptools>=42\", \"wheel\"]\nbuild-backend = \"setuptools.build_meta\"\n\n[project]\nname = \"tree-sitter-ruby\"\ndescription = \"Ruby grammar for tree-sitter\"\nversion = \"0.23.1\"\nkeywords = [\"incremental\", \"parsing\", \"tree-sitter\", \"ruby\"]\nclassifiers = [\n  \"Intended Audience :: Developers\",\n  \"License :: OSI Approved :: MIT License\",\n  \"Topic :: Software Development :: Compilers\",\n  \"Topic :: Text Processing :: Linguistic\",\n  \"Typing :: Typed\",\n]\nauthors = [\n  { name = \"Max Brunsfeld\", email = \"maxbrunsfeld@gmail.com\" },\n  { name = \"Amaan Qureshi\", email = \"amaanq12@gmail.com\" },\n]\nrequires-python = \">=3.9\"\nlicense.text = \"MIT\"\nreadme = \"README.md\"\n\n[project.urls]\nHomepage = \"https://github.com/tree-sitter/tree-sitter-ruby\"\n\n[project.optional-dependencies]\ncore = [\"tree-sitter~=0.22\"]\n\n[tool.cibuildwheel]\nbuild = \"cp39-*\"\nbuild-frontend = \"build\"\n"
  },
  {
    "path": "queries/highlights.scm",
    "content": "(identifier) @variable\n\n((identifier) @function.method\n (#is-not? local))\n\n[\n  \"alias\"\n  \"and\"\n  \"begin\"\n  \"break\"\n  \"case\"\n  \"class\"\n  \"def\"\n  \"do\"\n  \"else\"\n  \"elsif\"\n  \"end\"\n  \"ensure\"\n  \"for\"\n  \"if\"\n  \"in\"\n  \"module\"\n  \"next\"\n  \"or\"\n  \"rescue\"\n  \"retry\"\n  \"return\"\n  \"then\"\n  \"unless\"\n  \"until\"\n  \"when\"\n  \"while\"\n  \"yield\"\n] @keyword\n\n((identifier) @keyword\n (#match? @keyword \"^(private|protected|public)$\"))\n\n(constant) @constructor\n\n; Function calls\n\n\"defined?\" @function.method.builtin\n\n(call\n  method: [(identifier) (constant)] @function.method)\n\n((identifier) @function.method.builtin\n (#eq? @function.method.builtin \"require\"))\n\n; Function definitions\n\n(alias (identifier) @function.method)\n(setter (identifier) @function.method)\n(method name: [(identifier) (constant)] @function.method)\n(singleton_method name: [(identifier) (constant)] @function.method)\n\n; Identifiers\n\n[\n  (class_variable)\n  (instance_variable)\n] @property\n\n((identifier) @constant.builtin\n (#match? @constant.builtin \"^__(FILE|LINE|ENCODING)__$\"))\n\n(file) @constant.builtin\n(line) @constant.builtin\n(encoding) @constant.builtin\n\n(hash_splat_nil\n  \"**\" @operator) @constant.builtin\n\n((constant) @constant\n (#match? @constant \"^[A-Z\\\\d_]+$\"))\n\n[\n  (self)\n  (super)\n] @variable.builtin\n\n(block_parameter (identifier) @variable.parameter)\n(block_parameters (identifier) @variable.parameter)\n(destructured_parameter (identifier) @variable.parameter)\n(hash_splat_parameter (identifier) @variable.parameter)\n(lambda_parameters (identifier) @variable.parameter)\n(method_parameters (identifier) @variable.parameter)\n(splat_parameter (identifier) @variable.parameter)\n\n(keyword_parameter name: (identifier) @variable.parameter)\n(optional_parameter name: (identifier) @variable.parameter)\n\n; Literals\n\n[\n  (string)\n  (bare_string)\n  (subshell)\n  (heredoc_body)\n  (heredoc_beginning)\n] @string\n\n[\n  (simple_symbol)\n  (delimited_symbol)\n  (hash_key_symbol)\n  (bare_symbol)\n] @string.special.symbol\n\n(regex) @string.special.regex\n(escape_sequence) @escape\n\n[\n  (integer)\n  (float)\n] @number\n\n[\n  (nil)\n  (true)\n  (false)\n] @constant.builtin\n\n(interpolation\n  \"#{\" @punctuation.special\n  \"}\" @punctuation.special) @embedded\n\n(comment) @comment\n\n; Operators\n\n[\n\"=\"\n\"=>\"\n\"->\"\n] @operator\n\n[\n  \",\"\n  \";\"\n  \".\"\n] @punctuation.delimiter\n\n[\n  \"(\"\n  \")\"\n  \"[\"\n  \"]\"\n  \"{\"\n  \"}\"\n  \"%w(\"\n  \"%i(\"\n] @punctuation.bracket\n"
  },
  {
    "path": "queries/locals.scm",
    "content": "((method) @local.scope\n (#set! local.scope-inherits false))\n\n[\n  (lambda)\n  (block)\n  (do_block)\n] @local.scope\n\n(block_parameter (identifier) @local.definition)\n(block_parameters (identifier) @local.definition)\n(destructured_parameter (identifier) @local.definition)\n(hash_splat_parameter (identifier) @local.definition)\n(lambda_parameters (identifier) @local.definition)\n(method_parameters (identifier) @local.definition)\n(splat_parameter (identifier) @local.definition)\n\n(keyword_parameter name: (identifier) @local.definition)\n(optional_parameter name: (identifier) @local.definition)\n\n(identifier) @local.reference\n\n(assignment left: (identifier) @local.definition)\n(operator_assignment left: (identifier) @local.definition)\n(left_assignment_list (identifier) @local.definition)\n(rest_assignment (identifier) @local.definition)\n(destructured_left_assignment (identifier) @local.definition)\n"
  },
  {
    "path": "queries/tags.scm",
    "content": "; Method definitions\n\n(\n  (comment)* @doc\n  .\n  [\n    (method\n      name: (_) @name) @definition.method\n    (singleton_method\n      name: (_) @name) @definition.method\n  ]\n  (#strip! @doc \"^#\\\\s*\")\n  (#select-adjacent! @doc @definition.method)\n)\n\n(alias\n  name: (_) @name) @definition.method\n\n(setter\n  (identifier) @ignore)\n\n; Class definitions\n\n(\n  (comment)* @doc\n  .\n  [\n    (class\n      name: [\n        (constant) @name\n        (scope_resolution\n          name: (_) @name)\n      ]) @definition.class\n    (singleton_class\n      value: [\n        (constant) @name\n        (scope_resolution\n          name: (_) @name)\n      ]) @definition.class\n  ]\n  (#strip! @doc \"^#\\\\s*\")\n  (#select-adjacent! @doc @definition.class)\n)\n\n; Module definitions\n\n(\n  (module\n    name: [\n      (constant) @name\n      (scope_resolution\n        name: (_) @name)\n    ]) @definition.module\n)\n\n; Calls\n\n(call method: (identifier) @name) @reference.call\n\n(\n  [(identifier) (constant)] @name @reference.call\n  (#is-not? local)\n  (#not-match? @name \"^(lambda|load|require|require_relative|__FILE__|__LINE__)$\")\n)\n"
  },
  {
    "path": "setup.py",
    "content": "from os.path import isdir, join\nfrom platform import system\n\nfrom setuptools import Extension, find_packages, setup\nfrom setuptools.command.build import build\nfrom wheel.bdist_wheel import bdist_wheel\n\n\nclass Build(build):\n    def run(self):\n        if isdir(\"queries\"):\n            dest = join(self.build_lib, \"tree_sitter_ruby\", \"queries\")\n            self.copy_tree(\"queries\", dest)\n        super().run()\n\n\nclass BdistWheel(bdist_wheel):\n    def get_tag(self):\n        python, abi, platform = super().get_tag()\n        if python.startswith(\"cp\"):\n            python, abi = \"cp39\", \"abi3\"\n        return python, abi, platform\n\n\nsetup(\n    packages=find_packages(\"bindings/python\"),\n    package_dir={\"\": \"bindings/python\"},\n    package_data={\n        \"tree_sitter_ruby\": [\"*.pyi\", \"py.typed\"],\n        \"tree_sitter_ruby.queries\": [\"*.scm\"],\n    },\n    ext_package=\"tree_sitter_ruby\",\n    ext_modules=[\n        Extension(\n            name=\"_binding\",\n            sources=[\n                \"bindings/python/tree_sitter_ruby/binding.c\",\n                \"src/parser.c\",\n                \"src/scanner.c\",\n            ],\n            extra_compile_args=[\n                \"-std=c11\",\n                \"-fvisibility=hidden\",\n            ] if system() != \"Windows\" else [\n                \"/std:c11\",\n                \"/utf-8\",\n            ],\n            define_macros=[\n                (\"Py_LIMITED_API\", \"0x03090000\"),\n                (\"PY_SSIZE_T_CLEAN\", None),\n                (\"TREE_SITTER_HIDE_SYMBOLS\", None),\n            ],\n            include_dirs=[\"src\"],\n            py_limited_api=True,\n        )\n    ],\n    cmdclass={\n        \"build\": Build,\n        \"bdist_wheel\": BdistWheel\n    },\n    zip_safe=False\n)\n"
  },
  {
    "path": "src/grammar.json",
    "content": "{\n  \"$schema\": \"https://tree-sitter.github.io/tree-sitter/assets/schemas/grammar.schema.json\",\n  \"name\": \"ruby\",\n  \"word\": \"identifier\",\n  \"rules\": {\n    \"program\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_statements\"\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"CHOICE\",\n              \"members\": [\n                {\n                  \"type\": \"SEQ\",\n                  \"members\": [\n                    {\n                      \"type\": \"PATTERN\",\n                      \"value\": \"__END__\"\n                    },\n                    {\n                      \"type\": \"SYMBOL\",\n                      \"name\": \"uninterpreted\"\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        }\n      ]\n    },\n    \"uninterpreted\": {\n      \"type\": \"PATTERN\",\n      \"value\": \"(.|\\\\s)*\"\n    },\n    \"block_body\": {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_statements\"\n    },\n    \"_statements\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SEQ\",\n          \"members\": [\n            {\n              \"type\": \"REPEAT1\",\n              \"content\": {\n                \"type\": \"CHOICE\",\n                \"members\": [\n                  {\n                    \"type\": \"SEQ\",\n                    \"members\": [\n                      {\n                        \"type\": \"SYMBOL\",\n                        \"name\": \"_statement\"\n                      },\n                      {\n                        \"type\": \"SYMBOL\",\n                        \"name\": \"_terminator\"\n                      }\n                    ]\n                  },\n                  {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"empty_statement\"\n                  }\n                ]\n              }\n            },\n            {\n              \"type\": \"CHOICE\",\n              \"members\": [\n                {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_statement\"\n                },\n                {\n                  \"type\": \"BLANK\"\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_statement\"\n        }\n      ]\n    },\n    \"begin_block\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"BEGIN\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"{\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_statements\"\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"}\"\n        }\n      ]\n    },\n    \"end_block\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"END\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"{\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_statements\"\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"}\"\n        }\n      ]\n    },\n    \"_statement\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"undef\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"alias\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"if_modifier\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"unless_modifier\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"while_modifier\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"until_modifier\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"rescue_modifier\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"begin_block\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"end_block\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_expression\"\n        }\n      ]\n    },\n    \"method\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"def\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_method_rest\"\n        }\n      ]\n    },\n    \"singleton_method\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"def\"\n        },\n        {\n          \"type\": \"SEQ\",\n          \"members\": [\n            {\n              \"type\": \"CHOICE\",\n              \"members\": [\n                {\n                  \"type\": \"FIELD\",\n                  \"name\": \"object\",\n                  \"content\": {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"_variable\"\n                  }\n                },\n                {\n                  \"type\": \"SEQ\",\n                  \"members\": [\n                    {\n                      \"type\": \"STRING\",\n                      \"value\": \"(\"\n                    },\n                    {\n                      \"type\": \"FIELD\",\n                      \"name\": \"object\",\n                      \"content\": {\n                        \"type\": \"SYMBOL\",\n                        \"name\": \"_arg\"\n                      }\n                    },\n                    {\n                      \"type\": \"STRING\",\n                      \"value\": \")\"\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"type\": \"CHOICE\",\n              \"members\": [\n                {\n                  \"type\": \"STRING\",\n                  \"value\": \".\"\n                },\n                {\n                  \"type\": \"STRING\",\n                  \"value\": \"::\"\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_method_rest\"\n        }\n      ]\n    },\n    \"_method_rest\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"name\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_method_name\"\n          }\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_body_expr\"\n            },\n            {\n              \"type\": \"SEQ\",\n              \"members\": [\n                {\n                  \"type\": \"FIELD\",\n                  \"name\": \"parameters\",\n                  \"content\": {\n                    \"type\": \"ALIAS\",\n                    \"content\": {\n                      \"type\": \"SYMBOL\",\n                      \"name\": \"parameters\"\n                    },\n                    \"named\": true,\n                    \"value\": \"method_parameters\"\n                  }\n                },\n                {\n                  \"type\": \"CHOICE\",\n                  \"members\": [\n                    {\n                      \"type\": \"SEQ\",\n                      \"members\": [\n                        {\n                          \"type\": \"CHOICE\",\n                          \"members\": [\n                            {\n                              \"type\": \"SYMBOL\",\n                              \"name\": \"_terminator\"\n                            },\n                            {\n                              \"type\": \"BLANK\"\n                            }\n                          ]\n                        },\n                        {\n                          \"type\": \"CHOICE\",\n                          \"members\": [\n                            {\n                              \"type\": \"FIELD\",\n                              \"name\": \"body\",\n                              \"content\": {\n                                \"type\": \"SYMBOL\",\n                                \"name\": \"body_statement\"\n                              }\n                            },\n                            {\n                              \"type\": \"BLANK\"\n                            }\n                          ]\n                        },\n                        {\n                          \"type\": \"STRING\",\n                          \"value\": \"end\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"SYMBOL\",\n                      \"name\": \"_body_expr\"\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"type\": \"SEQ\",\n              \"members\": [\n                {\n                  \"type\": \"CHOICE\",\n                  \"members\": [\n                    {\n                      \"type\": \"FIELD\",\n                      \"name\": \"parameters\",\n                      \"content\": {\n                        \"type\": \"ALIAS\",\n                        \"content\": {\n                          \"type\": \"SYMBOL\",\n                          \"name\": \"bare_parameters\"\n                        },\n                        \"named\": true,\n                        \"value\": \"method_parameters\"\n                      }\n                    },\n                    {\n                      \"type\": \"BLANK\"\n                    }\n                  ]\n                },\n                {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_terminator\"\n                },\n                {\n                  \"type\": \"CHOICE\",\n                  \"members\": [\n                    {\n                      \"type\": \"FIELD\",\n                      \"name\": \"body\",\n                      \"content\": {\n                        \"type\": \"SYMBOL\",\n                        \"name\": \"body_statement\"\n                      }\n                    },\n                    {\n                      \"type\": \"BLANK\"\n                    }\n                  ]\n                },\n                {\n                  \"type\": \"STRING\",\n                  \"value\": \"end\"\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    \"rescue_modifier_arg\": {\n      \"type\": \"PREC\",\n      \"value\": 16,\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"body\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_arg\"\n            }\n          },\n          {\n            \"type\": \"STRING\",\n            \"value\": \"rescue\"\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"handler\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_arg\"\n            }\n          }\n        ]\n      }\n    },\n    \"rescue_modifier_expression\": {\n      \"type\": \"PREC\",\n      \"value\": 16,\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"body\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_expression\"\n            }\n          },\n          {\n            \"type\": \"STRING\",\n            \"value\": \"rescue\"\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"handler\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_arg\"\n            }\n          }\n        ]\n      }\n    },\n    \"_body_expr\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"=\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"body\",\n          \"content\": {\n            \"type\": \"CHOICE\",\n            \"members\": [\n              {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_arg\"\n              },\n              {\n                \"type\": \"ALIAS\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"rescue_modifier_arg\"\n                },\n                \"named\": true,\n                \"value\": \"rescue_modifier\"\n              }\n            ]\n          }\n        }\n      ]\n    },\n    \"parameters\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"(\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SEQ\",\n              \"members\": [\n                {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_formal_parameter\"\n                },\n                {\n                  \"type\": \"REPEAT\",\n                  \"content\": {\n                    \"type\": \"SEQ\",\n                    \"members\": [\n                      {\n                        \"type\": \"STRING\",\n                        \"value\": \",\"\n                      },\n                      {\n                        \"type\": \"SYMBOL\",\n                        \"name\": \"_formal_parameter\"\n                      }\n                    ]\n                  }\n                }\n              ]\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \")\"\n        }\n      ]\n    },\n    \"bare_parameters\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_simple_formal_parameter\"\n        },\n        {\n          \"type\": \"REPEAT\",\n          \"content\": {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"STRING\",\n                \"value\": \",\"\n              },\n              {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_formal_parameter\"\n              }\n            ]\n          }\n        }\n      ]\n    },\n    \"block_parameters\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"|\"\n        },\n        {\n          \"type\": \"SEQ\",\n          \"members\": [\n            {\n              \"type\": \"CHOICE\",\n              \"members\": [\n                {\n                  \"type\": \"SEQ\",\n                  \"members\": [\n                    {\n                      \"type\": \"SYMBOL\",\n                      \"name\": \"_formal_parameter\"\n                    },\n                    {\n                      \"type\": \"REPEAT\",\n                      \"content\": {\n                        \"type\": \"SEQ\",\n                        \"members\": [\n                          {\n                            \"type\": \"STRING\",\n                            \"value\": \",\"\n                          },\n                          {\n                            \"type\": \"SYMBOL\",\n                            \"name\": \"_formal_parameter\"\n                          }\n                        ]\n                      }\n                    }\n                  ]\n                },\n                {\n                  \"type\": \"BLANK\"\n                }\n              ]\n            },\n            {\n              \"type\": \"CHOICE\",\n              \"members\": [\n                {\n                  \"type\": \"STRING\",\n                  \"value\": \",\"\n                },\n                {\n                  \"type\": \"BLANK\"\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SEQ\",\n              \"members\": [\n                {\n                  \"type\": \"STRING\",\n                  \"value\": \";\"\n                },\n                {\n                  \"type\": \"SEQ\",\n                  \"members\": [\n                    {\n                      \"type\": \"FIELD\",\n                      \"name\": \"locals\",\n                      \"content\": {\n                        \"type\": \"SYMBOL\",\n                        \"name\": \"identifier\"\n                      }\n                    },\n                    {\n                      \"type\": \"REPEAT\",\n                      \"content\": {\n                        \"type\": \"SEQ\",\n                        \"members\": [\n                          {\n                            \"type\": \"STRING\",\n                            \"value\": \",\"\n                          },\n                          {\n                            \"type\": \"FIELD\",\n                            \"name\": \"locals\",\n                            \"content\": {\n                              \"type\": \"SYMBOL\",\n                              \"name\": \"identifier\"\n                            }\n                          }\n                        ]\n                      }\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"|\"\n        }\n      ]\n    },\n    \"_formal_parameter\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_simple_formal_parameter\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"parameters\"\n          },\n          \"named\": true,\n          \"value\": \"destructured_parameter\"\n        }\n      ]\n    },\n    \"_simple_formal_parameter\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"identifier\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"splat_parameter\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"hash_splat_parameter\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"hash_splat_nil\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"forward_parameter\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"block_parameter\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"keyword_parameter\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"optional_parameter\"\n        }\n      ]\n    },\n    \"forward_parameter\": {\n      \"type\": \"STRING\",\n      \"value\": \"...\"\n    },\n    \"splat_parameter\": {\n      \"type\": \"PREC_RIGHT\",\n      \"value\": -2,\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"STRING\",\n            \"value\": \"*\"\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"name\",\n            \"content\": {\n              \"type\": \"CHOICE\",\n              \"members\": [\n                {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"identifier\"\n                },\n                {\n                  \"type\": \"BLANK\"\n                }\n              ]\n            }\n          }\n        ]\n      }\n    },\n    \"hash_splat_parameter\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"**\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"name\",\n          \"content\": {\n            \"type\": \"CHOICE\",\n            \"members\": [\n              {\n                \"type\": \"SYMBOL\",\n                \"name\": \"identifier\"\n              },\n              {\n                \"type\": \"BLANK\"\n              }\n            ]\n          }\n        }\n      ]\n    },\n    \"hash_splat_nil\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"**\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"nil\"\n        }\n      ]\n    },\n    \"block_parameter\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"&\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"name\",\n          \"content\": {\n            \"type\": \"CHOICE\",\n            \"members\": [\n              {\n                \"type\": \"SYMBOL\",\n                \"name\": \"identifier\"\n              },\n              {\n                \"type\": \"BLANK\"\n              }\n            ]\n          }\n        }\n      ]\n    },\n    \"keyword_parameter\": {\n      \"type\": \"PREC_RIGHT\",\n      \"value\": 51,\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"name\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"identifier\"\n            }\n          },\n          {\n            \"type\": \"IMMEDIATE_TOKEN\",\n            \"content\": {\n              \"type\": \"STRING\",\n              \"value\": \":\"\n            }\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"value\",\n            \"content\": {\n              \"type\": \"CHOICE\",\n              \"members\": [\n                {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_arg\"\n                },\n                {\n                  \"type\": \"BLANK\"\n                }\n              ]\n            }\n          }\n        ]\n      }\n    },\n    \"optional_parameter\": {\n      \"type\": \"PREC\",\n      \"value\": 51,\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"name\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"identifier\"\n            }\n          },\n          {\n            \"type\": \"STRING\",\n            \"value\": \"=\"\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"value\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_arg\"\n            }\n          }\n        ]\n      }\n    },\n    \"class\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"class\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"name\",\n          \"content\": {\n            \"type\": \"CHOICE\",\n            \"members\": [\n              {\n                \"type\": \"SYMBOL\",\n                \"name\": \"constant\"\n              },\n              {\n                \"type\": \"SYMBOL\",\n                \"name\": \"scope_resolution\"\n              }\n            ]\n          }\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SEQ\",\n              \"members\": [\n                {\n                  \"type\": \"FIELD\",\n                  \"name\": \"superclass\",\n                  \"content\": {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"superclass\"\n                  }\n                },\n                {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_terminator\"\n                }\n              ]\n            },\n            {\n              \"type\": \"CHOICE\",\n              \"members\": [\n                {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_terminator\"\n                },\n                {\n                  \"type\": \"BLANK\"\n                }\n              ]\n            }\n          ]\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"body\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"body_statement\"\n              }\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"end\"\n        }\n      ]\n    },\n    \"superclass\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"<\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_expression\"\n        }\n      ]\n    },\n    \"singleton_class\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"class\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_singleton_class_left_angle_left_langle\"\n          },\n          \"named\": false,\n          \"value\": \"<<\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"value\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_arg\"\n          }\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_terminator\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"body\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"body_statement\"\n              }\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"end\"\n        }\n      ]\n    },\n    \"module\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"module\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"name\",\n          \"content\": {\n            \"type\": \"CHOICE\",\n            \"members\": [\n              {\n                \"type\": \"SYMBOL\",\n                \"name\": \"constant\"\n              },\n              {\n                \"type\": \"SYMBOL\",\n                \"name\": \"scope_resolution\"\n              }\n            ]\n          }\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_terminator\"\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"body\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"body_statement\"\n              }\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"end\"\n        }\n      ]\n    },\n    \"return_command\": {\n      \"type\": \"PREC_LEFT\",\n      \"value\": 0,\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"STRING\",\n            \"value\": \"return\"\n          },\n          {\n            \"type\": \"ALIAS\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"command_argument_list\"\n            },\n            \"named\": true,\n            \"value\": \"argument_list\"\n          }\n        ]\n      }\n    },\n    \"yield_command\": {\n      \"type\": \"PREC_LEFT\",\n      \"value\": 0,\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"STRING\",\n            \"value\": \"yield\"\n          },\n          {\n            \"type\": \"ALIAS\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"command_argument_list\"\n            },\n            \"named\": true,\n            \"value\": \"argument_list\"\n          }\n        ]\n      }\n    },\n    \"break_command\": {\n      \"type\": \"PREC_LEFT\",\n      \"value\": 0,\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"STRING\",\n            \"value\": \"break\"\n          },\n          {\n            \"type\": \"ALIAS\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"command_argument_list\"\n            },\n            \"named\": true,\n            \"value\": \"argument_list\"\n          }\n        ]\n      }\n    },\n    \"next_command\": {\n      \"type\": \"PREC_LEFT\",\n      \"value\": 0,\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"STRING\",\n            \"value\": \"next\"\n          },\n          {\n            \"type\": \"ALIAS\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"command_argument_list\"\n            },\n            \"named\": true,\n            \"value\": \"argument_list\"\n          }\n        ]\n      }\n    },\n    \"return\": {\n      \"type\": \"PREC_LEFT\",\n      \"value\": 0,\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"STRING\",\n            \"value\": \"return\"\n          },\n          {\n            \"type\": \"CHOICE\",\n            \"members\": [\n              {\n                \"type\": \"SYMBOL\",\n                \"name\": \"argument_list\"\n              },\n              {\n                \"type\": \"BLANK\"\n              }\n            ]\n          }\n        ]\n      }\n    },\n    \"yield\": {\n      \"type\": \"PREC_LEFT\",\n      \"value\": 0,\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"STRING\",\n            \"value\": \"yield\"\n          },\n          {\n            \"type\": \"CHOICE\",\n            \"members\": [\n              {\n                \"type\": \"SYMBOL\",\n                \"name\": \"argument_list\"\n              },\n              {\n                \"type\": \"BLANK\"\n              }\n            ]\n          }\n        ]\n      }\n    },\n    \"break\": {\n      \"type\": \"PREC_LEFT\",\n      \"value\": 0,\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"STRING\",\n            \"value\": \"break\"\n          },\n          {\n            \"type\": \"CHOICE\",\n            \"members\": [\n              {\n                \"type\": \"SYMBOL\",\n                \"name\": \"argument_list\"\n              },\n              {\n                \"type\": \"BLANK\"\n              }\n            ]\n          }\n        ]\n      }\n    },\n    \"next\": {\n      \"type\": \"PREC_LEFT\",\n      \"value\": 0,\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"STRING\",\n            \"value\": \"next\"\n          },\n          {\n            \"type\": \"CHOICE\",\n            \"members\": [\n              {\n                \"type\": \"SYMBOL\",\n                \"name\": \"argument_list\"\n              },\n              {\n                \"type\": \"BLANK\"\n              }\n            ]\n          }\n        ]\n      }\n    },\n    \"redo\": {\n      \"type\": \"PREC_LEFT\",\n      \"value\": 0,\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"STRING\",\n            \"value\": \"redo\"\n          },\n          {\n            \"type\": \"CHOICE\",\n            \"members\": [\n              {\n                \"type\": \"SYMBOL\",\n                \"name\": \"argument_list\"\n              },\n              {\n                \"type\": \"BLANK\"\n              }\n            ]\n          }\n        ]\n      }\n    },\n    \"retry\": {\n      \"type\": \"PREC_LEFT\",\n      \"value\": 0,\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"STRING\",\n            \"value\": \"retry\"\n          },\n          {\n            \"type\": \"CHOICE\",\n            \"members\": [\n              {\n                \"type\": \"SYMBOL\",\n                \"name\": \"argument_list\"\n              },\n              {\n                \"type\": \"BLANK\"\n              }\n            ]\n          }\n        ]\n      }\n    },\n    \"if_modifier\": {\n      \"type\": \"PREC\",\n      \"value\": 16,\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"body\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_statement\"\n            }\n          },\n          {\n            \"type\": \"STRING\",\n            \"value\": \"if\"\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"condition\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_expression\"\n            }\n          }\n        ]\n      }\n    },\n    \"unless_modifier\": {\n      \"type\": \"PREC\",\n      \"value\": 16,\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"body\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_statement\"\n            }\n          },\n          {\n            \"type\": \"STRING\",\n            \"value\": \"unless\"\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"condition\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_expression\"\n            }\n          }\n        ]\n      }\n    },\n    \"while_modifier\": {\n      \"type\": \"PREC\",\n      \"value\": 16,\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"body\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_statement\"\n            }\n          },\n          {\n            \"type\": \"STRING\",\n            \"value\": \"while\"\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"condition\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_expression\"\n            }\n          }\n        ]\n      }\n    },\n    \"until_modifier\": {\n      \"type\": \"PREC\",\n      \"value\": 16,\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"body\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_statement\"\n            }\n          },\n          {\n            \"type\": \"STRING\",\n            \"value\": \"until\"\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"condition\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_expression\"\n            }\n          }\n        ]\n      }\n    },\n    \"rescue_modifier\": {\n      \"type\": \"PREC\",\n      \"value\": 16,\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"body\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_statement\"\n            }\n          },\n          {\n            \"type\": \"STRING\",\n            \"value\": \"rescue\"\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"handler\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_expression\"\n            }\n          }\n        ]\n      }\n    },\n    \"while\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"while\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"condition\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_statement\"\n          }\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"body\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"do\"\n          }\n        }\n      ]\n    },\n    \"until\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"until\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"condition\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_statement\"\n          }\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"body\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"do\"\n          }\n        }\n      ]\n    },\n    \"for\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"for\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"pattern\",\n          \"content\": {\n            \"type\": \"CHOICE\",\n            \"members\": [\n              {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_lhs\"\n              },\n              {\n                \"type\": \"SYMBOL\",\n                \"name\": \"left_assignment_list\"\n              }\n            ]\n          }\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"value\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"in\"\n          }\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"body\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"do\"\n          }\n        }\n      ]\n    },\n    \"in\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"in\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_arg\"\n        }\n      ]\n    },\n    \"do\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"STRING\",\n              \"value\": \"do\"\n            },\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_terminator\"\n            }\n          ]\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_statements\"\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"end\"\n        }\n      ]\n    },\n    \"case\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"case\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SEQ\",\n              \"members\": [\n                {\n                  \"type\": \"CHOICE\",\n                  \"members\": [\n                    {\n                      \"type\": \"SYMBOL\",\n                      \"name\": \"_line_break\"\n                    },\n                    {\n                      \"type\": \"BLANK\"\n                    }\n                  ]\n                },\n                {\n                  \"type\": \"FIELD\",\n                  \"name\": \"value\",\n                  \"content\": {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"_statement\"\n                  }\n                }\n              ]\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_terminator\"\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"REPEAT\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"when\"\n          }\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"else\"\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"end\"\n        }\n      ]\n    },\n    \"case_match\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"case\"\n        },\n        {\n          \"type\": \"SEQ\",\n          \"members\": [\n            {\n              \"type\": \"CHOICE\",\n              \"members\": [\n                {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_line_break\"\n                },\n                {\n                  \"type\": \"BLANK\"\n                }\n              ]\n            },\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"value\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_statement\"\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_terminator\"\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"REPEAT1\",\n          \"content\": {\n            \"type\": \"FIELD\",\n            \"name\": \"clauses\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"in_clause\"\n            }\n          }\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"else\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"else\"\n              }\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"end\"\n        }\n      ]\n    },\n    \"when\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"when\"\n        },\n        {\n          \"type\": \"SEQ\",\n          \"members\": [\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"pattern\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"pattern\"\n              }\n            },\n            {\n              \"type\": \"REPEAT\",\n              \"content\": {\n                \"type\": \"SEQ\",\n                \"members\": [\n                  {\n                    \"type\": \"STRING\",\n                    \"value\": \",\"\n                  },\n                  {\n                    \"type\": \"FIELD\",\n                    \"name\": \"pattern\",\n                    \"content\": {\n                      \"type\": \"SYMBOL\",\n                      \"name\": \"pattern\"\n                    }\n                  }\n                ]\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_terminator\"\n            },\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"body\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"then\"\n              }\n            }\n          ]\n        }\n      ]\n    },\n    \"in_clause\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"in\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"pattern\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_pattern_top_expr_body\"\n          }\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"guard\",\n          \"content\": {\n            \"type\": \"CHOICE\",\n            \"members\": [\n              {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_guard\"\n              },\n              {\n                \"type\": \"BLANK\"\n              }\n            ]\n          }\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_terminator\"\n            },\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"body\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"then\"\n              }\n            }\n          ]\n        }\n      ]\n    },\n    \"pattern\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_arg\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"splat_argument\"\n        }\n      ]\n    },\n    \"_guard\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"if_guard\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"unless_guard\"\n        }\n      ]\n    },\n    \"if_guard\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"if\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"condition\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_expression\"\n          }\n        }\n      ]\n    },\n    \"unless_guard\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"unless\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"condition\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_expression\"\n          }\n        }\n      ]\n    },\n    \"_pattern_top_expr_body\": {\n      \"type\": \"PREC\",\n      \"value\": -1,\n      \"content\": {\n        \"type\": \"CHOICE\",\n        \"members\": [\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_pattern_expr\"\n          },\n          {\n            \"type\": \"ALIAS\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_array_pattern_n\"\n            },\n            \"named\": true,\n            \"value\": \"array_pattern\"\n          },\n          {\n            \"type\": \"ALIAS\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_find_pattern_body\"\n            },\n            \"named\": true,\n            \"value\": \"find_pattern\"\n          },\n          {\n            \"type\": \"ALIAS\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_hash_pattern_body\"\n            },\n            \"named\": true,\n            \"value\": \"hash_pattern\"\n          }\n        ]\n      }\n    },\n    \"_array_pattern_n\": {\n      \"type\": \"PREC_RIGHT\",\n      \"value\": 0,\n      \"content\": {\n        \"type\": \"CHOICE\",\n        \"members\": [\n          {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_pattern_expr\"\n              },\n              {\n                \"type\": \"ALIAS\",\n                \"content\": {\n                  \"type\": \"STRING\",\n                  \"value\": \",\"\n                },\n                \"named\": true,\n                \"value\": \"splat_parameter\"\n              }\n            ]\n          },\n          {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_pattern_expr\"\n              },\n              {\n                \"type\": \"STRING\",\n                \"value\": \",\"\n              },\n              {\n                \"type\": \"CHOICE\",\n                \"members\": [\n                  {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"_pattern_expr\"\n                  },\n                  {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"_array_pattern_n\"\n                  }\n                ]\n              }\n            ]\n          },\n          {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"SYMBOL\",\n                \"name\": \"splat_parameter\"\n              },\n              {\n                \"type\": \"REPEAT\",\n                \"content\": {\n                  \"type\": \"SEQ\",\n                  \"members\": [\n                    {\n                      \"type\": \"STRING\",\n                      \"value\": \",\"\n                    },\n                    {\n                      \"type\": \"SYMBOL\",\n                      \"name\": \"_pattern_expr\"\n                    }\n                  ]\n                }\n              }\n            ]\n          }\n        ]\n      }\n    },\n    \"_pattern_expr\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"as_pattern\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_pattern_expr_alt\"\n        }\n      ]\n    },\n    \"as_pattern\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"value\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_pattern_expr\"\n          }\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"=>\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"name\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"identifier\"\n          }\n        }\n      ]\n    },\n    \"_pattern_expr_alt\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"alternative_pattern\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_pattern_expr_basic\"\n        }\n      ]\n    },\n    \"alternative_pattern\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"alternatives\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_pattern_expr_basic\"\n          }\n        },\n        {\n          \"type\": \"REPEAT1\",\n          \"content\": {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"STRING\",\n                \"value\": \"|\"\n              },\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"alternatives\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_pattern_expr_basic\"\n                }\n              }\n            ]\n          }\n        }\n      ]\n    },\n    \"_array_pattern_body\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_pattern_expr\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_array_pattern_n\"\n        }\n      ]\n    },\n    \"array_pattern\": {\n      \"type\": \"PREC_RIGHT\",\n      \"value\": -1,\n      \"content\": {\n        \"type\": \"CHOICE\",\n        \"members\": [\n          {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"STRING\",\n                \"value\": \"[\"\n              },\n              {\n                \"type\": \"CHOICE\",\n                \"members\": [\n                  {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"_array_pattern_body\"\n                  },\n                  {\n                    \"type\": \"BLANK\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"STRING\",\n                \"value\": \"]\"\n              }\n            ]\n          },\n          {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"class\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_pattern_constant\"\n                }\n              },\n              {\n                \"type\": \"IMMEDIATE_TOKEN\",\n                \"content\": {\n                  \"type\": \"STRING\",\n                  \"value\": \"[\"\n                }\n              },\n              {\n                \"type\": \"CHOICE\",\n                \"members\": [\n                  {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"_array_pattern_body\"\n                  },\n                  {\n                    \"type\": \"BLANK\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"STRING\",\n                \"value\": \"]\"\n              }\n            ]\n          },\n          {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"class\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_pattern_constant\"\n                }\n              },\n              {\n                \"type\": \"IMMEDIATE_TOKEN\",\n                \"content\": {\n                  \"type\": \"STRING\",\n                  \"value\": \"(\"\n                }\n              },\n              {\n                \"type\": \"CHOICE\",\n                \"members\": [\n                  {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"_array_pattern_body\"\n                  },\n                  {\n                    \"type\": \"BLANK\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"STRING\",\n                \"value\": \")\"\n              }\n            ]\n          }\n        ]\n      }\n    },\n    \"_find_pattern_body\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"splat_parameter\"\n        },\n        {\n          \"type\": \"REPEAT1\",\n          \"content\": {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"STRING\",\n                \"value\": \",\"\n              },\n              {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_pattern_expr\"\n              }\n            ]\n          }\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \",\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"splat_parameter\"\n        }\n      ]\n    },\n    \"find_pattern\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SEQ\",\n          \"members\": [\n            {\n              \"type\": \"STRING\",\n              \"value\": \"[\"\n            },\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_find_pattern_body\"\n            },\n            {\n              \"type\": \"STRING\",\n              \"value\": \"]\"\n            }\n          ]\n        },\n        {\n          \"type\": \"SEQ\",\n          \"members\": [\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"class\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_pattern_constant\"\n              }\n            },\n            {\n              \"type\": \"IMMEDIATE_TOKEN\",\n              \"content\": {\n                \"type\": \"STRING\",\n                \"value\": \"[\"\n              }\n            },\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_find_pattern_body\"\n            },\n            {\n              \"type\": \"STRING\",\n              \"value\": \"]\"\n            }\n          ]\n        },\n        {\n          \"type\": \"SEQ\",\n          \"members\": [\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"class\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_pattern_constant\"\n              }\n            },\n            {\n              \"type\": \"IMMEDIATE_TOKEN\",\n              \"content\": {\n                \"type\": \"STRING\",\n                \"value\": \"(\"\n              }\n            },\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_find_pattern_body\"\n            },\n            {\n              \"type\": \"STRING\",\n              \"value\": \")\"\n            }\n          ]\n        }\n      ]\n    },\n    \"_hash_pattern_body\": {\n      \"type\": \"PREC_RIGHT\",\n      \"value\": 0,\n      \"content\": {\n        \"type\": \"CHOICE\",\n        \"members\": [\n          {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"SEQ\",\n                \"members\": [\n                  {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"keyword_pattern\"\n                  },\n                  {\n                    \"type\": \"REPEAT\",\n                    \"content\": {\n                      \"type\": \"SEQ\",\n                      \"members\": [\n                        {\n                          \"type\": \"STRING\",\n                          \"value\": \",\"\n                        },\n                        {\n                          \"type\": \"SYMBOL\",\n                          \"name\": \"keyword_pattern\"\n                        }\n                      ]\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"CHOICE\",\n                \"members\": [\n                  {\n                    \"type\": \"STRING\",\n                    \"value\": \",\"\n                  },\n                  {\n                    \"type\": \"BLANK\"\n                  }\n                ]\n              }\n            ]\n          },\n          {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"SEQ\",\n                \"members\": [\n                  {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"keyword_pattern\"\n                  },\n                  {\n                    \"type\": \"REPEAT\",\n                    \"content\": {\n                      \"type\": \"SEQ\",\n                      \"members\": [\n                        {\n                          \"type\": \"STRING\",\n                          \"value\": \",\"\n                        },\n                        {\n                          \"type\": \"SYMBOL\",\n                          \"name\": \"keyword_pattern\"\n                        }\n                      ]\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"STRING\",\n                \"value\": \",\"\n              },\n              {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_hash_pattern_any_rest\"\n              }\n            ]\n          },\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_hash_pattern_any_rest\"\n          }\n        ]\n      }\n    },\n    \"keyword_pattern\": {\n      \"type\": \"PREC_RIGHT\",\n      \"value\": -1,\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"key\",\n            \"content\": {\n              \"type\": \"CHOICE\",\n              \"members\": [\n                {\n                  \"type\": \"ALIAS\",\n                  \"content\": {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"identifier\"\n                  },\n                  \"named\": true,\n                  \"value\": \"hash_key_symbol\"\n                },\n                {\n                  \"type\": \"ALIAS\",\n                  \"content\": {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"constant\"\n                  },\n                  \"named\": true,\n                  \"value\": \"hash_key_symbol\"\n                },\n                {\n                  \"type\": \"ALIAS\",\n                  \"content\": {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"identifier_suffix\"\n                  },\n                  \"named\": true,\n                  \"value\": \"hash_key_symbol\"\n                },\n                {\n                  \"type\": \"ALIAS\",\n                  \"content\": {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"constant_suffix\"\n                  },\n                  \"named\": true,\n                  \"value\": \"hash_key_symbol\"\n                },\n                {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"string\"\n                }\n              ]\n            }\n          },\n          {\n            \"type\": \"IMMEDIATE_TOKEN\",\n            \"content\": {\n              \"type\": \"STRING\",\n              \"value\": \":\"\n            }\n          },\n          {\n            \"type\": \"CHOICE\",\n            \"members\": [\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"value\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_pattern_expr\"\n                }\n              },\n              {\n                \"type\": \"BLANK\"\n              }\n            ]\n          }\n        ]\n      }\n    },\n    \"_hash_pattern_any_rest\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"hash_splat_parameter\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"hash_splat_nil\"\n        }\n      ]\n    },\n    \"hash_pattern\": {\n      \"type\": \"PREC_RIGHT\",\n      \"value\": -1,\n      \"content\": {\n        \"type\": \"CHOICE\",\n        \"members\": [\n          {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"STRING\",\n                \"value\": \"{\"\n              },\n              {\n                \"type\": \"CHOICE\",\n                \"members\": [\n                  {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"_hash_pattern_body\"\n                  },\n                  {\n                    \"type\": \"BLANK\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"STRING\",\n                \"value\": \"}\"\n              }\n            ]\n          },\n          {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"class\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_pattern_constant\"\n                }\n              },\n              {\n                \"type\": \"IMMEDIATE_TOKEN\",\n                \"content\": {\n                  \"type\": \"STRING\",\n                  \"value\": \"[\"\n                }\n              },\n              {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_hash_pattern_body\"\n              },\n              {\n                \"type\": \"STRING\",\n                \"value\": \"]\"\n              }\n            ]\n          },\n          {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"class\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_pattern_constant\"\n                }\n              },\n              {\n                \"type\": \"IMMEDIATE_TOKEN\",\n                \"content\": {\n                  \"type\": \"STRING\",\n                  \"value\": \"(\"\n                }\n              },\n              {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_hash_pattern_body\"\n              },\n              {\n                \"type\": \"STRING\",\n                \"value\": \")\"\n              }\n            ]\n          }\n        ]\n      }\n    },\n    \"_pattern_expr_basic\": {\n      \"type\": \"PREC_RIGHT\",\n      \"value\": -1,\n      \"content\": {\n        \"type\": \"CHOICE\",\n        \"members\": [\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_pattern_value\"\n          },\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"identifier\"\n          },\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"array_pattern\"\n          },\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"find_pattern\"\n          },\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"hash_pattern\"\n          },\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"parenthesized_pattern\"\n          }\n        ]\n      }\n    },\n    \"parenthesized_pattern\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"(\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_pattern_expr\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \")\"\n        }\n      ]\n    },\n    \"_pattern_value\": {\n      \"type\": \"PREC_RIGHT\",\n      \"value\": -1,\n      \"content\": {\n        \"type\": \"CHOICE\",\n        \"members\": [\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_pattern_primitive\"\n          },\n          {\n            \"type\": \"ALIAS\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_pattern_range\"\n            },\n            \"named\": true,\n            \"value\": \"range\"\n          },\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"variable_reference_pattern\"\n          },\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"expression_reference_pattern\"\n          },\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_pattern_constant\"\n          }\n        ]\n      }\n    },\n    \"_pattern_range\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SEQ\",\n          \"members\": [\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"begin\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_pattern_primitive\"\n              }\n            },\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"operator\",\n              \"content\": {\n                \"type\": \"CHOICE\",\n                \"members\": [\n                  {\n                    \"type\": \"STRING\",\n                    \"value\": \"..\"\n                  },\n                  {\n                    \"type\": \"STRING\",\n                    \"value\": \"...\"\n                  }\n                ]\n              }\n            },\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"end\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_pattern_primitive\"\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"SEQ\",\n          \"members\": [\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"operator\",\n              \"content\": {\n                \"type\": \"CHOICE\",\n                \"members\": [\n                  {\n                    \"type\": \"STRING\",\n                    \"value\": \"..\"\n                  },\n                  {\n                    \"type\": \"STRING\",\n                    \"value\": \"...\"\n                  }\n                ]\n              }\n            },\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"end\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_pattern_primitive\"\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"SEQ\",\n          \"members\": [\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"begin\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_pattern_primitive\"\n              }\n            },\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"operator\",\n              \"content\": {\n                \"type\": \"CHOICE\",\n                \"members\": [\n                  {\n                    \"type\": \"STRING\",\n                    \"value\": \"..\"\n                  },\n                  {\n                    \"type\": \"STRING\",\n                    \"value\": \"...\"\n                  }\n                ]\n              }\n            }\n          ]\n        }\n      ]\n    },\n    \"_pattern_primitive\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_pattern_literal\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_pattern_lambda\"\n        }\n      ]\n    },\n    \"_pattern_lambda\": {\n      \"type\": \"PREC_RIGHT\",\n      \"value\": -1,\n      \"content\": {\n        \"type\": \"SYMBOL\",\n        \"name\": \"lambda\"\n      }\n    },\n    \"_pattern_literal\": {\n      \"type\": \"PREC_RIGHT\",\n      \"value\": -1,\n      \"content\": {\n        \"type\": \"CHOICE\",\n        \"members\": [\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_literal\"\n          },\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"string\"\n          },\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"subshell\"\n          },\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"heredoc_beginning\"\n          },\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"regex\"\n          },\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"string_array\"\n          },\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"symbol_array\"\n          },\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_keyword_variable\"\n          }\n        ]\n      }\n    },\n    \"_keyword_variable\": {\n      \"type\": \"PREC_RIGHT\",\n      \"value\": -1,\n      \"content\": {\n        \"type\": \"CHOICE\",\n        \"members\": [\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"nil\"\n          },\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"self\"\n          },\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"true\"\n          },\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"false\"\n          },\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"line\"\n          },\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"file\"\n          },\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"encoding\"\n          }\n        ]\n      }\n    },\n    \"line\": {\n      \"type\": \"STRING\",\n      \"value\": \"__LINE__\"\n    },\n    \"file\": {\n      \"type\": \"STRING\",\n      \"value\": \"__FILE__\"\n    },\n    \"encoding\": {\n      \"type\": \"STRING\",\n      \"value\": \"__ENCODING__\"\n    },\n    \"variable_reference_pattern\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"^\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"name\",\n          \"content\": {\n            \"type\": \"CHOICE\",\n            \"members\": [\n              {\n                \"type\": \"SYMBOL\",\n                \"name\": \"identifier\"\n              },\n              {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_nonlocal_variable\"\n              }\n            ]\n          }\n        }\n      ]\n    },\n    \"expression_reference_pattern\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"^\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"(\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"value\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_expression\"\n          }\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \")\"\n        }\n      ]\n    },\n    \"_pattern_constant\": {\n      \"type\": \"PREC_RIGHT\",\n      \"value\": -1,\n      \"content\": {\n        \"type\": \"CHOICE\",\n        \"members\": [\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"constant\"\n          },\n          {\n            \"type\": \"ALIAS\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_pattern_constant_resolution\"\n            },\n            \"named\": true,\n            \"value\": \"scope_resolution\"\n          }\n        ]\n      }\n    },\n    \"_pattern_constant_resolution\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"scope\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_pattern_constant\"\n              }\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"::\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"name\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"constant\"\n          }\n        }\n      ]\n    },\n    \"if\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"if\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"condition\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_statement\"\n          }\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_terminator\"\n            },\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"consequence\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"then\"\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"alternative\",\n          \"content\": {\n            \"type\": \"CHOICE\",\n            \"members\": [\n              {\n                \"type\": \"CHOICE\",\n                \"members\": [\n                  {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"else\"\n                  },\n                  {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"elsif\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"BLANK\"\n              }\n            ]\n          }\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"end\"\n        }\n      ]\n    },\n    \"unless\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"unless\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"condition\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_statement\"\n          }\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_terminator\"\n            },\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"consequence\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"then\"\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"alternative\",\n          \"content\": {\n            \"type\": \"CHOICE\",\n            \"members\": [\n              {\n                \"type\": \"CHOICE\",\n                \"members\": [\n                  {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"else\"\n                  },\n                  {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"elsif\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"BLANK\"\n              }\n            ]\n          }\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"end\"\n        }\n      ]\n    },\n    \"elsif\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"elsif\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"condition\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_statement\"\n          }\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_terminator\"\n            },\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"consequence\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"then\"\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"alternative\",\n          \"content\": {\n            \"type\": \"CHOICE\",\n            \"members\": [\n              {\n                \"type\": \"CHOICE\",\n                \"members\": [\n                  {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"else\"\n                  },\n                  {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"elsif\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"BLANK\"\n              }\n            ]\n          }\n        }\n      ]\n    },\n    \"else\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"else\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_terminator\"\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_statements\"\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        }\n      ]\n    },\n    \"then\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SEQ\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_terminator\"\n            },\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_statements\"\n            }\n          ]\n        },\n        {\n          \"type\": \"SEQ\",\n          \"members\": [\n            {\n              \"type\": \"CHOICE\",\n              \"members\": [\n                {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_terminator\"\n                },\n                {\n                  \"type\": \"BLANK\"\n                }\n              ]\n            },\n            {\n              \"type\": \"STRING\",\n              \"value\": \"then\"\n            },\n            {\n              \"type\": \"CHOICE\",\n              \"members\": [\n                {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_statements\"\n                },\n                {\n                  \"type\": \"BLANK\"\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    \"begin\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"begin\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_terminator\"\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_body_statement\"\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"end\"\n        }\n      ]\n    },\n    \"ensure\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"ensure\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_statements\"\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        }\n      ]\n    },\n    \"rescue\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"rescue\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"exceptions\",\n          \"content\": {\n            \"type\": \"CHOICE\",\n            \"members\": [\n              {\n                \"type\": \"SYMBOL\",\n                \"name\": \"exceptions\"\n              },\n              {\n                \"type\": \"BLANK\"\n              }\n            ]\n          }\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"variable\",\n          \"content\": {\n            \"type\": \"CHOICE\",\n            \"members\": [\n              {\n                \"type\": \"SYMBOL\",\n                \"name\": \"exception_variable\"\n              },\n              {\n                \"type\": \"BLANK\"\n              }\n            ]\n          }\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_terminator\"\n            },\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"body\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"then\"\n              }\n            }\n          ]\n        }\n      ]\n    },\n    \"exceptions\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_arg\"\n            },\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"splat_argument\"\n            }\n          ]\n        },\n        {\n          \"type\": \"REPEAT\",\n          \"content\": {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"STRING\",\n                \"value\": \",\"\n              },\n              {\n                \"type\": \"CHOICE\",\n                \"members\": [\n                  {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"_arg\"\n                  },\n                  {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"splat_argument\"\n                  }\n                ]\n              }\n            ]\n          }\n        }\n      ]\n    },\n    \"exception_variable\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"=>\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_lhs\"\n        }\n      ]\n    },\n    \"body_statement\": {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_body_statement\"\n    },\n    \"_body_statement\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SEQ\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_statements\"\n            },\n            {\n              \"type\": \"REPEAT\",\n              \"content\": {\n                \"type\": \"CHOICE\",\n                \"members\": [\n                  {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"rescue\"\n                  },\n                  {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"else\"\n                  },\n                  {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"ensure\"\n                  }\n                ]\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"SEQ\",\n          \"members\": [\n            {\n              \"type\": \"CHOICE\",\n              \"members\": [\n                {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_statements\"\n                },\n                {\n                  \"type\": \"BLANK\"\n                }\n              ]\n            },\n            {\n              \"type\": \"REPEAT1\",\n              \"content\": {\n                \"type\": \"CHOICE\",\n                \"members\": [\n                  {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"rescue\"\n                  },\n                  {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"else\"\n                  },\n                  {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"ensure\"\n                  }\n                ]\n              }\n            }\n          ]\n        }\n      ]\n    },\n    \"_expression\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"command_binary\"\n          },\n          \"named\": true,\n          \"value\": \"binary\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"command_unary\"\n          },\n          \"named\": true,\n          \"value\": \"unary\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"command_assignment\"\n          },\n          \"named\": true,\n          \"value\": \"assignment\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"command_operator_assignment\"\n          },\n          \"named\": true,\n          \"value\": \"operator_assignment\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"command_call\"\n          },\n          \"named\": true,\n          \"value\": \"call\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"command_call_with_block\"\n          },\n          \"named\": true,\n          \"value\": \"call\"\n        },\n        {\n          \"type\": \"PREC_LEFT\",\n          \"value\": 0,\n          \"content\": {\n            \"type\": \"ALIAS\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_chained_command_call\"\n            },\n            \"named\": true,\n            \"value\": \"call\"\n          }\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"return_command\"\n          },\n          \"named\": true,\n          \"value\": \"return\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"yield_command\"\n          },\n          \"named\": true,\n          \"value\": \"yield\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"break_command\"\n          },\n          \"named\": true,\n          \"value\": \"break\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"next_command\"\n          },\n          \"named\": true,\n          \"value\": \"next\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"match_pattern\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"test_pattern\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_arg\"\n        }\n      ]\n    },\n    \"match_pattern\": {\n      \"type\": \"PREC\",\n      \"value\": 100,\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"value\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_arg\"\n            }\n          },\n          {\n            \"type\": \"STRING\",\n            \"value\": \"=>\"\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"pattern\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_pattern_top_expr_body\"\n            }\n          }\n        ]\n      }\n    },\n    \"test_pattern\": {\n      \"type\": \"PREC\",\n      \"value\": 100,\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"value\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_arg\"\n            }\n          },\n          {\n            \"type\": \"STRING\",\n            \"value\": \"in\"\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"pattern\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_pattern_top_expr_body\"\n            }\n          }\n        ]\n      }\n    },\n    \"_arg\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_unary_minus_pow\"\n          },\n          \"named\": true,\n          \"value\": \"unary\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_primary\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"assignment\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"operator_assignment\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"conditional\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"range\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"binary\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"unary\"\n        }\n      ]\n    },\n    \"_unary_minus_pow\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"operator\",\n          \"content\": {\n            \"type\": \"ALIAS\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_unary_minus_num\"\n            },\n            \"named\": false,\n            \"value\": \"-\"\n          }\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"operand\",\n          \"content\": {\n            \"type\": \"ALIAS\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_pow\"\n            },\n            \"named\": true,\n            \"value\": \"binary\"\n          }\n        }\n      ]\n    },\n    \"_pow\": {\n      \"type\": \"PREC_RIGHT\",\n      \"value\": 80,\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"left\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_simple_numeric\"\n            }\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"operator\",\n            \"content\": {\n              \"type\": \"ALIAS\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_binary_star_star\"\n              },\n              \"named\": false,\n              \"value\": \"**\"\n            }\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"right\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_arg\"\n            }\n          }\n        ]\n      }\n    },\n    \"_primary\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"parenthesized_statements\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_lhs\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_function_identifier_call\"\n          },\n          \"named\": true,\n          \"value\": \"call\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"call\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"array\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"string_array\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"symbol_array\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"hash\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"subshell\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_literal\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"string\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"character\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"chained_string\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"regex\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"lambda\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"method\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"singleton_method\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"class\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"singleton_class\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"module\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"begin\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"while\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"until\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"if\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"unless\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"for\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"case\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"case_match\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"return\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"yield\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"break\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"next\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"redo\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"retry\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"parenthesized_unary\"\n          },\n          \"named\": true,\n          \"value\": \"unary\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"heredoc_beginning\"\n        }\n      ]\n    },\n    \"parenthesized_statements\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"(\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_statements\"\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \")\"\n        }\n      ]\n    },\n    \"element_reference\": {\n      \"type\": \"PREC_LEFT\",\n      \"value\": 1,\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"object\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_primary\"\n            }\n          },\n          {\n            \"type\": \"ALIAS\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_element_reference_bracket\"\n            },\n            \"named\": false,\n            \"value\": \"[\"\n          },\n          {\n            \"type\": \"CHOICE\",\n            \"members\": [\n              {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_argument_list_with_trailing_comma\"\n              },\n              {\n                \"type\": \"BLANK\"\n              }\n            ]\n          },\n          {\n            \"type\": \"STRING\",\n            \"value\": \"]\"\n          },\n          {\n            \"type\": \"CHOICE\",\n            \"members\": [\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"block\",\n                \"content\": {\n                  \"type\": \"CHOICE\",\n                  \"members\": [\n                    {\n                      \"type\": \"SYMBOL\",\n                      \"name\": \"block\"\n                    },\n                    {\n                      \"type\": \"SYMBOL\",\n                      \"name\": \"do_block\"\n                    }\n                  ]\n                }\n              },\n              {\n                \"type\": \"BLANK\"\n              }\n            ]\n          }\n        ]\n      }\n    },\n    \"scope_resolution\": {\n      \"type\": \"PREC_LEFT\",\n      \"value\": 57,\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"CHOICE\",\n            \"members\": [\n              {\n                \"type\": \"STRING\",\n                \"value\": \"::\"\n              },\n              {\n                \"type\": \"SEQ\",\n                \"members\": [\n                  {\n                    \"type\": \"FIELD\",\n                    \"name\": \"scope\",\n                    \"content\": {\n                      \"type\": \"SYMBOL\",\n                      \"name\": \"_primary\"\n                    }\n                  },\n                  {\n                    \"type\": \"IMMEDIATE_TOKEN\",\n                    \"content\": {\n                      \"type\": \"STRING\",\n                      \"value\": \"::\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"name\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"constant\"\n            }\n          }\n        ]\n      }\n    },\n    \"_call_operator\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \".\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"&.\"\n        },\n        {\n          \"type\": \"IMMEDIATE_TOKEN\",\n          \"content\": {\n            \"type\": \"STRING\",\n            \"value\": \"::\"\n          }\n        }\n      ]\n    },\n    \"_call\": {\n      \"type\": \"PREC_LEFT\",\n      \"value\": 56,\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"receiver\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_primary\"\n            }\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"operator\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_call_operator\"\n            }\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"method\",\n            \"content\": {\n              \"type\": \"CHOICE\",\n              \"members\": [\n                {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"identifier\"\n                },\n                {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"operator\"\n                },\n                {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"constant\"\n                },\n                {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_function_identifier\"\n                }\n              ]\n            }\n          }\n        ]\n      }\n    },\n    \"command_call\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_call\"\n            },\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_chained_command_call\"\n            },\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"method\",\n              \"content\": {\n                \"type\": \"CHOICE\",\n                \"members\": [\n                  {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"_variable\"\n                  },\n                  {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"_function_identifier\"\n                  }\n                ]\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"arguments\",\n          \"content\": {\n            \"type\": \"ALIAS\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"command_argument_list\"\n            },\n            \"named\": true,\n            \"value\": \"argument_list\"\n          }\n        }\n      ]\n    },\n    \"command_call_with_block\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SEQ\",\n          \"members\": [\n            {\n              \"type\": \"CHOICE\",\n              \"members\": [\n                {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_call\"\n                },\n                {\n                  \"type\": \"FIELD\",\n                  \"name\": \"method\",\n                  \"content\": {\n                    \"type\": \"CHOICE\",\n                    \"members\": [\n                      {\n                        \"type\": \"SYMBOL\",\n                        \"name\": \"_variable\"\n                      },\n                      {\n                        \"type\": \"SYMBOL\",\n                        \"name\": \"_function_identifier\"\n                      }\n                    ]\n                  }\n                }\n              ]\n            },\n            {\n              \"type\": \"PREC\",\n              \"value\": 1,\n              \"content\": {\n                \"type\": \"SEQ\",\n                \"members\": [\n                  {\n                    \"type\": \"FIELD\",\n                    \"name\": \"arguments\",\n                    \"content\": {\n                      \"type\": \"ALIAS\",\n                      \"content\": {\n                        \"type\": \"SYMBOL\",\n                        \"name\": \"command_argument_list\"\n                      },\n                      \"named\": true,\n                      \"value\": \"argument_list\"\n                    }\n                  },\n                  {\n                    \"type\": \"FIELD\",\n                    \"name\": \"block\",\n                    \"content\": {\n                      \"type\": \"SYMBOL\",\n                      \"name\": \"block\"\n                    }\n                  }\n                ]\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"SEQ\",\n          \"members\": [\n            {\n              \"type\": \"CHOICE\",\n              \"members\": [\n                {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_call\"\n                },\n                {\n                  \"type\": \"FIELD\",\n                  \"name\": \"method\",\n                  \"content\": {\n                    \"type\": \"CHOICE\",\n                    \"members\": [\n                      {\n                        \"type\": \"SYMBOL\",\n                        \"name\": \"_variable\"\n                      },\n                      {\n                        \"type\": \"SYMBOL\",\n                        \"name\": \"_function_identifier\"\n                      }\n                    ]\n                  }\n                }\n              ]\n            },\n            {\n              \"type\": \"PREC\",\n              \"value\": -1,\n              \"content\": {\n                \"type\": \"SEQ\",\n                \"members\": [\n                  {\n                    \"type\": \"FIELD\",\n                    \"name\": \"arguments\",\n                    \"content\": {\n                      \"type\": \"ALIAS\",\n                      \"content\": {\n                        \"type\": \"SYMBOL\",\n                        \"name\": \"command_argument_list\"\n                      },\n                      \"named\": true,\n                      \"value\": \"argument_list\"\n                    }\n                  },\n                  {\n                    \"type\": \"FIELD\",\n                    \"name\": \"block\",\n                    \"content\": {\n                      \"type\": \"SYMBOL\",\n                      \"name\": \"do_block\"\n                    }\n                  }\n                ]\n              }\n            }\n          ]\n        }\n      ]\n    },\n    \"_chained_command_call\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"receiver\",\n          \"content\": {\n            \"type\": \"ALIAS\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"command_call_with_block\"\n            },\n            \"named\": true,\n            \"value\": \"call\"\n          }\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"operator\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_call_operator\"\n          }\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"method\",\n          \"content\": {\n            \"type\": \"CHOICE\",\n            \"members\": [\n              {\n                \"type\": \"SYMBOL\",\n                \"name\": \"identifier\"\n              },\n              {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_function_identifier\"\n              },\n              {\n                \"type\": \"SYMBOL\",\n                \"name\": \"operator\"\n              },\n              {\n                \"type\": \"SYMBOL\",\n                \"name\": \"constant\"\n              }\n            ]\n          }\n        }\n      ]\n    },\n    \"call\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SEQ\",\n          \"members\": [\n            {\n              \"type\": \"CHOICE\",\n              \"members\": [\n                {\n                  \"type\": \"CHOICE\",\n                  \"members\": [\n                    {\n                      \"type\": \"SYMBOL\",\n                      \"name\": \"_call\"\n                    },\n                    {\n                      \"type\": \"FIELD\",\n                      \"name\": \"method\",\n                      \"content\": {\n                        \"type\": \"CHOICE\",\n                        \"members\": [\n                          {\n                            \"type\": \"SYMBOL\",\n                            \"name\": \"_variable\"\n                          },\n                          {\n                            \"type\": \"SYMBOL\",\n                            \"name\": \"_function_identifier\"\n                          }\n                        ]\n                      }\n                    }\n                  ]\n                },\n                {\n                  \"type\": \"PREC_LEFT\",\n                  \"value\": 56,\n                  \"content\": {\n                    \"type\": \"SEQ\",\n                    \"members\": [\n                      {\n                        \"type\": \"FIELD\",\n                        \"name\": \"receiver\",\n                        \"content\": {\n                          \"type\": \"SYMBOL\",\n                          \"name\": \"_primary\"\n                        }\n                      },\n                      {\n                        \"type\": \"FIELD\",\n                        \"name\": \"operator\",\n                        \"content\": {\n                          \"type\": \"SYMBOL\",\n                          \"name\": \"_call_operator\"\n                        }\n                      }\n                    ]\n                  }\n                }\n              ]\n            },\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"arguments\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"argument_list\"\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"PREC\",\n          \"value\": 1,\n          \"content\": {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"SEQ\",\n                \"members\": [\n                  {\n                    \"type\": \"CHOICE\",\n                    \"members\": [\n                      {\n                        \"type\": \"CHOICE\",\n                        \"members\": [\n                          {\n                            \"type\": \"SYMBOL\",\n                            \"name\": \"_call\"\n                          },\n                          {\n                            \"type\": \"FIELD\",\n                            \"name\": \"method\",\n                            \"content\": {\n                              \"type\": \"CHOICE\",\n                              \"members\": [\n                                {\n                                  \"type\": \"SYMBOL\",\n                                  \"name\": \"_variable\"\n                                },\n                                {\n                                  \"type\": \"SYMBOL\",\n                                  \"name\": \"_function_identifier\"\n                                }\n                              ]\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"PREC_LEFT\",\n                        \"value\": 56,\n                        \"content\": {\n                          \"type\": \"SEQ\",\n                          \"members\": [\n                            {\n                              \"type\": \"FIELD\",\n                              \"name\": \"receiver\",\n                              \"content\": {\n                                \"type\": \"SYMBOL\",\n                                \"name\": \"_primary\"\n                              }\n                            },\n                            {\n                              \"type\": \"FIELD\",\n                              \"name\": \"operator\",\n                              \"content\": {\n                                \"type\": \"SYMBOL\",\n                                \"name\": \"_call_operator\"\n                              }\n                            }\n                          ]\n                        }\n                      }\n                    ]\n                  },\n                  {\n                    \"type\": \"FIELD\",\n                    \"name\": \"arguments\",\n                    \"content\": {\n                      \"type\": \"SYMBOL\",\n                      \"name\": \"argument_list\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"block\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"block\"\n                }\n              }\n            ]\n          }\n        },\n        {\n          \"type\": \"PREC\",\n          \"value\": -1,\n          \"content\": {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"SEQ\",\n                \"members\": [\n                  {\n                    \"type\": \"CHOICE\",\n                    \"members\": [\n                      {\n                        \"type\": \"CHOICE\",\n                        \"members\": [\n                          {\n                            \"type\": \"SYMBOL\",\n                            \"name\": \"_call\"\n                          },\n                          {\n                            \"type\": \"FIELD\",\n                            \"name\": \"method\",\n                            \"content\": {\n                              \"type\": \"CHOICE\",\n                              \"members\": [\n                                {\n                                  \"type\": \"SYMBOL\",\n                                  \"name\": \"_variable\"\n                                },\n                                {\n                                  \"type\": \"SYMBOL\",\n                                  \"name\": \"_function_identifier\"\n                                }\n                              ]\n                            }\n                          }\n                        ]\n                      },\n                      {\n                        \"type\": \"PREC_LEFT\",\n                        \"value\": 56,\n                        \"content\": {\n                          \"type\": \"SEQ\",\n                          \"members\": [\n                            {\n                              \"type\": \"FIELD\",\n                              \"name\": \"receiver\",\n                              \"content\": {\n                                \"type\": \"SYMBOL\",\n                                \"name\": \"_primary\"\n                              }\n                            },\n                            {\n                              \"type\": \"FIELD\",\n                              \"name\": \"operator\",\n                              \"content\": {\n                                \"type\": \"SYMBOL\",\n                                \"name\": \"_call_operator\"\n                              }\n                            }\n                          ]\n                        }\n                      }\n                    ]\n                  },\n                  {\n                    \"type\": \"FIELD\",\n                    \"name\": \"arguments\",\n                    \"content\": {\n                      \"type\": \"SYMBOL\",\n                      \"name\": \"argument_list\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"block\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"do_block\"\n                }\n              }\n            ]\n          }\n        },\n        {\n          \"type\": \"PREC\",\n          \"value\": 1,\n          \"content\": {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"CHOICE\",\n                \"members\": [\n                  {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"_call\"\n                  },\n                  {\n                    \"type\": \"FIELD\",\n                    \"name\": \"method\",\n                    \"content\": {\n                      \"type\": \"CHOICE\",\n                      \"members\": [\n                        {\n                          \"type\": \"SYMBOL\",\n                          \"name\": \"_variable\"\n                        },\n                        {\n                          \"type\": \"SYMBOL\",\n                          \"name\": \"_function_identifier\"\n                        }\n                      ]\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"block\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"block\"\n                }\n              }\n            ]\n          }\n        },\n        {\n          \"type\": \"PREC\",\n          \"value\": -1,\n          \"content\": {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"CHOICE\",\n                \"members\": [\n                  {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"_call\"\n                  },\n                  {\n                    \"type\": \"FIELD\",\n                    \"name\": \"method\",\n                    \"content\": {\n                      \"type\": \"CHOICE\",\n                      \"members\": [\n                        {\n                          \"type\": \"SYMBOL\",\n                          \"name\": \"_variable\"\n                        },\n                        {\n                          \"type\": \"SYMBOL\",\n                          \"name\": \"_function_identifier\"\n                        }\n                      ]\n                    }\n                  }\n                ]\n              },\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"block\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"do_block\"\n                }\n              }\n            ]\n          }\n        }\n      ]\n    },\n    \"command_argument_list\": {\n      \"type\": \"PREC_RIGHT\",\n      \"value\": 0,\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_argument\"\n          },\n          {\n            \"type\": \"REPEAT\",\n            \"content\": {\n              \"type\": \"SEQ\",\n              \"members\": [\n                {\n                  \"type\": \"STRING\",\n                  \"value\": \",\"\n                },\n                {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_argument\"\n                }\n              ]\n            }\n          }\n        ]\n      }\n    },\n    \"argument_list\": {\n      \"type\": \"PREC_RIGHT\",\n      \"value\": 0,\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"IMMEDIATE_TOKEN\",\n            \"content\": {\n              \"type\": \"STRING\",\n              \"value\": \"(\"\n            }\n          },\n          {\n            \"type\": \"CHOICE\",\n            \"members\": [\n              {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_argument_list_with_trailing_comma\"\n              },\n              {\n                \"type\": \"BLANK\"\n              }\n            ]\n          },\n          {\n            \"type\": \"STRING\",\n            \"value\": \")\"\n          }\n        ]\n      }\n    },\n    \"_argument_list_with_trailing_comma\": {\n      \"type\": \"PREC_RIGHT\",\n      \"value\": 0,\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_argument\"\n              },\n              {\n                \"type\": \"REPEAT\",\n                \"content\": {\n                  \"type\": \"SEQ\",\n                  \"members\": [\n                    {\n                      \"type\": \"STRING\",\n                      \"value\": \",\"\n                    },\n                    {\n                      \"type\": \"SYMBOL\",\n                      \"name\": \"_argument\"\n                    }\n                  ]\n                }\n              }\n            ]\n          },\n          {\n            \"type\": \"CHOICE\",\n            \"members\": [\n              {\n                \"type\": \"STRING\",\n                \"value\": \",\"\n              },\n              {\n                \"type\": \"BLANK\"\n              }\n            ]\n          }\n        ]\n      }\n    },\n    \"_argument\": {\n      \"type\": \"PREC_LEFT\",\n      \"value\": 0,\n      \"content\": {\n        \"type\": \"CHOICE\",\n        \"members\": [\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_expression\"\n          },\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"splat_argument\"\n          },\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"hash_splat_argument\"\n          },\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"forward_argument\"\n          },\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"block_argument\"\n          },\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"pair\"\n          }\n        ]\n      }\n    },\n    \"forward_argument\": {\n      \"type\": \"STRING\",\n      \"value\": \"...\"\n    },\n    \"splat_argument\": {\n      \"type\": \"PREC_RIGHT\",\n      \"value\": 0,\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"ALIAS\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_splat_star\"\n            },\n            \"named\": false,\n            \"value\": \"*\"\n          },\n          {\n            \"type\": \"CHOICE\",\n            \"members\": [\n              {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_arg\"\n              },\n              {\n                \"type\": \"BLANK\"\n              }\n            ]\n          }\n        ]\n      }\n    },\n    \"hash_splat_argument\": {\n      \"type\": \"PREC_RIGHT\",\n      \"value\": 0,\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"ALIAS\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_hash_splat_star_star\"\n            },\n            \"named\": false,\n            \"value\": \"**\"\n          },\n          {\n            \"type\": \"CHOICE\",\n            \"members\": [\n              {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_arg\"\n              },\n              {\n                \"type\": \"BLANK\"\n              }\n            ]\n          }\n        ]\n      }\n    },\n    \"block_argument\": {\n      \"type\": \"PREC_RIGHT\",\n      \"value\": 0,\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"ALIAS\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_block_ampersand\"\n            },\n            \"named\": false,\n            \"value\": \"&\"\n          },\n          {\n            \"type\": \"CHOICE\",\n            \"members\": [\n              {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_arg\"\n              },\n              {\n                \"type\": \"BLANK\"\n              }\n            ]\n          }\n        ]\n      }\n    },\n    \"do_block\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"do\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_terminator\"\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SEQ\",\n              \"members\": [\n                {\n                  \"type\": \"FIELD\",\n                  \"name\": \"parameters\",\n                  \"content\": {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"block_parameters\"\n                  }\n                },\n                {\n                  \"type\": \"CHOICE\",\n                  \"members\": [\n                    {\n                      \"type\": \"SYMBOL\",\n                      \"name\": \"_terminator\"\n                    },\n                    {\n                      \"type\": \"BLANK\"\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"FIELD\",\n              \"name\": \"body\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"body_statement\"\n              }\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"end\"\n        }\n      ]\n    },\n    \"block\": {\n      \"type\": \"PREC\",\n      \"value\": 1,\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"STRING\",\n            \"value\": \"{\"\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"parameters\",\n            \"content\": {\n              \"type\": \"CHOICE\",\n              \"members\": [\n                {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"block_parameters\"\n                },\n                {\n                  \"type\": \"BLANK\"\n                }\n              ]\n            }\n          },\n          {\n            \"type\": \"CHOICE\",\n            \"members\": [\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"body\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"block_body\"\n                }\n              },\n              {\n                \"type\": \"BLANK\"\n              }\n            ]\n          },\n          {\n            \"type\": \"STRING\",\n            \"value\": \"}\"\n          }\n        ]\n      }\n    },\n    \"_arg_rhs\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_arg\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"rescue_modifier_arg\"\n          },\n          \"named\": true,\n          \"value\": \"rescue_modifier\"\n        }\n      ]\n    },\n    \"assignment\": {\n      \"type\": \"PREC_RIGHT\",\n      \"value\": 15,\n      \"content\": {\n        \"type\": \"CHOICE\",\n        \"members\": [\n          {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"left\",\n                \"content\": {\n                  \"type\": \"CHOICE\",\n                  \"members\": [\n                    {\n                      \"type\": \"SYMBOL\",\n                      \"name\": \"_lhs\"\n                    },\n                    {\n                      \"type\": \"SYMBOL\",\n                      \"name\": \"left_assignment_list\"\n                    }\n                  ]\n                }\n              },\n              {\n                \"type\": \"STRING\",\n                \"value\": \"=\"\n              },\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"right\",\n                \"content\": {\n                  \"type\": \"CHOICE\",\n                  \"members\": [\n                    {\n                      \"type\": \"SYMBOL\",\n                      \"name\": \"_arg_rhs\"\n                    },\n                    {\n                      \"type\": \"SYMBOL\",\n                      \"name\": \"splat_argument\"\n                    },\n                    {\n                      \"type\": \"SYMBOL\",\n                      \"name\": \"right_assignment_list\"\n                    }\n                  ]\n                }\n              }\n            ]\n          }\n        ]\n      }\n    },\n    \"command_assignment\": {\n      \"type\": \"PREC_RIGHT\",\n      \"value\": 15,\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"left\",\n            \"content\": {\n              \"type\": \"CHOICE\",\n              \"members\": [\n                {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_lhs\"\n                },\n                {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"left_assignment_list\"\n                }\n              ]\n            }\n          },\n          {\n            \"type\": \"STRING\",\n            \"value\": \"=\"\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"right\",\n            \"content\": {\n              \"type\": \"CHOICE\",\n              \"members\": [\n                {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_expression\"\n                },\n                {\n                  \"type\": \"ALIAS\",\n                  \"content\": {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"rescue_modifier_expression\"\n                  },\n                  \"named\": true,\n                  \"value\": \"rescue_modifier\"\n                }\n              ]\n            }\n          }\n        ]\n      }\n    },\n    \"operator_assignment\": {\n      \"type\": \"PREC_RIGHT\",\n      \"value\": 15,\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"left\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_lhs\"\n            }\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"operator\",\n            \"content\": {\n              \"type\": \"CHOICE\",\n              \"members\": [\n                {\n                  \"type\": \"STRING\",\n                  \"value\": \"+=\"\n                },\n                {\n                  \"type\": \"STRING\",\n                  \"value\": \"-=\"\n                },\n                {\n                  \"type\": \"STRING\",\n                  \"value\": \"*=\"\n                },\n                {\n                  \"type\": \"STRING\",\n                  \"value\": \"**=\"\n                },\n                {\n                  \"type\": \"STRING\",\n                  \"value\": \"/=\"\n                },\n                {\n                  \"type\": \"STRING\",\n                  \"value\": \"||=\"\n                },\n                {\n                  \"type\": \"STRING\",\n                  \"value\": \"|=\"\n                },\n                {\n                  \"type\": \"STRING\",\n                  \"value\": \"&&=\"\n                },\n                {\n                  \"type\": \"STRING\",\n                  \"value\": \"&=\"\n                },\n                {\n                  \"type\": \"STRING\",\n                  \"value\": \"%=\"\n                },\n                {\n                  \"type\": \"STRING\",\n                  \"value\": \">>=\"\n                },\n                {\n                  \"type\": \"STRING\",\n                  \"value\": \"<<=\"\n                },\n                {\n                  \"type\": \"STRING\",\n                  \"value\": \"^=\"\n                }\n              ]\n            }\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"right\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_arg_rhs\"\n            }\n          }\n        ]\n      }\n    },\n    \"command_operator_assignment\": {\n      \"type\": \"PREC_RIGHT\",\n      \"value\": 15,\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"left\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_lhs\"\n            }\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"operator\",\n            \"content\": {\n              \"type\": \"CHOICE\",\n              \"members\": [\n                {\n                  \"type\": \"STRING\",\n                  \"value\": \"+=\"\n                },\n                {\n                  \"type\": \"STRING\",\n                  \"value\": \"-=\"\n                },\n                {\n                  \"type\": \"STRING\",\n                  \"value\": \"*=\"\n                },\n                {\n                  \"type\": \"STRING\",\n                  \"value\": \"**=\"\n                },\n                {\n                  \"type\": \"STRING\",\n                  \"value\": \"/=\"\n                },\n                {\n                  \"type\": \"STRING\",\n                  \"value\": \"||=\"\n                },\n                {\n                  \"type\": \"STRING\",\n                  \"value\": \"|=\"\n                },\n                {\n                  \"type\": \"STRING\",\n                  \"value\": \"&&=\"\n                },\n                {\n                  \"type\": \"STRING\",\n                  \"value\": \"&=\"\n                },\n                {\n                  \"type\": \"STRING\",\n                  \"value\": \"%=\"\n                },\n                {\n                  \"type\": \"STRING\",\n                  \"value\": \">>=\"\n                },\n                {\n                  \"type\": \"STRING\",\n                  \"value\": \"<<=\"\n                },\n                {\n                  \"type\": \"STRING\",\n                  \"value\": \"^=\"\n                }\n              ]\n            }\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"right\",\n            \"content\": {\n              \"type\": \"CHOICE\",\n              \"members\": [\n                {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_expression\"\n                },\n                {\n                  \"type\": \"ALIAS\",\n                  \"content\": {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"rescue_modifier_expression\"\n                  },\n                  \"named\": true,\n                  \"value\": \"rescue_modifier\"\n                }\n              ]\n            }\n          }\n        ]\n      }\n    },\n    \"conditional\": {\n      \"type\": \"PREC_RIGHT\",\n      \"value\": 20,\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"condition\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_arg\"\n            }\n          },\n          {\n            \"type\": \"STRING\",\n            \"value\": \"?\"\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"consequence\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_arg\"\n            }\n          },\n          {\n            \"type\": \"STRING\",\n            \"value\": \":\"\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"alternative\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_arg\"\n            }\n          }\n        ]\n      }\n    },\n    \"range\": {\n      \"type\": \"PREC_RIGHT\",\n      \"value\": 25,\n      \"content\": {\n        \"type\": \"CHOICE\",\n        \"members\": [\n          {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"begin\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_arg\"\n                }\n              },\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"operator\",\n                \"content\": {\n                  \"type\": \"CHOICE\",\n                  \"members\": [\n                    {\n                      \"type\": \"STRING\",\n                      \"value\": \"..\"\n                    },\n                    {\n                      \"type\": \"STRING\",\n                      \"value\": \"...\"\n                    }\n                  ]\n                }\n              },\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"end\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_arg\"\n                }\n              }\n            ]\n          },\n          {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"operator\",\n                \"content\": {\n                  \"type\": \"CHOICE\",\n                  \"members\": [\n                    {\n                      \"type\": \"STRING\",\n                      \"value\": \"..\"\n                    },\n                    {\n                      \"type\": \"STRING\",\n                      \"value\": \"...\"\n                    }\n                  ]\n                }\n              },\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"end\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_arg\"\n                }\n              }\n            ]\n          },\n          {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"begin\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_arg\"\n                }\n              },\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"operator\",\n                \"content\": {\n                  \"type\": \"CHOICE\",\n                  \"members\": [\n                    {\n                      \"type\": \"STRING\",\n                      \"value\": \"..\"\n                    },\n                    {\n                      \"type\": \"STRING\",\n                      \"value\": \"...\"\n                    }\n                  ]\n                }\n              }\n            ]\n          }\n        ]\n      }\n    },\n    \"binary\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"PREC_LEFT\",\n          \"value\": -2,\n          \"content\": {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"left\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_arg\"\n                }\n              },\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"operator\",\n                \"content\": {\n                  \"type\": \"STRING\",\n                  \"value\": \"and\"\n                }\n              },\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"right\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_arg\"\n                }\n              }\n            ]\n          }\n        },\n        {\n          \"type\": \"PREC_LEFT\",\n          \"value\": -2,\n          \"content\": {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"left\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_arg\"\n                }\n              },\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"operator\",\n                \"content\": {\n                  \"type\": \"STRING\",\n                  \"value\": \"or\"\n                }\n              },\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"right\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_arg\"\n                }\n              }\n            ]\n          }\n        },\n        {\n          \"type\": \"PREC_LEFT\",\n          \"value\": 30,\n          \"content\": {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"left\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_arg\"\n                }\n              },\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"operator\",\n                \"content\": {\n                  \"type\": \"STRING\",\n                  \"value\": \"||\"\n                }\n              },\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"right\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_arg\"\n                }\n              }\n            ]\n          }\n        },\n        {\n          \"type\": \"PREC_LEFT\",\n          \"value\": 35,\n          \"content\": {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"left\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_arg\"\n                }\n              },\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"operator\",\n                \"content\": {\n                  \"type\": \"STRING\",\n                  \"value\": \"&&\"\n                }\n              },\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"right\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_arg\"\n                }\n              }\n            ]\n          }\n        },\n        {\n          \"type\": \"PREC_LEFT\",\n          \"value\": 60,\n          \"content\": {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"left\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_arg\"\n                }\n              },\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"operator\",\n                \"content\": {\n                  \"type\": \"CHOICE\",\n                  \"members\": [\n                    {\n                      \"type\": \"STRING\",\n                      \"value\": \"<<\"\n                    },\n                    {\n                      \"type\": \"STRING\",\n                      \"value\": \">>\"\n                    }\n                  ]\n                }\n              },\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"right\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_arg\"\n                }\n              }\n            ]\n          }\n        },\n        {\n          \"type\": \"PREC_LEFT\",\n          \"value\": 45,\n          \"content\": {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"left\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_arg\"\n                }\n              },\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"operator\",\n                \"content\": {\n                  \"type\": \"CHOICE\",\n                  \"members\": [\n                    {\n                      \"type\": \"STRING\",\n                      \"value\": \"<\"\n                    },\n                    {\n                      \"type\": \"STRING\",\n                      \"value\": \"<=\"\n                    },\n                    {\n                      \"type\": \"STRING\",\n                      \"value\": \">\"\n                    },\n                    {\n                      \"type\": \"STRING\",\n                      \"value\": \">=\"\n                    }\n                  ]\n                }\n              },\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"right\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_arg\"\n                }\n              }\n            ]\n          }\n        },\n        {\n          \"type\": \"PREC_LEFT\",\n          \"value\": 55,\n          \"content\": {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"left\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_arg\"\n                }\n              },\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"operator\",\n                \"content\": {\n                  \"type\": \"STRING\",\n                  \"value\": \"&\"\n                }\n              },\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"right\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_arg\"\n                }\n              }\n            ]\n          }\n        },\n        {\n          \"type\": \"PREC_LEFT\",\n          \"value\": 50,\n          \"content\": {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"left\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_arg\"\n                }\n              },\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"operator\",\n                \"content\": {\n                  \"type\": \"CHOICE\",\n                  \"members\": [\n                    {\n                      \"type\": \"STRING\",\n                      \"value\": \"^\"\n                    },\n                    {\n                      \"type\": \"STRING\",\n                      \"value\": \"|\"\n                    }\n                  ]\n                }\n              },\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"right\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_arg\"\n                }\n              }\n            ]\n          }\n        },\n        {\n          \"type\": \"PREC_LEFT\",\n          \"value\": 65,\n          \"content\": {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"left\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_arg\"\n                }\n              },\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"operator\",\n                \"content\": {\n                  \"type\": \"CHOICE\",\n                  \"members\": [\n                    {\n                      \"type\": \"STRING\",\n                      \"value\": \"+\"\n                    },\n                    {\n                      \"type\": \"ALIAS\",\n                      \"content\": {\n                        \"type\": \"SYMBOL\",\n                        \"name\": \"_binary_minus\"\n                      },\n                      \"named\": false,\n                      \"value\": \"-\"\n                    }\n                  ]\n                }\n              },\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"right\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_arg\"\n                }\n              }\n            ]\n          }\n        },\n        {\n          \"type\": \"PREC_LEFT\",\n          \"value\": 70,\n          \"content\": {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"left\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_arg\"\n                }\n              },\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"operator\",\n                \"content\": {\n                  \"type\": \"CHOICE\",\n                  \"members\": [\n                    {\n                      \"type\": \"STRING\",\n                      \"value\": \"/\"\n                    },\n                    {\n                      \"type\": \"STRING\",\n                      \"value\": \"%\"\n                    },\n                    {\n                      \"type\": \"ALIAS\",\n                      \"content\": {\n                        \"type\": \"SYMBOL\",\n                        \"name\": \"_binary_star\"\n                      },\n                      \"named\": false,\n                      \"value\": \"*\"\n                    }\n                  ]\n                }\n              },\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"right\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_arg\"\n                }\n              }\n            ]\n          }\n        },\n        {\n          \"type\": \"PREC_RIGHT\",\n          \"value\": 40,\n          \"content\": {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"left\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_arg\"\n                }\n              },\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"operator\",\n                \"content\": {\n                  \"type\": \"CHOICE\",\n                  \"members\": [\n                    {\n                      \"type\": \"STRING\",\n                      \"value\": \"==\"\n                    },\n                    {\n                      \"type\": \"STRING\",\n                      \"value\": \"!=\"\n                    },\n                    {\n                      \"type\": \"STRING\",\n                      \"value\": \"===\"\n                    },\n                    {\n                      \"type\": \"STRING\",\n                      \"value\": \"<=>\"\n                    },\n                    {\n                      \"type\": \"STRING\",\n                      \"value\": \"=~\"\n                    },\n                    {\n                      \"type\": \"STRING\",\n                      \"value\": \"!~\"\n                    }\n                  ]\n                }\n              },\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"right\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_arg\"\n                }\n              }\n            ]\n          }\n        },\n        {\n          \"type\": \"PREC_RIGHT\",\n          \"value\": 80,\n          \"content\": {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"left\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_arg\"\n                }\n              },\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"operator\",\n                \"content\": {\n                  \"type\": \"ALIAS\",\n                  \"content\": {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"_binary_star_star\"\n                  },\n                  \"named\": false,\n                  \"value\": \"**\"\n                }\n              },\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"right\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_arg\"\n                }\n              }\n            ]\n          }\n        }\n      ]\n    },\n    \"command_binary\": {\n      \"type\": \"PREC_LEFT\",\n      \"value\": 0,\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"left\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_expression\"\n            }\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"operator\",\n            \"content\": {\n              \"type\": \"CHOICE\",\n              \"members\": [\n                {\n                  \"type\": \"STRING\",\n                  \"value\": \"or\"\n                },\n                {\n                  \"type\": \"STRING\",\n                  \"value\": \"and\"\n                }\n              ]\n            }\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"right\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_expression\"\n            }\n          }\n        ]\n      }\n    },\n    \"unary\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"PREC\",\n          \"value\": 10,\n          \"content\": {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"operator\",\n                \"content\": {\n                  \"type\": \"STRING\",\n                  \"value\": \"defined?\"\n                }\n              },\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"operand\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_arg\"\n                }\n              }\n            ]\n          }\n        },\n        {\n          \"type\": \"PREC_RIGHT\",\n          \"value\": 5,\n          \"content\": {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"operator\",\n                \"content\": {\n                  \"type\": \"STRING\",\n                  \"value\": \"not\"\n                }\n              },\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"operand\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_arg\"\n                }\n              }\n            ]\n          }\n        },\n        {\n          \"type\": \"PREC_RIGHT\",\n          \"value\": 75,\n          \"content\": {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"operator\",\n                \"content\": {\n                  \"type\": \"CHOICE\",\n                  \"members\": [\n                    {\n                      \"type\": \"ALIAS\",\n                      \"content\": {\n                        \"type\": \"SYMBOL\",\n                        \"name\": \"_unary_minus\"\n                      },\n                      \"named\": false,\n                      \"value\": \"-\"\n                    },\n                    {\n                      \"type\": \"ALIAS\",\n                      \"content\": {\n                        \"type\": \"SYMBOL\",\n                        \"name\": \"_binary_minus\"\n                      },\n                      \"named\": false,\n                      \"value\": \"-\"\n                    },\n                    {\n                      \"type\": \"STRING\",\n                      \"value\": \"+\"\n                    }\n                  ]\n                }\n              },\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"operand\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_arg\"\n                }\n              }\n            ]\n          }\n        },\n        {\n          \"type\": \"PREC_RIGHT\",\n          \"value\": 85,\n          \"content\": {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"operator\",\n                \"content\": {\n                  \"type\": \"CHOICE\",\n                  \"members\": [\n                    {\n                      \"type\": \"STRING\",\n                      \"value\": \"!\"\n                    },\n                    {\n                      \"type\": \"STRING\",\n                      \"value\": \"~\"\n                    }\n                  ]\n                }\n              },\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"operand\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_arg\"\n                }\n              }\n            ]\n          }\n        }\n      ]\n    },\n    \"command_unary\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"PREC\",\n          \"value\": 10,\n          \"content\": {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"operator\",\n                \"content\": {\n                  \"type\": \"STRING\",\n                  \"value\": \"defined?\"\n                }\n              },\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"operand\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_expression\"\n                }\n              }\n            ]\n          }\n        },\n        {\n          \"type\": \"PREC_RIGHT\",\n          \"value\": 5,\n          \"content\": {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"operator\",\n                \"content\": {\n                  \"type\": \"STRING\",\n                  \"value\": \"not\"\n                }\n              },\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"operand\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_expression\"\n                }\n              }\n            ]\n          }\n        },\n        {\n          \"type\": \"PREC_RIGHT\",\n          \"value\": 75,\n          \"content\": {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"operator\",\n                \"content\": {\n                  \"type\": \"CHOICE\",\n                  \"members\": [\n                    {\n                      \"type\": \"ALIAS\",\n                      \"content\": {\n                        \"type\": \"SYMBOL\",\n                        \"name\": \"_unary_minus\"\n                      },\n                      \"named\": false,\n                      \"value\": \"-\"\n                    },\n                    {\n                      \"type\": \"STRING\",\n                      \"value\": \"+\"\n                    }\n                  ]\n                }\n              },\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"operand\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_expression\"\n                }\n              }\n            ]\n          }\n        },\n        {\n          \"type\": \"PREC_RIGHT\",\n          \"value\": 85,\n          \"content\": {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"operator\",\n                \"content\": {\n                  \"type\": \"CHOICE\",\n                  \"members\": [\n                    {\n                      \"type\": \"STRING\",\n                      \"value\": \"!\"\n                    },\n                    {\n                      \"type\": \"STRING\",\n                      \"value\": \"~\"\n                    }\n                  ]\n                }\n              },\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"operand\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_expression\"\n                }\n              }\n            ]\n          }\n        }\n      ]\n    },\n    \"parenthesized_unary\": {\n      \"type\": \"PREC\",\n      \"value\": 56,\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"operator\",\n            \"content\": {\n              \"type\": \"CHOICE\",\n              \"members\": [\n                {\n                  \"type\": \"STRING\",\n                  \"value\": \"defined?\"\n                },\n                {\n                  \"type\": \"STRING\",\n                  \"value\": \"not\"\n                }\n              ]\n            }\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"operand\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"parenthesized_statements\"\n            }\n          }\n        ]\n      }\n    },\n    \"unary_literal\": {\n      \"type\": \"PREC_RIGHT\",\n      \"value\": 75,\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"operator\",\n            \"content\": {\n              \"type\": \"CHOICE\",\n              \"members\": [\n                {\n                  \"type\": \"ALIAS\",\n                  \"content\": {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"_unary_minus_num\"\n                  },\n                  \"named\": false,\n                  \"value\": \"-\"\n                },\n                {\n                  \"type\": \"STRING\",\n                  \"value\": \"+\"\n                }\n              ]\n            }\n          },\n          {\n            \"type\": \"FIELD\",\n            \"name\": \"operand\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_simple_numeric\"\n            }\n          }\n        ]\n      }\n    },\n    \"_literal\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"simple_symbol\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"delimited_symbol\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_numeric\"\n        }\n      ]\n    },\n    \"_numeric\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_simple_numeric\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"unary_literal\"\n          },\n          \"named\": true,\n          \"value\": \"unary\"\n        }\n      ]\n    },\n    \"_simple_numeric\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"integer\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"float\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"complex\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"rational\"\n        }\n      ]\n    },\n    \"right_assignment_list\": {\n      \"type\": \"PREC\",\n      \"value\": -1,\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"CHOICE\",\n            \"members\": [\n              {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_arg\"\n              },\n              {\n                \"type\": \"SYMBOL\",\n                \"name\": \"splat_argument\"\n              }\n            ]\n          },\n          {\n            \"type\": \"REPEAT\",\n            \"content\": {\n              \"type\": \"SEQ\",\n              \"members\": [\n                {\n                  \"type\": \"STRING\",\n                  \"value\": \",\"\n                },\n                {\n                  \"type\": \"CHOICE\",\n                  \"members\": [\n                    {\n                      \"type\": \"SYMBOL\",\n                      \"name\": \"_arg\"\n                    },\n                    {\n                      \"type\": \"SYMBOL\",\n                      \"name\": \"splat_argument\"\n                    }\n                  ]\n                }\n              ]\n            }\n          }\n        ]\n      }\n    },\n    \"left_assignment_list\": {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_mlhs\"\n    },\n    \"_mlhs\": {\n      \"type\": \"PREC_LEFT\",\n      \"value\": -1,\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"CHOICE\",\n                \"members\": [\n                  {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"_lhs\"\n                  },\n                  {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"rest_assignment\"\n                  },\n                  {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"destructured_left_assignment\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"REPEAT\",\n                \"content\": {\n                  \"type\": \"SEQ\",\n                  \"members\": [\n                    {\n                      \"type\": \"STRING\",\n                      \"value\": \",\"\n                    },\n                    {\n                      \"type\": \"CHOICE\",\n                      \"members\": [\n                        {\n                          \"type\": \"SYMBOL\",\n                          \"name\": \"_lhs\"\n                        },\n                        {\n                          \"type\": \"SYMBOL\",\n                          \"name\": \"rest_assignment\"\n                        },\n                        {\n                          \"type\": \"SYMBOL\",\n                          \"name\": \"destructured_left_assignment\"\n                        }\n                      ]\n                    }\n                  ]\n                }\n              }\n            ]\n          },\n          {\n            \"type\": \"CHOICE\",\n            \"members\": [\n              {\n                \"type\": \"STRING\",\n                \"value\": \",\"\n              },\n              {\n                \"type\": \"BLANK\"\n              }\n            ]\n          }\n        ]\n      }\n    },\n    \"destructured_left_assignment\": {\n      \"type\": \"PREC\",\n      \"value\": -1,\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"STRING\",\n            \"value\": \"(\"\n          },\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_mlhs\"\n          },\n          {\n            \"type\": \"STRING\",\n            \"value\": \")\"\n          }\n        ]\n      }\n    },\n    \"rest_assignment\": {\n      \"type\": \"PREC\",\n      \"value\": -1,\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"STRING\",\n            \"value\": \"*\"\n          },\n          {\n            \"type\": \"CHOICE\",\n            \"members\": [\n              {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_lhs\"\n              },\n              {\n                \"type\": \"BLANK\"\n              }\n            ]\n          }\n        ]\n      }\n    },\n    \"_function_identifier\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"identifier_suffix\"\n          },\n          \"named\": true,\n          \"value\": \"identifier\"\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"constant_suffix\"\n          },\n          \"named\": true,\n          \"value\": \"constant\"\n        }\n      ]\n    },\n    \"_function_identifier_call\": {\n      \"type\": \"PREC_LEFT\",\n      \"value\": 0,\n      \"content\": {\n        \"type\": \"FIELD\",\n        \"name\": \"method\",\n        \"content\": {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_function_identifier\"\n        }\n      }\n    },\n    \"_lhs\": {\n      \"type\": \"PREC_LEFT\",\n      \"value\": 0,\n      \"content\": {\n        \"type\": \"CHOICE\",\n        \"members\": [\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_variable\"\n          },\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"true\"\n          },\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"false\"\n          },\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"nil\"\n          },\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"scope_resolution\"\n          },\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"element_reference\"\n          },\n          {\n            \"type\": \"ALIAS\",\n            \"content\": {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_call\"\n            },\n            \"named\": true,\n            \"value\": \"call\"\n          }\n        ]\n      }\n    },\n    \"_variable\": {\n      \"type\": \"PREC_RIGHT\",\n      \"value\": 0,\n      \"content\": {\n        \"type\": \"CHOICE\",\n        \"members\": [\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"self\"\n          },\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"super\"\n          },\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_nonlocal_variable\"\n          },\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"identifier\"\n          },\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"constant\"\n          }\n        ]\n      }\n    },\n    \"operator\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"..\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"|\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"^\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"&\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"<=>\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"==\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"===\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"=~\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \">\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \">=\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"<\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"<=\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"+\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"!=\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"-\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"*\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"/\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"%\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"!\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"!~\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"**\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"<<\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \">>\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"~\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"+@\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"-@\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"~@\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"[]\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"[]=\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"`\"\n        }\n      ]\n    },\n    \"_method_name\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"identifier\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_function_identifier\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"constant\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"setter\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"simple_symbol\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"delimited_symbol\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"operator\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_nonlocal_variable\"\n        }\n      ]\n    },\n    \"_nonlocal_variable\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"instance_variable\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"class_variable\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"global_variable\"\n        }\n      ]\n    },\n    \"setter\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"name\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"identifier\"\n          }\n        },\n        {\n          \"type\": \"IMMEDIATE_TOKEN\",\n          \"content\": {\n            \"type\": \"STRING\",\n            \"value\": \"=\"\n          }\n        }\n      ]\n    },\n    \"undef\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"undef\"\n        },\n        {\n          \"type\": \"SEQ\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_method_name\"\n            },\n            {\n              \"type\": \"REPEAT\",\n              \"content\": {\n                \"type\": \"SEQ\",\n                \"members\": [\n                  {\n                    \"type\": \"STRING\",\n                    \"value\": \",\"\n                  },\n                  {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"_method_name\"\n                  }\n                ]\n              }\n            }\n          ]\n        }\n      ]\n    },\n    \"alias\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"alias\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"name\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_method_name\"\n          }\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"alias\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_method_name\"\n          }\n        }\n      ]\n    },\n    \"comment\": {\n      \"type\": \"TOKEN\",\n      \"content\": {\n        \"type\": \"PREC\",\n        \"value\": -2,\n        \"content\": {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SEQ\",\n              \"members\": [\n                {\n                  \"type\": \"STRING\",\n                  \"value\": \"#\"\n                },\n                {\n                  \"type\": \"PATTERN\",\n                  \"value\": \".*\"\n                }\n              ]\n            },\n            {\n              \"type\": \"SEQ\",\n              \"members\": [\n                {\n                  \"type\": \"PATTERN\",\n                  \"value\": \"=begin.*\\\\r?\\\\n\"\n                },\n                {\n                  \"type\": \"REPEAT\",\n                  \"content\": {\n                    \"type\": \"CHOICE\",\n                    \"members\": [\n                      {\n                        \"type\": \"PATTERN\",\n                        \"value\": \"[^=]\"\n                      },\n                      {\n                        \"type\": \"PATTERN\",\n                        \"value\": \"=[^e]\"\n                      },\n                      {\n                        \"type\": \"PATTERN\",\n                        \"value\": \"=e[^n]\"\n                      },\n                      {\n                        \"type\": \"PATTERN\",\n                        \"value\": \"=en[^d]\"\n                      }\n                    ]\n                  }\n                },\n                {\n                  \"type\": \"PATTERN\",\n                  \"value\": \"[\\\\s*]*=end.*\"\n                }\n              ]\n            }\n          ]\n        }\n      }\n    },\n    \"integer\": {\n      \"type\": \"PATTERN\",\n      \"value\": \"0[bB][01](_?[01])*|0[oO]?[0-7](_?[0-7])*|(0[dD])?\\\\d(_?\\\\d)*|0[xX][0-9a-fA-F](_?[0-9a-fA-F])*\"\n    },\n    \"_int_or_float\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"integer\"\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"float\"\n        }\n      ]\n    },\n    \"float\": {\n      \"type\": \"PATTERN\",\n      \"value\": \"\\\\d(_?\\\\d)*(\\\\.\\\\d)?(_?\\\\d)*([eE][\\\\+-]?\\\\d(_?\\\\d)*)?\"\n    },\n    \"complex\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SEQ\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_int_or_float\"\n            },\n            {\n              \"type\": \"IMMEDIATE_TOKEN\",\n              \"content\": {\n                \"type\": \"STRING\",\n                \"value\": \"i\"\n              }\n            }\n          ]\n        },\n        {\n          \"type\": \"SEQ\",\n          \"members\": [\n            {\n              \"type\": \"ALIAS\",\n              \"content\": {\n                \"type\": \"SYMBOL\",\n                \"name\": \"_int_or_float\"\n              },\n              \"named\": true,\n              \"value\": \"rational\"\n            },\n            {\n              \"type\": \"IMMEDIATE_TOKEN\",\n              \"content\": {\n                \"type\": \"STRING\",\n                \"value\": \"ri\"\n              }\n            }\n          ]\n        }\n      ]\n    },\n    \"rational\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_int_or_float\"\n        },\n        {\n          \"type\": \"IMMEDIATE_TOKEN\",\n          \"content\": {\n            \"type\": \"STRING\",\n            \"value\": \"r\"\n          }\n        }\n      ]\n    },\n    \"super\": {\n      \"type\": \"STRING\",\n      \"value\": \"super\"\n    },\n    \"self\": {\n      \"type\": \"STRING\",\n      \"value\": \"self\"\n    },\n    \"true\": {\n      \"type\": \"STRING\",\n      \"value\": \"true\"\n    },\n    \"false\": {\n      \"type\": \"STRING\",\n      \"value\": \"false\"\n    },\n    \"nil\": {\n      \"type\": \"STRING\",\n      \"value\": \"nil\"\n    },\n    \"constant\": {\n      \"type\": \"TOKEN\",\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"PATTERN\",\n            \"value\": \"[A-Z]\"\n          },\n          {\n            \"type\": \"PATTERN\",\n            \"value\": \"[^\\\\x00-\\\\x1F\\\\s:;`\\\"'@$#.,|^&<=>+\\\\-*/\\\\\\\\%?!~()\\\\[\\\\]{}]*\"\n          }\n        ]\n      }\n    },\n    \"constant_suffix\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"TOKEN\",\n          \"content\": {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"PATTERN\",\n                \"value\": \"[A-Z]\"\n              },\n              {\n                \"type\": \"PATTERN\",\n                \"value\": \"[^\\\\x00-\\\\x1F\\\\s:;`\\\"'@$#.,|^&<=>+\\\\-*/\\\\\\\\%?!~()\\\\[\\\\]{}]*\"\n              },\n              {\n                \"type\": \"PATTERN\",\n                \"value\": \"[?]\"\n              }\n            ]\n          }\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_constant_suffix\"\n        }\n      ]\n    },\n    \"identifier\": {\n      \"type\": \"TOKEN\",\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"PATTERN\",\n            \"value\": \"[^\\\\x00-\\\\x1F\\\\sA-Z0-9:;`\\\"'@$#.,|^&<=>+\\\\-*/\\\\\\\\%?!~()\\\\[\\\\]{}]\"\n          },\n          {\n            \"type\": \"PATTERN\",\n            \"value\": \"[^\\\\x00-\\\\x1F\\\\s:;`\\\"'@$#.,|^&<=>+\\\\-*/\\\\\\\\%?!~()\\\\[\\\\]{}]*\"\n          }\n        ]\n      }\n    },\n    \"identifier_suffix\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"TOKEN\",\n          \"content\": {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"PATTERN\",\n                \"value\": \"[^\\\\x00-\\\\x1F\\\\sA-Z0-9:;`\\\"'@$#.,|^&<=>+\\\\-*/\\\\\\\\%?!~()\\\\[\\\\]{}]\"\n              },\n              {\n                \"type\": \"PATTERN\",\n                \"value\": \"[^\\\\x00-\\\\x1F\\\\s:;`\\\"'@$#.,|^&<=>+\\\\-*/\\\\\\\\%?!~()\\\\[\\\\]{}]*\"\n              },\n              {\n                \"type\": \"PATTERN\",\n                \"value\": \"[?]\"\n              }\n            ]\n          }\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_identifier_suffix\"\n        }\n      ]\n    },\n    \"instance_variable\": {\n      \"type\": \"TOKEN\",\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"STRING\",\n            \"value\": \"@\"\n          },\n          {\n            \"type\": \"PATTERN\",\n            \"value\": \"[^\\\\x00-\\\\x1F\\\\s0-9:;`\\\"'@$#.,|^&<=>+\\\\-*/\\\\\\\\%?!~()\\\\[\\\\]{}]\"\n          },\n          {\n            \"type\": \"PATTERN\",\n            \"value\": \"[^\\\\x00-\\\\x1F\\\\s:;`\\\"'@$#.,|^&<=>+\\\\-*/\\\\\\\\%?!~()\\\\[\\\\]{}]*\"\n          }\n        ]\n      }\n    },\n    \"class_variable\": {\n      \"type\": \"TOKEN\",\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"STRING\",\n            \"value\": \"@@\"\n          },\n          {\n            \"type\": \"PATTERN\",\n            \"value\": \"[^\\\\x00-\\\\x1F\\\\s0-9:;`\\\"'@$#.,|^&<=>+\\\\-*/\\\\\\\\%?!~()\\\\[\\\\]{}]\"\n          },\n          {\n            \"type\": \"PATTERN\",\n            \"value\": \"[^\\\\x00-\\\\x1F\\\\s:;`\\\"'@$#.,|^&<=>+\\\\-*/\\\\\\\\%?!~()\\\\[\\\\]{}]*\"\n          }\n        ]\n      }\n    },\n    \"global_variable\": {\n      \"type\": \"PATTERN\",\n      \"value\": \"\\\\$(-[a-zA-Z0-9_]|[!@&`'+~=/\\\\\\\\,;.<>*$?:\\\"]|[0-9]+|[a-zA-Z_][a-zA-Z0-9_]*)\"\n    },\n    \"chained_string\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"string\"\n        },\n        {\n          \"type\": \"REPEAT1\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"string\"\n          }\n        }\n      ]\n    },\n    \"character\": {\n      \"type\": \"PATTERN\",\n      \"value\": \"\\\\?(\\\\\\\\\\\\S(\\\\{[0-9A-Fa-f]*\\\\}|[0-9A-Fa-f]*|-\\\\S([MC]-\\\\S)?)?|\\\\S)\"\n    },\n    \"interpolation\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SEQ\",\n          \"members\": [\n            {\n              \"type\": \"STRING\",\n              \"value\": \"#{\"\n            },\n            {\n              \"type\": \"CHOICE\",\n              \"members\": [\n                {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_statements\"\n                },\n                {\n                  \"type\": \"BLANK\"\n                }\n              ]\n            },\n            {\n              \"type\": \"STRING\",\n              \"value\": \"}\"\n            }\n          ]\n        },\n        {\n          \"type\": \"SEQ\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_short_interpolation\"\n            },\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_nonlocal_variable\"\n            }\n          ]\n        }\n      ]\n    },\n    \"string\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_string_start\"\n          },\n          \"named\": false,\n          \"value\": \"\\\"\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_literal_contents\"\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_string_end\"\n          },\n          \"named\": false,\n          \"value\": \"\\\"\"\n        }\n      ]\n    },\n    \"subshell\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_subshell_start\"\n          },\n          \"named\": false,\n          \"value\": \"`\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_literal_contents\"\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_string_end\"\n          },\n          \"named\": false,\n          \"value\": \"`\"\n        }\n      ]\n    },\n    \"string_array\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_string_array_start\"\n          },\n          \"named\": false,\n          \"value\": \"%w(\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"PATTERN\",\n              \"value\": \"\\\\s+\"\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SEQ\",\n              \"members\": [\n                {\n                  \"type\": \"ALIAS\",\n                  \"content\": {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"_literal_contents\"\n                  },\n                  \"named\": true,\n                  \"value\": \"bare_string\"\n                },\n                {\n                  \"type\": \"REPEAT\",\n                  \"content\": {\n                    \"type\": \"SEQ\",\n                    \"members\": [\n                      {\n                        \"type\": \"PATTERN\",\n                        \"value\": \"\\\\s+\"\n                      },\n                      {\n                        \"type\": \"ALIAS\",\n                        \"content\": {\n                          \"type\": \"SYMBOL\",\n                          \"name\": \"_literal_contents\"\n                        },\n                        \"named\": true,\n                        \"value\": \"bare_string\"\n                      }\n                    ]\n                  }\n                }\n              ]\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"PATTERN\",\n              \"value\": \"\\\\s+\"\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_string_end\"\n          },\n          \"named\": false,\n          \"value\": \")\"\n        }\n      ]\n    },\n    \"symbol_array\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_symbol_array_start\"\n          },\n          \"named\": false,\n          \"value\": \"%i(\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"PATTERN\",\n              \"value\": \"\\\\s+\"\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SEQ\",\n              \"members\": [\n                {\n                  \"type\": \"ALIAS\",\n                  \"content\": {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"_literal_contents\"\n                  },\n                  \"named\": true,\n                  \"value\": \"bare_symbol\"\n                },\n                {\n                  \"type\": \"REPEAT\",\n                  \"content\": {\n                    \"type\": \"SEQ\",\n                    \"members\": [\n                      {\n                        \"type\": \"PATTERN\",\n                        \"value\": \"\\\\s+\"\n                      },\n                      {\n                        \"type\": \"ALIAS\",\n                        \"content\": {\n                          \"type\": \"SYMBOL\",\n                          \"name\": \"_literal_contents\"\n                        },\n                        \"named\": true,\n                        \"value\": \"bare_symbol\"\n                      }\n                    ]\n                  }\n                }\n              ]\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"PATTERN\",\n              \"value\": \"\\\\s+\"\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_string_end\"\n          },\n          \"named\": false,\n          \"value\": \")\"\n        }\n      ]\n    },\n    \"delimited_symbol\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_symbol_start\"\n          },\n          \"named\": false,\n          \"value\": \":\\\"\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_literal_contents\"\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_string_end\"\n          },\n          \"named\": false,\n          \"value\": \"\\\"\"\n        }\n      ]\n    },\n    \"regex\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_regex_start\"\n          },\n          \"named\": false,\n          \"value\": \"/\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_literal_contents\"\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"ALIAS\",\n          \"content\": {\n            \"type\": \"SYMBOL\",\n            \"name\": \"_string_end\"\n          },\n          \"named\": false,\n          \"value\": \"/\"\n        }\n      ]\n    },\n    \"heredoc_body\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_heredoc_body_start\"\n        },\n        {\n          \"type\": \"REPEAT\",\n          \"content\": {\n            \"type\": \"CHOICE\",\n            \"members\": [\n              {\n                \"type\": \"SYMBOL\",\n                \"name\": \"heredoc_content\"\n              },\n              {\n                \"type\": \"SYMBOL\",\n                \"name\": \"interpolation\"\n              },\n              {\n                \"type\": \"SYMBOL\",\n                \"name\": \"escape_sequence\"\n              }\n            ]\n          }\n        },\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"heredoc_end\"\n        }\n      ]\n    },\n    \"_literal_contents\": {\n      \"type\": \"REPEAT1\",\n      \"content\": {\n        \"type\": \"CHOICE\",\n        \"members\": [\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"string_content\"\n          },\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"interpolation\"\n          },\n          {\n            \"type\": \"SYMBOL\",\n            \"name\": \"escape_sequence\"\n          }\n        ]\n      }\n    },\n    \"escape_sequence\": {\n      \"type\": \"TOKEN\",\n      \"content\": {\n        \"type\": \"SEQ\",\n        \"members\": [\n          {\n            \"type\": \"STRING\",\n            \"value\": \"\\\\\"\n          },\n          {\n            \"type\": \"CHOICE\",\n            \"members\": [\n              {\n                \"type\": \"PATTERN\",\n                \"value\": \"[^ux0-7]\"\n              },\n              {\n                \"type\": \"PATTERN\",\n                \"value\": \"x[0-9a-fA-F]{1,2}\"\n              },\n              {\n                \"type\": \"PATTERN\",\n                \"value\": \"[0-7]{1,3}\"\n              },\n              {\n                \"type\": \"PATTERN\",\n                \"value\": \"u[0-9a-fA-F]{4}\"\n              },\n              {\n                \"type\": \"PATTERN\",\n                \"value\": \"u\\\\{[0-9a-fA-F ]+\\\\}\"\n              }\n            ]\n          }\n        ]\n      }\n    },\n    \"array\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"[\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SYMBOL\",\n              \"name\": \"_argument_list_with_trailing_comma\"\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"]\"\n        }\n      ]\n    },\n    \"hash\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"{\"\n        },\n        {\n          \"type\": \"CHOICE\",\n          \"members\": [\n            {\n              \"type\": \"SEQ\",\n              \"members\": [\n                {\n                  \"type\": \"SEQ\",\n                  \"members\": [\n                    {\n                      \"type\": \"CHOICE\",\n                      \"members\": [\n                        {\n                          \"type\": \"SYMBOL\",\n                          \"name\": \"pair\"\n                        },\n                        {\n                          \"type\": \"SYMBOL\",\n                          \"name\": \"hash_splat_argument\"\n                        }\n                      ]\n                    },\n                    {\n                      \"type\": \"REPEAT\",\n                      \"content\": {\n                        \"type\": \"SEQ\",\n                        \"members\": [\n                          {\n                            \"type\": \"STRING\",\n                            \"value\": \",\"\n                          },\n                          {\n                            \"type\": \"CHOICE\",\n                            \"members\": [\n                              {\n                                \"type\": \"SYMBOL\",\n                                \"name\": \"pair\"\n                              },\n                              {\n                                \"type\": \"SYMBOL\",\n                                \"name\": \"hash_splat_argument\"\n                              }\n                            ]\n                          }\n                        ]\n                      }\n                    }\n                  ]\n                },\n                {\n                  \"type\": \"CHOICE\",\n                  \"members\": [\n                    {\n                      \"type\": \"STRING\",\n                      \"value\": \",\"\n                    },\n                    {\n                      \"type\": \"BLANK\"\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"type\": \"BLANK\"\n            }\n          ]\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \"}\"\n        }\n      ]\n    },\n    \"pair\": {\n      \"type\": \"PREC_RIGHT\",\n      \"value\": 0,\n      \"content\": {\n        \"type\": \"CHOICE\",\n        \"members\": [\n          {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"key\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_arg\"\n                }\n              },\n              {\n                \"type\": \"STRING\",\n                \"value\": \"=>\"\n              },\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"value\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_arg\"\n                }\n              }\n            ]\n          },\n          {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"key\",\n                \"content\": {\n                  \"type\": \"CHOICE\",\n                  \"members\": [\n                    {\n                      \"type\": \"SYMBOL\",\n                      \"name\": \"string\"\n                    }\n                  ]\n                }\n              },\n              {\n                \"type\": \"IMMEDIATE_TOKEN\",\n                \"content\": {\n                  \"type\": \"STRING\",\n                  \"value\": \":\"\n                }\n              },\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"value\",\n                \"content\": {\n                  \"type\": \"SYMBOL\",\n                  \"name\": \"_arg\"\n                }\n              }\n            ]\n          },\n          {\n            \"type\": \"SEQ\",\n            \"members\": [\n              {\n                \"type\": \"FIELD\",\n                \"name\": \"key\",\n                \"content\": {\n                  \"type\": \"CHOICE\",\n                  \"members\": [\n                    {\n                      \"type\": \"SYMBOL\",\n                      \"name\": \"hash_key_symbol\"\n                    },\n                    {\n                      \"type\": \"ALIAS\",\n                      \"content\": {\n                        \"type\": \"SYMBOL\",\n                        \"name\": \"identifier\"\n                      },\n                      \"named\": true,\n                      \"value\": \"hash_key_symbol\"\n                    },\n                    {\n                      \"type\": \"ALIAS\",\n                      \"content\": {\n                        \"type\": \"SYMBOL\",\n                        \"name\": \"constant\"\n                      },\n                      \"named\": true,\n                      \"value\": \"hash_key_symbol\"\n                    },\n                    {\n                      \"type\": \"ALIAS\",\n                      \"content\": {\n                        \"type\": \"SYMBOL\",\n                        \"name\": \"identifier_suffix\"\n                      },\n                      \"named\": true,\n                      \"value\": \"hash_key_symbol\"\n                    },\n                    {\n                      \"type\": \"ALIAS\",\n                      \"content\": {\n                        \"type\": \"SYMBOL\",\n                        \"name\": \"constant_suffix\"\n                      },\n                      \"named\": true,\n                      \"value\": \"hash_key_symbol\"\n                    }\n                  ]\n                }\n              },\n              {\n                \"type\": \"IMMEDIATE_TOKEN\",\n                \"content\": {\n                  \"type\": \"STRING\",\n                  \"value\": \":\"\n                }\n              },\n              {\n                \"type\": \"CHOICE\",\n                \"members\": [\n                  {\n                    \"type\": \"FIELD\",\n                    \"name\": \"value\",\n                    \"content\": {\n                      \"type\": \"CHOICE\",\n                      \"members\": [\n                        {\n                          \"type\": \"SYMBOL\",\n                          \"name\": \"_arg\"\n                        },\n                        {\n                          \"type\": \"BLANK\"\n                        }\n                      ]\n                    }\n                  },\n                  {\n                    \"type\": \"SYMBOL\",\n                    \"name\": \"_no_line_break\"\n                  }\n                ]\n              }\n            ]\n          }\n        ]\n      }\n    },\n    \"lambda\": {\n      \"type\": \"SEQ\",\n      \"members\": [\n        {\n          \"type\": \"STRING\",\n          \"value\": \"->\"\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"parameters\",\n          \"content\": {\n            \"type\": \"CHOICE\",\n            \"members\": [\n              {\n                \"type\": \"CHOICE\",\n                \"members\": [\n                  {\n                    \"type\": \"ALIAS\",\n                    \"content\": {\n                      \"type\": \"SYMBOL\",\n                      \"name\": \"parameters\"\n                    },\n                    \"named\": true,\n                    \"value\": \"lambda_parameters\"\n                  },\n                  {\n                    \"type\": \"ALIAS\",\n                    \"content\": {\n                      \"type\": \"SYMBOL\",\n                      \"name\": \"bare_parameters\"\n                    },\n                    \"named\": true,\n                    \"value\": \"lambda_parameters\"\n                  }\n                ]\n              },\n              {\n                \"type\": \"BLANK\"\n              }\n            ]\n          }\n        },\n        {\n          \"type\": \"FIELD\",\n          \"name\": \"body\",\n          \"content\": {\n            \"type\": \"CHOICE\",\n            \"members\": [\n              {\n                \"type\": \"SYMBOL\",\n                \"name\": \"block\"\n              },\n              {\n                \"type\": \"SYMBOL\",\n                \"name\": \"do_block\"\n              }\n            ]\n          }\n        }\n      ]\n    },\n    \"empty_statement\": {\n      \"type\": \"PREC\",\n      \"value\": -1,\n      \"content\": {\n        \"type\": \"STRING\",\n        \"value\": \";\"\n      }\n    },\n    \"_terminator\": {\n      \"type\": \"CHOICE\",\n      \"members\": [\n        {\n          \"type\": \"SYMBOL\",\n          \"name\": \"_line_break\"\n        },\n        {\n          \"type\": \"STRING\",\n          \"value\": \";\"\n        }\n      ]\n    }\n  },\n  \"extras\": [\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"comment\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"heredoc_body\"\n    },\n    {\n      \"type\": \"PATTERN\",\n      \"value\": \"\\\\s\"\n    },\n    {\n      \"type\": \"PATTERN\",\n      \"value\": \"\\\\\\\\\\\\r?\\\\n\"\n    }\n  ],\n  \"conflicts\": [],\n  \"precedences\": [],\n  \"externals\": [\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_line_break\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_no_line_break\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"simple_symbol\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_string_start\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_symbol_start\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_subshell_start\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_regex_start\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_string_array_start\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_symbol_array_start\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_heredoc_body_start\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"string_content\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"heredoc_content\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_string_end\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"heredoc_end\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"heredoc_beginning\"\n    },\n    {\n      \"type\": \"STRING\",\n      \"value\": \"/\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_block_ampersand\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_splat_star\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_unary_minus\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_unary_minus_num\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_binary_minus\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_binary_star\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_singleton_class_left_angle_left_langle\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"hash_key_symbol\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_identifier_suffix\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_constant_suffix\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_hash_splat_star_star\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_binary_star_star\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_element_reference_bracket\"\n    },\n    {\n      \"type\": \"SYMBOL\",\n      \"name\": \"_short_interpolation\"\n    }\n  ],\n  \"inline\": [\n    \"_arg_rhs\",\n    \"_call_operator\"\n  ],\n  \"supertypes\": [\n    \"_statement\",\n    \"_arg\",\n    \"_call_operator\",\n    \"_method_name\",\n    \"_expression\",\n    \"_variable\",\n    \"_primary\",\n    \"_simple_numeric\",\n    \"_lhs\",\n    \"_nonlocal_variable\",\n    \"_pattern_top_expr_body\",\n    \"_pattern_expr\",\n    \"_pattern_expr_basic\",\n    \"_pattern_primitive\",\n    \"_pattern_constant\"\n  ]\n}\n"
  },
  {
    "path": "src/node-types.json",
    "content": "[\n  {\n    \"type\": \"_arg\",\n    \"named\": true,\n    \"subtypes\": [\n      {\n        \"type\": \"_primary\",\n        \"named\": true\n      },\n      {\n        \"type\": \"assignment\",\n        \"named\": true\n      },\n      {\n        \"type\": \"binary\",\n        \"named\": true\n      },\n      {\n        \"type\": \"conditional\",\n        \"named\": true\n      },\n      {\n        \"type\": \"operator_assignment\",\n        \"named\": true\n      },\n      {\n        \"type\": \"range\",\n        \"named\": true\n      },\n      {\n        \"type\": \"unary\",\n        \"named\": true\n      }\n    ]\n  },\n  {\n    \"type\": \"_call_operator\",\n    \"named\": true,\n    \"subtypes\": [\n      {\n        \"type\": \"&.\",\n        \"named\": false\n      },\n      {\n        \"type\": \".\",\n        \"named\": false\n      },\n      {\n        \"type\": \"::\",\n        \"named\": false\n      }\n    ]\n  },\n  {\n    \"type\": \"_expression\",\n    \"named\": true,\n    \"subtypes\": [\n      {\n        \"type\": \"_arg\",\n        \"named\": true\n      },\n      {\n        \"type\": \"assignment\",\n        \"named\": true\n      },\n      {\n        \"type\": \"binary\",\n        \"named\": true\n      },\n      {\n        \"type\": \"break\",\n        \"named\": true\n      },\n      {\n        \"type\": \"call\",\n        \"named\": true\n      },\n      {\n        \"type\": \"match_pattern\",\n        \"named\": true\n      },\n      {\n        \"type\": \"next\",\n        \"named\": true\n      },\n      {\n        \"type\": \"operator_assignment\",\n        \"named\": true\n      },\n      {\n        \"type\": \"return\",\n        \"named\": true\n      },\n      {\n        \"type\": \"test_pattern\",\n        \"named\": true\n      },\n      {\n        \"type\": \"unary\",\n        \"named\": true\n      },\n      {\n        \"type\": \"yield\",\n        \"named\": true\n      }\n    ]\n  },\n  {\n    \"type\": \"_lhs\",\n    \"named\": true,\n    \"subtypes\": [\n      {\n        \"type\": \"_variable\",\n        \"named\": true\n      },\n      {\n        \"type\": \"call\",\n        \"named\": true\n      },\n      {\n        \"type\": \"element_reference\",\n        \"named\": true\n      },\n      {\n        \"type\": \"false\",\n        \"named\": true\n      },\n      {\n        \"type\": \"nil\",\n        \"named\": true\n      },\n      {\n        \"type\": \"scope_resolution\",\n        \"named\": true\n      },\n      {\n        \"type\": \"true\",\n        \"named\": true\n      }\n    ]\n  },\n  {\n    \"type\": \"_method_name\",\n    \"named\": true,\n    \"subtypes\": [\n      {\n        \"type\": \"_nonlocal_variable\",\n        \"named\": true\n      },\n      {\n        \"type\": \"constant\",\n        \"named\": true\n      },\n      {\n        \"type\": \"delimited_symbol\",\n        \"named\": true\n      },\n      {\n        \"type\": \"identifier\",\n        \"named\": true\n      },\n      {\n        \"type\": \"operator\",\n        \"named\": true\n      },\n      {\n        \"type\": \"setter\",\n        \"named\": true\n      },\n      {\n        \"type\": \"simple_symbol\",\n        \"named\": true\n      }\n    ]\n  },\n  {\n    \"type\": \"_nonlocal_variable\",\n    \"named\": true,\n    \"subtypes\": [\n      {\n        \"type\": \"class_variable\",\n        \"named\": true\n      },\n      {\n        \"type\": \"global_variable\",\n        \"named\": true\n      },\n      {\n        \"type\": \"instance_variable\",\n        \"named\": true\n      }\n    ]\n  },\n  {\n    \"type\": \"_pattern_constant\",\n    \"named\": true,\n    \"subtypes\": [\n      {\n        \"type\": \"constant\",\n        \"named\": true\n      },\n      {\n        \"type\": \"scope_resolution\",\n        \"named\": true\n      }\n    ]\n  },\n  {\n    \"type\": \"_pattern_expr\",\n    \"named\": true,\n    \"subtypes\": [\n      {\n        \"type\": \"_pattern_expr_basic\",\n        \"named\": true\n      },\n      {\n        \"type\": \"alternative_pattern\",\n        \"named\": true\n      },\n      {\n        \"type\": \"as_pattern\",\n        \"named\": true\n      }\n    ]\n  },\n  {\n    \"type\": \"_pattern_expr_basic\",\n    \"named\": true,\n    \"subtypes\": [\n      {\n        \"type\": \"_pattern_constant\",\n        \"named\": true\n      },\n      {\n        \"type\": \"_pattern_primitive\",\n        \"named\": true\n      },\n      {\n        \"type\": \"array_pattern\",\n        \"named\": true\n      },\n      {\n        \"type\": \"expression_reference_pattern\",\n        \"named\": true\n      },\n      {\n        \"type\": \"find_pattern\",\n        \"named\": true\n      },\n      {\n        \"type\": \"hash_pattern\",\n        \"named\": true\n      },\n      {\n        \"type\": \"identifier\",\n        \"named\": true\n      },\n      {\n        \"type\": \"parenthesized_pattern\",\n        \"named\": true\n      },\n      {\n        \"type\": \"range\",\n        \"named\": true\n      },\n      {\n        \"type\": \"variable_reference_pattern\",\n        \"named\": true\n      }\n    ]\n  },\n  {\n    \"type\": \"_pattern_primitive\",\n    \"named\": true,\n    \"subtypes\": [\n      {\n        \"type\": \"_simple_numeric\",\n        \"named\": true\n      },\n      {\n        \"type\": \"delimited_symbol\",\n        \"named\": true\n      },\n      {\n        \"type\": \"encoding\",\n        \"named\": true\n      },\n      {\n        \"type\": \"false\",\n        \"named\": true\n      },\n      {\n        \"type\": \"file\",\n        \"named\": true\n      },\n      {\n        \"type\": \"heredoc_beginning\",\n        \"named\": true\n      },\n      {\n        \"type\": \"lambda\",\n        \"named\": true\n      },\n      {\n        \"type\": \"line\",\n        \"named\": true\n      },\n      {\n        \"type\": \"nil\",\n        \"named\": true\n      },\n      {\n        \"type\": \"regex\",\n        \"named\": true\n      },\n      {\n        \"type\": \"self\",\n        \"named\": true\n      },\n      {\n        \"type\": \"simple_symbol\",\n        \"named\": true\n      },\n      {\n        \"type\": \"string\",\n        \"named\": true\n      },\n      {\n        \"type\": \"string_array\",\n        \"named\": true\n      },\n      {\n        \"type\": \"subshell\",\n        \"named\": true\n      },\n      {\n        \"type\": \"symbol_array\",\n        \"named\": true\n      },\n      {\n        \"type\": \"true\",\n        \"named\": true\n      },\n      {\n        \"type\": \"unary\",\n        \"named\": true\n      }\n    ]\n  },\n  {\n    \"type\": \"_pattern_top_expr_body\",\n    \"named\": true,\n    \"subtypes\": [\n      {\n        \"type\": \"_pattern_expr\",\n        \"named\": true\n      },\n      {\n        \"type\": \"array_pattern\",\n        \"named\": true\n      },\n      {\n        \"type\": \"find_pattern\",\n        \"named\": true\n      },\n      {\n        \"type\": \"hash_pattern\",\n        \"named\": true\n      }\n    ]\n  },\n  {\n    \"type\": \"_primary\",\n    \"named\": true,\n    \"subtypes\": [\n      {\n        \"type\": \"_lhs\",\n        \"named\": true\n      },\n      {\n        \"type\": \"_simple_numeric\",\n        \"named\": true\n      },\n      {\n        \"type\": \"array\",\n        \"named\": true\n      },\n      {\n        \"type\": \"begin\",\n        \"named\": true\n      },\n      {\n        \"type\": \"break\",\n        \"named\": true\n      },\n      {\n        \"type\": \"call\",\n        \"named\": true\n      },\n      {\n        \"type\": \"case\",\n        \"named\": true\n      },\n      {\n        \"type\": \"case_match\",\n        \"named\": true\n      },\n      {\n        \"type\": \"chained_string\",\n        \"named\": true\n      },\n      {\n        \"type\": \"character\",\n        \"named\": true\n      },\n      {\n        \"type\": \"class\",\n        \"named\": true\n      },\n      {\n        \"type\": \"delimited_symbol\",\n        \"named\": true\n      },\n      {\n        \"type\": \"for\",\n        \"named\": true\n      },\n      {\n        \"type\": \"hash\",\n        \"named\": true\n      },\n      {\n        \"type\": \"heredoc_beginning\",\n        \"named\": true\n      },\n      {\n        \"type\": \"if\",\n        \"named\": true\n      },\n      {\n        \"type\": \"lambda\",\n        \"named\": true\n      },\n      {\n        \"type\": \"method\",\n        \"named\": true\n      },\n      {\n        \"type\": \"module\",\n        \"named\": true\n      },\n      {\n        \"type\": \"next\",\n        \"named\": true\n      },\n      {\n        \"type\": \"parenthesized_statements\",\n        \"named\": true\n      },\n      {\n        \"type\": \"redo\",\n        \"named\": true\n      },\n      {\n        \"type\": \"regex\",\n        \"named\": true\n      },\n      {\n        \"type\": \"retry\",\n        \"named\": true\n      },\n      {\n        \"type\": \"return\",\n        \"named\": true\n      },\n      {\n        \"type\": \"simple_symbol\",\n        \"named\": true\n      },\n      {\n        \"type\": \"singleton_class\",\n        \"named\": true\n      },\n      {\n        \"type\": \"singleton_method\",\n        \"named\": true\n      },\n      {\n        \"type\": \"string\",\n        \"named\": true\n      },\n      {\n        \"type\": \"string_array\",\n        \"named\": true\n      },\n      {\n        \"type\": \"subshell\",\n        \"named\": true\n      },\n      {\n        \"type\": \"symbol_array\",\n        \"named\": true\n      },\n      {\n        \"type\": \"unary\",\n        \"named\": true\n      },\n      {\n        \"type\": \"unless\",\n        \"named\": true\n      },\n      {\n        \"type\": \"until\",\n        \"named\": true\n      },\n      {\n        \"type\": \"while\",\n        \"named\": true\n      },\n      {\n        \"type\": \"yield\",\n        \"named\": true\n      }\n    ]\n  },\n  {\n    \"type\": \"_simple_numeric\",\n    \"named\": true,\n    \"subtypes\": [\n      {\n        \"type\": \"complex\",\n        \"named\": true\n      },\n      {\n        \"type\": \"float\",\n        \"named\": true\n      },\n      {\n        \"type\": \"integer\",\n        \"named\": true\n      },\n      {\n        \"type\": \"rational\",\n        \"named\": true\n      }\n    ]\n  },\n  {\n    \"type\": \"_statement\",\n    \"named\": true,\n    \"subtypes\": [\n      {\n        \"type\": \"_expression\",\n        \"named\": true\n      },\n      {\n        \"type\": \"alias\",\n        \"named\": true\n      },\n      {\n        \"type\": \"begin_block\",\n        \"named\": true\n      },\n      {\n        \"type\": \"end_block\",\n        \"named\": true\n      },\n      {\n        \"type\": \"if_modifier\",\n        \"named\": true\n      },\n      {\n        \"type\": \"rescue_modifier\",\n        \"named\": true\n      },\n      {\n        \"type\": \"undef\",\n        \"named\": true\n      },\n      {\n        \"type\": \"unless_modifier\",\n        \"named\": true\n      },\n      {\n        \"type\": \"until_modifier\",\n        \"named\": true\n      },\n      {\n        \"type\": \"while_modifier\",\n        \"named\": true\n      }\n    ]\n  },\n  {\n    \"type\": \"_variable\",\n    \"named\": true,\n    \"subtypes\": [\n      {\n        \"type\": \"_nonlocal_variable\",\n        \"named\": true\n      },\n      {\n        \"type\": \"constant\",\n        \"named\": true\n      },\n      {\n        \"type\": \"identifier\",\n        \"named\": true\n      },\n      {\n        \"type\": \"self\",\n        \"named\": true\n      },\n      {\n        \"type\": \"super\",\n        \"named\": true\n      }\n    ]\n  },\n  {\n    \"type\": \"alias\",\n    \"named\": true,\n    \"fields\": {\n      \"alias\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"_method_name\",\n            \"named\": true\n          }\n        ]\n      },\n      \"name\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"_method_name\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"alternative_pattern\",\n    \"named\": true,\n    \"fields\": {\n      \"alternatives\": {\n        \"multiple\": true,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"_pattern_expr_basic\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"argument_list\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": true,\n      \"required\": false,\n      \"types\": [\n        {\n          \"type\": \"_expression\",\n          \"named\": true\n        },\n        {\n          \"type\": \"block_argument\",\n          \"named\": true\n        },\n        {\n          \"type\": \"forward_argument\",\n          \"named\": true\n        },\n        {\n          \"type\": \"hash_splat_argument\",\n          \"named\": true\n        },\n        {\n          \"type\": \"pair\",\n          \"named\": true\n        },\n        {\n          \"type\": \"splat_argument\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"array\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": true,\n      \"required\": false,\n      \"types\": [\n        {\n          \"type\": \"_expression\",\n          \"named\": true\n        },\n        {\n          \"type\": \"block_argument\",\n          \"named\": true\n        },\n        {\n          \"type\": \"forward_argument\",\n          \"named\": true\n        },\n        {\n          \"type\": \"hash_splat_argument\",\n          \"named\": true\n        },\n        {\n          \"type\": \"pair\",\n          \"named\": true\n        },\n        {\n          \"type\": \"splat_argument\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"array_pattern\",\n    \"named\": true,\n    \"fields\": {\n      \"class\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"_pattern_constant\",\n            \"named\": true\n          }\n        ]\n      }\n    },\n    \"children\": {\n      \"multiple\": true,\n      \"required\": false,\n      \"types\": [\n        {\n          \"type\": \"_pattern_expr\",\n          \"named\": true\n        },\n        {\n          \"type\": \"splat_parameter\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"as_pattern\",\n    \"named\": true,\n    \"fields\": {\n      \"name\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"identifier\",\n            \"named\": true\n          }\n        ]\n      },\n      \"value\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"_pattern_expr\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"assignment\",\n    \"named\": true,\n    \"fields\": {\n      \"left\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"_lhs\",\n            \"named\": true\n          },\n          {\n            \"type\": \"left_assignment_list\",\n            \"named\": true\n          }\n        ]\n      },\n      \"right\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"_expression\",\n            \"named\": true\n          },\n          {\n            \"type\": \"rescue_modifier\",\n            \"named\": true\n          },\n          {\n            \"type\": \"right_assignment_list\",\n            \"named\": true\n          },\n          {\n            \"type\": \"splat_argument\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"bare_string\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": true,\n      \"required\": true,\n      \"types\": [\n        {\n          \"type\": \"escape_sequence\",\n          \"named\": true\n        },\n        {\n          \"type\": \"interpolation\",\n          \"named\": true\n        },\n        {\n          \"type\": \"string_content\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"bare_symbol\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": true,\n      \"required\": true,\n      \"types\": [\n        {\n          \"type\": \"escape_sequence\",\n          \"named\": true\n        },\n        {\n          \"type\": \"interpolation\",\n          \"named\": true\n        },\n        {\n          \"type\": \"string_content\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"begin\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": true,\n      \"required\": false,\n      \"types\": [\n        {\n          \"type\": \"_statement\",\n          \"named\": true\n        },\n        {\n          \"type\": \"else\",\n          \"named\": true\n        },\n        {\n          \"type\": \"empty_statement\",\n          \"named\": true\n        },\n        {\n          \"type\": \"ensure\",\n          \"named\": true\n        },\n        {\n          \"type\": \"rescue\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"begin_block\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": true,\n      \"required\": false,\n      \"types\": [\n        {\n          \"type\": \"_statement\",\n          \"named\": true\n        },\n        {\n          \"type\": \"empty_statement\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"binary\",\n    \"named\": true,\n    \"fields\": {\n      \"left\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"_expression\",\n            \"named\": true\n          },\n          {\n            \"type\": \"_simple_numeric\",\n            \"named\": true\n          }\n        ]\n      },\n      \"operator\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"!=\",\n            \"named\": false\n          },\n          {\n            \"type\": \"!~\",\n            \"named\": false\n          },\n          {\n            \"type\": \"%\",\n            \"named\": false\n          },\n          {\n            \"type\": \"&\",\n            \"named\": false\n          },\n          {\n            \"type\": \"&&\",\n            \"named\": false\n          },\n          {\n            \"type\": \"*\",\n            \"named\": false\n          },\n          {\n            \"type\": \"**\",\n            \"named\": false\n          },\n          {\n            \"type\": \"+\",\n            \"named\": false\n          },\n          {\n            \"type\": \"-\",\n            \"named\": false\n          },\n          {\n            \"type\": \"/\",\n            \"named\": false\n          },\n          {\n            \"type\": \"<\",\n            \"named\": false\n          },\n          {\n            \"type\": \"<<\",\n            \"named\": false\n          },\n          {\n            \"type\": \"<=\",\n            \"named\": false\n          },\n          {\n            \"type\": \"<=>\",\n            \"named\": false\n          },\n          {\n            \"type\": \"==\",\n            \"named\": false\n          },\n          {\n            \"type\": \"===\",\n            \"named\": false\n          },\n          {\n            \"type\": \"=~\",\n            \"named\": false\n          },\n          {\n            \"type\": \">\",\n            \"named\": false\n          },\n          {\n            \"type\": \">=\",\n            \"named\": false\n          },\n          {\n            \"type\": \">>\",\n            \"named\": false\n          },\n          {\n            \"type\": \"^\",\n            \"named\": false\n          },\n          {\n            \"type\": \"and\",\n            \"named\": false\n          },\n          {\n            \"type\": \"or\",\n            \"named\": false\n          },\n          {\n            \"type\": \"|\",\n            \"named\": false\n          },\n          {\n            \"type\": \"||\",\n            \"named\": false\n          }\n        ]\n      },\n      \"right\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"_expression\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"block\",\n    \"named\": true,\n    \"fields\": {\n      \"body\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"block_body\",\n            \"named\": true\n          }\n        ]\n      },\n      \"parameters\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"block_parameters\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"block_argument\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": false,\n      \"required\": false,\n      \"types\": [\n        {\n          \"type\": \"_arg\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"block_body\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": true,\n      \"required\": true,\n      \"types\": [\n        {\n          \"type\": \"_statement\",\n          \"named\": true\n        },\n        {\n          \"type\": \"empty_statement\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"block_parameter\",\n    \"named\": true,\n    \"fields\": {\n      \"name\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"identifier\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"block_parameters\",\n    \"named\": true,\n    \"fields\": {\n      \"locals\": {\n        \"multiple\": true,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"identifier\",\n            \"named\": true\n          }\n        ]\n      }\n    },\n    \"children\": {\n      \"multiple\": true,\n      \"required\": false,\n      \"types\": [\n        {\n          \"type\": \"block_parameter\",\n          \"named\": true\n        },\n        {\n          \"type\": \"destructured_parameter\",\n          \"named\": true\n        },\n        {\n          \"type\": \"forward_parameter\",\n          \"named\": true\n        },\n        {\n          \"type\": \"hash_splat_nil\",\n          \"named\": true\n        },\n        {\n          \"type\": \"hash_splat_parameter\",\n          \"named\": true\n        },\n        {\n          \"type\": \"identifier\",\n          \"named\": true\n        },\n        {\n          \"type\": \"keyword_parameter\",\n          \"named\": true\n        },\n        {\n          \"type\": \"optional_parameter\",\n          \"named\": true\n        },\n        {\n          \"type\": \"splat_parameter\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"body_statement\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": true,\n      \"required\": true,\n      \"types\": [\n        {\n          \"type\": \"_statement\",\n          \"named\": true\n        },\n        {\n          \"type\": \"else\",\n          \"named\": true\n        },\n        {\n          \"type\": \"empty_statement\",\n          \"named\": true\n        },\n        {\n          \"type\": \"ensure\",\n          \"named\": true\n        },\n        {\n          \"type\": \"rescue\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"break\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": false,\n      \"required\": false,\n      \"types\": [\n        {\n          \"type\": \"argument_list\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"call\",\n    \"named\": true,\n    \"fields\": {\n      \"arguments\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"argument_list\",\n            \"named\": true\n          }\n        ]\n      },\n      \"block\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"block\",\n            \"named\": true\n          },\n          {\n            \"type\": \"do_block\",\n            \"named\": true\n          }\n        ]\n      },\n      \"method\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"_variable\",\n            \"named\": true\n          },\n          {\n            \"type\": \"operator\",\n            \"named\": true\n          }\n        ]\n      },\n      \"operator\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"_call_operator\",\n            \"named\": true\n          }\n        ]\n      },\n      \"receiver\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"_primary\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"case\",\n    \"named\": true,\n    \"fields\": {\n      \"value\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"_statement\",\n            \"named\": true\n          }\n        ]\n      }\n    },\n    \"children\": {\n      \"multiple\": true,\n      \"required\": false,\n      \"types\": [\n        {\n          \"type\": \"else\",\n          \"named\": true\n        },\n        {\n          \"type\": \"when\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"case_match\",\n    \"named\": true,\n    \"fields\": {\n      \"clauses\": {\n        \"multiple\": true,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"in_clause\",\n            \"named\": true\n          }\n        ]\n      },\n      \"else\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"else\",\n            \"named\": true\n          }\n        ]\n      },\n      \"value\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"_statement\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"chained_string\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": true,\n      \"required\": true,\n      \"types\": [\n        {\n          \"type\": \"string\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"class\",\n    \"named\": true,\n    \"fields\": {\n      \"body\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"body_statement\",\n            \"named\": true\n          }\n        ]\n      },\n      \"name\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"constant\",\n            \"named\": true\n          },\n          {\n            \"type\": \"scope_resolution\",\n            \"named\": true\n          }\n        ]\n      },\n      \"superclass\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"superclass\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"complex\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": false,\n      \"required\": true,\n      \"types\": [\n        {\n          \"type\": \"float\",\n          \"named\": true\n        },\n        {\n          \"type\": \"integer\",\n          \"named\": true\n        },\n        {\n          \"type\": \"rational\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"conditional\",\n    \"named\": true,\n    \"fields\": {\n      \"alternative\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"_arg\",\n            \"named\": true\n          }\n        ]\n      },\n      \"condition\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"_arg\",\n            \"named\": true\n          }\n        ]\n      },\n      \"consequence\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"_arg\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"constant\",\n    \"named\": true,\n    \"fields\": {}\n  },\n  {\n    \"type\": \"delimited_symbol\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": true,\n      \"required\": false,\n      \"types\": [\n        {\n          \"type\": \"escape_sequence\",\n          \"named\": true\n        },\n        {\n          \"type\": \"interpolation\",\n          \"named\": true\n        },\n        {\n          \"type\": \"string_content\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"destructured_left_assignment\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": true,\n      \"required\": true,\n      \"types\": [\n        {\n          \"type\": \"_lhs\",\n          \"named\": true\n        },\n        {\n          \"type\": \"destructured_left_assignment\",\n          \"named\": true\n        },\n        {\n          \"type\": \"rest_assignment\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"destructured_parameter\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": true,\n      \"required\": false,\n      \"types\": [\n        {\n          \"type\": \"block_parameter\",\n          \"named\": true\n        },\n        {\n          \"type\": \"destructured_parameter\",\n          \"named\": true\n        },\n        {\n          \"type\": \"forward_parameter\",\n          \"named\": true\n        },\n        {\n          \"type\": \"hash_splat_nil\",\n          \"named\": true\n        },\n        {\n          \"type\": \"hash_splat_parameter\",\n          \"named\": true\n        },\n        {\n          \"type\": \"identifier\",\n          \"named\": true\n        },\n        {\n          \"type\": \"keyword_parameter\",\n          \"named\": true\n        },\n        {\n          \"type\": \"optional_parameter\",\n          \"named\": true\n        },\n        {\n          \"type\": \"splat_parameter\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"do\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": true,\n      \"required\": false,\n      \"types\": [\n        {\n          \"type\": \"_statement\",\n          \"named\": true\n        },\n        {\n          \"type\": \"empty_statement\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"do_block\",\n    \"named\": true,\n    \"fields\": {\n      \"body\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"body_statement\",\n            \"named\": true\n          }\n        ]\n      },\n      \"parameters\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"block_parameters\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"element_reference\",\n    \"named\": true,\n    \"fields\": {\n      \"block\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"block\",\n            \"named\": true\n          },\n          {\n            \"type\": \"do_block\",\n            \"named\": true\n          }\n        ]\n      },\n      \"object\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"_primary\",\n            \"named\": true\n          }\n        ]\n      }\n    },\n    \"children\": {\n      \"multiple\": true,\n      \"required\": false,\n      \"types\": [\n        {\n          \"type\": \"_expression\",\n          \"named\": true\n        },\n        {\n          \"type\": \"block_argument\",\n          \"named\": true\n        },\n        {\n          \"type\": \"forward_argument\",\n          \"named\": true\n        },\n        {\n          \"type\": \"hash_splat_argument\",\n          \"named\": true\n        },\n        {\n          \"type\": \"pair\",\n          \"named\": true\n        },\n        {\n          \"type\": \"splat_argument\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"else\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": true,\n      \"required\": false,\n      \"types\": [\n        {\n          \"type\": \"_statement\",\n          \"named\": true\n        },\n        {\n          \"type\": \"empty_statement\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"elsif\",\n    \"named\": true,\n    \"fields\": {\n      \"alternative\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"else\",\n            \"named\": true\n          },\n          {\n            \"type\": \"elsif\",\n            \"named\": true\n          }\n        ]\n      },\n      \"condition\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"_statement\",\n            \"named\": true\n          }\n        ]\n      },\n      \"consequence\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"then\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"empty_statement\",\n    \"named\": true,\n    \"fields\": {}\n  },\n  {\n    \"type\": \"end_block\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": true,\n      \"required\": false,\n      \"types\": [\n        {\n          \"type\": \"_statement\",\n          \"named\": true\n        },\n        {\n          \"type\": \"empty_statement\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"ensure\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": true,\n      \"required\": false,\n      \"types\": [\n        {\n          \"type\": \"_statement\",\n          \"named\": true\n        },\n        {\n          \"type\": \"empty_statement\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"exception_variable\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": false,\n      \"required\": true,\n      \"types\": [\n        {\n          \"type\": \"_lhs\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"exceptions\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": true,\n      \"required\": true,\n      \"types\": [\n        {\n          \"type\": \"_arg\",\n          \"named\": true\n        },\n        {\n          \"type\": \"splat_argument\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"expression_reference_pattern\",\n    \"named\": true,\n    \"fields\": {\n      \"value\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"_expression\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"find_pattern\",\n    \"named\": true,\n    \"fields\": {\n      \"class\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"_pattern_constant\",\n            \"named\": true\n          }\n        ]\n      }\n    },\n    \"children\": {\n      \"multiple\": true,\n      \"required\": true,\n      \"types\": [\n        {\n          \"type\": \"_pattern_expr\",\n          \"named\": true\n        },\n        {\n          \"type\": \"splat_parameter\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"for\",\n    \"named\": true,\n    \"fields\": {\n      \"body\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"do\",\n            \"named\": true\n          }\n        ]\n      },\n      \"pattern\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"_lhs\",\n            \"named\": true\n          },\n          {\n            \"type\": \"left_assignment_list\",\n            \"named\": true\n          }\n        ]\n      },\n      \"value\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"in\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"forward_argument\",\n    \"named\": true,\n    \"fields\": {}\n  },\n  {\n    \"type\": \"forward_parameter\",\n    \"named\": true,\n    \"fields\": {}\n  },\n  {\n    \"type\": \"hash\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": true,\n      \"required\": false,\n      \"types\": [\n        {\n          \"type\": \"hash_splat_argument\",\n          \"named\": true\n        },\n        {\n          \"type\": \"pair\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"hash_key_symbol\",\n    \"named\": true,\n    \"fields\": {}\n  },\n  {\n    \"type\": \"hash_pattern\",\n    \"named\": true,\n    \"fields\": {\n      \"class\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"_pattern_constant\",\n            \"named\": true\n          }\n        ]\n      }\n    },\n    \"children\": {\n      \"multiple\": true,\n      \"required\": false,\n      \"types\": [\n        {\n          \"type\": \"hash_splat_nil\",\n          \"named\": true\n        },\n        {\n          \"type\": \"hash_splat_parameter\",\n          \"named\": true\n        },\n        {\n          \"type\": \"keyword_pattern\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"hash_splat_argument\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": false,\n      \"required\": false,\n      \"types\": [\n        {\n          \"type\": \"_arg\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"hash_splat_nil\",\n    \"named\": true,\n    \"fields\": {}\n  },\n  {\n    \"type\": \"hash_splat_parameter\",\n    \"named\": true,\n    \"fields\": {\n      \"name\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"identifier\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"heredoc_body\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": true,\n      \"required\": true,\n      \"types\": [\n        {\n          \"type\": \"escape_sequence\",\n          \"named\": true\n        },\n        {\n          \"type\": \"heredoc_content\",\n          \"named\": true\n        },\n        {\n          \"type\": \"heredoc_end\",\n          \"named\": true\n        },\n        {\n          \"type\": \"interpolation\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"identifier\",\n    \"named\": true,\n    \"fields\": {}\n  },\n  {\n    \"type\": \"if\",\n    \"named\": true,\n    \"fields\": {\n      \"alternative\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"else\",\n            \"named\": true\n          },\n          {\n            \"type\": \"elsif\",\n            \"named\": true\n          }\n        ]\n      },\n      \"condition\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"_statement\",\n            \"named\": true\n          }\n        ]\n      },\n      \"consequence\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"then\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"if_guard\",\n    \"named\": true,\n    \"fields\": {\n      \"condition\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"_expression\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"if_modifier\",\n    \"named\": true,\n    \"fields\": {\n      \"body\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"_statement\",\n            \"named\": true\n          }\n        ]\n      },\n      \"condition\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"_expression\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"in\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": false,\n      \"required\": true,\n      \"types\": [\n        {\n          \"type\": \"_arg\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"in_clause\",\n    \"named\": true,\n    \"fields\": {\n      \"body\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"then\",\n            \"named\": true\n          }\n        ]\n      },\n      \"guard\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"if_guard\",\n            \"named\": true\n          },\n          {\n            \"type\": \"unless_guard\",\n            \"named\": true\n          }\n        ]\n      },\n      \"pattern\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"_pattern_top_expr_body\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"interpolation\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": true,\n      \"required\": false,\n      \"types\": [\n        {\n          \"type\": \"_nonlocal_variable\",\n          \"named\": true\n        },\n        {\n          \"type\": \"_statement\",\n          \"named\": true\n        },\n        {\n          \"type\": \"empty_statement\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"keyword_parameter\",\n    \"named\": true,\n    \"fields\": {\n      \"name\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"identifier\",\n            \"named\": true\n          }\n        ]\n      },\n      \"value\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"_arg\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"keyword_pattern\",\n    \"named\": true,\n    \"fields\": {\n      \"key\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"hash_key_symbol\",\n            \"named\": true\n          },\n          {\n            \"type\": \"string\",\n            \"named\": true\n          }\n        ]\n      },\n      \"value\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"_pattern_expr\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"lambda\",\n    \"named\": true,\n    \"fields\": {\n      \"body\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"block\",\n            \"named\": true\n          },\n          {\n            \"type\": \"do_block\",\n            \"named\": true\n          }\n        ]\n      },\n      \"parameters\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"lambda_parameters\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"lambda_parameters\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": true,\n      \"required\": false,\n      \"types\": [\n        {\n          \"type\": \"block_parameter\",\n          \"named\": true\n        },\n        {\n          \"type\": \"destructured_parameter\",\n          \"named\": true\n        },\n        {\n          \"type\": \"forward_parameter\",\n          \"named\": true\n        },\n        {\n          \"type\": \"hash_splat_nil\",\n          \"named\": true\n        },\n        {\n          \"type\": \"hash_splat_parameter\",\n          \"named\": true\n        },\n        {\n          \"type\": \"identifier\",\n          \"named\": true\n        },\n        {\n          \"type\": \"keyword_parameter\",\n          \"named\": true\n        },\n        {\n          \"type\": \"optional_parameter\",\n          \"named\": true\n        },\n        {\n          \"type\": \"splat_parameter\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"left_assignment_list\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": true,\n      \"required\": true,\n      \"types\": [\n        {\n          \"type\": \"_lhs\",\n          \"named\": true\n        },\n        {\n          \"type\": \"destructured_left_assignment\",\n          \"named\": true\n        },\n        {\n          \"type\": \"rest_assignment\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"match_pattern\",\n    \"named\": true,\n    \"fields\": {\n      \"pattern\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"_pattern_top_expr_body\",\n            \"named\": true\n          }\n        ]\n      },\n      \"value\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"_arg\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"method\",\n    \"named\": true,\n    \"fields\": {\n      \"body\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"_arg\",\n            \"named\": true\n          },\n          {\n            \"type\": \"body_statement\",\n            \"named\": true\n          },\n          {\n            \"type\": \"rescue_modifier\",\n            \"named\": true\n          }\n        ]\n      },\n      \"name\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"_method_name\",\n            \"named\": true\n          }\n        ]\n      },\n      \"parameters\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"method_parameters\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"method_parameters\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": true,\n      \"required\": false,\n      \"types\": [\n        {\n          \"type\": \"block_parameter\",\n          \"named\": true\n        },\n        {\n          \"type\": \"destructured_parameter\",\n          \"named\": true\n        },\n        {\n          \"type\": \"forward_parameter\",\n          \"named\": true\n        },\n        {\n          \"type\": \"hash_splat_nil\",\n          \"named\": true\n        },\n        {\n          \"type\": \"hash_splat_parameter\",\n          \"named\": true\n        },\n        {\n          \"type\": \"identifier\",\n          \"named\": true\n        },\n        {\n          \"type\": \"keyword_parameter\",\n          \"named\": true\n        },\n        {\n          \"type\": \"optional_parameter\",\n          \"named\": true\n        },\n        {\n          \"type\": \"splat_parameter\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"module\",\n    \"named\": true,\n    \"fields\": {\n      \"body\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"body_statement\",\n            \"named\": true\n          }\n        ]\n      },\n      \"name\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"constant\",\n            \"named\": true\n          },\n          {\n            \"type\": \"scope_resolution\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"next\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": false,\n      \"required\": false,\n      \"types\": [\n        {\n          \"type\": \"argument_list\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"nil\",\n    \"named\": true,\n    \"fields\": {}\n  },\n  {\n    \"type\": \"operator\",\n    \"named\": true,\n    \"fields\": {}\n  },\n  {\n    \"type\": \"operator_assignment\",\n    \"named\": true,\n    \"fields\": {\n      \"left\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"_lhs\",\n            \"named\": true\n          }\n        ]\n      },\n      \"operator\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"%=\",\n            \"named\": false\n          },\n          {\n            \"type\": \"&&=\",\n            \"named\": false\n          },\n          {\n            \"type\": \"&=\",\n            \"named\": false\n          },\n          {\n            \"type\": \"**=\",\n            \"named\": false\n          },\n          {\n            \"type\": \"*=\",\n            \"named\": false\n          },\n          {\n            \"type\": \"+=\",\n            \"named\": false\n          },\n          {\n            \"type\": \"-=\",\n            \"named\": false\n          },\n          {\n            \"type\": \"/=\",\n            \"named\": false\n          },\n          {\n            \"type\": \"<<=\",\n            \"named\": false\n          },\n          {\n            \"type\": \">>=\",\n            \"named\": false\n          },\n          {\n            \"type\": \"^=\",\n            \"named\": false\n          },\n          {\n            \"type\": \"|=\",\n            \"named\": false\n          },\n          {\n            \"type\": \"||=\",\n            \"named\": false\n          }\n        ]\n      },\n      \"right\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"_expression\",\n            \"named\": true\n          },\n          {\n            \"type\": \"rescue_modifier\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"optional_parameter\",\n    \"named\": true,\n    \"fields\": {\n      \"name\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"identifier\",\n            \"named\": true\n          }\n        ]\n      },\n      \"value\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"_arg\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"pair\",\n    \"named\": true,\n    \"fields\": {\n      \"key\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"_arg\",\n            \"named\": true\n          },\n          {\n            \"type\": \"hash_key_symbol\",\n            \"named\": true\n          },\n          {\n            \"type\": \"string\",\n            \"named\": true\n          }\n        ]\n      },\n      \"value\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"_arg\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"parenthesized_pattern\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": false,\n      \"required\": true,\n      \"types\": [\n        {\n          \"type\": \"_pattern_expr\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"parenthesized_statements\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": true,\n      \"required\": false,\n      \"types\": [\n        {\n          \"type\": \"_statement\",\n          \"named\": true\n        },\n        {\n          \"type\": \"empty_statement\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"pattern\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": false,\n      \"required\": true,\n      \"types\": [\n        {\n          \"type\": \"_arg\",\n          \"named\": true\n        },\n        {\n          \"type\": \"splat_argument\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"program\",\n    \"named\": true,\n    \"root\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": true,\n      \"required\": false,\n      \"types\": [\n        {\n          \"type\": \"_statement\",\n          \"named\": true\n        },\n        {\n          \"type\": \"empty_statement\",\n          \"named\": true\n        },\n        {\n          \"type\": \"uninterpreted\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"range\",\n    \"named\": true,\n    \"fields\": {\n      \"begin\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"_arg\",\n            \"named\": true\n          },\n          {\n            \"type\": \"_pattern_primitive\",\n            \"named\": true\n          }\n        ]\n      },\n      \"end\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"_arg\",\n            \"named\": true\n          },\n          {\n            \"type\": \"_pattern_primitive\",\n            \"named\": true\n          }\n        ]\n      },\n      \"operator\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"..\",\n            \"named\": false\n          },\n          {\n            \"type\": \"...\",\n            \"named\": false\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"rational\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": false,\n      \"required\": true,\n      \"types\": [\n        {\n          \"type\": \"float\",\n          \"named\": true\n        },\n        {\n          \"type\": \"integer\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"redo\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": false,\n      \"required\": false,\n      \"types\": [\n        {\n          \"type\": \"argument_list\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"regex\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": true,\n      \"required\": false,\n      \"types\": [\n        {\n          \"type\": \"escape_sequence\",\n          \"named\": true\n        },\n        {\n          \"type\": \"interpolation\",\n          \"named\": true\n        },\n        {\n          \"type\": \"string_content\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"rescue\",\n    \"named\": true,\n    \"fields\": {\n      \"body\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"then\",\n            \"named\": true\n          }\n        ]\n      },\n      \"exceptions\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"exceptions\",\n            \"named\": true\n          }\n        ]\n      },\n      \"variable\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"exception_variable\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"rescue_modifier\",\n    \"named\": true,\n    \"fields\": {\n      \"body\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"_arg\",\n            \"named\": true\n          },\n          {\n            \"type\": \"_statement\",\n            \"named\": true\n          }\n        ]\n      },\n      \"handler\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"_expression\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"rest_assignment\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": false,\n      \"required\": false,\n      \"types\": [\n        {\n          \"type\": \"_lhs\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"retry\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": false,\n      \"required\": false,\n      \"types\": [\n        {\n          \"type\": \"argument_list\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"return\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": false,\n      \"required\": false,\n      \"types\": [\n        {\n          \"type\": \"argument_list\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"right_assignment_list\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": true,\n      \"required\": true,\n      \"types\": [\n        {\n          \"type\": \"_arg\",\n          \"named\": true\n        },\n        {\n          \"type\": \"splat_argument\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"scope_resolution\",\n    \"named\": true,\n    \"fields\": {\n      \"name\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"constant\",\n            \"named\": true\n          }\n        ]\n      },\n      \"scope\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"_pattern_constant\",\n            \"named\": true\n          },\n          {\n            \"type\": \"_primary\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"setter\",\n    \"named\": true,\n    \"fields\": {\n      \"name\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"identifier\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"singleton_class\",\n    \"named\": true,\n    \"fields\": {\n      \"body\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"body_statement\",\n            \"named\": true\n          }\n        ]\n      },\n      \"value\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"_arg\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"singleton_method\",\n    \"named\": true,\n    \"fields\": {\n      \"body\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"_arg\",\n            \"named\": true\n          },\n          {\n            \"type\": \"body_statement\",\n            \"named\": true\n          },\n          {\n            \"type\": \"rescue_modifier\",\n            \"named\": true\n          }\n        ]\n      },\n      \"name\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"_method_name\",\n            \"named\": true\n          }\n        ]\n      },\n      \"object\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"_arg\",\n            \"named\": true\n          },\n          {\n            \"type\": \"_variable\",\n            \"named\": true\n          }\n        ]\n      },\n      \"parameters\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"method_parameters\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"splat_argument\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": false,\n      \"required\": false,\n      \"types\": [\n        {\n          \"type\": \"_arg\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"splat_parameter\",\n    \"named\": true,\n    \"fields\": {\n      \"name\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"identifier\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"string\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": true,\n      \"required\": false,\n      \"types\": [\n        {\n          \"type\": \"escape_sequence\",\n          \"named\": true\n        },\n        {\n          \"type\": \"interpolation\",\n          \"named\": true\n        },\n        {\n          \"type\": \"string_content\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"string_array\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": true,\n      \"required\": false,\n      \"types\": [\n        {\n          \"type\": \"bare_string\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"subshell\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": true,\n      \"required\": false,\n      \"types\": [\n        {\n          \"type\": \"escape_sequence\",\n          \"named\": true\n        },\n        {\n          \"type\": \"interpolation\",\n          \"named\": true\n        },\n        {\n          \"type\": \"string_content\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"superclass\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": false,\n      \"required\": true,\n      \"types\": [\n        {\n          \"type\": \"_expression\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"symbol_array\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": true,\n      \"required\": false,\n      \"types\": [\n        {\n          \"type\": \"bare_symbol\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"test_pattern\",\n    \"named\": true,\n    \"fields\": {\n      \"pattern\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"_pattern_top_expr_body\",\n            \"named\": true\n          }\n        ]\n      },\n      \"value\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"_arg\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"then\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": true,\n      \"required\": false,\n      \"types\": [\n        {\n          \"type\": \"_statement\",\n          \"named\": true\n        },\n        {\n          \"type\": \"empty_statement\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"unary\",\n    \"named\": true,\n    \"fields\": {\n      \"operand\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"_expression\",\n            \"named\": true\n          },\n          {\n            \"type\": \"_simple_numeric\",\n            \"named\": true\n          },\n          {\n            \"type\": \"parenthesized_statements\",\n            \"named\": true\n          }\n        ]\n      },\n      \"operator\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"!\",\n            \"named\": false\n          },\n          {\n            \"type\": \"+\",\n            \"named\": false\n          },\n          {\n            \"type\": \"-\",\n            \"named\": false\n          },\n          {\n            \"type\": \"defined?\",\n            \"named\": false\n          },\n          {\n            \"type\": \"not\",\n            \"named\": false\n          },\n          {\n            \"type\": \"~\",\n            \"named\": false\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"undef\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": true,\n      \"required\": true,\n      \"types\": [\n        {\n          \"type\": \"_method_name\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"unless\",\n    \"named\": true,\n    \"fields\": {\n      \"alternative\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"else\",\n            \"named\": true\n          },\n          {\n            \"type\": \"elsif\",\n            \"named\": true\n          }\n        ]\n      },\n      \"condition\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"_statement\",\n            \"named\": true\n          }\n        ]\n      },\n      \"consequence\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"then\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"unless_guard\",\n    \"named\": true,\n    \"fields\": {\n      \"condition\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"_expression\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"unless_modifier\",\n    \"named\": true,\n    \"fields\": {\n      \"body\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"_statement\",\n            \"named\": true\n          }\n        ]\n      },\n      \"condition\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"_expression\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"until\",\n    \"named\": true,\n    \"fields\": {\n      \"body\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"do\",\n            \"named\": true\n          }\n        ]\n      },\n      \"condition\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"_statement\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"until_modifier\",\n    \"named\": true,\n    \"fields\": {\n      \"body\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"_statement\",\n            \"named\": true\n          }\n        ]\n      },\n      \"condition\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"_expression\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"variable_reference_pattern\",\n    \"named\": true,\n    \"fields\": {\n      \"name\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"_nonlocal_variable\",\n            \"named\": true\n          },\n          {\n            \"type\": \"identifier\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"when\",\n    \"named\": true,\n    \"fields\": {\n      \"body\": {\n        \"multiple\": false,\n        \"required\": false,\n        \"types\": [\n          {\n            \"type\": \"then\",\n            \"named\": true\n          }\n        ]\n      },\n      \"pattern\": {\n        \"multiple\": true,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"pattern\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"while\",\n    \"named\": true,\n    \"fields\": {\n      \"body\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"do\",\n            \"named\": true\n          }\n        ]\n      },\n      \"condition\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"_statement\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"while_modifier\",\n    \"named\": true,\n    \"fields\": {\n      \"body\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"_statement\",\n            \"named\": true\n          }\n        ]\n      },\n      \"condition\": {\n        \"multiple\": false,\n        \"required\": true,\n        \"types\": [\n          {\n            \"type\": \"_expression\",\n            \"named\": true\n          }\n        ]\n      }\n    }\n  },\n  {\n    \"type\": \"yield\",\n    \"named\": true,\n    \"fields\": {},\n    \"children\": {\n      \"multiple\": false,\n      \"required\": false,\n      \"types\": [\n        {\n          \"type\": \"argument_list\",\n          \"named\": true\n        }\n      ]\n    }\n  },\n  {\n    \"type\": \"!\",\n    \"named\": false\n  },\n  {\n    \"type\": \"!=\",\n    \"named\": false\n  },\n  {\n    \"type\": \"!~\",\n    \"named\": false\n  },\n  {\n    \"type\": \"\\\"\",\n    \"named\": false\n  },\n  {\n    \"type\": \"#{\",\n    \"named\": false\n  },\n  {\n    \"type\": \"%\",\n    \"named\": false\n  },\n  {\n    \"type\": \"%=\",\n    \"named\": false\n  },\n  {\n    \"type\": \"%i(\",\n    \"named\": false\n  },\n  {\n    \"type\": \"%w(\",\n    \"named\": false\n  },\n  {\n    \"type\": \"&\",\n    \"named\": false\n  },\n  {\n    \"type\": \"&&\",\n    \"named\": false\n  },\n  {\n    \"type\": \"&&=\",\n    \"named\": false\n  },\n  {\n    \"type\": \"&.\",\n    \"named\": false\n  },\n  {\n    \"type\": \"&=\",\n    \"named\": false\n  },\n  {\n    \"type\": \"(\",\n    \"named\": false\n  },\n  {\n    \"type\": \")\",\n    \"named\": false\n  },\n  {\n    \"type\": \"*\",\n    \"named\": false\n  },\n  {\n    \"type\": \"**\",\n    \"named\": false\n  },\n  {\n    \"type\": \"**=\",\n    \"named\": false\n  },\n  {\n    \"type\": \"*=\",\n    \"named\": false\n  },\n  {\n    \"type\": \"+\",\n    \"named\": false\n  },\n  {\n    \"type\": \"+=\",\n    \"named\": false\n  },\n  {\n    \"type\": \"+@\",\n    \"named\": false\n  },\n  {\n    \"type\": \",\",\n    \"named\": false\n  },\n  {\n    \"type\": \"-\",\n    \"named\": false\n  },\n  {\n    \"type\": \"-=\",\n    \"named\": false\n  },\n  {\n    \"type\": \"->\",\n    \"named\": false\n  },\n  {\n    \"type\": \"-@\",\n    \"named\": false\n  },\n  {\n    \"type\": \".\",\n    \"named\": false\n  },\n  {\n    \"type\": \"..\",\n    \"named\": false\n  },\n  {\n    \"type\": \"...\",\n    \"named\": false\n  },\n  {\n    \"type\": \"/\",\n    \"named\": false\n  },\n  {\n    \"type\": \"/=\",\n    \"named\": false\n  },\n  {\n    \"type\": \":\",\n    \"named\": false\n  },\n  {\n    \"type\": \":\\\"\",\n    \"named\": false\n  },\n  {\n    \"type\": \"::\",\n    \"named\": false\n  },\n  {\n    \"type\": \";\",\n    \"named\": false\n  },\n  {\n    \"type\": \"<\",\n    \"named\": false\n  },\n  {\n    \"type\": \"<<\",\n    \"named\": false\n  },\n  {\n    \"type\": \"<<=\",\n    \"named\": false\n  },\n  {\n    \"type\": \"<=\",\n    \"named\": false\n  },\n  {\n    \"type\": \"<=>\",\n    \"named\": false\n  },\n  {\n    \"type\": \"=\",\n    \"named\": false\n  },\n  {\n    \"type\": \"==\",\n    \"named\": false\n  },\n  {\n    \"type\": \"===\",\n    \"named\": false\n  },\n  {\n    \"type\": \"=>\",\n    \"named\": false\n  },\n  {\n    \"type\": \"=~\",\n    \"named\": false\n  },\n  {\n    \"type\": \">\",\n    \"named\": false\n  },\n  {\n    \"type\": \">=\",\n    \"named\": false\n  },\n  {\n    \"type\": \">>\",\n    \"named\": false\n  },\n  {\n    \"type\": \">>=\",\n    \"named\": false\n  },\n  {\n    \"type\": \"?\",\n    \"named\": false\n  },\n  {\n    \"type\": \"BEGIN\",\n    \"named\": false\n  },\n  {\n    \"type\": \"END\",\n    \"named\": false\n  },\n  {\n    \"type\": \"[\",\n    \"named\": false\n  },\n  {\n    \"type\": \"[]\",\n    \"named\": false\n  },\n  {\n    \"type\": \"[]=\",\n    \"named\": false\n  },\n  {\n    \"type\": \"]\",\n    \"named\": false\n  },\n  {\n    \"type\": \"^\",\n    \"named\": false\n  },\n  {\n    \"type\": \"^=\",\n    \"named\": false\n  },\n  {\n    \"type\": \"`\",\n    \"named\": false\n  },\n  {\n    \"type\": \"alias\",\n    \"named\": false\n  },\n  {\n    \"type\": \"and\",\n    \"named\": false\n  },\n  {\n    \"type\": \"begin\",\n    \"named\": false\n  },\n  {\n    \"type\": \"break\",\n    \"named\": false\n  },\n  {\n    \"type\": \"case\",\n    \"named\": false\n  },\n  {\n    \"type\": \"character\",\n    \"named\": true\n  },\n  {\n    \"type\": \"class\",\n    \"named\": false\n  },\n  {\n    \"type\": \"class_variable\",\n    \"named\": true\n  },\n  {\n    \"type\": \"comment\",\n    \"named\": true\n  },\n  {\n    \"type\": \"def\",\n    \"named\": false\n  },\n  {\n    \"type\": \"defined?\",\n    \"named\": false\n  },\n  {\n    \"type\": \"do\",\n    \"named\": false\n  },\n  {\n    \"type\": \"else\",\n    \"named\": false\n  },\n  {\n    \"type\": \"elsif\",\n    \"named\": false\n  },\n  {\n    \"type\": \"encoding\",\n    \"named\": true\n  },\n  {\n    \"type\": \"end\",\n    \"named\": false\n  },\n  {\n    \"type\": \"ensure\",\n    \"named\": false\n  },\n  {\n    \"type\": \"escape_sequence\",\n    \"named\": true\n  },\n  {\n    \"type\": \"false\",\n    \"named\": true\n  },\n  {\n    \"type\": \"file\",\n    \"named\": true\n  },\n  {\n    \"type\": \"float\",\n    \"named\": true\n  },\n  {\n    \"type\": \"for\",\n    \"named\": false\n  },\n  {\n    \"type\": \"global_variable\",\n    \"named\": true\n  },\n  {\n    \"type\": \"heredoc_beginning\",\n    \"named\": true\n  },\n  {\n    \"type\": \"heredoc_content\",\n    \"named\": true\n  },\n  {\n    \"type\": \"heredoc_end\",\n    \"named\": true\n  },\n  {\n    \"type\": \"i\",\n    \"named\": false\n  },\n  {\n    \"type\": \"if\",\n    \"named\": false\n  },\n  {\n    \"type\": \"in\",\n    \"named\": false\n  },\n  {\n    \"type\": \"instance_variable\",\n    \"named\": true\n  },\n  {\n    \"type\": \"integer\",\n    \"named\": true\n  },\n  {\n    \"type\": \"line\",\n    \"named\": true\n  },\n  {\n    \"type\": \"module\",\n    \"named\": false\n  },\n  {\n    \"type\": \"next\",\n    \"named\": false\n  },\n  {\n    \"type\": \"nil\",\n    \"named\": false\n  },\n  {\n    \"type\": \"not\",\n    \"named\": false\n  },\n  {\n    \"type\": \"or\",\n    \"named\": false\n  },\n  {\n    \"type\": \"r\",\n    \"named\": false\n  },\n  {\n    \"type\": \"redo\",\n    \"named\": false\n  },\n  {\n    \"type\": \"rescue\",\n    \"named\": false\n  },\n  {\n    \"type\": \"retry\",\n    \"named\": false\n  },\n  {\n    \"type\": \"return\",\n    \"named\": false\n  },\n  {\n    \"type\": \"ri\",\n    \"named\": false\n  },\n  {\n    \"type\": \"self\",\n    \"named\": true\n  },\n  {\n    \"type\": \"simple_symbol\",\n    \"named\": true\n  },\n  {\n    \"type\": \"string_content\",\n    \"named\": true\n  },\n  {\n    \"type\": \"super\",\n    \"named\": true\n  },\n  {\n    \"type\": \"then\",\n    \"named\": false\n  },\n  {\n    \"type\": \"true\",\n    \"named\": true\n  },\n  {\n    \"type\": \"undef\",\n    \"named\": false\n  },\n  {\n    \"type\": \"uninterpreted\",\n    \"named\": true\n  },\n  {\n    \"type\": \"unless\",\n    \"named\": false\n  },\n  {\n    \"type\": \"until\",\n    \"named\": false\n  },\n  {\n    \"type\": \"when\",\n    \"named\": false\n  },\n  {\n    \"type\": \"while\",\n    \"named\": false\n  },\n  {\n    \"type\": \"yield\",\n    \"named\": false\n  },\n  {\n    \"type\": \"{\",\n    \"named\": false\n  },\n  {\n    \"type\": \"|\",\n    \"named\": false\n  },\n  {\n    \"type\": \"|=\",\n    \"named\": false\n  },\n  {\n    \"type\": \"||\",\n    \"named\": false\n  },\n  {\n    \"type\": \"||=\",\n    \"named\": false\n  },\n  {\n    \"type\": \"}\",\n    \"named\": false\n  },\n  {\n    \"type\": \"~\",\n    \"named\": false\n  },\n  {\n    \"type\": \"~@\",\n    \"named\": false\n  }\n]"
  },
  {
    "path": "src/scanner.c",
    "content": "#include \"tree_sitter/alloc.h\"\n#include \"tree_sitter/array.h\"\n#include \"tree_sitter/parser.h\"\n\n#include <string.h>\n#include <wctype.h>\n\ntypedef enum {\n    LINE_BREAK,\n    NO_LINE_BREAK,\n\n    // Delimited literals\n    SIMPLE_SYMBOL,\n    STRING_START,\n    SYMBOL_START,\n    SUBSHELL_START,\n    REGEX_START,\n    STRING_ARRAY_START,\n    SYMBOL_ARRAY_START,\n    HEREDOC_BODY_START,\n    STRING_CONTENT,\n    HEREDOC_CONTENT,\n    STRING_END,\n    HEREDOC_BODY_END,\n    HEREDOC_START,\n\n    // Whitespace-sensitive tokens\n    FORWARD_SLASH,\n    BLOCK_AMPERSAND,\n    SPLAT_STAR,\n    UNARY_MINUS,\n    UNARY_MINUS_NUM,\n    BINARY_MINUS,\n    BINARY_STAR,\n    SINGLETON_CLASS_LEFT_ANGLE_LEFT_ANGLE,\n    HASH_KEY_SYMBOL,\n    IDENTIFIER_SUFFIX,\n    CONSTANT_SUFFIX,\n    HASH_SPLAT_STAR_STAR,\n    BINARY_STAR_STAR,\n    ELEMENT_REFERENCE_BRACKET,\n    SHORT_INTERPOLATION,\n\n    NONE\n} TokenType;\n\ntypedef Array(char) String;\n\ntypedef struct {\n    TokenType type;\n    int32_t open_delimiter;\n    int32_t close_delimiter;\n    int32_t nesting_depth;\n    bool allows_interpolation;\n} Literal;\n\ntypedef struct {\n    String word;\n    bool end_word_indentation_allowed;\n    bool allows_interpolation;\n    bool started;\n} Heredoc;\n\ntypedef struct {\n    bool has_leading_whitespace;\n    Array(Literal) literal_stack;\n    Array(Heredoc) open_heredocs;\n} Scanner;\n\nconst char NON_IDENTIFIER_CHARS[] = {\n    '\\0', '\\n', '\\r', '\\t', ' ', ':', ';', '`',  '\"', '\\'', '@', '$', '#', '.', ',', '|', '^', '&',\n    '<',  '=',  '>',  '+',  '-', '*', '/', '\\\\', '%', '?',  '!', '~', '(', ')', '[', ']', '{', '}',\n};\n\nstatic inline void skip(Scanner *scanner, TSLexer *lexer) {\n    scanner->has_leading_whitespace = true;\n    lexer->advance(lexer, true);\n}\n\nstatic inline void advance(TSLexer *lexer) { lexer->advance(lexer, false); }\n\nstatic inline void reset(Scanner *scanner) {\n    array_delete(&scanner->literal_stack);\n    for (uint32_t i = 0; i < scanner->open_heredocs.size; i++) {\n        array_delete(&array_get(&scanner->open_heredocs, i)->word);\n    }\n    array_delete(&scanner->open_heredocs);\n}\n\nstatic inline unsigned serialize(Scanner *scanner, char *buffer) {\n    unsigned size = 0;\n\n    if (scanner->literal_stack.size * 5 + 2 >= TREE_SITTER_SERIALIZATION_BUFFER_SIZE) {\n        return 0;\n    }\n\n    buffer[size++] = (char)scanner->literal_stack.size;\n    for (uint32_t i = 0; i < scanner->literal_stack.size; i++) {\n        Literal *literal = array_get(&scanner->literal_stack, i);\n        buffer[size++] = literal->type;\n        buffer[size++] = (char)literal->open_delimiter;\n        buffer[size++] = (char)literal->close_delimiter;\n        buffer[size++] = (char)literal->nesting_depth;\n        buffer[size++] = (char)literal->allows_interpolation;\n    }\n\n    buffer[size++] = (char)scanner->open_heredocs.size;\n    for (uint32_t i = 0; i < scanner->open_heredocs.size; i++) {\n        Heredoc *heredoc = array_get(&scanner->open_heredocs, i);\n        if (size + 3 + sizeof(uint32_t) + heredoc->word.size >= TREE_SITTER_SERIALIZATION_BUFFER_SIZE) {\n            return 0;\n        }\n        buffer[size++] = (char)heredoc->end_word_indentation_allowed;\n        buffer[size++] = (char)heredoc->allows_interpolation;\n        buffer[size++] = (char)heredoc->started;\n        memcpy(&buffer[size], &heredoc->word.size, sizeof(uint32_t));\n        size += sizeof(uint32_t);\n        memcpy(&buffer[size], heredoc->word.contents, heredoc->word.size);\n        size += heredoc->word.size;\n    }\n\n    return size;\n}\n\nstatic inline void deserialize(Scanner *scanner, const char *buffer, unsigned length) {\n    unsigned size = 0;\n    scanner->has_leading_whitespace = false;\n    reset(scanner);\n\n    if (length == 0) {\n        return;\n    }\n\n    uint8_t literal_depth = buffer[size++];\n    for (unsigned j = 0; j < literal_depth; j++) {\n        Literal literal = {0};\n        literal.type = (TokenType)(buffer[size++]);\n        literal.open_delimiter = (unsigned char)buffer[size++];\n        literal.close_delimiter = (unsigned char)buffer[size++];\n        literal.nesting_depth = (unsigned char)buffer[size++];\n        literal.allows_interpolation = buffer[size++];\n        array_push(&scanner->literal_stack, literal);\n    }\n\n    uint8_t open_heredoc_count = buffer[size++];\n    for (unsigned j = 0; j < open_heredoc_count; j++) {\n        Heredoc heredoc = {0};\n        heredoc.end_word_indentation_allowed = buffer[size++];\n        heredoc.allows_interpolation = buffer[size++];\n        heredoc.started = buffer[size++];\n\n        heredoc.word = (String)array_new();\n        uint32_t word_length;\n        memcpy(&word_length, &buffer[size], sizeof(uint32_t));\n        size += sizeof(uint32_t);\n        array_reserve(&heredoc.word, word_length);\n        memcpy(heredoc.word.contents, &buffer[size], word_length);\n        heredoc.word.size = word_length;\n        size += word_length;\n        array_push(&scanner->open_heredocs, heredoc);\n    }\n\n    assert(size == length);\n}\n\nstatic inline bool scan_whitespace(Scanner *scanner, TSLexer *lexer, const bool *valid_symbols) {\n    bool heredoc_body_start_is_valid = scanner->open_heredocs.size > 0 && !scanner->open_heredocs.contents[0].started &&\n                                       valid_symbols[HEREDOC_BODY_START];\n    bool crossed_newline = false;\n\n    for (;;) {\n        if (!valid_symbols[NO_LINE_BREAK] && valid_symbols[LINE_BREAK] && lexer->is_at_included_range_start(lexer)) {\n            lexer->mark_end(lexer);\n            lexer->result_symbol = LINE_BREAK;\n            return true;\n        }\n\n        switch (lexer->lookahead) {\n            case ' ':\n            case '\\t':\n                skip(scanner, lexer);\n                break;\n            case '\\r':\n                if (heredoc_body_start_is_valid) {\n                    lexer->result_symbol = HEREDOC_BODY_START;\n                    scanner->open_heredocs.contents[0].started = true;\n                    return true;\n                } else {\n                    skip(scanner, lexer);\n                    break;\n                }\n            case '\\n':\n                if (heredoc_body_start_is_valid) {\n                    lexer->result_symbol = HEREDOC_BODY_START;\n                    scanner->open_heredocs.contents[0].started = true;\n                    return true;\n                } else if (!valid_symbols[NO_LINE_BREAK] && valid_symbols[LINE_BREAK] && !crossed_newline) {\n                    lexer->mark_end(lexer);\n                    advance(lexer);\n                    crossed_newline = true;\n                } else {\n                    skip(scanner, lexer);\n                }\n                break;\n            case '\\\\':\n                advance(lexer);\n                if (lexer->lookahead == '\\r') {\n                    skip(scanner, lexer);\n                }\n                if (iswspace(lexer->lookahead)) {\n                    skip(scanner, lexer);\n                } else {\n                    return false;\n                }\n                break;\n            default:\n                if (crossed_newline) {\n                    if (lexer->lookahead != '.' && lexer->lookahead != '&' && lexer->lookahead != '#') {\n                        lexer->result_symbol = LINE_BREAK;\n                    } else if (lexer->lookahead == '.') {\n                        // Don't return LINE_BREAK for the call operator (`.`) but do return one for range\n                        // operators\n                        // (`..` and `...`)\n                        advance(lexer);\n                        if (!lexer->eof(lexer) && lexer->lookahead == '.') {\n                            lexer->result_symbol = LINE_BREAK;\n                        } else {\n                            return false;\n                        }\n                    }\n                }\n                return true;\n        }\n    }\n}\n\nstatic inline bool scan_operator(TSLexer *lexer) {\n    switch (lexer->lookahead) {\n        // <, <=, <<, <=>\n        case '<':\n            advance(lexer);\n            if (lexer->lookahead == '<') {\n                advance(lexer);\n            } else if (lexer->lookahead == '=') {\n                advance(lexer);\n                if (lexer->lookahead == '>') {\n                    advance(lexer);\n                }\n            }\n            return true;\n\n        // >, >=, >>\n        case '>':\n            advance(lexer);\n            if (lexer->lookahead == '>' || lexer->lookahead == '=') {\n                advance(lexer);\n            }\n            return true;\n\n        // ==, ===, =~\n        case '=':\n            advance(lexer);\n            if (lexer->lookahead == '~') {\n                advance(lexer);\n                return true;\n            }\n            if (lexer->lookahead == '=') {\n                advance(lexer);\n                if (lexer->lookahead == '=') {\n                    advance(lexer);\n                }\n                return true;\n            }\n            return false;\n\n        // +, -, ~, +@, -@, ~@\n        case '+':\n        case '-':\n        case '~':\n            advance(lexer);\n            if (lexer->lookahead == '@') {\n                advance(lexer);\n            }\n            return true;\n\n        // ..\n        case '.':\n            advance(lexer);\n            if (lexer->lookahead == '.') {\n                advance(lexer);\n                return true;\n            }\n            return false;\n\n        // &, ^, |, /, %`\n        case '&':\n        case '^':\n        case '|':\n        case '/':\n        case '%':\n        case '`':\n            advance(lexer);\n            return true;\n\n        // !, !=, !~\n        case '!':\n            advance(lexer);\n            if (lexer->lookahead == '=' || lexer->lookahead == '~') {\n                advance(lexer);\n            }\n            return true;\n\n        // *, **\n        case '*':\n            advance(lexer);\n            if (lexer->lookahead == '*') {\n                advance(lexer);\n            }\n            return true;\n\n        // [], []=\n        case '[':\n            advance(lexer);\n            if (lexer->lookahead == ']') {\n                advance(lexer);\n            } else {\n                return false;\n            }\n            if (lexer->lookahead == '=') {\n                advance(lexer);\n            }\n            return true;\n\n        default:\n            return false;\n    }\n}\n\nstatic inline bool is_iden_char(char c) {\n    return memchr(&NON_IDENTIFIER_CHARS, c, sizeof(NON_IDENTIFIER_CHARS)) == NULL;\n}\n\nstatic inline bool scan_symbol_identifier(TSLexer *lexer) {\n    if (lexer->lookahead == '@') {\n        advance(lexer);\n        if (lexer->lookahead == '@') {\n            advance(lexer);\n        }\n    } else if (lexer->lookahead == '$') {\n        advance(lexer);\n    }\n\n    if (is_iden_char((char)lexer->lookahead)) {\n        advance(lexer);\n    } else if (!scan_operator(lexer)) {\n        return false;\n    }\n\n    while (is_iden_char((char)lexer->lookahead)) {\n        advance(lexer);\n    }\n\n    if (lexer->lookahead == '?' || lexer->lookahead == '!') {\n        advance(lexer);\n    }\n\n    if (lexer->lookahead == '=') {\n        lexer->mark_end(lexer);\n        advance(lexer);\n        if (lexer->lookahead != '>') {\n            lexer->mark_end(lexer);\n        }\n    }\n\n    return true;\n}\n\nstatic inline bool scan_open_delimiter(Scanner *scanner, TSLexer *lexer, Literal *literal, const bool *valid_symbols) {\n    switch (lexer->lookahead) {\n        case '\"':\n            literal->type = STRING_START;\n            literal->open_delimiter = literal->close_delimiter = lexer->lookahead;\n            literal->allows_interpolation = true;\n            advance(lexer);\n            return true;\n\n        case '\\'':\n            literal->type = STRING_START;\n            literal->open_delimiter = literal->close_delimiter = lexer->lookahead;\n            literal->allows_interpolation = false;\n            advance(lexer);\n            return true;\n\n        case '`':\n            if (!valid_symbols[SUBSHELL_START]) {\n                return false;\n            }\n            literal->type = SUBSHELL_START;\n            literal->open_delimiter = literal->close_delimiter = lexer->lookahead;\n            literal->allows_interpolation = true;\n            advance(lexer);\n            return true;\n\n        case '/':\n            if (!valid_symbols[REGEX_START]) {\n                return false;\n            }\n            literal->type = REGEX_START;\n            literal->open_delimiter = literal->close_delimiter = lexer->lookahead;\n            literal->allows_interpolation = true;\n            advance(lexer);\n            if (valid_symbols[FORWARD_SLASH]) {\n                if (!scanner->has_leading_whitespace) {\n                    return false;\n                }\n                if (lexer->lookahead == ' ' || lexer->lookahead == '\\t' || lexer->lookahead == '\\n' ||\n                    lexer->lookahead == '\\r') {\n                    return false;\n                }\n                if (lexer->lookahead == '=') {\n                    return false;\n                }\n            }\n            return true;\n\n        case '%':\n            advance(lexer);\n\n            switch (lexer->lookahead) {\n                case 's':\n                    if (!valid_symbols[SIMPLE_SYMBOL]) {\n                        return false;\n                    }\n                    literal->type = SYMBOL_START;\n                    literal->allows_interpolation = false;\n                    advance(lexer);\n                    break;\n\n                case 'r':\n                    if (!valid_symbols[REGEX_START]) {\n                        return false;\n                    }\n                    literal->type = REGEX_START;\n                    literal->allows_interpolation = true;\n                    advance(lexer);\n                    break;\n\n                case 'x':\n                    if (!valid_symbols[SUBSHELL_START]) {\n                        return false;\n                    }\n                    literal->type = SUBSHELL_START;\n                    literal->allows_interpolation = true;\n                    advance(lexer);\n                    break;\n\n                case 'q':\n                    if (!valid_symbols[STRING_START]) {\n                        return false;\n                    }\n                    literal->type = STRING_START;\n                    literal->allows_interpolation = false;\n                    advance(lexer);\n                    break;\n\n                case 'Q':\n                    if (!valid_symbols[STRING_START]) {\n                        return false;\n                    }\n                    literal->type = STRING_START;\n                    literal->allows_interpolation = true;\n                    advance(lexer);\n                    break;\n\n                case 'w':\n                    if (!valid_symbols[STRING_ARRAY_START]) {\n                        return false;\n                    }\n                    literal->type = STRING_ARRAY_START;\n                    literal->allows_interpolation = false;\n                    advance(lexer);\n                    break;\n\n                case 'i':\n                    if (!valid_symbols[SYMBOL_ARRAY_START]) {\n                        return false;\n                    }\n                    literal->type = SYMBOL_ARRAY_START;\n                    literal->allows_interpolation = false;\n                    advance(lexer);\n                    break;\n\n                case 'W':\n                    if (!valid_symbols[STRING_ARRAY_START]) {\n                        return false;\n                    }\n                    literal->type = STRING_ARRAY_START;\n                    literal->allows_interpolation = true;\n                    advance(lexer);\n                    break;\n\n                case 'I':\n                    if (!valid_symbols[SYMBOL_ARRAY_START]) {\n                        return false;\n                    }\n                    literal->type = SYMBOL_ARRAY_START;\n                    literal->allows_interpolation = true;\n                    advance(lexer);\n                    break;\n\n                default:\n                    if (!valid_symbols[STRING_START]) {\n                        return false;\n                    }\n                    literal->type = STRING_START;\n                    literal->allows_interpolation = true;\n                    break;\n            }\n\n            switch (lexer->lookahead) {\n                case '(':\n                    literal->open_delimiter = '(';\n                    literal->close_delimiter = ')';\n                    break;\n\n                case '[':\n                    literal->open_delimiter = '[';\n                    literal->close_delimiter = ']';\n                    break;\n\n                case '{':\n                    literal->open_delimiter = '{';\n                    literal->close_delimiter = '}';\n                    break;\n\n                case '<':\n                    literal->open_delimiter = '<';\n                    literal->close_delimiter = '>';\n                    break;\n\n                case '\\r':\n                case '\\n':\n                case ' ':\n                case '\\t':\n                    // If the `/` operator is valid, then so is the `%` operator, which means\n                    // that a `%` followed by whitespace should be considered an operator,\n                    // not a percent string.\n                    if (valid_symbols[FORWARD_SLASH]) {\n                        return false;\n                    }\n                    break;\n\n                case '|':\n                case '!':\n                case '#':\n                case '/':\n                case '\\\\':\n                case '@':\n                case '$':\n                case '%':\n                case '^':\n                case '&':\n                case '*':\n                case ')':\n                case ']':\n                case '}':\n                case '>':\n                // TODO: Implement %= as external rule and re-enable = as a valid\n                // unbalanced delimiter. That will be necessary due to ambiguity\n                // between &= assignment operator and %=...= as string\n                // content delimiter.\n                // case '=':\n                case '+':\n                case '-':\n                case '~':\n                case '`':\n                case ',':\n                case '.':\n                case '?':\n                case ':':\n                case ';':\n                case '_':\n                case '\"':\n                case '\\'':\n                    literal->open_delimiter = lexer->lookahead;\n                    literal->close_delimiter = lexer->lookahead;\n                    break;\n                default:\n                    return false;\n            }\n\n            advance(lexer);\n            return true;\n\n        default:\n            return false;\n    }\n}\n\nstatic inline void scan_heredoc_word(TSLexer *lexer, Heredoc *heredoc) {\n    String word = array_new();\n    int32_t quote = 0;\n\n    switch (lexer->lookahead) {\n        case '\\'':\n        case '\"':\n        case '`':\n            quote = lexer->lookahead;\n            advance(lexer);\n            while (lexer->lookahead != quote && !lexer->eof(lexer)) {\n                array_push(&word, lexer->lookahead);\n                advance(lexer);\n            }\n            advance(lexer);\n            break;\n\n        default:\n            if (iswalnum(lexer->lookahead) || lexer->lookahead == '_') {\n                array_push(&word, lexer->lookahead);\n                advance(lexer);\n                while (iswalnum(lexer->lookahead) || lexer->lookahead == '_') {\n                    array_push(&word, lexer->lookahead);\n                    advance(lexer);\n                }\n            }\n            break;\n    }\n\n    heredoc->word = word;\n    heredoc->allows_interpolation = quote != '\\'';\n}\n\nstatic inline bool scan_short_interpolation(TSLexer *lexer, const bool has_content, const TSSymbol content_symbol) {\n    char start = (char)lexer->lookahead;\n    if (start == '@' || start == '$') {\n        if (has_content) {\n            lexer->result_symbol = content_symbol;\n            return true;\n        }\n        lexer->mark_end(lexer);\n        advance(lexer);\n        bool is_short_interpolation = false;\n        if (start == '$') {\n            if (strchr(\"!@&`'+~=/\\\\,;.<>*$?:\\\"\", lexer->lookahead) != NULL) {\n                is_short_interpolation = true;\n            } else {\n                if (lexer->lookahead == '-') {\n                    advance(lexer);\n                    is_short_interpolation = iswalpha(lexer->lookahead) || lexer->lookahead == '_';\n                } else {\n                    is_short_interpolation = iswalnum(lexer->lookahead) || lexer->lookahead == '_';\n                }\n            }\n        }\n        if (start == '@') {\n            if (lexer->lookahead == '@') {\n                advance(lexer);\n            }\n            is_short_interpolation = is_iden_char((char)lexer->lookahead) && !iswdigit(lexer->lookahead);\n        }\n\n        if (is_short_interpolation) {\n            lexer->result_symbol = SHORT_INTERPOLATION;\n            return true;\n        }\n    }\n    return false;\n}\n\nstatic inline bool scan_heredoc_content(Scanner *scanner, TSLexer *lexer) {\n    Heredoc *heredoc = array_get(&scanner->open_heredocs, 0);\n    size_t position_in_word = 0;\n    bool look_for_heredoc_end = true;\n    bool has_content = false;\n\n    for (;;) {\n        if (position_in_word == heredoc->word.size) {\n            if (!has_content) {\n                lexer->mark_end(lexer);\n            }\n            while (lexer->lookahead == ' ' || lexer->lookahead == '\\t') {\n                advance(lexer);\n            }\n            if (lexer->lookahead == '\\n' || lexer->lookahead == '\\r') {\n                if (has_content) {\n                    lexer->result_symbol = HEREDOC_CONTENT;\n                } else {\n                    array_delete(&heredoc->word);\n                    array_erase(&scanner->open_heredocs, 0);\n                    lexer->result_symbol = HEREDOC_BODY_END;\n                }\n                return true;\n            }\n            has_content = true;\n            position_in_word = 0;\n        }\n\n        if (lexer->eof(lexer)) {\n            lexer->mark_end(lexer);\n            if (has_content) {\n                lexer->result_symbol = HEREDOC_CONTENT;\n            } else {\n                array_delete(&heredoc->word);\n                array_erase(&scanner->open_heredocs, 0);\n                lexer->result_symbol = HEREDOC_BODY_END;\n            }\n            return true;\n        }\n\n        if (lexer->lookahead == *array_get(&heredoc->word, position_in_word) && look_for_heredoc_end) {\n            advance(lexer);\n            position_in_word++;\n        } else {\n            position_in_word = 0;\n            look_for_heredoc_end = false;\n\n            if (heredoc->allows_interpolation && lexer->lookahead == '\\\\') {\n                if (has_content) {\n                    lexer->result_symbol = HEREDOC_CONTENT;\n                    return true;\n                }\n                return false;\n            }\n\n            if (heredoc->allows_interpolation && lexer->lookahead == '#') {\n                lexer->mark_end(lexer);\n                advance(lexer);\n                if (lexer->lookahead == '{') {\n                    if (has_content) {\n                        lexer->result_symbol = HEREDOC_CONTENT;\n                        return true;\n                    }\n                    return false;\n                }\n                if (scan_short_interpolation(lexer, has_content, HEREDOC_CONTENT)) {\n                    return true;\n                }\n            } else if (lexer->lookahead == '\\r' || lexer->lookahead == '\\n') {\n                if (lexer->lookahead == '\\r') {\n                    advance(lexer);\n                    if (lexer->lookahead == '\\n') {\n                        advance(lexer);\n                    }\n                } else {\n                    advance(lexer);\n                }\n                has_content = true;\n                look_for_heredoc_end = true;\n                while (lexer->lookahead == ' ' || lexer->lookahead == '\\t') {\n                    advance(lexer);\n                    if (!heredoc->end_word_indentation_allowed) {\n                        look_for_heredoc_end = false;\n                    }\n                }\n                lexer->mark_end(lexer);\n            } else {\n                has_content = true;\n                advance(lexer);\n                lexer->mark_end(lexer);\n            }\n        }\n    }\n}\n\nstatic inline bool scan_literal_content(Scanner *scanner, TSLexer *lexer) {\n    Literal *literal = array_back(&scanner->literal_stack);\n    bool has_content = false;\n    bool stop_on_space = literal->type == SYMBOL_ARRAY_START || literal->type == STRING_ARRAY_START;\n\n    for (;;) {\n        if (stop_on_space && iswspace(lexer->lookahead)) {\n            if (has_content) {\n                lexer->mark_end(lexer);\n                lexer->result_symbol = STRING_CONTENT;\n                return true;\n            }\n            return false;\n        }\n        if (lexer->lookahead == literal->close_delimiter) {\n            lexer->mark_end(lexer);\n            if (literal->nesting_depth == 1) {\n                if (has_content) {\n                    lexer->result_symbol = STRING_CONTENT;\n                } else {\n                    advance(lexer);\n                    if (literal->type == REGEX_START) {\n                        while (iswlower(lexer->lookahead)) {\n                            advance(lexer);\n                        }\n                    }\n                    array_pop(&scanner->literal_stack);\n                    lexer->result_symbol = STRING_END;\n                    lexer->mark_end(lexer);\n                }\n                return true;\n            }\n            literal->nesting_depth--;\n            advance(lexer);\n\n        } else if (lexer->lookahead == literal->open_delimiter) {\n            literal->nesting_depth++;\n            advance(lexer);\n        } else if (literal->allows_interpolation && lexer->lookahead == '#') {\n            lexer->mark_end(lexer);\n            advance(lexer);\n            if (lexer->lookahead == '{') {\n                if (has_content) {\n                    lexer->result_symbol = STRING_CONTENT;\n                    return true;\n                }\n                return false;\n            }\n            if (scan_short_interpolation(lexer, has_content, STRING_CONTENT)) {\n                return true;\n            }\n        } else if (lexer->lookahead == '\\\\') {\n            if (literal->allows_interpolation) {\n                if (has_content) {\n                    lexer->mark_end(lexer);\n                    lexer->result_symbol = STRING_CONTENT;\n                    return true;\n                }\n                return false;\n            }\n            advance(lexer);\n            advance(lexer);\n\n        } else if (lexer->eof(lexer)) {\n            advance(lexer);\n            lexer->mark_end(lexer);\n            return false;\n        } else {\n            advance(lexer);\n        }\n\n        has_content = true;\n    }\n}\n\nstatic inline bool scan(Scanner *scanner, TSLexer *lexer, const bool *valid_symbols) {\n    scanner->has_leading_whitespace = false;\n\n    // Contents of literals, which match any character except for some close delimiter\n    if (!valid_symbols[STRING_START]) {\n        if ((valid_symbols[STRING_CONTENT] || valid_symbols[STRING_END]) && scanner->literal_stack.size > 0) {\n            return scan_literal_content(scanner, lexer);\n        }\n        if ((valid_symbols[HEREDOC_CONTENT] || valid_symbols[HEREDOC_BODY_END]) && scanner->open_heredocs.size > 0) {\n            return scan_heredoc_content(scanner, lexer);\n        }\n    }\n\n    // Whitespace\n    lexer->result_symbol = NONE;\n    if (!scan_whitespace(scanner, lexer, valid_symbols)) {\n        return false;\n    }\n    if (lexer->result_symbol != NONE) {\n        return true;\n    }\n\n    switch (lexer->lookahead) {\n        case '&':\n            if (valid_symbols[BLOCK_AMPERSAND]) {\n                advance(lexer);\n                if (lexer->lookahead != '&' && lexer->lookahead != '.' && lexer->lookahead != '=' &&\n                    !iswspace(lexer->lookahead)) {\n                    lexer->result_symbol = BLOCK_AMPERSAND;\n                    return true;\n                }\n                return false;\n            }\n            break;\n\n        case '<':\n            if (valid_symbols[SINGLETON_CLASS_LEFT_ANGLE_LEFT_ANGLE]) {\n                advance(lexer);\n                if (lexer->lookahead == '<') {\n                    advance(lexer);\n                    lexer->result_symbol = SINGLETON_CLASS_LEFT_ANGLE_LEFT_ANGLE;\n                    return true;\n                }\n                return false;\n            }\n            break;\n\n        case '*':\n            if (valid_symbols[SPLAT_STAR] || valid_symbols[BINARY_STAR] || valid_symbols[HASH_SPLAT_STAR_STAR] ||\n                valid_symbols[BINARY_STAR_STAR]) {\n                advance(lexer);\n                if (lexer->lookahead == '=') {\n                    return false;\n                }\n                if (lexer->lookahead == '*') {\n                    if (valid_symbols[HASH_SPLAT_STAR_STAR] || valid_symbols[BINARY_STAR_STAR]) {\n                        advance(lexer);\n                        if (lexer->lookahead == '=') {\n                            return false;\n                        }\n                        if (valid_symbols[BINARY_STAR_STAR] && !scanner->has_leading_whitespace) {\n                            lexer->result_symbol = BINARY_STAR_STAR;\n                            return true;\n                        }\n                        if (valid_symbols[HASH_SPLAT_STAR_STAR] && !iswspace(lexer->lookahead)) {\n                            lexer->result_symbol = HASH_SPLAT_STAR_STAR;\n                            return true;\n                        }\n                        if (valid_symbols[BINARY_STAR_STAR]) {\n                            lexer->result_symbol = BINARY_STAR_STAR;\n                            return true;\n                        }\n                        if (valid_symbols[HASH_SPLAT_STAR_STAR]) {\n                            lexer->result_symbol = HASH_SPLAT_STAR_STAR;\n                            return true;\n                        }\n                        return false;\n                    }\n                    return false;\n                }\n                if (valid_symbols[BINARY_STAR] && !scanner->has_leading_whitespace) {\n                    lexer->result_symbol = BINARY_STAR;\n                    return true;\n                }\n                if (valid_symbols[SPLAT_STAR] && !iswspace(lexer->lookahead)) {\n                    lexer->result_symbol = SPLAT_STAR;\n                    return true;\n                }\n                if (valid_symbols[BINARY_STAR]) {\n                    lexer->result_symbol = BINARY_STAR;\n                    return true;\n                }\n                if (valid_symbols[SPLAT_STAR]) {\n                    lexer->result_symbol = SPLAT_STAR;\n                    return true;\n                }\n                return false;\n            }\n            break;\n\n        case '-':\n            if (valid_symbols[UNARY_MINUS] || valid_symbols[UNARY_MINUS_NUM] || valid_symbols[BINARY_MINUS]) {\n                advance(lexer);\n                if (lexer->lookahead != '=' && lexer->lookahead != '>') {\n                    if (valid_symbols[UNARY_MINUS_NUM] &&\n                        (!valid_symbols[BINARY_STAR] || scanner->has_leading_whitespace) &&\n                        iswdigit(lexer->lookahead)) {\n                        lexer->result_symbol = UNARY_MINUS_NUM;\n                        return true;\n                    }\n                    if (valid_symbols[UNARY_MINUS] && scanner->has_leading_whitespace && !iswspace(lexer->lookahead)) {\n                        lexer->result_symbol = UNARY_MINUS;\n                    } else if (valid_symbols[BINARY_MINUS]) {\n                        lexer->result_symbol = BINARY_MINUS;\n                    } else {\n                        lexer->result_symbol = UNARY_MINUS;\n                    }\n                    return true;\n                }\n                return false;\n            }\n            break;\n\n        case ':':\n            if (valid_symbols[SYMBOL_START]) {\n                Literal literal = {0};\n                literal.type = SYMBOL_START;\n                literal.nesting_depth = 1;\n                advance(lexer);\n\n                switch (lexer->lookahead) {\n                    case '\"':\n                        advance(lexer);\n                        literal.open_delimiter = '\"';\n                        literal.close_delimiter = '\"';\n                        literal.allows_interpolation = true;\n                        array_push(&scanner->literal_stack, literal);\n                        lexer->result_symbol = SYMBOL_START;\n                        return true;\n\n                    case '\\'':\n                        advance(lexer);\n                        literal.open_delimiter = '\\'';\n                        literal.close_delimiter = '\\'';\n                        literal.allows_interpolation = false;\n                        array_push(&scanner->literal_stack, literal);\n                        lexer->result_symbol = SYMBOL_START;\n                        return true;\n\n                    default:\n                        if (scan_symbol_identifier(lexer)) {\n                            lexer->result_symbol = SIMPLE_SYMBOL;\n                            return true;\n                        }\n                }\n\n                return false;\n            }\n            break;\n\n        case '[':\n            // Treat a square bracket as an element reference if either:\n            // * the bracket is not preceded by any whitespace\n            // * an arbitrary expression is not valid at the current position.\n            if (valid_symbols[ELEMENT_REFERENCE_BRACKET] &&\n                (!scanner->has_leading_whitespace || !valid_symbols[STRING_START])) {\n                advance(lexer);\n                lexer->result_symbol = ELEMENT_REFERENCE_BRACKET;\n                return true;\n            }\n            break;\n\n        default:\n            break;\n    }\n\n    // Open delimiters for literals\n    if (((valid_symbols[HASH_KEY_SYMBOL] || valid_symbols[IDENTIFIER_SUFFIX]) &&\n         (iswalpha(lexer->lookahead) || lexer->lookahead == '_')) ||\n        (valid_symbols[CONSTANT_SUFFIX] && iswupper(lexer->lookahead))) {\n        TokenType validIdentifierSymbol = iswupper(lexer->lookahead) ? CONSTANT_SUFFIX : IDENTIFIER_SUFFIX;\n        while (iswalnum(lexer->lookahead) || lexer->lookahead == '_') {\n            advance(lexer);\n        }\n\n        if (valid_symbols[HASH_KEY_SYMBOL] && lexer->lookahead == ':') {\n            lexer->mark_end(lexer);\n            advance(lexer);\n            if (lexer->lookahead != ':') {\n                lexer->result_symbol = HASH_KEY_SYMBOL;\n                return true;\n            }\n        } else if (valid_symbols[validIdentifierSymbol] && lexer->lookahead == '!') {\n            advance(lexer);\n            if (lexer->lookahead != '=') {\n                lexer->result_symbol = validIdentifierSymbol;\n                return true;\n            }\n        }\n\n        return false;\n    }\n\n    // Open delimiters for literals\n    if (valid_symbols[STRING_START]) {\n        Literal literal = {0};\n        literal.nesting_depth = 1;\n\n        if (lexer->lookahead == '<') {\n            advance(lexer);\n            if (lexer->lookahead != '<') {\n                return false;\n            }\n            advance(lexer);\n\n            Heredoc heredoc = {0};\n            if (lexer->lookahead == '-' || lexer->lookahead == '~') {\n                advance(lexer);\n                heredoc.end_word_indentation_allowed = true;\n            }\n\n            scan_heredoc_word(lexer, &heredoc);\n            if (heredoc.word.size == 0) {\n                array_delete(&heredoc.word);\n                return false;\n            }\n            array_push(&scanner->open_heredocs, heredoc);\n            lexer->result_symbol = HEREDOC_START;\n            return true;\n        }\n\n        if (scan_open_delimiter(scanner, lexer, &literal, valid_symbols)) {\n            array_push(&scanner->literal_stack, literal);\n            lexer->result_symbol = literal.type;\n            return true;\n        }\n        return false;\n    }\n\n    return false;\n}\n\nvoid *tree_sitter_ruby_external_scanner_create() {\n    Scanner *scanner = (Scanner *)ts_calloc(1, sizeof(Scanner));\n    return scanner;\n}\n\nbool tree_sitter_ruby_external_scanner_scan(void *payload, TSLexer *lexer, const bool *valid_symbols) {\n    Scanner *scanner = (Scanner *)payload;\n    return scan(scanner, lexer, valid_symbols);\n}\n\nunsigned tree_sitter_ruby_external_scanner_serialize(void *payload, char *buffer) {\n    Scanner *scanner = (Scanner *)payload;\n    return serialize(scanner, buffer);\n}\n\nvoid tree_sitter_ruby_external_scanner_deserialize(void *payload, const char *buffer, unsigned length) {\n    Scanner *scanner = (Scanner *)payload;\n    deserialize(scanner, buffer, length);\n}\n\nvoid tree_sitter_ruby_external_scanner_destroy(void *payload) {\n    Scanner *scanner = (Scanner *)payload;\n    for (uint32_t i = 0; i < scanner->open_heredocs.size; i++) {\n        array_delete(&array_get(&scanner->open_heredocs, i)->word);\n    }\n    array_delete(&scanner->open_heredocs);\n    array_delete(&scanner->literal_stack);\n    ts_free(scanner);\n}\n"
  },
  {
    "path": "src/tree_sitter/alloc.h",
    "content": "#ifndef TREE_SITTER_ALLOC_H_\n#define TREE_SITTER_ALLOC_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include <stdbool.h>\n#include <stdio.h>\n#include <stdlib.h>\n\n// Allow clients to override allocation functions\n#ifdef TREE_SITTER_REUSE_ALLOCATOR\n\nextern void *(*ts_current_malloc)(size_t size);\nextern void *(*ts_current_calloc)(size_t count, size_t size);\nextern void *(*ts_current_realloc)(void *ptr, size_t size);\nextern void (*ts_current_free)(void *ptr);\n\n#ifndef ts_malloc\n#define ts_malloc  ts_current_malloc\n#endif\n#ifndef ts_calloc\n#define ts_calloc  ts_current_calloc\n#endif\n#ifndef ts_realloc\n#define ts_realloc ts_current_realloc\n#endif\n#ifndef ts_free\n#define ts_free    ts_current_free\n#endif\n\n#else\n\n#ifndef ts_malloc\n#define ts_malloc  malloc\n#endif\n#ifndef ts_calloc\n#define ts_calloc  calloc\n#endif\n#ifndef ts_realloc\n#define ts_realloc realloc\n#endif\n#ifndef ts_free\n#define ts_free    free\n#endif\n\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif // TREE_SITTER_ALLOC_H_\n"
  },
  {
    "path": "src/tree_sitter/array.h",
    "content": "#ifndef TREE_SITTER_ARRAY_H_\n#define TREE_SITTER_ARRAY_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include \"./alloc.h\"\n\n#include <assert.h>\n#include <stdbool.h>\n#include <stdint.h>\n#include <stdlib.h>\n#include <string.h>\n\n#ifdef _MSC_VER\n#pragma warning(disable : 4101)\n#elif defined(__GNUC__) || defined(__clang__)\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wunused-variable\"\n#endif\n\n#define Array(T)       \\\n  struct {             \\\n    T *contents;       \\\n    uint32_t size;     \\\n    uint32_t capacity; \\\n  }\n\n/// Initialize an array.\n#define array_init(self) \\\n  ((self)->size = 0, (self)->capacity = 0, (self)->contents = NULL)\n\n/// Create an empty array.\n#define array_new() \\\n  { NULL, 0, 0 }\n\n/// Get a pointer to the element at a given `index` in the array.\n#define array_get(self, _index) \\\n  (assert((uint32_t)(_index) < (self)->size), &(self)->contents[_index])\n\n/// Get a pointer to the first element in the array.\n#define array_front(self) array_get(self, 0)\n\n/// Get a pointer to the last element in the array.\n#define array_back(self) array_get(self, (self)->size - 1)\n\n/// Clear the array, setting its size to zero. Note that this does not free any\n/// memory allocated for the array's contents.\n#define array_clear(self) ((self)->size = 0)\n\n/// Reserve `new_capacity` elements of space in the array. If `new_capacity` is\n/// less than the array's current capacity, this function has no effect.\n#define array_reserve(self, new_capacity) \\\n  _array__reserve((Array *)(self), array_elem_size(self), new_capacity)\n\n/// Free any memory allocated for this array. Note that this does not free any\n/// memory allocated for the array's contents.\n#define array_delete(self) _array__delete((Array *)(self))\n\n/// Push a new `element` onto the end of the array.\n#define array_push(self, element)                            \\\n  (_array__grow((Array *)(self), 1, array_elem_size(self)), \\\n   (self)->contents[(self)->size++] = (element))\n\n/// Increase the array's size by `count` elements.\n/// New elements are zero-initialized.\n#define array_grow_by(self, count) \\\n  do { \\\n    if ((count) == 0) break; \\\n    _array__grow((Array *)(self), count, array_elem_size(self)); \\\n    memset((self)->contents + (self)->size, 0, (count) * array_elem_size(self)); \\\n    (self)->size += (count); \\\n  } while (0)\n\n/// Append all elements from one array to the end of another.\n#define array_push_all(self, other)                                       \\\n  array_extend((self), (other)->size, (other)->contents)\n\n/// Append `count` elements to the end of the array, reading their values from the\n/// `contents` pointer.\n#define array_extend(self, count, contents)                    \\\n  _array__splice(                                               \\\n    (Array *)(self), array_elem_size(self), (self)->size, \\\n    0, count,  contents                                        \\\n  )\n\n/// Remove `old_count` elements from the array starting at the given `index`. At\n/// the same index, insert `new_count` new elements, reading their values from the\n/// `new_contents` pointer.\n#define array_splice(self, _index, old_count, new_count, new_contents)  \\\n  _array__splice(                                                       \\\n    (Array *)(self), array_elem_size(self), _index,                \\\n    old_count, new_count, new_contents                                 \\\n  )\n\n/// Insert one `element` into the array at the given `index`.\n#define array_insert(self, _index, element) \\\n  _array__splice((Array *)(self), array_elem_size(self), _index, 0, 1, &(element))\n\n/// Remove one element from the array at the given `index`.\n#define array_erase(self, _index) \\\n  _array__erase((Array *)(self), array_elem_size(self), _index)\n\n/// Pop the last element off the array, returning the element by value.\n#define array_pop(self) ((self)->contents[--(self)->size])\n\n/// Assign the contents of one array to another, reallocating if necessary.\n#define array_assign(self, other) \\\n  _array__assign((Array *)(self), (const Array *)(other), array_elem_size(self))\n\n/// Swap one array with another\n#define array_swap(self, other) \\\n  _array__swap((Array *)(self), (Array *)(other))\n\n/// Get the size of the array contents\n#define array_elem_size(self) (sizeof *(self)->contents)\n\n/// Search a sorted array for a given `needle` value, using the given `compare`\n/// callback to determine the order.\n///\n/// If an existing element is found to be equal to `needle`, then the `index`\n/// out-parameter is set to the existing value's index, and the `exists`\n/// out-parameter is set to true. Otherwise, `index` is set to an index where\n/// `needle` should be inserted in order to preserve the sorting, and `exists`\n/// is set to false.\n#define array_search_sorted_with(self, compare, needle, _index, _exists) \\\n  _array__search_sorted(self, 0, compare, , needle, _index, _exists)\n\n/// Search a sorted array for a given `needle` value, using integer comparisons\n/// of a given struct field (specified with a leading dot) to determine the order.\n///\n/// See also `array_search_sorted_with`.\n#define array_search_sorted_by(self, field, needle, _index, _exists) \\\n  _array__search_sorted(self, 0, _compare_int, field, needle, _index, _exists)\n\n/// Insert a given `value` into a sorted array, using the given `compare`\n/// callback to determine the order.\n#define array_insert_sorted_with(self, compare, value) \\\n  do { \\\n    unsigned _index, _exists; \\\n    array_search_sorted_with(self, compare, &(value), &_index, &_exists); \\\n    if (!_exists) array_insert(self, _index, value); \\\n  } while (0)\n\n/// Insert a given `value` into a sorted array, using integer comparisons of\n/// a given struct field (specified with a leading dot) to determine the order.\n///\n/// See also `array_search_sorted_by`.\n#define array_insert_sorted_by(self, field, value) \\\n  do { \\\n    unsigned _index, _exists; \\\n    array_search_sorted_by(self, field, (value) field, &_index, &_exists); \\\n    if (!_exists) array_insert(self, _index, value); \\\n  } while (0)\n\n// Private\n\ntypedef Array(void) Array;\n\n/// This is not what you're looking for, see `array_delete`.\nstatic inline void _array__delete(Array *self) {\n  if (self->contents) {\n    ts_free(self->contents);\n    self->contents = NULL;\n    self->size = 0;\n    self->capacity = 0;\n  }\n}\n\n/// This is not what you're looking for, see `array_erase`.\nstatic inline void _array__erase(Array *self, size_t element_size,\n                                uint32_t index) {\n  assert(index < self->size);\n  char *contents = (char *)self->contents;\n  memmove(contents + index * element_size, contents + (index + 1) * element_size,\n          (self->size - index - 1) * element_size);\n  self->size--;\n}\n\n/// This is not what you're looking for, see `array_reserve`.\nstatic inline void _array__reserve(Array *self, size_t element_size, uint32_t new_capacity) {\n  if (new_capacity > self->capacity) {\n    if (self->contents) {\n      self->contents = ts_realloc(self->contents, new_capacity * element_size);\n    } else {\n      self->contents = ts_malloc(new_capacity * element_size);\n    }\n    self->capacity = new_capacity;\n  }\n}\n\n/// This is not what you're looking for, see `array_assign`.\nstatic inline void _array__assign(Array *self, const Array *other, size_t element_size) {\n  _array__reserve(self, element_size, other->size);\n  self->size = other->size;\n  memcpy(self->contents, other->contents, self->size * element_size);\n}\n\n/// This is not what you're looking for, see `array_swap`.\nstatic inline void _array__swap(Array *self, Array *other) {\n  Array swap = *other;\n  *other = *self;\n  *self = swap;\n}\n\n/// This is not what you're looking for, see `array_push` or `array_grow_by`.\nstatic inline void _array__grow(Array *self, uint32_t count, size_t element_size) {\n  uint32_t new_size = self->size + count;\n  if (new_size > self->capacity) {\n    uint32_t new_capacity = self->capacity * 2;\n    if (new_capacity < 8) new_capacity = 8;\n    if (new_capacity < new_size) new_capacity = new_size;\n    _array__reserve(self, element_size, new_capacity);\n  }\n}\n\n/// This is not what you're looking for, see `array_splice`.\nstatic inline void _array__splice(Array *self, size_t element_size,\n                                 uint32_t index, uint32_t old_count,\n                                 uint32_t new_count, const void *elements) {\n  uint32_t new_size = self->size + new_count - old_count;\n  uint32_t old_end = index + old_count;\n  uint32_t new_end = index + new_count;\n  assert(old_end <= self->size);\n\n  _array__reserve(self, element_size, new_size);\n\n  char *contents = (char *)self->contents;\n  if (self->size > old_end) {\n    memmove(\n      contents + new_end * element_size,\n      contents + old_end * element_size,\n      (self->size - old_end) * element_size\n    );\n  }\n  if (new_count > 0) {\n    if (elements) {\n      memcpy(\n        (contents + index * element_size),\n        elements,\n        new_count * element_size\n      );\n    } else {\n      memset(\n        (contents + index * element_size),\n        0,\n        new_count * element_size\n      );\n    }\n  }\n  self->size += new_count - old_count;\n}\n\n/// A binary search routine, based on Rust's `std::slice::binary_search_by`.\n/// This is not what you're looking for, see `array_search_sorted_with` or `array_search_sorted_by`.\n#define _array__search_sorted(self, start, compare, suffix, needle, _index, _exists) \\\n  do { \\\n    *(_index) = start; \\\n    *(_exists) = false; \\\n    uint32_t size = (self)->size - *(_index); \\\n    if (size == 0) break; \\\n    int comparison; \\\n    while (size > 1) { \\\n      uint32_t half_size = size / 2; \\\n      uint32_t mid_index = *(_index) + half_size; \\\n      comparison = compare(&((self)->contents[mid_index] suffix), (needle)); \\\n      if (comparison <= 0) *(_index) = mid_index; \\\n      size -= half_size; \\\n    } \\\n    comparison = compare(&((self)->contents[*(_index)] suffix), (needle)); \\\n    if (comparison == 0) *(_exists) = true; \\\n    else if (comparison < 0) *(_index) += 1; \\\n  } while (0)\n\n/// Helper macro for the `_sorted_by` routines below. This takes the left (existing)\n/// parameter by reference in order to work with the generic sorting function above.\n#define _compare_int(a, b) ((int)*(a) - (int)(b))\n\n#ifdef _MSC_VER\n#pragma warning(default : 4101)\n#elif defined(__GNUC__) || defined(__clang__)\n#pragma GCC diagnostic pop\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif  // TREE_SITTER_ARRAY_H_\n"
  },
  {
    "path": "src/tree_sitter/parser.h",
    "content": "#ifndef TREE_SITTER_PARSER_H_\n#define TREE_SITTER_PARSER_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include <stdbool.h>\n#include <stdint.h>\n#include <stdlib.h>\n\n#define ts_builtin_sym_error ((TSSymbol)-1)\n#define ts_builtin_sym_end 0\n#define TREE_SITTER_SERIALIZATION_BUFFER_SIZE 1024\n\n#ifndef TREE_SITTER_API_H_\ntypedef uint16_t TSStateId;\ntypedef uint16_t TSSymbol;\ntypedef uint16_t TSFieldId;\ntypedef struct TSLanguage TSLanguage;\n#endif\n\ntypedef struct {\n  TSFieldId field_id;\n  uint8_t child_index;\n  bool inherited;\n} TSFieldMapEntry;\n\ntypedef struct {\n  uint16_t index;\n  uint16_t length;\n} TSFieldMapSlice;\n\ntypedef struct {\n  bool visible;\n  bool named;\n  bool supertype;\n} TSSymbolMetadata;\n\ntypedef struct TSLexer TSLexer;\n\nstruct TSLexer {\n  int32_t lookahead;\n  TSSymbol result_symbol;\n  void (*advance)(TSLexer *, bool);\n  void (*mark_end)(TSLexer *);\n  uint32_t (*get_column)(TSLexer *);\n  bool (*is_at_included_range_start)(const TSLexer *);\n  bool (*eof)(const TSLexer *);\n  void (*log)(const TSLexer *, const char *, ...);\n};\n\ntypedef enum {\n  TSParseActionTypeShift,\n  TSParseActionTypeReduce,\n  TSParseActionTypeAccept,\n  TSParseActionTypeRecover,\n} TSParseActionType;\n\ntypedef union {\n  struct {\n    uint8_t type;\n    TSStateId state;\n    bool extra;\n    bool repetition;\n  } shift;\n  struct {\n    uint8_t type;\n    uint8_t child_count;\n    TSSymbol symbol;\n    int16_t dynamic_precedence;\n    uint16_t production_id;\n  } reduce;\n  uint8_t type;\n} TSParseAction;\n\ntypedef struct {\n  uint16_t lex_state;\n  uint16_t external_lex_state;\n} TSLexMode;\n\ntypedef union {\n  TSParseAction action;\n  struct {\n    uint8_t count;\n    bool reusable;\n  } entry;\n} TSParseActionEntry;\n\ntypedef struct {\n  int32_t start;\n  int32_t end;\n} TSCharacterRange;\n\nstruct TSLanguage {\n  uint32_t version;\n  uint32_t symbol_count;\n  uint32_t alias_count;\n  uint32_t token_count;\n  uint32_t external_token_count;\n  uint32_t state_count;\n  uint32_t large_state_count;\n  uint32_t production_id_count;\n  uint32_t field_count;\n  uint16_t max_alias_sequence_length;\n  const uint16_t *parse_table;\n  const uint16_t *small_parse_table;\n  const uint32_t *small_parse_table_map;\n  const TSParseActionEntry *parse_actions;\n  const char * const *symbol_names;\n  const char * const *field_names;\n  const TSFieldMapSlice *field_map_slices;\n  const TSFieldMapEntry *field_map_entries;\n  const TSSymbolMetadata *symbol_metadata;\n  const TSSymbol *public_symbol_map;\n  const uint16_t *alias_map;\n  const TSSymbol *alias_sequences;\n  const TSLexMode *lex_modes;\n  bool (*lex_fn)(TSLexer *, TSStateId);\n  bool (*keyword_lex_fn)(TSLexer *, TSStateId);\n  TSSymbol keyword_capture_token;\n  struct {\n    const bool *states;\n    const TSSymbol *symbol_map;\n    void *(*create)(void);\n    void (*destroy)(void *);\n    bool (*scan)(void *, TSLexer *, const bool *symbol_whitelist);\n    unsigned (*serialize)(void *, char *);\n    void (*deserialize)(void *, const char *, unsigned);\n  } external_scanner;\n  const TSStateId *primary_state_ids;\n};\n\nstatic inline bool set_contains(TSCharacterRange *ranges, uint32_t len, int32_t lookahead) {\n  uint32_t index = 0;\n  uint32_t size = len - index;\n  while (size > 1) {\n    uint32_t half_size = size / 2;\n    uint32_t mid_index = index + half_size;\n    TSCharacterRange *range = &ranges[mid_index];\n    if (lookahead >= range->start && lookahead <= range->end) {\n      return true;\n    } else if (lookahead > range->end) {\n      index = mid_index;\n    }\n    size -= half_size;\n  }\n  TSCharacterRange *range = &ranges[index];\n  return (lookahead >= range->start && lookahead <= range->end);\n}\n\n/*\n *  Lexer Macros\n */\n\n#ifdef _MSC_VER\n#define UNUSED __pragma(warning(suppress : 4101))\n#else\n#define UNUSED __attribute__((unused))\n#endif\n\n#define START_LEXER()           \\\n  bool result = false;          \\\n  bool skip = false;            \\\n  UNUSED                        \\\n  bool eof = false;             \\\n  int32_t lookahead;            \\\n  goto start;                   \\\n  next_state:                   \\\n  lexer->advance(lexer, skip);  \\\n  start:                        \\\n  skip = false;                 \\\n  lookahead = lexer->lookahead;\n\n#define ADVANCE(state_value) \\\n  {                          \\\n    state = state_value;     \\\n    goto next_state;         \\\n  }\n\n#define ADVANCE_MAP(...)                                              \\\n  {                                                                   \\\n    static const uint16_t map[] = { __VA_ARGS__ };                    \\\n    for (uint32_t i = 0; i < sizeof(map) / sizeof(map[0]); i += 2) {  \\\n      if (map[i] == lookahead) {                                      \\\n        state = map[i + 1];                                           \\\n        goto next_state;                                              \\\n      }                                                               \\\n    }                                                                 \\\n  }\n\n#define SKIP(state_value) \\\n  {                       \\\n    skip = true;          \\\n    state = state_value;  \\\n    goto next_state;      \\\n  }\n\n#define ACCEPT_TOKEN(symbol_value)     \\\n  result = true;                       \\\n  lexer->result_symbol = symbol_value; \\\n  lexer->mark_end(lexer);\n\n#define END_STATE() return result;\n\n/*\n *  Parse Table Macros\n */\n\n#define SMALL_STATE(id) ((id) - LARGE_STATE_COUNT)\n\n#define STATE(id) id\n\n#define ACTIONS(id) id\n\n#define SHIFT(state_value)            \\\n  {{                                  \\\n    .shift = {                        \\\n      .type = TSParseActionTypeShift, \\\n      .state = (state_value)          \\\n    }                                 \\\n  }}\n\n#define SHIFT_REPEAT(state_value)     \\\n  {{                                  \\\n    .shift = {                        \\\n      .type = TSParseActionTypeShift, \\\n      .state = (state_value),         \\\n      .repetition = true              \\\n    }                                 \\\n  }}\n\n#define SHIFT_EXTRA()                 \\\n  {{                                  \\\n    .shift = {                        \\\n      .type = TSParseActionTypeShift, \\\n      .extra = true                   \\\n    }                                 \\\n  }}\n\n#define REDUCE(symbol_name, children, precedence, prod_id) \\\n  {{                                                       \\\n    .reduce = {                                            \\\n      .type = TSParseActionTypeReduce,                     \\\n      .symbol = symbol_name,                               \\\n      .child_count = children,                             \\\n      .dynamic_precedence = precedence,                    \\\n      .production_id = prod_id                             \\\n    },                                                     \\\n  }}\n\n#define RECOVER()                    \\\n  {{                                 \\\n    .type = TSParseActionTypeRecover \\\n  }}\n\n#define ACCEPT_INPUT()              \\\n  {{                                \\\n    .type = TSParseActionTypeAccept \\\n  }}\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif  // TREE_SITTER_PARSER_H_\n"
  },
  {
    "path": "test/corpus/comments.txt",
    "content": "========\ncomments\n========\n\n# anything else here should be ignored\n\n---\n\n(program (comment))\n\n===================\nempty block comment\n===================\n\n=begin\n=end\n\n---\n\n(program (comment))\n\n======================\none-line block comment\n======================\n\n=begin\nwhatever\n=end\n\n---\n\n(program (comment))\n\n======================================\nblock comment with comment after begin\n======================================\n\n=begin rdoc\n=end\n\n---\n\n(program (comment))\n\n======================================\nblock comment with comment after end\n======================================\n\n=begin \n=end rdoc\n\n---\n\n(program (comment))\n\n=========================\nmulti-line block comments\n=========================\n\n=begin\nwhatever\nmultiple lines of whatever\n=end\n\n---\n\n(program (comment))\n\n=========================\nmulti-line block comments followed by standard comment\n=========================\n\n=begin\nwhatever\nmultiple lines of whatever\n=end\n# Another comment\n\n---\n\n(program (comment) (comment))\n\n=========================\nmulti-line block comments with almost end\n=========================\n\n=begin\n=e\n=en\n=end\n\n---\n\n(program (comment))\n\n=========================\nblock comment without newline after end\n=========================\n\n=begin\ncomment\n=end\n---\n\n(program (comment))\n"
  },
  {
    "path": "test/corpus/control-flow.txt",
    "content": "=====================\nempty while statement\n=====================\n\nwhile foo do\nend\n\n---\n\n(program (while\n  condition: (identifier)\n  body: (do)))\n\n================\nwhile without do\n================\n\nwhile foo\nend\n\n---\n\n(program (while\n  condition: (identifier)\n  body: (do)))\n\n=========================\nwhile statement with body\n=========================\n\nwhile foo do\n  bar\nend\n\n---\n\n(program (while\n  condition: (identifier)\n  body: (do (identifier))))\n\n=====================\nempty until statement\n=====================\n\nuntil foo bar do\nend\n\n---\n\n(program (until\n  condition: (call\n    method: (identifier)\n    arguments: (argument_list (identifier)))\n  body: (do)))\n\n=========================\nuntil statement with body\n=========================\n\nuntil foo do\n  bar\nend\n\n---\n\n(program (until\n  (identifier)\n  (do (identifier))))\n\n==================\nempty if statement\n==================\n\nif foo\nend\n\n---\n\n(program (if\n  condition: (identifier)))\n\n=======================\nempty if/else statement\n=======================\n\nif foo then\nelse\nend\n\nif true then ;; 123; end\n\n---\n\n(program\n  (if\n    condition: (identifier)\n    consequence: (then)\n    alternative: (else))\n  (if\n    condition: (true)\n    consequence: (then\n      (empty_statement)\n      (empty_statement)\n      (integer))))\n\n==================================\nsingle-line if then else statement\n==================================\n\nif foo then bar else quux end\n\n---\n\n(program (if (identifier) (then (identifier)) (else (identifier))))\n\n========\nif elsif\n========\n\nif foo\n  bar\nelsif quux\n  baz\nend\n\n---\n\n(program\n  (if (identifier) (then (identifier))\n  (elsif (identifier) (then (identifier)))))\n\n=============\nif elsif else\n=============\n\nif foo\n  bar\nelsif quux\n  baz\nelse\n  bat\nend\n\n---\n\n(program\n  (if (identifier)\n    (then (identifier))\n    (elsif\n      (identifier)\n      (then (identifier))\n      (else (identifier)))))\n\n======================\nempty unless statement\n======================\n\nunless foo\nend\n\n---\n\n(program (unless (identifier)))\n\n================================\nempty unless statement with then\n================================\n\nunless foo then\n  hi\nend\n\n---\n\n(program\n  (unless\n    condition: (identifier)\n    consequence: (then\n      (identifier))))\n\n================================\nempty unless statement with else\n================================\n\nunless foo\nelse\nend\n\n---\n\n(program\n  (unless\n    condition: (identifier)\n    alternative: (else)))\n\n===\nfor\n===\n\nfor x in y do\n\tf\nend\n\nfor x, in y\n\tf\nend\n\nfor x, *y in z do\n\tf\nend\n\nfor (k, v) in y do\n\tf\nend\n\n---\n\n(program\n  (for\n    pattern: (identifier)\n    value: (in (identifier))\n    body: (do (identifier)))\n  (for\n    pattern: (left_assignment_list\n      (identifier))\n    value: (in (identifier))\n    body: (do (identifier)))\n  (for\n    pattern: (left_assignment_list\n      (identifier)\n      (rest_assignment (identifier)))\n    value: (in (identifier))\n    body: (do (identifier)))\n  (for\n    pattern: (left_assignment_list\n      (destructured_left_assignment\n        (identifier)\n        (identifier)))\n    value: (in (identifier))\n    body: (do (identifier))))\n\n==============\nfor without do\n==============\n\nfor x in y\n  f\nend\n\n---\n\n(program (for\n  pattern: (identifier)\n  value: (in (identifier))\n  body: (do (identifier))))\n\n==============\nnext\n==============\n\nfor x in y\n  next\nend\n\n---\n\n(program (for (identifier) (in (identifier)) (do (next))))\n\n==============\nretry\n==============\n\nfor x in y\n  retry\nend\n\n---\n\n(program (for\n  pattern: (identifier)\n  value: (in (identifier))\n  body: (do (retry))))\n\n==============\nbreak\n==============\n\nwhile b\n  break\nend\n\n---\n\n(program (while (identifier) (do (break))))\n\n==============\nredo\n==============\n\nwhile b\n  redo\nend\n\n---\n\n\n(program (while (identifier) (do (redo))))\n\n===========\nempty begin\n===========\n\nbegin\nend\n\n---\n\n(program (begin))\n\n===============\nbegin with body\n===============\n\nbegin\n\tfoo\nend\n\n---\n\n(program (begin (identifier)))\n\n===============\nbegin with else\n===============\n\nbegin\n\tfoo\nelse\n  bar\nend\n\n---\n\n(program\n  (begin (identifier)\n    (else (identifier))))\n\n===============\nbegin with ensure\n===============\n\nbegin\n\tfoo\nensure\n  bar\nend\n\n---\n\n(program\n  (begin (identifier)\n    (ensure (identifier))))\n\n=======================\nbegin with empty rescue\n=======================\n\nbegin\nrescue\nend\n\nbegin\nrescue then\nend\n\nbegin\nrescue\n  bar\nend\n\n---\n\n(program\n  (begin (rescue))\n  (begin (rescue (then)))\n  (begin (rescue (then (identifier)))))\n\n===========================\nbegin with rescue with args\n===========================\n\nbegin\nrescue x\nend\n\nbegin\nrescue x then\nend\n\nbegin\nrescue x\n  bar\nend\n\nbegin\nrescue => x\n  bar\nend\n\nbegin\nrescue x, y\n  bar\nend\n\nbegin\nrescue Error => x\nend\n\nbegin\nrescue Error => x\n  bar\nend\n\n---\n\n(program\n  (begin (rescue (exceptions (identifier))))\n  (begin (rescue (exceptions (identifier)) (then)))\n  (begin (rescue (exceptions (identifier)) (then (identifier))))\n  (begin (rescue (exception_variable (identifier)) (then (identifier))))\n  (begin (rescue (exceptions (identifier) (identifier)) (then (identifier))))\n  (begin (rescue (exceptions (constant)) (exception_variable (identifier))))\n  (begin (rescue (exceptions (constant)) (exception_variable (identifier)) (then (identifier)))))\n\n===========================\nbegin with rescue with splat args\n===========================\n\nbegin\nrescue *args\nend\n\n---\n\n(program (begin (rescue (exceptions (splat_argument (identifier))))))\n\n=================\nrescue modifier\n=================\n\nfoo rescue nil\n\nif foo rescue nil\nelsif bar rescue nil\nend\n\nunless foo rescue nil\nend\n\n---\n\n(program\n  (rescue_modifier (identifier) (nil))\n  (if (rescue_modifier (identifier) (nil)) (elsif (rescue_modifier (identifier) (nil))))\n  (unless (rescue_modifier (identifier) (nil))))\n\n=================\nrescue modifier in assignments\n=================\n\nx = foo rescue 1\nx += foo rescue 1\nx, y = foo rescue 1\nx = bar, foo rescue 1\nx = foo 1 rescue 2\nx += foo 1 rescue 2\n\n---\n\n(program\n  (assignment\n    left: (identifier)\n    right: (rescue_modifier\n      body: (identifier)\n      handler: (integer)))\n  (operator_assignment\n    left: (identifier)\n    right: (rescue_modifier\n      body: (identifier)\n      handler: (integer)))\n  (assignment\n    left: (left_assignment_list\n      (identifier)\n      (identifier))\n    right: (rescue_modifier\n      body: (identifier)\n      handler: (integer)))\n  (rescue_modifier\n    body: (assignment\n      left: (identifier)\n      right: (right_assignment_list\n        (identifier)\n        (identifier)))\n    handler: (integer))\n  (assignment\n    left: (identifier)\n    right: (rescue_modifier\n      body: (call\n        method: (identifier)\n        arguments: (argument_list\n          (integer)))\n      handler: (integer)))\n  (operator_assignment\n    left: (identifier)\n    right: (rescue_modifier\n      body: (call\n        method: (identifier)\n        arguments: (argument_list\n          (integer)))\n      handler: (integer))))\n\n============================\nbegin with all the trimmings\n============================\n\nbegin\n\tfoo\nrescue x\n  retry\nelse\n\tquux\nensure\n  baz\nend\n\n---\n\n(program\n  (begin (identifier)\n    (rescue (exceptions (identifier)) (then (retry)))\n    (else (identifier))\n    (ensure (identifier))))\n\n======\nreturn\n======\n\nreturn foo\n\n---\n\n(program (return (argument_list (identifier))))\n\n====================\nreturn without value\n====================\n\nreturn\n\n---\n\n(program (return))\n\n====\ncase\n====\n\ncase foo\nwhen bar\nend\n\ncase \n  foo\nwhen bar\nend\n\n---\n\n(program\n  (case (identifier)\n  (when (pattern (identifier))))\n  (case (identifier)\n  (when (pattern (identifier)))))\n\n==============\ncase with else\n==============\n\ncase foo\nwhen bar\nelse\nend\n\ncase key\nwhen bar\nelse; leaf\nend\n\n---\n\n(program\n  (case\n    (identifier)\n    (when (pattern (identifier)))\n    (else))\n  (case\n    (identifier)\n    (when (pattern (identifier)))\n    (else (identifier))))\n\n==============================\ncase with multiple when blocks\n==============================\n\ncase a\nwhen b\n  c\nwhen d\n  e\nelse\n  f\nend\n\n---\n\n(program\n  (case (identifier)\n    (when (pattern (identifier)) (then (identifier)))\n    (when (pattern (identifier)) (then (identifier)))\n    (else (identifier))))\n\n\n==============================\ncase without line break\n==============================\n\ncase a when b\n c end\n\n---\n\n(program\n  (case (identifier)\n    (when\n      (pattern\n        (identifier))\n      (then\n        (identifier)))))\n\n==============================\ncase with splat parameter in when\n==============================\n\ncase a\nwhen *foo\n  c\nend\n\n---\n\n(program\n  (case\n    (identifier)\n    (when\n      (pattern (splat_argument (identifier)))\n      (then (identifier)))))\n\n==============\ncase with assignment\n==============\n\nx = case foo\nwhen bar\nelse\nend\n\n---\n\n(program (assignment (identifier)\n  (case (identifier)\n    (when (pattern (identifier)))\n    (else))))\n\n==============\ncase with expression\n==============\n\nx = case foo = bar | baz\nwhen bar\nelse\nend\n\n---\n\n(program (assignment (identifier)\n  (case (assignment (identifier) (binary (identifier) (identifier)))\n    (when (pattern (identifier)))\n    (else))))\n\n==============================\ncase without expression\n==============================\n\ncase when b\n c end\n\ncase \nwhen b then c\nend\n\n---\n\n(program\n  (case\n    (when\n      (pattern\n        (identifier))\n      (then\n        (identifier))))\n  (case\n    (when\n      (pattern\n        (identifier))\n      (then\n        (identifier)))))"
  },
  {
    "path": "test/corpus/declarations.txt",
    "content": "============\nempty method\n============\n\ndef foo\nend\n\ndef foo?\nend\n\ndef foo!\nend\n\n---\n\n(program\n  (method (identifier))\n  (method (identifier))\n  (method (identifier)))\n\n=====================\nmethod with body\n=====================\n\ndef foo\n  bar\nend\n\n---\n\n(program (method (identifier) (body_statement (identifier))))\n\n=====================\n\"end\"-less method\n=====================\n\ndef foo = bar\ndef foo() = bar\ndef foo(x) = bar\ndef Object.foo = bar\ndef Object.foo (x) = bar\ndef foo() = bar rescue (print \"error\")\n\n---\n\n(program\n  (method name: (identifier) body: (identifier))\n  (method name: (identifier) parameters: (method_parameters) body: (identifier))\n  (method name: (identifier) parameters: (method_parameters (identifier)) body: (identifier))\n  (singleton_method object: (constant) name: (identifier) body: (identifier))\n  (singleton_method object: (constant) name: (identifier) parameters: (method_parameters (identifier)) body: (identifier))\n  (method name: (identifier) parameters: (method_parameters)\n    body: (rescue_modifier\n      body: (identifier)\n      handler: (parenthesized_statements (call method: (identifier) arguments: (argument_list (string (string_content)))))\n    )\n  )\n)\n\n===========================\nmethod as attribute setter\n===========================\n\ndef foo=\nend\n\n---\n\n(program (method (setter (identifier))))\n\n==============================\nmethod definition of operators\n==============================\n\ndef `(a)\n  \"`\"\nend\n\ndef +@(a)\nend\n\ndef -@(a)\nend\n\ndef ~@(a)\nend\n\ndef %(a)\nend\n\ndef ..(a)\nend\n\ndef !~(a)\nend\n\n---\n\n(program\n  (method (operator) (method_parameters (identifier)) (body_statement (string (string_content))))\n  (method (operator) (method_parameters (identifier)))\n  (method (operator) (method_parameters (identifier)))\n  (method (operator) (method_parameters (identifier)))\n  (method (operator) (method_parameters (identifier)))\n  (method (operator) (method_parameters (identifier)))\n  (method (operator) (method_parameters (identifier))))\n\n===================================================\nmethod with forward slash name and regex ambiguity\n===================================================\n\nputs /(/\n\ndef /(name)\nend\n\ndef / name\nend\n\n---\n\n(program\n  (call (identifier) (argument_list (regex (string_content))))\n  (method (operator) (method_parameters (identifier)))\n  (method (operator) (method_parameters (identifier))))\n\n\n===========================\nmethod with call to super\n===========================\n\ndef foo\n  super\nend\n\ndef foo\n  bar.baz { super }\nend\n\ndef foo\n  super.bar a, b\nend\n\n---\n\n(program\n  (method (identifier) (body_statement (super)))\n  (method\n    (identifier)\n    (body_statement (call (identifier) (identifier) (block (block_body (super))))))\n  (method\n    (identifier)\n    (body_statement (call (super) (identifier) (argument_list (identifier) (identifier))))))\n\n===========================\nmethod with args\n===========================\n\ndef foo(bar)\nend\n\ndef foo(bar); end\ndef foo(bar) end\n\n---\n\n(program\n  (method (identifier) (method_parameters (identifier)))\n  (method (identifier) (method_parameters (identifier)))\n  (method (identifier) (method_parameters (identifier))))\n\n================================\nmethod with unparenthesized args\n================================\n\ndef foo bar\nend\n\n---\n\n(program (method (identifier) (method_parameters (identifier))))\n\n=========================\nmethod with multiple args\n=========================\n\ndef foo(bar, quux)\nend\n\n---\n\n(program (method (identifier) (method_parameters (identifier) (identifier))))\n\n=========================================\nmethod with multiple unparenthesized args\n=========================================\n\ndef foo bar, quux\nend\n\n---\n\n(program (method (identifier) (method_parameters (identifier) (identifier))))\n\n=========================================\nmethod with keyword parameters\n=========================================\n\ndef foo(bar: nil, baz:)\nend\n\n---\n\n(program\n  (method (identifier)\n    (method_parameters\n      (keyword_parameter (identifier) (nil))\n      (keyword_parameter (identifier)))))\n\n=========================================\nmethod with default parameters\n=========================================\n\ndef foo(bar = nil)\nend\n\ndef foo(bar=nil)\nend\n\n---\n\n(program\n  (method (identifier)\n    (method_parameters (optional_parameter (identifier) (nil))))\n  (method (identifier)\n    (method_parameters (optional_parameter (identifier) (nil)))))\n\n=========================================\nmethod with interesting params\n=========================================\n\ndef foo(*options)\nend\n\ndef foo(x, *options)\nend\n\ndef foo(x, *options, y)\nend\n\ndef foo(**options)\nend\n\ndef foo(name:, **)\nend\n\ndef foo(x, **nil)\nend\n\ndef foo(&block)\nend\n\ndef foo(&)\nend\n\ndef foo(...)\n  super(...)\nend\n\ndef foo(a, b, ...)\n  bar(b, ...)\nend\n\ndef foo ...\n  3\nend\n\ndef foo\n  ... 3\nend\n\ndef foo\n  .. 3\nend\n\n---\n\n(program\n  (method (identifier) (method_parameters (splat_parameter (identifier))))\n  (method (identifier) (method_parameters (identifier) (splat_parameter (identifier))))\n  (method (identifier) (method_parameters (identifier) (splat_parameter (identifier)) (identifier)))\n  (method (identifier) (method_parameters (hash_splat_parameter (identifier))))\n  (method (identifier) (method_parameters (keyword_parameter (identifier)) (hash_splat_parameter)))\n  (method (identifier) (method_parameters (identifier) (hash_splat_nil)))\n  (method (identifier) (method_parameters (block_parameter (identifier))))\n  (method (identifier) (method_parameters (block_parameter)))\n  (method (identifier) (method_parameters (forward_parameter))\n    (body_statement (call (super) (argument_list (forward_argument))))\n  )\n  (method (identifier) (method_parameters (identifier) (identifier) (forward_parameter))\n    (body_statement (call (identifier) (argument_list (identifier) (forward_argument))))\n  )\n  (method (identifier) (method_parameters (forward_parameter))\n    (body_statement (integer))\n  )\n  (method (identifier) (body_statement (range (integer))))\n  (method (identifier) (body_statement (range (integer))))\n)\n\n=========================================\nsingleton method\n=========================================\n\ndef self.foo\nend\n\n---\n\n(program (singleton_method (self) (identifier)))\n\n=========================================\nsingleton method with body\n=========================================\n\ndef self.foo\n  bar\nend\n\n---\n\n(program (singleton_method (self) (identifier) (body_statement (identifier))))\n\n\n=========================================\nsingleton method with arg\n=========================================\n\ndef self.foo(bar)\nend\n\n---\n\n(program (singleton_method (self) (identifier) (method_parameters (identifier))))\n\n=========================================\nsingleton method with un-parenthesized arg\n=========================================\n\ndef self.foo bar\nend\n\n---\n\n(program (singleton_method (self) (identifier) (method_parameters (identifier))))\n\n=========================================\nsingleton method with args\n=========================================\n\ndef self.foo(bar, baz)\nend\n\n---\n\n(program (singleton_method (self) (identifier) (method_parameters (identifier) (identifier))))\n\n\n=========================================\nsingleton method with un-parenthesized args\n=========================================\n\ndef self.foo bar, baz\nend\n\n---\n\n(program (singleton_method (self) (identifier) (method_parameters (identifier) (identifier))))\n\n===========\nempty class\n===========\n\nclass Foo\nend\n\nclass Foo; end\n\nclass Foo::Bar\nend\n\nclass ::Foo::Bar\nend\n\nclass Cß\nend\n\n---\n\n(program\n  (class (constant))\n  (class (constant))\n  (class (scope_resolution (constant) (constant)))\n  (class (scope_resolution (scope_resolution (constant)) (constant)))\n  (class (constant)))\n\n==============\nempty subclass\n==============\n\nclass Foo < Bar\nend\n\n---\n\n(program (class (constant) (superclass (constant))))\n\n==================================\nempty subclass of namespaced class\n==================================\n\nclass Foo < Bar::Quux\nend\n\nclass Foo < ::Bar\nend\n\nclass Foo < Bar::Baz.new(foo)\nend\n\n---\n\n(program\n  (class\n    (constant)\n    (superclass (scope_resolution (constant) (constant))))\n  (class\n    (constant)\n    (superclass (scope_resolution (constant))))\n  (class\n    (constant)\n    (superclass (call (scope_resolution (constant) (constant)) (identifier) (argument_list (identifier))))))\n\n=======================================\none-line class/module def without ;\n=======================================\n\nmodule NoActiveModel class Resource; end; end\nclass String def foo; end end\n\n---\n\n(program\n  (module\n    name: (constant)\n    body: (body_statement\n      (class\n        name: (constant))))\n  (class\n    name: (constant)\n    body: (body_statement\n      (method\n        name: (identifier)))))\n\n=======================================\nunparenthesized call as superclass\n=======================================\n\nclass A < B.new \\\n  :c,\n  :d\nend\n\n---\n\n(program (class\n  name: (constant)\n  superclass: (superclass (call\n    receiver: (constant)\n    method: (identifier)\n    arguments: (argument_list\n      (simple_symbol)\n      (simple_symbol))))))\n\n===============\nclass with body\n===============\n\nclass Foo\n\tdef bar\n\tend\nend\n\n---\n\n(program (class (constant) (body_statement (method (identifier)))))\n\n====================\nclass with operators\n====================\n\nclass A\n  def ==; end\n  def !=(other); end\nend\n\n---\n\n(program\n  (class\n    name: (constant)\n    body: (body_statement\n      (method\n        name: (operator))\n      (method\n        name: (operator)\n        parameters: (method_parameters\n          (identifier))))))\n\n=========================================\nclass within dynamically-computed module\n=========================================\n\nclass foo()::Bar\nend\n\n---\n\n(program (class (scope_resolution (call (identifier) (argument_list)) (constant))))\n\n===============\nsingleton class\n===============\n\nclass << self\nend\n\nclass <<self\nend\n\nclass << Foo\nend\n\nclass << Foo::Bar\nend\n\n---\n\n(program\n  (singleton_class (self))\n  (singleton_class (self))\n  (singleton_class (constant))\n  (singleton_class (scope_resolution (constant) (constant))))\n\n\n============\nempty module\n============\n\nmodule Foo\nend\n\nmodule Foo::Bar\nend\n\n---\n\n(program\n  (module (constant))\n  (module (scope_resolution (constant) (constant))))\n\n================\nmodule with body\n================\n\nmodule Foo\n\tdef bar\n\tend\nend\n\n---\n\n(program (module (constant) (body_statement (method (identifier)))))\n\n========================\nmodule without semicolon\n========================\n\nmodule Foo end\n\n---\n\n(program (module (constant)))\n\n=======\n__END__\n=======\n\nword\n__END__\nword\nx\nab\nd\n\n---\n\n(program (identifier) (uninterpreted))\n\n========================================\n__END__ followed by a comment\n========================================\n\nword\n__END__\n# comment\n\n---\n\n(program (identifier) (uninterpreted))\n\n========================================\n__END__ at end of file, without new line\n========================================\n\nword\n__END__\n---\n\n(program (identifier) (uninterpreted))\n\n==============================\nmodule with class with methods\n==============================\n\nmodule A\n  class B < C\n    include D::E.f.g\n\n    attr_reader :h\n\n    # i\n    def j\n      k\n    end\n\n    def self.l\n    end\n  end\nend\n\n---\n\n(program (module (constant)\n  (body_statement\n    (class (constant) (superclass (constant))\n      (body_statement\n        (call (identifier) (argument_list\n          (call\n            (call\n              (scope_resolution (constant) (constant))\n              (identifier))\n            (identifier))))\n\n      (call (identifier) (argument_list (simple_symbol)))\n\n      (comment)\n      (method (identifier) (body_statement (identifier)))\n      (singleton_method (self) (identifier)))))))\n\n\n===========\nempty BEGIN block\n===========\n\nBEGIN {\n\n}\n\n---\n\n(program (begin_block))\n\n===========\nBEGIN block\n===========\n\nbaz\nBEGIN {\nfoo\n}\nbar\n\n---\n\n(program (identifier) (begin_block (identifier)) (identifier))\n\n===========\nempty END block\n===========\n\nEND {\n\n}\n\n---\n\n(program (end_block))\n\n===========\nEND block\n===========\n\nbaz\nEND {\nfoo\n}\nbar\n\n---\n\n(program (identifier) (end_block (identifier)) (identifier))\n"
  },
  {
    "path": "test/corpus/expressions.txt",
    "content": "================\nscope resolution\n================\n\nFoo::Bar\n::Bar\n\nputs ::Foo::Bar\n\n---\n\n(program\n  (scope_resolution\n    scope: (constant)\n    name: (constant))\n  (scope_resolution\n    name: (constant))\n  (call\n    method: (identifier)\n    arguments: (argument_list\n      (scope_resolution\n        scope: (scope_resolution\n          name: (constant))\n        name: (constant)))))\n\n============\nelement reference\n============\n\nfoo[bar]\nfoo[*bar]\nfoo[* bar]\nfoo[]\n\n---\n\n(program\n  (element_reference\n    object: (identifier)\n    (identifier))\n  (element_reference\n    object: (identifier)\n    (splat_argument\n      (identifier)))\n  (element_reference\n    object: (identifier)\n    (splat_argument\n      (identifier)))\n  (element_reference\n    object: (identifier)))\n\n============\nelement reference with string\n============\n\nfoo[\"bar\"]\n\n---\n\n(program\n  (element_reference\n    (identifier)\n    (string\n      (string_content))))\n\n============\nelement reference with symbol\n============\n\nfoo[:bar]\n\n---\n\n(program\n  (element_reference\n    (identifier)\n    (simple_symbol)))\n\n============\nelement assignment\n============\n\nfoo[bar] = 1\n\n---\n\n(program\n  (assignment\n    left: (element_reference\n      object: (identifier)\n      (identifier))\n    right: (integer)))\n\n===============\nvacuous literal\n===============\n\n()\n\n---\n\n(program\n  (parenthesized_statements))\n\n===============\nempty statement\n===============\n\n;\n\n---\n\n(program\n  (empty_statement))\n\n===================\nyield without value\n===================\n\nyield\n\n---\n\n(program\n  (yield))\n\n=====\nyield\n=====\n\nyield foo\nyield foo, bar\nyield(baz)\n\n---\n\n(program\n  (yield\n    (argument_list\n      (identifier)))\n  (yield\n    (argument_list\n      (identifier)\n      (identifier)))\n  (yield\n    (argument_list\n      (identifier))))\n\n===\nnot\n===\n\nnot foo\n\n---\n\n(program\n  (unary\n    (identifier)))\n\n===\nand\n===\n\nfoo and bar\n\n---\n\n(program\n  (binary\n    (identifier)\n    (identifier)))\n\n===\nor\n===\n\nfoo or bar\n\n---\n\n(program\n  (binary\n    (identifier)\n    (identifier)))\n\n====================\nand or associativity\n====================\n\na or b and c\n\n---\n\n(program\n  (binary\n    (binary\n      (identifier)\n      (identifier))\n    (identifier)))\n\n========\ndefined?\n========\n\ndefined? foo\ndefined? Foo.bar\ndefined?(foo)\ndefined?($foo)\ndefined?(@foo)\ndefined?(@äö).should be_true\n\n---\n\n(program\n  (unary\n    operand: (identifier))\n  (unary\n    operand: (call\n      receiver: (constant)\n      method: (identifier)))\n  (unary\n    operand: (parenthesized_statements\n      (identifier)))\n  (unary\n    operand: (parenthesized_statements\n      (global_variable)))\n  (unary\n    operand: (parenthesized_statements\n      (instance_variable)))\n  (call\n    receiver: (unary\n      operand: (parenthesized_statements\n        (instance_variable)))\n    method: (identifier)\n    arguments: (argument_list\n      (identifier))))\n\n==========\nassignment\n==========\n\nx = y\nx = *args\nFALSE = \"false\"\nTRUE = \"true\"\nNIL = \"nil\"\n\n---\n\n(program\n  (assignment\n    (identifier)\n    (identifier))\n  (assignment\n    (identifier)\n    (splat_argument\n      (identifier)))\n  (assignment\n    (constant)\n    (string\n      (string_content)))\n  (assignment\n    (constant)\n    (string\n      (string_content)))\n  (assignment\n    (constant)\n    (string\n      (string_content))))\n\n=====================\nmultiple assignment\n=====================\n\nx, y = [1, 2]\nx, * = [1, 2]\nx, *args = [1, 2]\nx, y = *foo\nself.foo, self.bar = target.a?, target.b\n(x, y) = foo\n(a, b, c = 1)\n\n---\n\n(program\n  (assignment\n    (left_assignment_list\n      (identifier)\n      (identifier))\n    (array\n      (integer)\n      (integer)))\n  (assignment\n    (left_assignment_list\n      (identifier)\n      (rest_assignment))\n    (array\n      (integer)\n      (integer)))\n  (assignment\n    (left_assignment_list\n      (identifier)\n      (rest_assignment\n        (identifier)))\n    (array\n      (integer)\n      (integer)))\n  (assignment\n    (left_assignment_list\n      (identifier)\n      (identifier))\n    (splat_argument\n      (identifier)))\n  (assignment\n    (left_assignment_list\n      (call\n        (self)\n        (identifier))\n      (call\n        (self)\n        (identifier)))\n    (right_assignment_list\n      (call\n        (identifier)\n        (identifier))\n      (call\n        (identifier)\n        (identifier))))\n  (assignment\n    (left_assignment_list\n      (destructured_left_assignment\n        (identifier)\n        (identifier)))\n    (identifier))\n  (parenthesized_statements\n    (assignment\n      (left_assignment_list\n        (identifier)\n        (identifier)\n        (identifier))\n      (integer))))\n\n==================================================\nmultiple assignment with multiple right hand sides\n==================================================\n\nfoo = 1, 2\nx, y = foo, bar\n\n---\n\n(program\n  (assignment\n    (identifier)\n    (right_assignment_list\n      (integer)\n      (integer)))\n  (assignment\n    (left_assignment_list\n      (identifier)\n      (identifier))\n    (right_assignment_list\n      (identifier)\n      (identifier))))\n\n==================================================\ndestructured left hand side assignment\n==================================================\n\na, (b, c), d, (e, (f, g)) = foo\n\n---\n\n(program\n  (assignment\n    left: (left_assignment_list\n      (identifier)\n      (destructured_left_assignment\n        (identifier)\n        (identifier))\n      (identifier)\n      (destructured_left_assignment\n        (identifier)\n        (destructured_left_assignment\n          (identifier)\n          (identifier))))\n    right: (identifier)))\n\n==========\nassignment from method call\n==========\n\nx = foo a, b\nx = foo a, :b => 1, :c => 2\n\n---\n\n(program\n  (assignment\n    (identifier)\n    (call\n      (identifier)\n      (argument_list\n        (identifier)\n        (identifier))))\n  (assignment\n    (identifier)\n    (call\n      (identifier)\n      (argument_list\n        (identifier)\n        (pair\n          (simple_symbol)\n          (integer))\n        (pair\n          (simple_symbol)\n          (integer))))))\n\n==========\nmath assignment\n==========\n\nx += y\nx -= y\nx *= y\nx **= y\nx /= y\nputs \"/hi\"\n\n---\n\n(program\n  (operator_assignment\n    (identifier)\n    (identifier))\n  (operator_assignment\n    (identifier)\n    (identifier))\n  (operator_assignment\n    (identifier)\n    (identifier))\n  (operator_assignment\n    (identifier)\n    (identifier))\n  (operator_assignment\n    (identifier)\n    (identifier))\n  (call\n    (identifier)\n    (argument_list\n      (string\n        (string_content)))))\n\n==========\noperator assignment\n==========\n\nx ||= y\nx &&= y\nx &= y\nx |= y\nx %= y\nx >>= y\nx <<= y\nx ^= y\n\n---\n\n(program\n  (operator_assignment\n    (identifier)\n    (identifier))\n  (operator_assignment\n    (identifier)\n    (identifier))\n  (operator_assignment\n    (identifier)\n    (identifier))\n  (operator_assignment\n    (identifier)\n    (identifier))\n  (operator_assignment\n    (identifier)\n    (identifier))\n  (operator_assignment\n    (identifier)\n    (identifier))\n  (operator_assignment\n    (identifier)\n    (identifier))\n  (operator_assignment\n    (identifier)\n    (identifier)))\n\n===========\nconditional\n===========\n\na ? b : c\n\na ? b\n  : c\n\n---\n\n(program\n  (conditional\n    condition: (identifier)\n    consequence: (identifier)\n    alternative: (identifier))\n  (conditional\n    condition: (identifier)\n    consequence: (identifier)\n    alternative: (identifier)))\n\n===========================================\nconditional and character literal ambiguity\n===========================================\n\ntrue ?\")\":\"c\"\n\n---\n\n(program\n  (conditional\n    (true)\n    (string\n      (string_content))\n    (string\n      (string_content))))\n\n===========================================\nconditional with reserved identifiers\n===========================================\n\nfoo ? true: false\nfoo ? return: false\n\n---\n\n(program\n  (conditional\n    (identifier)\n    (true)\n    (false))\n  (conditional\n    (identifier)\n    (return)\n    (false)))\n\n===============\ninclusive range\n===============\n\na..b\n\n---\n\n(program\n  (range\n    (identifier)\n    (identifier)))\n\n===============\nexclusive range\n===============\n\na...b\n\n---\n\n(program\n  (range\n    (identifier)\n    (identifier)))\n\n==========\nboolean or\n==========\n\na || b\n\n---\n\n(program\n  (binary\n    (identifier)\n    (identifier)))\n\n===========\nboolean and\n===========\n\na && b\n\n---\n\n(program\n  (binary\n    (identifier)\n    (identifier)))\n\n===========\nboolean and/or\n===========\n\na || b && c\na && b || c\n\n---\n\n(program\n  (binary\n    left: (identifier)\n    right: (binary\n      left: (identifier)\n      right: (identifier)))\n  (binary\n    left: (binary\n      left: (identifier)\n      right: (identifier))\n    right: (identifier)))\n\n==========\nrelational\n==========\n\na == b\na != b\na === b\na <=> b\na =~ b\na !~ b\na==b\na!=b\na===b\na<=>b\na=~b\na!~b # not a binary operation\n\n---\n\n(program\n  (binary\n    left: (identifier)\n    right: (identifier))\n  (binary\n    left: (identifier)\n    right: (identifier))\n  (binary\n    left: (identifier)\n    right: (identifier))\n  (binary\n    left: (identifier)\n    right: (identifier))\n  (binary\n    left: (identifier)\n    right: (identifier))\n  (binary\n    left: (identifier)\n    right: (identifier))\n  (binary\n    left: (identifier)\n    right: (identifier))\n  (binary\n    left: (identifier)\n    right: (identifier))\n  (binary\n    left: (identifier)\n    right: (identifier))\n  (binary\n    left: (identifier)\n    right: (identifier))\n  (binary\n    left: (identifier)\n    right: (identifier))\n  (call\n    method: (identifier)\n    arguments: (argument_list\n      (unary\n        operand: (identifier))))\n  (comment))\n\n==========\ncomparison\n==========\n\na < b\na <= b\na > b\na >= b\n\n---\n\n(program\n  (binary\n    (identifier)\n    (identifier))\n  (binary\n    (identifier)\n    (identifier))\n  (binary\n    (identifier)\n    (identifier))\n  (binary\n    (identifier)\n    (identifier)))\n\n==========\nbitwise or\n==========\n\na | b\n\n---\n\n(program\n  (binary\n    (identifier)\n    (identifier)))\n\n===========\nbitwise xor\n===========\n\na ^ b\n\n---\n\n(program\n  (binary\n    (identifier)\n    (identifier)))\n\n===========\nbitwise and\n===========\n\na & b\n\n---\n\n(program\n  (binary\n    (identifier)\n    (identifier)))\n\n=====\nshift\n=====\n\na >> b\na << b\n\n---\n\n(program\n  (binary\n    (identifier)\n    (identifier))\n  (binary\n    (identifier)\n    (identifier)))\n\n========\nadditive\n========\n\na + b\n\n---\n\n(program\n  (binary\n    (identifier)\n    (identifier)))\n\n==============\nmultiplicative\n==============\n\na * b\na*b\na *b\na* b\n\n---\n\n(program\n  (binary\n    left: (identifier)\n    right: (identifier))\n  (binary\n    left: (identifier)\n    right: (identifier))\n  (call\n    method: (identifier)\n    arguments: (argument_list\n      (splat_argument\n        (identifier))))\n  (binary\n    left: (identifier)\n    right: (identifier)))\n\n==============\nbinary operations\n==============\n\n2+2*2\n\n---\n\n(program\n  (binary\n    (integer)\n    (binary\n      (integer)\n      (integer))))\n\n===========\nunary minus\n===========\n\n-a\nfoo -a, bar\nfoo(-a, bar)\n\n---\n\n(program\n  (unary\n    (identifier))\n  (call\n    (identifier)\n    (argument_list\n      (unary\n        (identifier))\n      (identifier)))\n  (call\n    (identifier)\n    (argument_list\n      (unary\n        (identifier))\n      (identifier))))\n\n===========\nbinary minus\n===========\n\nfoo-a\n@ivar-1\n\n---\n\n(program\n  (binary\n    (identifier)\n    (identifier))\n  (binary\n    (instance_variable)\n    (integer)))\n\n===========\nexponential\n===========\n\na ** b\n\n---\n\n(program\n  (binary\n    (identifier)\n    (identifier)))\n\n====\nminus, call, exponential, range\n====\n\na - 1\na-1\na -1\na- 1\n(-1.foo)\n\na - b\na-b\na -b\na- b\n(-b.foo)\n\n-2**10\n-x**10\n\n1..-1\n1 .. -1\n1.. -1\n1 ..-1\n\n---\n\n(program\n  (binary\n    left: (identifier)\n    right: (integer))\n  (binary\n    left: (identifier)\n    right: (integer))\n  (call\n    method: (identifier)\n    arguments: (argument_list\n      (unary\n        operand: (integer))))\n  (binary\n    left: (identifier)\n    right: (integer))\n  (parenthesized_statements\n    (call\n      receiver: (unary\n        operand: (integer))\n      method: (identifier)))\n  (binary\n    left: (identifier)\n    right: (identifier))\n  (binary\n    left: (identifier)\n    right: (identifier))\n  (call\n    method: (identifier)\n    arguments: (argument_list\n      (unary\n        operand: (identifier))))\n  (binary\n    left: (identifier)\n    right: (identifier))\n  (parenthesized_statements\n    (unary\n      operand: (call\n        receiver: (identifier)\n        method: (identifier))))\n  (unary\n    operand: (binary\n      left: (integer)\n      right: (integer)))\n  (unary\n    operand: (binary\n      left: (identifier)\n      right: (integer)))\n  (range\n    begin: (integer)\n    end: (unary\n      operand: (integer)))\n  (range\n    begin: (integer)\n    end: (unary\n      operand: (integer)))\n  (range\n    begin: (integer)\n    end: (unary\n      operand: (integer)))\n  (range\n    begin: (integer)\n    end: (unary\n      operand: (integer))))\n\n==========\ncomplement\n==========\n\n!a\n\n---\n\n(program\n  (unary\n    (identifier)))\n\n===============================\nmethod call\n===============================\n\nfoo\nfoo()\nprint \"hello\"\nprint(\"hello\")\nexit!\nexit!()\ninclude?\ninclude?(\"hello\")\ninclude? \"hello\"\nexit! if done\nexit!() if done\n\n---\n\n(program\n  (identifier)\n  (call\n    method: (identifier)\n    arguments: (argument_list))\n  (call\n    method: (identifier)\n    arguments: (argument_list\n      (string\n        (string_content))))\n  (call\n    method: (identifier)\n    arguments: (argument_list\n      (string\n        (string_content))))\n  (call\n    method: (identifier))\n  (call\n    method: (identifier)\n    arguments: (argument_list))\n  (call\n    method: (identifier))\n  (call\n    method: (identifier)\n    arguments: (argument_list\n      (string\n        (string_content))))\n  (call\n    method: (identifier)\n    arguments: (argument_list\n      (string\n        (string_content))))\n  (if_modifier\n    body: (call\n      method: (identifier))\n    condition: (identifier))\n  (if_modifier\n    body: (call\n      method: (identifier)\n      arguments: (argument_list))\n    condition: (identifier)))\n\n====================================\nnested unparenthesized method calls\n====================================\n\nputs get_name self, true\nputs(get_name self, true)\n\n---\n\n(program\n  (call\n    method: (identifier)\n    arguments: (argument_list\n      (call\n        method: (identifier)\n        arguments: (argument_list\n          (self)\n          (true)))))\n  (call\n    method: (identifier)\n    arguments: (argument_list\n      (call\n        method: (identifier)\n        arguments: (argument_list\n          (self)\n          (true))))))\n\n===============================\nmethod call with arguments on multiple lines\n===============================\n\nfoo a,\n  b, c\n\n---\n\n(program\n  (call\n    method: (identifier)\n    arguments: (argument_list\n      (identifier)\n      (identifier)\n      (identifier))))\n\n===============================\nmethod call with trailing comma\n===============================\n\nfoo(a, b,)\nfoo(bar(a),)\n\n---\n\n(program\n  (call\n    (identifier)\n    (argument_list\n      (identifier)\n      (identifier)))\n  (call\n    (identifier)\n    (argument_list\n      (call\n        (identifier)\n        (argument_list\n          (identifier))))))\n\n==============================================\nkeyword arguments, no space, trailing comma\n==============================================\n\nfoo(a:b)\nfoo(a_:b)\nfoo(a2:b)\nfoo(a_:b,)\nfoo(a2:b,)\n\n---\n\n(program\n  (call\n    (identifier)\n    (argument_list\n      (pair\n        (hash_key_symbol)\n        (identifier))))\n  (call\n    (identifier)\n    (argument_list\n      (pair\n        (hash_key_symbol)\n        (identifier))))\n  (call\n    (identifier)\n    (argument_list\n      (pair\n        (hash_key_symbol)\n        (identifier))))\n  (call\n    (identifier)\n    (argument_list\n      (pair\n        (hash_key_symbol)\n        (identifier))))\n  (call\n    (identifier)\n    (argument_list\n      (pair\n        (hash_key_symbol)\n        (identifier)))))\n\n===============================\nmethod call with receiver\n===============================\n\nfoo.bar\nfoo.bar()\nfoo.bar \"hi\"\nfoo.bar \"hi\", 2\nfoo.bar(\"hi\")\nfoo.bar(\"hi\", 2)\n\n---\n\n(program\n  (call\n    receiver: (identifier)\n    method: (identifier))\n  (call\n    receiver: (identifier)\n    method: (identifier)\n    arguments: (argument_list))\n  (call\n    receiver: (identifier)\n    method: (identifier)\n    arguments: (argument_list\n      (string\n        (string_content))))\n  (call\n    receiver: (identifier)\n    method: (identifier)\n    arguments: (argument_list\n      (string\n        (string_content))\n      (integer)))\n  (call\n    receiver: (identifier)\n    method: (identifier)\n    arguments: (argument_list\n      (string\n        (string_content))))\n  (call\n    receiver: (identifier)\n    method: (identifier)\n    arguments: (argument_list\n      (string\n        (string_content))\n      (integer))))\n\n===============================\nimplicit call\n===============================\n\nfoo[bar].()\nfoo.(1, 2)\n\n---\n\n(program\n  (call\n    receiver: (element_reference\n      object: (identifier)\n      (identifier))\n    arguments: (argument_list))\n  (call\n    receiver: (identifier)\n    arguments: (argument_list\n      (integer)\n      (integer))))\n\n===============================\nimplicit call with block\n===============================\n\na.() {}\na.(b: c) do\n  d\nend\n\n---\n\n(program\n  (call\n    receiver: (identifier)\n    arguments: (argument_list)\n    block: (block))\n  (call\n    receiver: (identifier)\n    arguments: (argument_list\n      (pair\n        key: (hash_key_symbol)\n        value: (identifier)))\n    block: (do_block\n      body: (body_statement\n        (identifier)))))\n\n===============================\ncall with operator method name\n===============================\n\nfoo.[]()\n\n---\n\n(program\n  (call\n    receiver: (identifier)\n    method: (operator)\n    arguments: (argument_list)))\n\n===============================\nmethod call with :: operator\n===============================\n\nfoo::bar\n::Foo::bar\nFoo::Bar::baz\n\n---\n\n(program\n  (call\n    (identifier)\n    (identifier))\n  (call\n    (scope_resolution\n      (constant))\n    (identifier))\n  (call\n    (scope_resolution\n      (constant)\n      (constant))\n    (identifier)))\n\n===============================\nmethod call with safe navigation operator\n===============================\n\nfoo&.bar\n\n---\n\n(program\n  (call\n    (identifier)\n    (identifier)))\n\n===============================\ncalls to methods on negated literals\n===============================\n\n-1.class.should eq(Fixnum)\n-0.1.class\n\n---\n\n(program\n  (call\n    receiver: (call\n      receiver: (unary\n        operand: (integer))\n      method: (identifier))\n    method: (identifier)\n    arguments: (argument_list\n      (call\n        method: (identifier)\n        arguments: (argument_list\n          (constant)))))\n  (call\n    receiver: (unary\n      operand: (float))\n    method: (identifier)))\n\n===============================\nmethod call with hash args\n===============================\n\nfoo(:a => true)\nfoo([] => 1)\nfoo(bar => 1)\nfoo :a => true, :c => 1\n\n---\n\n(program\n  (call\n    (identifier)\n    (argument_list\n      (pair\n        (simple_symbol)\n        (true))))\n  (call\n    (identifier)\n    (argument_list\n      (pair\n        (array)\n        (integer))))\n  (call\n    (identifier)\n    (argument_list\n      (pair\n        (identifier)\n        (integer))))\n  (call\n    (identifier)\n    (argument_list\n      (pair\n        (simple_symbol)\n        (true))\n      (pair\n        (simple_symbol)\n        (integer)))))\n\n===============================\nmethod call with keyword args\n===============================\n\nfoo(a: true)\nfoo a: true\nfoo B: true\nfoo a: ;\nfoo B:\n\n---\n\n(program\n  (call\n    (identifier)\n    (argument_list\n      (pair\n        (hash_key_symbol)\n        (true))))\n  (call\n    (identifier)\n    (argument_list\n      (pair\n        (hash_key_symbol)\n        (true))))\n  (call\n    (identifier)\n    (argument_list\n      (pair\n        (hash_key_symbol)\n        (true))))\n  (call\n    (identifier)\n    (argument_list\n      (pair\n        (hash_key_symbol))))\n  (call\n    (identifier)\n    (argument_list\n      (pair\n        (hash_key_symbol)))))\n\n===============================\nmethod call with reserved keyword args\n===============================\n\nfoo(if: true)\nfoo alias: true\nfoo and: true\nfoo begin: true\nfoo break: true\nfoo case: true\nfoo class: true\nfoo def: true\nfoo defined: true\nfoo do: true\nfoo else: true\nfoo elsif: true\nfoo end: true\nfoo ensure: true\nfoo false: true\nfoo for: true\nfoo if: true\nfoo in: true\nfoo module: true\nfoo next: true\nfoo nil: true\nfoo not: true\nfoo or: true\nfoo redo: true\nfoo rescue: true\nfoo retry: true\nfoo return: true\nfoo self: true\nfoo super: true\nfoo then: true\nfoo true: true\nfoo undef: true\nfoo unless: true\nfoo until: true\nfoo when: true\nfoo while: true\nfoo yield: true\nfoo yield:\n\n---\n\n(program\n  (call\n    (identifier)\n    (argument_list\n      (pair\n        (hash_key_symbol)\n        (true))))\n  (call\n    (identifier)\n    (argument_list\n      (pair\n        (hash_key_symbol)\n        (true))))\n  (call\n    (identifier)\n    (argument_list\n      (pair\n        (hash_key_symbol)\n        (true))))\n  (call\n    (identifier)\n    (argument_list\n      (pair\n        (hash_key_symbol)\n        (true))))\n  (call\n    (identifier)\n    (argument_list\n      (pair\n        (hash_key_symbol)\n        (true))))\n  (call\n    (identifier)\n    (argument_list\n      (pair\n        (hash_key_symbol)\n        (true))))\n  (call\n    (identifier)\n    (argument_list\n      (pair\n        (hash_key_symbol)\n        (true))))\n  (call\n    (identifier)\n    (argument_list\n      (pair\n        (hash_key_symbol)\n        (true))))\n  (call\n    (identifier)\n    (argument_list\n      (pair\n        (hash_key_symbol)\n        (true))))\n  (call\n    (identifier)\n    (argument_list\n      (pair\n        (hash_key_symbol)\n        (true))))\n  (call\n    (identifier)\n    (argument_list\n      (pair\n        (hash_key_symbol)\n        (true))))\n  (call\n    (identifier)\n    (argument_list\n      (pair\n        (hash_key_symbol)\n        (true))))\n  (call\n    (identifier)\n    (argument_list\n      (pair\n        (hash_key_symbol)\n        (true))))\n  (call\n    (identifier)\n    (argument_list\n      (pair\n        (hash_key_symbol)\n        (true))))\n  (call\n    (identifier)\n    (argument_list\n      (pair\n        (hash_key_symbol)\n        (true))))\n  (call\n    (identifier)\n    (argument_list\n      (pair\n        (hash_key_symbol)\n        (true))))\n  (call\n    (identifier)\n    (argument_list\n      (pair\n        (hash_key_symbol)\n        (true))))\n  (call\n    (identifier)\n    (argument_list\n      (pair\n        (hash_key_symbol)\n        (true))))\n  (call\n    (identifier)\n    (argument_list\n      (pair\n        (hash_key_symbol)\n        (true))))\n  (call\n    (identifier)\n    (argument_list\n      (pair\n        (hash_key_symbol)\n        (true))))\n  (call\n    (identifier)\n    (argument_list\n      (pair\n        (hash_key_symbol)\n        (true))))\n  (call\n    (identifier)\n    (argument_list\n      (pair\n        (hash_key_symbol)\n        (true))))\n  (call\n    (identifier)\n    (argument_list\n      (pair\n        (hash_key_symbol)\n        (true))))\n  (call\n    (identifier)\n    (argument_list\n      (pair\n        (hash_key_symbol)\n        (true))))\n  (call\n    (identifier)\n    (argument_list\n      (pair\n        (hash_key_symbol)\n        (true))))\n  (call\n    (identifier)\n    (argument_list\n      (pair\n        (hash_key_symbol)\n        (true))))\n  (call\n    (identifier)\n    (argument_list\n      (pair\n        (hash_key_symbol)\n        (true))))\n  (call\n    (identifier)\n    (argument_list\n      (pair\n        (hash_key_symbol)\n        (true))))\n  (call\n    (identifier)\n    (argument_list\n      (pair\n        (hash_key_symbol)\n        (true))))\n  (call\n    (identifier)\n    (argument_list\n      (pair\n        (hash_key_symbol)\n        (true))))\n  (call\n    (identifier)\n    (argument_list\n      (pair\n        (hash_key_symbol)\n        (true))))\n  (call\n    (identifier)\n    (argument_list\n      (pair\n        (hash_key_symbol)\n        (true))))\n  (call\n    (identifier)\n    (argument_list\n      (pair\n        (hash_key_symbol)\n        (true))))\n  (call\n    (identifier)\n    (argument_list\n      (pair\n        (hash_key_symbol)\n        (true))))\n  (call\n    (identifier)\n    (argument_list\n      (pair\n        (hash_key_symbol)\n        (true))))\n  (call\n    (identifier)\n    (argument_list\n      (pair\n        (hash_key_symbol)\n        (true))))\n  (call\n    (identifier)\n    (argument_list\n      (pair\n        (hash_key_symbol)\n        (true))))\n  (call\n    (identifier)\n    (argument_list\n      (pair\n        (hash_key_symbol)))))\n\n===============================\nmethod call with paren args\n===============================\n\nfoo (b), a\n\n---\n\n(program\n  (call\n    (identifier)\n    (argument_list\n      (parenthesized_statements\n        (identifier))\n      (identifier))))\n\n===============================\nmethod call with block argument\n===============================\n\nfoo(&:sort)\nfoo(&bar)\nfoo(&bar, 1)\nfoo &bar\nfoo &bar, 1\nfoo(&)\nfoo(&, 1)\nfoo &;\nfoo 1, &;\n\n---\n\n(program\n  (call\n    (identifier)\n    (argument_list\n      (block_argument\n        (simple_symbol))))\n  (call\n    (identifier)\n    (argument_list\n      (block_argument\n        (identifier))))\n  (call\n    (identifier)\n    (argument_list\n      (block_argument\n        (identifier))\n      (integer)))\n  (call\n    (identifier)\n    (argument_list\n      (block_argument\n        (identifier))))\n  (call\n    (identifier)\n    (argument_list\n      (block_argument\n        (identifier))\n      (integer)))\n  (call\n    (identifier)\n    (argument_list\n      (block_argument)))\n  (call\n    (identifier)\n    (argument_list\n      (block_argument)\n      (integer)))\n  (call\n    (identifier)\n    (argument_list\n      (block_argument)))\n  (call\n    (identifier)\n    (argument_list\n      (integer)\n      (block_argument))))\n\n===============================\nmethod call with splat argument\n===============================\n\nfoo(*bar)\nfoo *bar\nfoo *%w{ .. lib }\nfoo *(bar.baz)\n\n---\n\n(program\n  (call\n    (identifier)\n    (argument_list\n      (splat_argument\n        (identifier))))\n  (call\n    (identifier)\n    (argument_list\n      (splat_argument\n        (identifier))))\n  (call\n    (identifier)\n    (argument_list\n      (splat_argument\n        (string_array\n          (bare_string\n            (string_content))\n          (bare_string\n            (string_content))))))\n  (call\n    (identifier)\n    (argument_list\n      (splat_argument\n        (parenthesized_statements\n          (call\n            (identifier)\n            (identifier)))))))\n\n===============================\nmethod call lambda argument\n===============================\n\nfoo :bar, -> (a) { 1 }\nfoo :bar, -> (a) { where(:c => b) }\n\n---\n\n(program\n  (call\n    (identifier)\n    (argument_list\n      (simple_symbol)\n      (lambda\n        (lambda_parameters\n          (identifier))\n        (block\n          (block_body\n            (integer))))))\n  (call\n    (identifier)\n    (argument_list\n      (simple_symbol)\n      (lambda\n        (lambda_parameters\n          (identifier))\n        (block\n          (block_body\n            (call\n              (identifier)\n              (argument_list\n                (pair\n                  (simple_symbol)\n                  (identifier))))))))))\n\n===============================\nmethod call lambda argument and do block\n===============================\n\nfoo :bar, -> (a) { 1 } do\nend\n\n---\n\n(program\n  (call\n    (identifier)\n    (argument_list\n      (simple_symbol)\n      (lambda\n        (lambda_parameters\n          (identifier))\n        (block\n          (block_body\n            (integer)))))\n    (do_block)))\n\n===============================================\nchained method calls with blocks but no parens\n===============================================\n\na.b c, *d do |e|\n  f\nend.g h { |i|\n  i\n}.j do\n  k\nend\n\n---\n\n(program\n  (call\n    receiver: (call\n      receiver: (identifier)\n      method: (identifier)\n      arguments: (argument_list\n        (identifier)\n        (splat_argument\n          (identifier)))\n      block: (do_block\n        parameters: (block_parameters\n          (identifier))\n        body: (body_statement\n          (identifier))))\n    method: (identifier)\n    arguments: (argument_list\n      (call\n        receiver: (call\n          method: (identifier)\n          block: (block\n            parameters: (block_parameters\n              (identifier))\n            body: (block_body\n              (identifier))))\n        method: (identifier)\n        block: (do_block\n          body: (body_statement\n            (identifier)))))))\n\n===============================\nmethod calls in binary expression\n===============================\n\none two or\n  three four, five and\n  six seven, eight, nine\n\n---\n\n(program\n  (binary\n    left: (binary\n      left: (call\n        method: (identifier)\n        arguments: (argument_list\n          (identifier)))\n      right: (call\n        method: (identifier)\n        arguments: (argument_list\n          (identifier)\n          (identifier))))\n    right: (call\n      method: (identifier)\n      arguments: (argument_list\n        (identifier)\n        (identifier)\n        (identifier)))))\n\n===============================\nmethod calls in unary expression\n===============================\n\n!a.b c\n\n---\n\n(program\n  (unary\n    operand: (call\n      receiver: (identifier)\n      method: (identifier)\n      arguments: (argument_list\n        (identifier)))))\n\n===============================\nmethod calls with splat argument\n===============================\n\nfoo(*bar)\nfoo(*[bar, baz].quoz)\nfoo(x, *bar)\nfoo(*bar.baz)\nfoo(**baz)\nfoo **bar, baz\nfoo(*)\nfoo(x, *)\nfoo(**)\nfoo x, **\n---\n\n(program\n  (call\n    (identifier)\n    (argument_list\n      (splat_argument\n        (identifier))))\n  (call\n    (identifier)\n    (argument_list\n      (splat_argument\n        (call\n          (array\n            (identifier)\n            (identifier))\n          (identifier)))))\n  (call\n    (identifier)\n    (argument_list\n      (identifier)\n      (splat_argument\n        (identifier))))\n  (call\n    (identifier)\n    (argument_list\n      (splat_argument\n        (call\n          (identifier)\n          (identifier)))))\n  (call\n    (identifier)\n    (argument_list\n      (hash_splat_argument\n        (identifier))))\n  (call\n    (identifier)\n    (argument_list\n      (hash_splat_argument\n        (identifier))\n      (identifier)))\n  (call\n    (identifier)\n    (argument_list\n      (splat_argument)))\n  (call\n    (identifier)\n    (argument_list\n      (identifier)\n      (splat_argument)))\n  (call\n    (identifier)\n    (argument_list\n      (hash_splat_argument)))\n  (call\n    (identifier)\n    (argument_list\n      (identifier)\n      (hash_splat_argument))))\n\n============================\nmethod call without parens\n============================\n\ninclude D::E.f\n\n---\n\n(program\n  (call\n    (identifier)\n    (argument_list\n      (call\n        (scope_resolution\n          (constant)\n          (constant))\n        (identifier)))))\n\n============================\nmethod call with line break\n============================\n\nFoo\n  .bar!\n  .baz\n\nFoo \\\n  .bar\n\nFoo \\\n  &.bar\n  &.baz\n\nFoo\n  # a comment\n  .bar\n  .baz\n\n---\n\n(program\n  (call\n    (call\n      (constant)\n      (identifier))\n    (identifier))\n  (call\n    (constant)\n    (identifier))\n  (call\n    (call\n      (constant)\n      (identifier))\n    (identifier))\n  (call\n    (call\n      (constant)\n      (comment)\n      (identifier))\n    (identifier)))\n\n======================================\nmethod call with block argument do end\n======================================\n\nfoo do |i|\n  bar\nrescue E\n  baz\nensure\n  quux\nend\n\nfoo do\n  |i| i\nend\n\nfoo do; end\n\nfoo(a) do |i|\n  foo\nend\n\nfoo.bar a do |i|\n  foo\nend\n\nfoo(a) do |name: i, *args|\nend\n\n---\n\n(program\n  (call\n    method: (identifier)\n    block: (do_block\n      parameters: (block_parameters\n        (identifier))\n      body: (body_statement\n        (identifier)\n        (rescue\n          exceptions: (exceptions\n            (constant))\n          body: (then\n            (identifier)))\n        (ensure\n          (identifier)))))\n  (call\n    method: (identifier)\n    block: (do_block\n      parameters: (block_parameters\n        (identifier))\n      body: (body_statement\n        (identifier))))\n  (call\n    method: (identifier)\n    block: (do_block))\n  (call\n    method: (identifier)\n    arguments: (argument_list\n      (identifier))\n    block: (do_block\n      parameters: (block_parameters\n        (identifier))\n      body: (body_statement\n        (identifier))))\n  (call\n    receiver: (identifier)\n    method: (identifier)\n    arguments: (argument_list\n      (identifier))\n    block: (do_block\n      parameters: (block_parameters\n        (identifier))\n      body: (body_statement\n        (identifier))))\n  (call\n    method: (identifier)\n    arguments: (argument_list\n      (identifier))\n    block: (do_block\n      parameters: (block_parameters\n        (keyword_parameter\n          name: (identifier)\n          value: (identifier))\n        (splat_parameter\n          name: (identifier))))))\n\n===============================\nmethod call with block argument curly\n===============================\n\nfoo { |i| foo }\nfoo items.any? { |i| i > 0 }\nfoo(bar, baz) { quux }\n\n---\n\n(program\n  (call\n    method: (identifier)\n    block: (block\n      parameters: (block_parameters\n        (identifier))\n      body: (block_body\n        (identifier))))\n  (call\n    method: (identifier)\n    arguments: (argument_list\n      (call\n        receiver: (identifier)\n        method: (identifier)\n        block: (block\n          parameters: (block_parameters\n            (identifier))\n          body: (block_body\n            (binary\n              left: (identifier)\n              right: (integer)))))))\n  (call\n    method: (identifier)\n    arguments: (argument_list\n      (identifier)\n      (identifier))\n    block: (block\n      body: (block_body\n        (identifier)))))\n\n===============================\nmethod call with block shadow arguments\n===============================\n\nfoo { |; i, j| }\nfoo { |x, y ; i, j| }\n\n---\n\n(program\n  (call\n    method: (identifier)\n    block: (block\n      parameters: (block_parameters\n        locals: (identifier)\n        locals: (identifier))))\n  (call\n    method: (identifier)\n    block: (block\n      parameters: (block_parameters\n        (identifier)\n        (identifier)\n        locals: (identifier)\n        locals: (identifier)))))\n\n===============================\nmethod call with capitalized name\n===============================\n\nrequest.GET\n\n---\n\n(program\n  (call\n    (identifier)\n    (constant)))\n\n===============================\ndestructured parameters\n===============================\n\n-> (d, *f, (x, y)) {}\n\ndef foo(d, *f, (x, y))\nend\n\ndef foo d, *f, (x, y)\nend\n\nfoo do |a, (c, d, *f, (x, y)), *e|\nend\n\n---\n\n(program\n  (lambda\n    (lambda_parameters\n      (identifier)\n      (splat_parameter\n        (identifier))\n      (destructured_parameter\n        (identifier)\n        (identifier)))\n    (block))\n  (method\n    (identifier)\n    (method_parameters\n      (identifier)\n      (splat_parameter\n        (identifier))\n      (destructured_parameter\n        (identifier)\n        (identifier))))\n  (method\n    (identifier)\n    (method_parameters\n      (identifier)\n      (splat_parameter\n        (identifier))\n      (destructured_parameter\n        (identifier)\n        (identifier))))\n  (call\n    (identifier)\n    (do_block\n      (block_parameters\n        (identifier)\n        (destructured_parameter\n          (identifier)\n          (identifier)\n          (splat_parameter\n            (identifier))\n          (destructured_parameter\n            (identifier)\n            (identifier)))\n        (splat_parameter\n          (identifier))))))\n\n==================================================\nelement reference and method with array arguments\n==================================================\n\nfoo []\nfoo [1]\nfoo[1]\n\n---\n\n(program\n  (call\n    method: (identifier)\n    arguments: (argument_list\n      (array)))\n  (call\n    method: (identifier)\n    arguments: (argument_list\n      (array\n        (integer))))\n  (element_reference\n    object: (identifier)\n    (integer)))\n\n=====================================\nelement reference on call expression\n=====================================\n\nd(a) [0]\nd.find { |x| x > 1 } [0]\nd.find { |x| x > 1 } [0] == 0\n\n---\n\n(program\n  (element_reference\n    (call\n      (identifier)\n      (argument_list\n        (identifier)))\n    (integer))\n  (element_reference\n    (call\n      (identifier)\n      (identifier)\n      (block\n        (block_parameters\n          (identifier))\n        (block_body\n          (binary\n            (identifier)\n            (integer)))))\n    (integer))\n  (binary\n    (element_reference\n      (call\n        (identifier)\n        (identifier)\n        (block\n          (block_parameters\n            (identifier))\n          (block_body\n            (binary\n              (identifier)\n              (integer)))))\n      (integer))\n    (integer)))\n\n============================\nelement reference with block\n============================\n\nfoo[:bar] { |baz| baz }\n\nfoo[:bar] do |baz|\n  baz\nend\n\n---\n\n(program\n  (element_reference\n    (identifier)\n    (simple_symbol)\n    (block\n      (block_parameters\n        (identifier))\n      (block_body\n        (identifier))))\n  (element_reference\n    (identifier)\n    (simple_symbol)\n    (do_block\n      (block_parameters\n        (identifier))\n      (body_statement\n        (identifier)))))\n\n======================================\ncall with array and block\n======================================\n\nfun [0] { |x| x }\n\nfun [0] do\n  puts 1\nend\n\n---\n\n(program\n  (call\n    (identifier)\n    (argument_list\n      (array\n        (integer)))\n    (block\n      (block_parameters\n        (identifier))\n      (block_body\n        (identifier))))\n  (call\n    (identifier)\n    (argument_list\n      (array\n        (integer)))\n    (do_block\n      (body_statement\n        (call\n          (identifier)\n          (argument_list\n            (integer)))))))\n\n========================================================================\ncall with normal and keyword argument with value that looks like a block\n========================================================================\nrender \"foo/bars/show\", locals: { }\nrender \"foo/bars/show\", locals: { display_text: dt, safe_text: \"hello\" }\n\n---\n\n(program\n  (call\n    (identifier)\n    (argument_list\n      (string\n        (string_content))\n      (pair\n        (hash_key_symbol)\n        (hash))))\n  (call\n    (identifier)\n    (argument_list\n      (string\n        (string_content))\n      (pair\n        (hash_key_symbol)\n        (hash\n          (pair\n            (hash_key_symbol)\n            (identifier))\n          (pair\n            (hash_key_symbol)\n            (string\n              (string_content))))))))\n\n========================================================================\ncall with keyword argument on different lines\n========================================================================\n\nrender :show_details, 5,\n    description:\n      \"Some long \" \\\n      \"piece of text.\",\n    dark_mode: false\n\nrender \"/foo/bar\", params:\n    {\n        id: 3,\n        title: \"Hello world\"\n    },\n    headers: { Accept: \"text/html\" }\n\nrender \"/foo/bar\", params:\n    {\n        id: 3,\n        title: \"Hello world\"\n    }\n\n---\n\n(program\n  (call\n    method: (identifier)\n    arguments: (argument_list\n      (simple_symbol)\n      (integer)\n      (pair\n        key: (hash_key_symbol)\n        value: (chained_string\n          (string\n            (string_content))\n          (string\n            (string_content))))\n      (pair\n        key: (hash_key_symbol)\n        value: (false))))\n  (call\n    method: (identifier)\n    arguments: (argument_list\n      (string\n        (string_content))\n      (pair\n        key: (hash_key_symbol)\n        value: (hash\n          (pair\n            key: (hash_key_symbol)\n            value: (integer))\n          (pair\n            key: (hash_key_symbol)\n            value: (string\n              (string_content)))))\n      (pair\n        key: (hash_key_symbol)\n        value: (hash\n          (pair\n            key: (hash_key_symbol)\n            value: (string\n              (string_content)))))))\n  (call\n    method: (identifier)\n    arguments: (argument_list\n      (string\n        (string_content))\n      (pair\n        key: (hash_key_symbol)\n        value: (hash\n          (pair\n            key: (hash_key_symbol)\n            value: (integer))\n          (pair\n            key: (hash_key_symbol)\n            value: (string\n              (string_content))))))))\n\n==============\nempty lambda expression\n==============\n\nlambda {}\n\n---\n\n(program\n  (call\n    (identifier)\n    (block)))\n\n==================\nlambda expressions\n==================\n\nlambda { foo }\nlambda(&block) { foo }\nlambda(&lambda{})\n\n---\n\n(program\n  (call\n    (identifier)\n    (block\n      (block_body\n        (identifier))))\n  (call\n    (identifier)\n    (argument_list\n      (block_argument\n        (identifier)))\n    (block\n      (block_body\n        (identifier))))\n  (call\n    (identifier)\n    (argument_list\n      (block_argument\n        (call\n          (identifier)\n          (block))))))\n\n====================\nlambda expression with an arg\n====================\n\nlambda { |foo| 1 }\n\n---\n\n(program\n  (call\n    (identifier)\n    (block\n      (block_parameters\n        (identifier))\n      (block_body\n        (integer)))))\n\n===========================\nlambda expression with multiple args\n===========================\n\nlambda { |a, b, c|\n  1\n  2\n}\n\n---\n\n(program\n  (call\n    (identifier)\n    (block\n      (block_parameters\n        (identifier)\n        (identifier)\n        (identifier))\n      (block_body\n        (integer)\n        (integer)))))\n\n===========================\nlambda expression with trailing comma\n===========================\n\nlambda { |a, b,|\n  1\n}\n\n---\n\n(program\n  (call\n    (identifier)\n    (block\n      (block_parameters\n        (identifier)\n        (identifier))\n      (block_body\n        (integer)))))\n\n===========================\nlambda expression with optional arg\n===========================\n\nlambda { |a, b=nil|\n  1\n}\n\n---\n\n(program\n  (call\n    (identifier)\n    (block\n      (block_parameters\n        (identifier)\n        (optional_parameter\n          (identifier)\n          (nil)))\n      (block_body\n        (integer)))))\n\n===========================\nlambda expression with keyword arg\n===========================\n\nlambda { |a, b: nil|\n  1\n}\n\n---\n\n(program\n  (call\n    (identifier)\n    (block\n      (block_parameters\n        (identifier)\n        (keyword_parameter\n          (identifier)\n          (nil)))\n      (block_body\n        (integer)))))\n\n====================\nlambda expression with do end\n====================\n\nlambda do |foo|\n  1\nend\n\n---\n\n(program\n  (call\n    (identifier)\n    (do_block\n      (block_parameters\n        (identifier))\n      (body_statement\n        (integer)))))\n\n============================\nlambda and proc as variables\n============================\n\nproc = Proc.new\nlambda = lambda {}\nproc = proc {}\n\n---\n\n(program\n  (assignment\n    (identifier)\n    (call\n      (constant)\n      (identifier)))\n  (assignment\n    (identifier)\n    (call\n      (identifier)\n      (block)))\n  (assignment\n    (identifier)\n    (call\n      (identifier)\n      (block))))\n\n===============================\nbackslash-newline as line continuation\n===============================\n\nfoo \\\n  a, b\n\n\"abc \\\nde\"\n\nfoo \\\n  \"abc\"\n\n---\n\n(program\n  (call\n    (identifier)\n    (argument_list\n      (identifier)\n      (identifier)))\n  (string\n    (string_content)\n    (escape_sequence)\n    (string_content))\n  (call\n    (identifier)\n    (argument_list\n      (string\n        (string_content)))))\n\n===============================\nbasic division\n===============================\n\n10 / 5\nx / y\nx /\n5\n---\n\n(program\n  (binary\n    (integer)\n    (integer))\n  (binary\n    (identifier)\n    (identifier))\n  (binary\n    (identifier)\n    (integer)))\n\n===============================\ndivision without spaces\n===============================\n\nh/w\n\"#{foo}\"\n\nTime.at(timestamp/1000)\n\"#{timestamp}\"\n\n---\n\n(program\n  (binary\n    left: (identifier)\n    right: (identifier))\n  (string\n    (interpolation\n      (identifier)))\n  (call\n    receiver: (constant)\n    method: (identifier)\n    arguments: (argument_list\n      (binary\n        left: (identifier)\n        right: (integer))))\n  (string\n    (interpolation\n      (identifier))))\n\n===============================\nregex as parameter\n===============================\n\nfoo /bar/\n\n---\n\n(program\n  (call\n    (identifier)\n    (argument_list\n      (regex\n        (string_content)))))\n\n===============================\nregex with opening space\n===============================\n\nfoo\n/ bar/\n\n---\n\n(program\n  (identifier)\n  (regex\n    (string_content)))\n\n===============================\nforward slash operator as method\n===============================\n\nFoo / \"bar\"\n\"/edit\"\n\n---\n\n(program\n  (binary\n    (constant)\n    (string\n      (string_content)))\n  (string\n    (string_content)))\n\n===============================\nmultiline regex\n===============================\n\n/ a\n  b/\n\n---\n\n(program\n  (regex\n    (string_content)))\n"
  },
  {
    "path": "test/corpus/line-endings.txt",
    "content": "=================\r\nCRLF line endings\r\n=================\r\n\r\nputs 'hi'\r\nx = foo()\r\n\r\n---\r\n\r\n(program\r\n  (call (identifier) (argument_list (string (string_content))))\r\n  (assignment (identifier) (call (identifier) (argument_list))))\r\n\r\n=======================\r\nCRLF multiline comments\r\n=======================\r\n\r\n=begin\r\n=end\r\n\r\n---\r\n\r\n(program (comment))\r\n"
  },
  {
    "path": "test/corpus/literals.txt",
    "content": "======\nsymbol\n======\n\n:foo\n:foo!\n:foo?\n:foo=\n:@foo\n:@foo_0123_bar\n:@@foo\n:$foo\n:$0\n:_bar\n:åäö\n:_\n\n---\n\n(program\n  (simple_symbol)\n  (simple_symbol)\n  (simple_symbol)\n  (simple_symbol)\n  (simple_symbol)\n  (simple_symbol)\n  (simple_symbol)\n  (simple_symbol)\n  (simple_symbol)\n  (simple_symbol)\n  (simple_symbol)\n  (simple_symbol))\n\n======\nsymbol operators\n======\n\n:+\n:-\n:+@\n:-@\n:[]\n:[]=\n:&\n:!\n:`\n:^\n:|\n:~\n:/\n:%\n:*\n:**\n:==\n:===\n:=~\n:>\n:>=\n:>>\n:<\n:<=\n:<<\n:<=>\n:!=\n:!~\n\n---\n\n(program\n  (simple_symbol)\n  (simple_symbol)\n  (simple_symbol)\n  (simple_symbol)\n  (simple_symbol)\n  (simple_symbol)\n  (simple_symbol)\n  (simple_symbol)\n  (simple_symbol)\n  (simple_symbol)\n  (simple_symbol)\n  (simple_symbol)\n  (simple_symbol)\n  (simple_symbol)\n  (simple_symbol)\n  (simple_symbol)\n  (simple_symbol)\n  (simple_symbol)\n  (simple_symbol)\n  (simple_symbol)\n  (simple_symbol)\n  (simple_symbol)\n  (simple_symbol)\n  (simple_symbol)\n  (simple_symbol)\n  (simple_symbol)\n  (simple_symbol)\n  (simple_symbol))\n\n====================\nsingle quoted symbol\n====================\n\n:''\n:'foo bar'\n:'#{'\n\n---\n\n(program\n  (delimited_symbol)\n  (delimited_symbol\n    (string_content))\n  (delimited_symbol\n    (string_content)))\n\n====================\ndouble quoted symbol\n====================\n\n:\"foo bar\"\n:\"#\"\n\n---\n\n(program\n  (delimited_symbol\n    (string_content))\n  (delimited_symbol\n    (string_content)))\n\n=======================================\ndouble quoted symbol with interpolation\n=======================================\n\n:\"foo #{bar}\"\n\n---\n\n(program\n  (delimited_symbol\n    (string_content)\n    (interpolation\n      (identifier))))\n\n=======================================\ninterpolation with no content\n=======================================\n\n:\"foo #{}\"\n\n---\n\n(program\n  (delimited_symbol\n    (string_content)\n    (interpolation)))\n\n=========================================\npercent symbol with unbalanced delimiters\n=========================================\n\n%s/a/\n%s\\a\\\n%s#a#\n\n---\n\n(program\n  (delimited_symbol\n    (string_content))\n  (delimited_symbol\n    (string_content))\n  (delimited_symbol\n    (string_content)))\n\n=======================================\npercent symbol with balanced delimiters\n=======================================\n\n%s{a{b}c}\n%s<a<b>c>\n%s(a(b)c)\n%s[a[b]c]\n\n---\n\n(program\n  (delimited_symbol\n    (string_content))\n  (delimited_symbol\n    (string_content))\n  (delimited_symbol\n    (string_content))\n  (delimited_symbol\n    (string_content)))\n\n=======================================\nglobal variables\n=======================================\n\n$foo\n$$\n$!\n$@\n$&\n$`\n$'\n$+\n$~\n$=\n$/\n$\\\n$,\n$;\n$.\n$<\n$>\n$_\n$0\n$*\n$$\n$?\n$:\n$\"\n$0\n$1\n$2\n$3\n$4\n$5\n$6\n$7\n$8\n$9\n$0\n$10\n$stdin\n$stdout\n$stderr\n$DEBUG\n$FILENAME\n$LOAD_PATH\n$VERBOSE\n\n---\n\n(program\n  (global_variable)\n  (global_variable)\n  (global_variable)\n  (global_variable)\n  (global_variable)\n  (global_variable)\n  (global_variable)\n  (global_variable)\n  (global_variable)\n  (global_variable)\n  (global_variable)\n  (global_variable)\n  (global_variable)\n  (global_variable)\n  (global_variable)\n  (global_variable)\n  (global_variable)\n  (global_variable)\n  (global_variable)\n  (global_variable)\n  (global_variable)\n  (global_variable)\n  (global_variable)\n  (global_variable)\n  (global_variable)\n  (global_variable)\n  (global_variable)\n  (global_variable)\n  (global_variable)\n  (global_variable)\n  (global_variable)\n  (global_variable)\n  (global_variable)\n  (global_variable)\n  (global_variable)\n  (global_variable)\n  (global_variable)\n  (global_variable)\n  (global_variable)\n  (global_variable)\n  (global_variable)\n  (global_variable)\n  (global_variable))\n\n=======\ninteger\n=======\n\n1234\n\n---\n\n(program\n  (integer))\n\n=======\ninteger as object\n=======\n\n3.times\n\n---\n\n(program\n  (call\n    (integer)\n    (identifier)))\n\n=======================\ninteger with underscore\n=======================\n\n1_234\n\n---\n\n(program\n  (integer))\n\n===========================\ninteger with decimal prefix\n===========================\n\n0d1_234\n0D1_234\n\n---\n\n(program\n  (integer)\n  (integer))\n\n===============================\ninteger with hexadecimal prefix\n===============================\n\n0xa_bcd_ef0_123_456_789\n\n---\n\n(program\n  (integer))\n\n===============================\ninteger with hexadecimal prefix capitalised\n===============================\n\n0Xa_bcd_ef0_123_456_789\n\n---\n\n(program\n  (integer))\n\n=========================\ninteger with octal prefix\n=========================\n\n01234567\n0o1234567\n\n---\n\n(program\n  (integer)\n  (integer))\n\n==========================\ninteger with binary prefix\n==========================\n0b1_0\n0B1_0\n\n---\n\n(program\n  (integer)\n  (integer))\n\n=====\nfloat\n=====\n\n1.234_5e678_90\n1E30\n1.0e+6\n1.0e-6\n\n---\n\n(program\n  (float)\n  (float)\n  (float)\n  (float))\n\n=====\ncomplex\n=====\n\n-2i\n+2i\n1+1i\n1-10i\n10+3i\n12-34i\n\n-2.2i\n+2.2i\n1+1.2i\n1-10.2i\n10+3.2i\n12-34.2i\n\n-2ri\n+2.2ri\n1+1ri\n1-10.2ri\n10+3ri\n12-34.2ri\n\n---\n\n(program\n  (unary\n    operand: (complex\n      (integer)))\n  (unary\n    operand: (complex\n      (integer)))\n  (binary\n    left: (integer)\n    right: (complex\n      (integer)))\n  (binary\n    left: (integer)\n    right: (complex\n      (integer)))\n  (binary\n    left: (integer)\n    right: (complex\n      (integer)))\n  (binary\n    left: (integer)\n    right: (complex\n      (integer)))\n  (unary\n    operand: (complex\n      (float)))\n  (unary\n    operand: (complex\n      (float)))\n  (binary\n    left: (integer)\n    right: (complex\n      (float)))\n  (binary\n    left: (integer)\n    right: (complex\n      (float)))\n  (binary\n    left: (integer)\n    right: (complex\n      (float)))\n  (binary\n    left: (integer)\n    right: (complex\n      (float)))\n  (unary\n    operand: (complex\n      (rational\n        (integer))))\n  (unary\n    operand: (complex\n      (rational\n        (float))))\n  (binary\n    left: (integer)\n    right: (complex\n      (rational\n        (integer))))\n  (binary\n    left: (integer)\n    right: (complex\n      (rational\n        (float))))\n  (binary\n    left: (integer)\n    right: (complex\n      (rational\n        (integer))))\n  (binary\n    left: (integer)\n    right: (complex\n      (rational\n        (float)))))\n\n========\nrational\n========\n\n2/3r\n1.2r\n+1.2r\n-2r\n0b01r\n0o7r\n0d1r\n0x12r\n\n---\n\n(program\n  (binary\n    (integer)\n    (rational\n      (integer)))\n  (rational\n    (float))\n  (unary\n    (rational\n      (float)))\n  (unary\n    (rational\n      (integer)))\n  (rational\n    (integer))\n  (rational\n    (integer))\n  (rational\n    (integer))\n  (rational\n    (integer)))\n\n=======\nboolean\n=======\n\ntrue\nfalse\n\n---\n\n(program\n  (true)\n  (false))\n\n===\nnil\n===\n\nnil\n\n---\n\n(program\n  (nil))\n\n====================\nsingle-quoted string\n====================\n\n''\n' '\n'  '\n\n---\n\n(program\n  (string)\n  (string\n    (string_content))\n  (string\n    (string_content)))\n\n==============================================\nsingle-quoted strings with backslashes\n==============================================\n\n'\\''\n'\\\\ \\n'\n'\\x00\\x01\\x02'\n\n---\n\n(program\n  (string\n    (string_content))\n  (string\n    (string_content))\n  (string\n    (string_content)))\n\n=================================================\nsingle-quoted string with pound and curly brace\n=================================================\n\n'#{hello'\n\n---\n\n(program\n  (string\n    (string_content)))\n\n====================\ndouble-quoted string\n====================\n\n\"\"\n\" \"\n\"  \"\n\n---\n\n(program\n  (string)\n  (string\n    (string_content))\n  (string\n    (string_content)))\n\n==============================================\ndouble-quoted strings with escape sequences\n==============================================\n\n\"\\\"\"\n\"\\\\\"\n\"\\d\"\n\"\\#{foo}\"\n\"\\u{1F600}\"\n\"\\u{1F600 1F600}\"\n\n---\n\n(program\n  (string\n    (escape_sequence))\n  (string\n    (escape_sequence))\n  (string\n    (escape_sequence))\n  (string\n    (escape_sequence)\n    (string_content))\n  (string\n    (escape_sequence))\n  (string\n    (escape_sequence)))\n\n=================================\ndouble-quoted string with just pound\n=================================\n\n\"#\"\n\n---\n\n(program\n  (string\n    (string_content)))\n\n=============\ninterpolation\n=============\n\n\"#{foo}\"\n\"foo#@foo\"\n\"#@@foo\"\n\"#$foo\"\n\"#$%\"\n\"#$1\"\n\"#$_1\"\n\"#$-AB\"\n\"#$-10\"\n\"#@1\"\n\"#@@1\"\n\"#{':foo' unless bar}\"\n\n---\n\n(program\n  (string\n    (interpolation\n      (identifier)))\n  (string\n    (string_content)\n    (interpolation\n      (instance_variable)))\n  (string\n    (interpolation\n      (class_variable)))\n  (string\n    (interpolation\n      (global_variable)))\n  (string\n    (string_content))\n  (string\n    (interpolation\n      (global_variable)))\n  (string\n    (interpolation\n      (global_variable)))\n  (string\n    (interpolation\n      (global_variable))\n    (string_content))\n  (string\n    (string_content))\n  (string\n    (string_content))\n  (string\n    (string_content))\n  (string\n    (interpolation\n      (unless_modifier\n        (string\n          (string_content))\n        (identifier)))))\n\n===========================================\npercent q string with unbalanced delimiters\n===========================================\n\n%q/a/\n%q\\a\\\n%q#a#\n\n---\n\n(program\n  (string\n    (string_content))\n  (string\n    (string_content))\n  (string\n    (string_content)))\n\n=========================================\npercent q string with balanced delimiters\n=========================================\n\n%q<a<b>c>\n%q{a{b}c}\n%q[a[b]c]\n%q(a(b)c)\n\n---\n\n(program\n  (string\n    (string_content))\n  (string\n    (string_content))\n  (string\n    (string_content))\n  (string\n    (string_content)))\n\n=========================================\npercent string with unbalanced delimiters\n=========================================\n\n%/a/\n%\\a\\\n%#a#\n\n---\n\n(program\n  (string\n    (string_content))\n  (string\n    (string_content))\n  (string\n    (string_content)))\n\n=========================================\npercent string with balanced delimiters\n=========================================\n\n%<a<b>c>\n%{a{b}c}\n%[a[b]c]\n%(a(b)c)\n\n---\n\n(program\n  (string\n    (string_content))\n  (string\n    (string_content))\n  (string\n    (string_content))\n  (string\n    (string_content)))\n\n===========================================\npercent Q string with unbalanced delimiters\n===========================================\n\n%Q#a#\n%Q/a/\n%Q\\a\\\n\n---\n\n(program\n  (string\n    (string_content))\n  (string\n    (string_content))\n  (string\n    (string_content)))\n\n=========================================\npercent Q string with balanced delimiters\n=========================================\n\n%Q<a<b>c>\n%Q{a{b}c}\n%Q[a[b]c]\n%Q(a(b)c)\n\n---\n\n(program\n  (string\n    (string_content))\n  (string\n    (string_content))\n  (string\n    (string_content))\n  (string\n    (string_content)))\n\n===============\nstring chaining\n===============\n\n%q(a) \"b\" \"c\"\n\"d\" \"e\"\n\n---\n\n(program\n  (chained_string\n    (string\n      (string_content))\n    (string\n      (string_content))\n    (string\n      (string_content)))\n  (chained_string\n    (string\n      (string_content))\n    (string\n      (string_content))))\n\n==========================\nnewline-delimited strings\n==========================\n\nflash[:notice] = \"Pattern addition failed for '%s' in '%s'\", %\n                  [pattern, key]\n\n----\n\n(program\n  (assignment\n    (element_reference\n      (identifier)\n      (simple_symbol))\n    (right_assignment_list\n      (string\n        (string_content))\n      (string\n        (string_content)))))\n\n==========================\n% formatting that looks like a newline-delimited strings\n==========================\n\nfoo(\"%s '%s' \" %\n  [a, b])\n\n----\n\n(program\n  (call\n    (identifier)\n    (argument_list\n      (binary\n        (string\n          (string_content))\n        (array\n          (identifier)\n          (identifier))))))\n\n========================================\nSingle character string literals\n========================================\n\n?a\n??\n?\\n\n?\\\\\n?\\377\n?\\u{41}\n?\\M-a\n?\\C-a\n?\\M-\\C-a\n?あ\n?\\u028f\n?\\u{028f}\n?\\xff\nfoo(?/)\n\n---\n\n(program\n  (character)\n  (character)\n  (character)\n  (character)\n  (character)\n  (character)\n  (character)\n  (character)\n  (character)\n  (character)\n  (character)\n  (character)\n  (character)\n  (call\n    (identifier)\n    (argument_list\n      (character))))\n\n========================================\nnested strings with different delimiters\n========================================\n\n\"abc#{\n  %r(def(ghi#{\n    `whoami`\n  })klm)\n}nop\"\n\n\n---\n\n(program\n  (string\n    (string_content)\n    (interpolation\n      (regex\n        (string_content)\n        (interpolation\n          (subshell\n            (string_content)))\n        (string_content)))\n    (string_content)))\n\n========================================\nbasic heredocs\n========================================\n\n<<TEXT\nheredoc \\x01 content\nTEXT\n\n<<TEXT1\n  TEXT1 ok if indented\nTEXT1\n\n<<TEXT_B\n* heredoc content\nTEXT_B\n\n<<~TEXT\ncontent\nTEXT\n\nif indentation_works?\n  <<-sql\n  heredoc content\n  sql\n\n  <<~TEXT\n  TEXT\n\n  <<~EOF\n    content\n  EOF\nend\n\n<<'..end src/parser.c modeval..id7a99570e05'\nheredoc content\n..end src/parser.c modeval..id7a99570e05\n\n---\n\n(program\n  (heredoc_beginning)\n  (heredoc_body\n    (heredoc_content)\n    (escape_sequence)\n    (heredoc_content)\n    (heredoc_end))\n  (heredoc_beginning)\n  (heredoc_body\n    (heredoc_content)\n    (heredoc_end))\n  (heredoc_beginning)\n  (heredoc_body\n    (heredoc_content)\n    (heredoc_end))\n  (heredoc_beginning)\n  (heredoc_body\n    (heredoc_content)\n    (heredoc_end))\n  (if\n    (call\n      (identifier))\n    (then\n      (heredoc_beginning)\n      (heredoc_body\n        (heredoc_content)\n        (heredoc_end))\n      (heredoc_beginning)\n      (heredoc_body\n        (heredoc_content)\n        (heredoc_end))\n      (heredoc_beginning)\n      (heredoc_body\n        (heredoc_content)\n        (heredoc_end))))\n  (heredoc_beginning)\n  (heredoc_body\n    (heredoc_content)\n    (heredoc_end)))\n\n========================================\nheredoc with long identifier (>255 chars)\n========================================\n\n<<~AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\ncontent\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n\n---\n\n(program\n  (heredoc_beginning)\n  (heredoc_body\n    (heredoc_content)\n    (heredoc_end)))\n\n========================================\nheredoc with interspersed end word\n========================================\n\n<<-eos\n  repositories\neos\n\n---\n\n(program\n  (heredoc_beginning)\n  (heredoc_body\n    (heredoc_content)\n    (heredoc_end)))\n\n========================================\nheredoc with end word in content\n========================================\n\n<<HTML\n<HTML>\n  <HEAD></HEAD><BODY></BODY>\n</HTML>\nHTML\n\n<<a\nattr_accessor\na\n\n---\n\n(program\n  (heredoc_beginning)\n  (heredoc_body\n    (heredoc_content)\n    (heredoc_end))\n  (heredoc_beginning)\n  (heredoc_body\n    (heredoc_content)\n    (heredoc_end)))\n\n========================================\nheredocs in context starting with dot\n========================================\n\ndef foo\n  select(<<-SQL)\n  .\n  SQL\nend\n\n---\n\n(program\n  (method\n    (identifier)\n    (body_statement\n      (call\n        (identifier)\n        (argument_list\n          (heredoc_beginning)))\n      (heredoc_body\n        (heredoc_content)\n        (heredoc_end)))))\n\n========================================\nheredocs with method continuation\n========================================\n\nselect(<<-SQL)\nab\nSQL\n  .join()\n\n---\n\n(program\n  (call\n    receiver: (call\n      method: (identifier)\n      arguments: (argument_list\n        (heredoc_beginning)))\n    (heredoc_body\n      (heredoc_content)\n      (heredoc_end))\n    method: (identifier)\n    arguments: (argument_list)))\n\n========================================\nheredocs with suffix dot method continuation\n========================================\n\njoins(<<~SQL).\n   `foo`\nSQL\nwhere(\"a\")\n\n---\n\n(program\n  (call\n    receiver: (call\n      method: (identifier)\n      arguments: (argument_list\n        (heredoc_beginning)))\n    (heredoc_body\n      (heredoc_content)\n      (heredoc_end))\n    method: (identifier)\n    arguments: (argument_list\n      (string\n        (string_content)))))\n\n========================================\nmultiple heredocs with method continuation\n========================================\n\njoins(<<~SQL).where(<<~SQL).\n  `one`\nSQL\n  `two`\nSQL\ngroup(\"b\")\n\n---\n\n(program\n  (call\n    receiver: (call\n      receiver: (call\n        method: (identifier)\n        arguments: (argument_list\n          (heredoc_beginning)))\n      method: (identifier)\n      arguments: (argument_list\n        (heredoc_beginning)))\n    (heredoc_body\n      (heredoc_content)\n      (heredoc_end))\n    (heredoc_body\n      (heredoc_content)\n      (heredoc_end))\n    method: (identifier)\n    arguments: (argument_list\n      (string\n        (string_content)))))\n\n========================================\nheredocs with interpolation\n========================================\n\n<<TEXT\na\nb #{[1, \"c #{2} d\", 3]} e\n#{4} f #{foo.bar}\n#{a if b}\n#{\n  # multiline\n  foo(\n    1,\n    bar\n  ).baz\n}\n#@foo#@@bar#$0\ng\nTEXT\n\nreturn\n\n---\n\n(program\n  (heredoc_beginning)\n  (heredoc_body\n    (heredoc_content)\n    (interpolation\n      (array\n        (integer)\n        (string\n          (string_content)\n          (interpolation\n            (integer))\n          (string_content))\n        (integer)))\n    (heredoc_content)\n    (interpolation\n      (integer))\n    (heredoc_content)\n    (interpolation\n      (call\n        (identifier)\n        (identifier)))\n    (heredoc_content)\n    (interpolation\n      (if_modifier\n        (identifier)\n        (identifier)))\n    (heredoc_content)\n    (interpolation\n      (comment)\n      (call\n        (call\n          (identifier)\n          (argument_list\n            (integer)\n            (identifier)))\n        (identifier)))\n    (heredoc_content)\n    (interpolation\n      (instance_variable))\n    (interpolation\n      (class_variable))\n    (interpolation\n      (global_variable))\n    (heredoc_content)\n    (heredoc_end))\n  (return))\n\n========================================\nheredocs with in args, pairs, and arrays\n========================================\n\nfoo.new(\n  select: <<-TEXT,\n    heredoc content,\n  TEXT\n  conditions: <<-TEXT\n    heredoc content\n  TEXT\n)\n{\n  select: <<-TEXT,\n    heredoc content,\n  TEXT\n  conditions: <<-TEXT\n    heredoc content\n  TEXT\n}\n\n[\n  <<-TEXT,\n  a\n  TEXT\n  <<-TEXT\n  b\n  TEXT\n]\n\nfoo[\n  1,\n  <<-TEXT\n  hi\n  TEXT\n  ] = 3\n\n---\n\n(program\n  (call\n    receiver: (identifier)\n    method: (identifier)\n    arguments: (argument_list\n      (pair\n        key: (hash_key_symbol)\n        value: (heredoc_beginning))\n      (heredoc_body\n        (heredoc_content)\n        (heredoc_end))\n      (pair\n        key: (hash_key_symbol)\n        value: (heredoc_beginning))\n      (heredoc_body\n        (heredoc_content)\n        (heredoc_end))))\n  (hash\n    (pair\n      key: (hash_key_symbol)\n      value: (heredoc_beginning))\n    (heredoc_body\n      (heredoc_content)\n      (heredoc_end))\n    (pair\n      key: (hash_key_symbol)\n      value: (heredoc_beginning))\n    (heredoc_body\n      (heredoc_content)\n      (heredoc_end)))\n  (array\n    (heredoc_beginning)\n    (heredoc_body\n      (heredoc_content)\n      (heredoc_end))\n    (heredoc_beginning)\n    (heredoc_body\n      (heredoc_content)\n      (heredoc_end)))\n  (assignment\n    left: (element_reference\n      object: (identifier)\n      (integer)\n      (heredoc_beginning)\n      (heredoc_body\n        (heredoc_content)\n        (heredoc_end)))\n    right: (integer)))\n\n==============================================================\nheredocs with method calls and interpolation with method calls\n==============================================================\n\nfoo(<<-STR.strip_heredoc.tr()\n    content #{ foo; bar().foo}\n  STR\n)\n\n---\n\n(program\n  (call\n    method: (identifier)\n    arguments: (argument_list\n      (call\n        receiver: (call\n          receiver: (heredoc_beginning)\n          method: (identifier))\n        method: (identifier)\n        arguments: (argument_list))\n      (heredoc_body\n        (heredoc_content)\n        (interpolation\n          (identifier)\n          (call\n            receiver: (call\n              method: (identifier)\n              arguments: (argument_list))\n            method: (identifier)))\n        (heredoc_content)\n        (heredoc_end)))))\n\n========================================\nmultiple heredocs\n========================================\n\nputs <<-ONE.size, <<-TWO.size\nfirst heredoc content\nONE\nsecond heredoc content\nTWO\n\n---\n\n(program\n  (call\n    (identifier)\n    (argument_list\n      (call\n        (heredoc_beginning)\n        (identifier))\n      (call\n        (heredoc_beginning)\n        (identifier))))\n  (heredoc_body\n    (heredoc_content)\n    (heredoc_end))\n  (heredoc_body\n    (heredoc_content)\n    (heredoc_end)))\n\n========================================\nheredoc content that starts with a dot\n========================================\n\n-> {\n  select(<<-SQL)\n  .\n  SQL\n}\n\n---\n\n(program\n  (lambda\n    (block\n      (block_body\n        (call\n          (identifier)\n          (argument_list\n            (heredoc_beginning)))\n        (heredoc_body\n          (heredoc_content)\n          (heredoc_end))))))\n\n========================================\nun-terminated heredocs\n========================================\n\n<<-ONE\n\n---\n\n(program\n  (heredoc_beginning)\n  (heredoc_body\n    (heredoc_content)\n    (heredoc_end)))\n\n=================================\nno interpolation or escape sequences in single quoted heredoc\n=================================\n\n<<'EOF'\nThis is \\not\\ an interpolation: #{foo}\nEOF\n\n<<~'EOF'\nThis is \\not\\ an interpolation: #{foo}\nEOF\n\n<<-'EOF'\nThis is \\not\\ an interpolation: #{foo}\nEOF\n\n---\n\n(program\n  (heredoc_beginning)\n  (heredoc_body\n    (heredoc_content)\n    (heredoc_end))\n  (heredoc_beginning)\n  (heredoc_body\n    (heredoc_content)\n    (heredoc_end))\n  (heredoc_beginning)\n  (heredoc_body\n    (heredoc_content)\n    (heredoc_end)))\n\n==================\nbackticks subshell\n==================\n\n`/usr/bin/env test blah blah`\n\n---\n\n(program\n  (subshell\n    (string_content)))\n\n==============================\nbackticks subshell with escape\n==============================\n\n`/usr/bin/env test blah \\`blah\\``\n\n---\n\n(program\n  (subshell\n    (string_content)\n    (escape_sequence)\n    (string_content)\n    (escape_sequence)))\n\n===========\nempty array\n===========\n\n[]\n\n---\n\n(program\n  (array))\n\n=====\narray\n=====\n\n[ foo, bar ]\n[foo, *bar]\n[foo, *@bar]\n[foo, *$bar]\n[foo, :bar => 1]\n\n---\n\n(program\n  (array\n    (identifier)\n    (identifier))\n  (array\n    (identifier)\n    (splat_argument\n      (identifier)))\n  (array\n    (identifier)\n    (splat_argument\n      (instance_variable)))\n  (array\n    (identifier)\n    (splat_argument\n      (global_variable)))\n  (array\n    (identifier)\n    (pair\n      (simple_symbol)\n      (integer))))\n\n=====\narray as object\n=====\n\n[1, 2].any? { |i| i > 1 }\n\n---\n\n(program\n  (call\n    receiver: (array\n      (integer)\n      (integer))\n    method: (identifier)\n    block: (block\n      parameters: (block_parameters\n        (identifier))\n      body: (block_body\n        (binary\n          left: (identifier)\n          right: (integer))))))\n\n=========================\narray with trailing comma\n=========================\n\n[ foo, ]\n\n---\n\n(program\n  (array\n    (identifier)))\n\n=====================\nempty percent w array\n=====================\n\n%w()\n\n---\n\n(program\n  (string_array))\n\n==========================\nunbalanced percent w array\n==========================\n\n%w/one two/\n\n---\n\n(program\n  (string_array\n    (bare_string\n      (string_content))\n    (bare_string\n      (string_content))))\n\n===============\npercent w array\n===============\n\n%w(word word)\n\n---\n\n(program\n  (string_array\n    (bare_string\n      (string_content))\n    (bare_string\n      (string_content))))\n\n===================================\npercent W array with interpolations\n===================================\n\n%W(a #{b} c)\n\n---\n\n(program\n  (string_array\n    (bare_string\n      (string_content))\n    (bare_string\n      (interpolation\n        (identifier)))\n    (bare_string\n      (string_content))))\n\n=====================\nempty percent i array\n=====================\n\n%i()\n\n---\n\n(program\n  (symbol_array))\n\n==========================\nunbalanced percent i array\n==========================\n\n%i/one two/\n\n---\n\n(program\n  (symbol_array\n    (bare_symbol\n      (string_content))\n    (bare_symbol\n      (string_content))))\n\n===============\npercent i array\n===============\n\n%i(word word)\n\n---\n\n(program\n  (symbol_array\n    (bare_symbol\n      (string_content))\n    (bare_symbol\n      (string_content))))\n\n====================================\npercent I array with interpolations\n====================================\n\n%I(a #{b} c)\n\n---\n\n(program\n  (symbol_array\n    (bare_symbol\n      (string_content))\n    (bare_symbol\n      (interpolation\n        (identifier)))\n    (bare_symbol\n      (string_content))))\n\n====================================\npercent i array with spaces\n====================================\n\n%I{\n  *\n  /#{something}+\n  ok\n}\n\n---\n\n(program\n  (symbol_array\n    (bare_symbol\n      (string_content))\n    (bare_symbol\n      (string_content)\n      (interpolation\n        (identifier))\n      (string_content))\n    (bare_symbol\n      (string_content))))\n\n==========\nempty hash\n==========\n\n{}\n\n---\n\n(program\n  (hash))\n\n=========================\nhash with no spaces\n=========================\n\n{:name=>\"foo\"}\n\n---\n\n(program\n  (hash\n    (pair\n      (simple_symbol)\n      (string\n        (string_content)))))\n\n=========================\nhash with expression keys\n=========================\n\n{ \"a\" => 1, \"b\" => 2 }\n{ [] => 1 }\n{ foo => 1 }\n\n---\n\n(program\n  (hash\n    (pair\n      (string\n        (string_content))\n      (integer))\n    (pair\n      (string\n        (string_content))\n      (integer)))\n  (hash\n    (pair\n      (array)\n      (integer)))\n  (hash\n    (pair\n      (identifier)\n      (integer))))\n\n=========================\nhash with reserved word key\n=========================\n\n{\n  alias: :foo,\n  and: :foo,\n  begin: :foo,\n  break: :foo,\n  case: :foo,\n  class: :foo,\n  def: :foo,\n  defined: :foo,\n  do: :foo,\n  else: :foo,\n  elsif: :foo,\n  end: :foo,\n  ensure: :foo,\n  false: :foo,\n  for: :foo,\n  in: :foo,\n  module: :foo,\n  next: :foo,\n  nil: :foo,\n  not: :foo,\n  or: :foo,\n  redo: :foo,\n  rescue: :foo,\n  retry: :foo,\n  return: :foo,\n  self: :foo,\n  super: :foo,\n  then: :foo,\n  true: :foo,\n  undef: :foo,\n  when: :foo,\n  yield: :foo,\n  if: :foo,\n  unless: :foo,\n  while: :foo,\n  until: :foo,\n  until:\n}\n\n---\n\n(program\n  (hash\n    (pair\n      (hash_key_symbol)\n      (simple_symbol))\n    (pair\n      (hash_key_symbol)\n      (simple_symbol))\n    (pair\n      (hash_key_symbol)\n      (simple_symbol))\n    (pair\n      (hash_key_symbol)\n      (simple_symbol))\n    (pair\n      (hash_key_symbol)\n      (simple_symbol))\n    (pair\n      (hash_key_symbol)\n      (simple_symbol))\n    (pair\n      (hash_key_symbol)\n      (simple_symbol))\n    (pair\n      (hash_key_symbol)\n      (simple_symbol))\n    (pair\n      (hash_key_symbol)\n      (simple_symbol))\n    (pair\n      (hash_key_symbol)\n      (simple_symbol))\n    (pair\n      (hash_key_symbol)\n      (simple_symbol))\n    (pair\n      (hash_key_symbol)\n      (simple_symbol))\n    (pair\n      (hash_key_symbol)\n      (simple_symbol))\n    (pair\n      (hash_key_symbol)\n      (simple_symbol))\n    (pair\n      (hash_key_symbol)\n      (simple_symbol))\n    (pair\n      (hash_key_symbol)\n      (simple_symbol))\n    (pair\n      (hash_key_symbol)\n      (simple_symbol))\n    (pair\n      (hash_key_symbol)\n      (simple_symbol))\n    (pair\n      (hash_key_symbol)\n      (simple_symbol))\n    (pair\n      (hash_key_symbol)\n      (simple_symbol))\n    (pair\n      (hash_key_symbol)\n      (simple_symbol))\n    (pair\n      (hash_key_symbol)\n      (simple_symbol))\n    (pair\n      (hash_key_symbol)\n      (simple_symbol))\n    (pair\n      (hash_key_symbol)\n      (simple_symbol))\n    (pair\n      (hash_key_symbol)\n      (simple_symbol))\n    (pair\n      (hash_key_symbol)\n      (simple_symbol))\n    (pair\n      (hash_key_symbol)\n      (simple_symbol))\n    (pair\n      (hash_key_symbol)\n      (simple_symbol))\n    (pair\n      (hash_key_symbol)\n      (simple_symbol))\n    (pair\n      (hash_key_symbol)\n      (simple_symbol))\n    (pair\n      (hash_key_symbol)\n      (simple_symbol))\n    (pair\n      (hash_key_symbol)\n      (simple_symbol))\n    (pair\n      (hash_key_symbol)\n      (simple_symbol))\n    (pair\n      (hash_key_symbol)\n      (simple_symbol))\n    (pair\n      (hash_key_symbol)\n      (simple_symbol))\n    (pair\n      (hash_key_symbol)\n      (simple_symbol))\n    (pair\n      (hash_key_symbol))))\n\n======================\nhash with keyword keys\n======================\n\n{ a: 1, b: 2, \"c\": 3 }\n{a:\n  1, B:2, \"c\":3 }\n{ a:, B:\n}\n\n---\n\n(program\n  (hash\n    (pair\n      (hash_key_symbol)\n      (integer))\n    (pair\n      (hash_key_symbol)\n      (integer))\n    (pair\n      (string\n        (string_content))\n      (integer)))\n  (hash\n    (pair\n      (hash_key_symbol)\n      (integer))\n    (pair\n      (hash_key_symbol)\n      (integer))\n    (pair\n      (string\n        (string_content))\n      (integer)))\n  (hash\n    (pair\n      (hash_key_symbol))\n    (pair\n      (hash_key_symbol))))\n\n========================\nhash with trailing comma\n========================\n\n{ a: 1, }\n\n---\n\n(program\n  (hash\n    (pair\n      (hash_key_symbol)\n      (integer))))\n\n========================\nhash initialization with hash splat\n========================\n\n{a: 1, **{b: 2}}\n\n---\n\n(program\n  (hash\n    (pair\n      (hash_key_symbol)\n      (integer))\n    (hash_splat_argument\n      (hash\n        (pair\n          (hash_key_symbol)\n          (integer))))))\n\n========================\nhash with line breaks and inline comments\n========================\n\n{\n  :pusher => pusher,\n\n  # Only warm caches if there are fewer than 10 tags and branches.\n  :should_warm_caches_after => 10,\n}\n\n---\n\n(program\n  (hash\n    (pair\n      (simple_symbol)\n      (identifier))\n    (comment)\n    (pair\n      (simple_symbol)\n      (integer))))\n\n==================\nregular expression\n==================\n\n/^(foo|bar[^_])$/i\n\n---\n\n(program\n  (regex\n    (string_content)))\n\n=====================================\nregular expression with interpolation\n=====================================\n\n/word#{foo}word/\n/word#word/\n/#/\n\n---\n\n(program\n  (regex\n    (string_content)\n    (interpolation\n      (identifier))\n    (string_content))\n  (regex\n    (string_content))\n  (regex\n    (string_content)))\n\n=======================================================\npercent r regular expression with unbalanced delimiters\n=======================================================\n\n%r/a/\n%r\\a\\\n%r#a#\n\n---\n\n(program\n  (regex\n    (string_content))\n  (regex\n    (string_content))\n  (regex\n    (string_content)))\n\n=====================================================\npercent r regular expression with balanced delimiters\n=====================================================\n\n%r<a<b>c>\n%r{a{b}c}\n%r[a[b]c]\n%r(a(b)c)\n%r(#)\n\n---\n\n(program\n  (regex\n    (string_content))\n  (regex\n    (string_content))\n  (regex\n    (string_content))\n  (regex\n    (string_content))\n  (regex\n    (string_content)))\n\n=========================================================================\npercent r regular expression with unbalanced delimiters and interpolation\n=========================================================================\n\n%r/a#{b}c/\n\n---\n\n(program\n  (regex\n    (string_content)\n    (interpolation\n      (identifier))\n    (string_content)))\n\n=======================================================================\npercent r regular expression with balanced delimiters and interpolation\n=======================================================================\n\n%r(a#{b}c)\n\n---\n\n(program\n  (regex\n    (string_content)\n    (interpolation\n      (identifier))\n    (string_content)))\n\n==============\nempty function\n==============\n\n-> {}\n\n---\n\n(program\n  (lambda\n    (block)))\n\n==================\nlambda literal with body\n==================\n\n-> { foo }\n\n---\n\n(program\n  (lambda\n    (block\n      (block_body\n        (identifier)))))\n\n====================\nlambda literal with an arg\n====================\n\n-> foo { 1 }\n-> (foo) { 1 }\n-> *foo { 1 }\n-> foo: 1 { 2 }\n-> foo, bar { 2 }\n\n---\n\n(program\n  (lambda\n    (lambda_parameters\n      (identifier))\n    (block\n      (block_body\n        (integer))))\n  (lambda\n    (lambda_parameters\n      (identifier))\n    (block\n      (block_body\n        (integer))))\n  (lambda\n    (lambda_parameters\n      (splat_parameter\n        (identifier)))\n    (block\n      (block_body\n        (integer))))\n  (lambda\n    (lambda_parameters\n      (keyword_parameter\n        (identifier)\n        (integer)))\n    (block\n      (block_body\n        (integer))))\n  (lambda\n    (lambda_parameters\n      (identifier)\n      (identifier))\n    (block\n      (block_body\n        (integer)))))\n\n===========================\nlambda literal with multiple args\n===========================\n\n-> (a, b, c) {\n  1\n  2\n}\n\n---\n\n(program\n  (lambda\n    (lambda_parameters\n      (identifier)\n      (identifier)\n      (identifier))\n    (block\n      (block_body\n        (integer)\n        (integer)))))\n\n====================\nlambda literal with do end\n====================\n\n-> (foo) do\n  1\nend\n\n---\n\n(program\n  (lambda\n    (lambda_parameters\n      (identifier))\n    (do_block\n      (body_statement\n        (integer)))))\n\n====================\nnon-ascii identifiers\n====================\n\nCß\n@äö\n@@äö\n:äö\näö\n\n---\n\n(program\n  (constant)\n  (instance_variable)\n  (class_variable)\n  (simple_symbol)\n  (identifier))\n"
  },
  {
    "path": "test/corpus/patterns.txt",
    "content": "================\npattern matching\n================\n\ncase expr\n  in 5 then true\n  else false\nend\n\ncase expr\n  in x unless x < 0\n  then true\n  in x if x < 0\n  then true\n  else false\nend\n\ncase expr\n  in 5\n  in 5,\n  in 1, 2\n  in 1, 2,\n  in 1, 2, 3\n  in 1, 2, 3,\n  in 1, 2, 3, *\n  in 1, *x, 3\n  in *\n  in *, 3, 4\n  in *, 3, *\n  in *a, 3, *b\n  in a:\n  in a: 5\n  in a: 5,\n  in a: 5, b:, **\n  in a: 5, b:, **map\n  in a: 5, b:, **nil\n  in **nil\n  in [5]\n  in [5,]\n  in [1, 2]\n  in [1, 2,]\n  in [1, 2, 3]\n  in [1, 2, 3,]\n  in [1, 2, 3, *]\n  in [1, *x, 3]\n  in [*]\n  in [*, 3, 4]\n  in [*, 3, *]\n  in [*a, 3, *b]\n  in {a:}\n  in {a: 5}\n  in {a: 5,}\n  in {a: 5, b:, **}\n  in {a: 5, b:, **map}\n  in {a: 5, b:, **nil}\n  in {**nil}\n  in {}\n  in []\nend\n\n-----\n\n(program\n  (case_match (identifier)\n    (in_clause\n      (integer)\n      (then (true))\n    )\n    (else (false)))\n  (case_match (identifier)\n    (in_clause\n      (identifier)\n      (unless_guard (binary (identifier) (integer)))\n      (then (true))\n    )\n    (in_clause\n      (identifier)\n      (if_guard (binary (identifier) (integer)))\n      (then (true))\n    )\n    (else (false))\n  )\n\n  (case_match (identifier)\n    (in_clause (integer))\n    (in_clause (array_pattern (integer) (splat_parameter)))\n    (in_clause (array_pattern (integer) (integer)))\n    (in_clause (array_pattern (integer) (integer) (splat_parameter)))\n    (in_clause (array_pattern (integer) (integer) (integer)))\n    (in_clause (array_pattern (integer) (integer) (integer) (splat_parameter)))\n    (in_clause (array_pattern (integer) (integer) (integer) (splat_parameter)))\n    (in_clause (array_pattern (integer) (splat_parameter (identifier)) (integer)))\n    (in_clause (array_pattern (splat_parameter)))\n    (in_clause (array_pattern (splat_parameter) (integer) (integer)))\n    (in_clause (find_pattern (splat_parameter) (integer) (splat_parameter)))\n    (in_clause (find_pattern (splat_parameter (identifier)) (integer) (splat_parameter (identifier))))\n    (in_clause (hash_pattern (keyword_pattern (hash_key_symbol))))\n    (in_clause (hash_pattern (keyword_pattern (hash_key_symbol) (integer))))\n    (in_clause (hash_pattern (keyword_pattern (hash_key_symbol) (integer))))\n    (in_clause (hash_pattern (keyword_pattern (hash_key_symbol) (integer)) (keyword_pattern (hash_key_symbol)) (hash_splat_parameter)))\n    (in_clause (hash_pattern (keyword_pattern (hash_key_symbol) (integer)) (keyword_pattern (hash_key_symbol)) (hash_splat_parameter (identifier))))\n    (in_clause (hash_pattern (keyword_pattern (hash_key_symbol) (integer)) (keyword_pattern (hash_key_symbol)) (hash_splat_nil)))\n    (in_clause (hash_pattern (hash_splat_nil)))\n    (in_clause (array_pattern (integer)))\n    (in_clause (array_pattern (integer) (splat_parameter)))\n    (in_clause (array_pattern (integer) (integer)))\n    (in_clause (array_pattern (integer) (integer) (splat_parameter)))\n    (in_clause (array_pattern (integer) (integer) (integer)))\n    (in_clause (array_pattern (integer) (integer) (integer) (splat_parameter)))\n    (in_clause (array_pattern (integer) (integer) (integer) (splat_parameter)))\n    (in_clause (array_pattern (integer) (splat_parameter (identifier)) (integer)))\n    (in_clause (array_pattern (splat_parameter)))\n    (in_clause (array_pattern (splat_parameter) (integer) (integer)))\n    (in_clause (find_pattern (splat_parameter) (integer) (splat_parameter)))\n    (in_clause (find_pattern (splat_parameter (identifier)) (integer) (splat_parameter (identifier))))\n    (in_clause (hash_pattern (keyword_pattern (hash_key_symbol))))\n    (in_clause (hash_pattern (keyword_pattern (hash_key_symbol) (integer))))\n    (in_clause (hash_pattern (keyword_pattern (hash_key_symbol) (integer))))\n    (in_clause (hash_pattern (keyword_pattern (hash_key_symbol) (integer)) (keyword_pattern (hash_key_symbol)) (hash_splat_parameter)))\n    (in_clause (hash_pattern (keyword_pattern (hash_key_symbol) (integer)) (keyword_pattern (hash_key_symbol)) (hash_splat_parameter (identifier))))\n    (in_clause (hash_pattern (keyword_pattern (hash_key_symbol) (integer)) (keyword_pattern (hash_key_symbol)) (hash_splat_nil)))\n    (in_clause (hash_pattern (hash_splat_nil)))\n    (in_clause (hash_pattern))\n    (in_clause (array_pattern))\n  )\n)\n\n=====================\nmore pattern matching\n=====================\n\ncase expr\n  in 5\n  in ^foo\n  in ^$foo\n  in ^@foo\n  in ^@@foo\n  in ^(1+1)\n  in ^(foo)\n  in ^(Foo::Bar)\n  in var\n  in \"string\"\n  in %w(foo bar)\n  in %i(foo bar)\n  in /.*abc[0-9]/\n  in 5 .. 10\n  in .. 10\n  in 5 ..\n  in 5 => x\n  in 5 | ^foo | var | \"string\"\n  in Foo\n  in Foo::Bar\n  in ::Foo::Bar\n  in (nil | self | true | false | __LINE__ | __FILE__ | __ENCODING__)\n  in -> x { x == 10 }\n  in :foo\n  in :\"foo bar\"\n  in -5 | +10\nend\n\n--------\n\n (program\n   (case_match (identifier)\n     (in_clause (integer))\n     (in_clause (variable_reference_pattern (identifier)))\n     (in_clause (variable_reference_pattern (global_variable)))\n     (in_clause (variable_reference_pattern (instance_variable)))\n     (in_clause (variable_reference_pattern (class_variable)))\n     (in_clause (expression_reference_pattern (binary (integer) (integer))))\n     (in_clause (expression_reference_pattern (identifier)))\n     (in_clause (expression_reference_pattern (scope_resolution (constant) (constant))))\n     (in_clause (identifier))\n     (in_clause (string (string_content)))\n     (in_clause (string_array (bare_string (string_content)) (bare_string (string_content))))\n     (in_clause (symbol_array (bare_symbol (string_content)) (bare_symbol (string_content))))\n     (in_clause (regex (string_content)))\n     (in_clause (range (integer) (integer)))\n     (in_clause (range (integer)))\n     (in_clause (range (integer)))\n     (in_clause (as_pattern (integer) (identifier)))\n     (in_clause\n       (alternative_pattern\n         (integer)\n         (variable_reference_pattern (identifier))\n         (identifier)\n         (string (string_content))\n       )\n     )\n     (in_clause (constant))\n     (in_clause (scope_resolution (constant) (constant)))\n     (in_clause (scope_resolution (scope_resolution (constant)) (constant)))\n     (in_clause\n       (parenthesized_pattern\n         (alternative_pattern\n           (nil)\n           (self)\n           (true)\n           (false)\n           (line)\n           (file)\n           (encoding)\n         )\n       )\n     )\n     (in_clause (lambda (lambda_parameters (identifier)) (block (block_body (binary (identifier) (integer))))))\n     (in_clause (simple_symbol))\n     (in_clause (delimited_symbol (string_content)))\n     (in_clause\n       (alternative_pattern\n         (unary (integer))\n         (unary (integer))\n       )\n     )\n   )\n)\n\n==============\narray patterns\n==============\ncase expr\n  in [];\n  in [x];\n  in [x, ];\n  in Foo::Bar[];\n  in Foo();\n  in Bar(*);\n  in Bar(a, b, *c, d, e);\nend\n\n--------------\n\n(program\n  (case_match (identifier)\n    (in_clause (array_pattern))\n    (in_clause (array_pattern (identifier)))\n    (in_clause (array_pattern (identifier) (splat_parameter)))\n    (in_clause (array_pattern (scope_resolution (constant) (constant))))\n    (in_clause (array_pattern (constant)))\n    (in_clause (array_pattern (constant) (splat_parameter)))\n    (in_clause\n      (array_pattern\n        (constant)\n        (identifier)\n        (identifier)\n        (splat_parameter (identifier))\n        (identifier)\n        (identifier)\n      )\n    )\n  )\n)\n\n=============\nfind patterns\n=============\n\ncase expr\n  in [*, x, *];\n  in [*x, 1, 2, *y];\n  in Foo::Bar[*, 1, *];\n  in Foo(*, Bar, *);\nend\n\n-------------\n\n(program\n  (case_match (identifier)\n    (in_clause (find_pattern (splat_parameter) (identifier) (splat_parameter)))\n    (in_clause (find_pattern (splat_parameter (identifier)) (integer) (integer) (splat_parameter (identifier))))\n    (in_clause (find_pattern\n       (scope_resolution (constant) (constant))\n       (splat_parameter)\n       (integer)\n       (splat_parameter))\n    )\n    (in_clause (find_pattern (constant) (splat_parameter) (constant) (splat_parameter)))\n  )\n)\n\n=============\nhash patterns\n=============\n\ncase expr\n  in {};\n  in {x:};\n  in Foo::Bar[ x:1 ];\n  in Foo::Bar[ x:1, a:, **rest ];\n  in Foo( y:);\n  in Bar( ** );\n  in Bar( a: 1, **nil);\nend\n\n-------------\n\n(program (case_match (identifier)\n  (in_clause (hash_pattern))\n  (in_clause (hash_pattern (keyword_pattern (hash_key_symbol))))\n  (in_clause (hash_pattern\n        (scope_resolution (constant) (constant))\n        (keyword_pattern (hash_key_symbol) (integer))\n  ))\n  (in_clause (hash_pattern\n    (scope_resolution (constant) (constant))\n    (keyword_pattern (hash_key_symbol) (integer))\n    (keyword_pattern (hash_key_symbol))\n    (hash_splat_parameter (identifier))\n  ))\n  (in_clause (hash_pattern (constant) (keyword_pattern (hash_key_symbol))))\n  (in_clause (hash_pattern (constant) (hash_splat_parameter)))\n  (in_clause (hash_pattern (constant) (keyword_pattern (hash_key_symbol) (integer)) (hash_splat_nil)))\n  )\n)\n\n=====================\npattern matching with fancy string literals\n=====================\n\ncase expr\n  in \"string\";\n  in `ls`;\n  in <<\"DOC\" then end\nsome text\nDOC\n\n---\n\n(program\n  (case_match\n    value: (identifier)\n    clauses: (in_clause\n      pattern: (string\n        (string_content)))\n    clauses: (in_clause\n      pattern: (subshell\n        (string_content)))\n    clauses: (in_clause\n      pattern: (heredoc_beginning)\n      body: (then)))\n  (heredoc_body\n    (heredoc_content)\n    (heredoc_end)))\n\n=================\none-line patterns\n=================\n\nx in Foo(y:)\n\ncase foo in 5 in true then 1 end\ncase foo in 5; in true then 1 end\ncase (foo x) in 5; in true then 1 end\n\nx => 6 | 7\nreturn x => 6 | 7\n\n-----------------\n\n(program\n  (test_pattern (identifier) (hash_pattern (constant) (keyword_pattern (hash_key_symbol))))\n\n  (case_match (test_pattern (identifier) (integer)) (in_clause (true) (then (integer))))\n  (case_match (test_pattern (identifier) (integer)) (in_clause (true) (then (integer))))\n  (case_match (test_pattern (parenthesized_statements (call (identifier) (argument_list (identifier)))) (integer))\n    (in_clause (true) (then (integer))))\n\n  (match_pattern (identifier) (alternative_pattern (integer) (integer)))\n  (return (argument_list (pair (identifier) (binary (integer) (integer)))))\n\n)\n\n=====================================\none-line patterns: incorrectly parsed\n=====================================\nfoo x in 5 # FIXME: should be parsed as `(foo x) in 5` instead of `foo (x in 5)`\n\n-----------------\n\n(program\n  (call (identifier) (argument_list (test_pattern (identifier) (integer)))) (comment)\n)\n"
  },
  {
    "path": "test/corpus/single-cr-as-whitespace.txt",
    "content": "==================================\nSingle CR characters as whitespace\n==================================\n\nputs\r\r\r\r\r\r\r\r\r\r\r\r\r\r\"hi\"\n\n---\n\n(program (call (identifier) (argument_list (string (string_content)))))\n"
  },
  {
    "path": "test/corpus/statements.txt",
    "content": "====================\nconditional modifier\n====================\n\nfoo if bar\nreturn if false\nreturn true if foo bar\nreturn nil if foo\n\n---\n\n(program\n  (if_modifier\n    (identifier)\n    (identifier))\n  (if_modifier\n    (return)\n    (false))\n  (if_modifier\n    (return (argument_list (true)))\n    (call (identifier) (argument_list (identifier))))\n  (if_modifier\n    (return (argument_list (nil)))\n    (identifier)))\n\n==============\nwhile modifier\n==============\n\nfoo while bar\n\n---\n\n(program (while_modifier\n  body: (identifier)\n  condition: (identifier)))\n\n===============\nunless modifier\n===============\n\nfoo unless bar\n\n---\n\n(program (unless_modifier\n  body: (identifier)\n  condition: (identifier)))\n\n==============\nuntil modifier\n==============\n\nfoo until bar\n\n---\n\n(program (until_modifier (identifier) (identifier)))\n\n========\nalias\n========\n\nalias :foo :bar\nalias foo bar\nalias $FOO $&\nalias foo +\n\n---\n\n(program\n  (alias (simple_symbol) (simple_symbol))\n  (alias (identifier) (identifier))\n  (alias (global_variable) (global_variable))\n  (alias (identifier) (operator)))\n\n========\nundef\n========\n\nundef :foo\nundef foo\nundef +\nundef :foo, :bar\n\n---\n\n(program\n  (undef (simple_symbol))\n  (undef (identifier))\n  (undef (operator))\n  (undef (simple_symbol) (simple_symbol)))\n"
  },
  {
    "path": "test/highlight/classes.rb",
    "content": "require \"a\"\n# ^ function.method.builtin\n\nclass Car < Vehicle\n  # <- keyword\n  #    ^ constructor\n\n  def init(id)\n    # <- keyword\n    # ^ function.method\n\n    @id = id\n    # <- property\n    #     ^ variable.parameter\n\n    yield\n    # <- keyword\n    return\n    # <- keyword\n    next\n    # <- keyword\n  end\n\n  private\n  # ^ keyword\n\n  public\n  # ^ keyword\n\n  protected\n  # ^ keyword\nend\n# <- keyword\n"
  },
  {
    "path": "test/highlight/constants.rb",
    "content": "class MyClass\n  #   ^ constructor\n\n  ELEMENT8 = 8\n  # ^ constant\n\n  ELEMENT16 = 16\n  # ^ constant\n\n  def OtherClass\n    #  ^ function.method\n\n    @other.OtherClass(Something.new).inspect\n    # ^ property\n    #      ^ function.method\n    #                 ^ constructor\n    #                           ^ function.method\n    #                                ^ function.method\n  end\nend\n\nif __FILE__ == $0\n  # ^ constant.builtin\nend\n"
  },
  {
    "path": "test/highlight/literals.rb",
    "content": "\"hello\"\n# ^ string\n%(hello)\n# ^ string\n%w(hello goodbye)\n#   ^ string\n#         ^ string\n\n:hello\n# ^ string.special.symbol\n%s(hello)\n# ^ string.special.symbol\n%I(hello goodbye)\n#  ^ string.special.symbol\n#         ^ string.special.symbol\n\n/hello/\n# ^ string.special.regex\n%r(hello)\n# ^ string.special.regex\n\n12345\n# ^ number\n12.345\n# ^ number\n\nnil\n# ^ constant.builtin\ntrue\n# ^ constant.builtin\nTRUE\n# ^ constant\nfalse\n# ^ constant.builtin\nFALSE\n# ^ constant\n"
  },
  {
    "path": "test/highlight/patterns.rb",
    "content": "expr = [false | __LINE__ | __FILE__ | __ENCODING__]\n#       ^ constant.builtin\n#               ^ constant.builtin\n#                          ^ constant.builtin\n#                                     ^ constant.builtin\n\ncase expr\n  in {a: 5, b:, **nil}\n#               ^ operator\n#                 ^ constant.builtin\n  in [false | __LINE__ | __FILE__ | __ENCODING__]\n#     ^ constant.builtin\n#             ^ constant.builtin\n#                        ^ constant.builtin\n#                                   ^ constant.builtin\n  else\nend\n\n"
  },
  {
    "path": "test/highlight/variables.rb",
    "content": "one = 1\n# <- variable\n\ndef two()\n  three = one\n  # ^ variable\n  #        ^ function.method\n\n  four = three\n  # ^ variable\n  #       ^ variable\n\n  four.each do |i|\n    puts i, three, five\n    #    ^ variable.parameter\n    #        ^ variable (because blocks are closures)\n    #               ^ function.method\n  end\n\n  four.each do |(a, b), c: d, e = f|\n    #            ^ variable.parameter\n    #               ^ variable.parameter\n    #                   ^ variable.parameter\n    #                      ^ function.method\n    #                         ^ variable.parameter\n    #                             ^ function.method\n    puts a, b, c, d, e, f\n    #    ^ variable.parameter\n    #       ^ variable.parameter\n    #          ^ variable.parameter\n    #             ^ function.method\n    #                ^ variable.parameter\n    #                   ^ function.method\n  end\n\n  five ||= 1\n  # ^ variable\n\n  six -> (seven) { eight(seven, five) }\n  # ^ function.method\n  #        ^ variable.parameter\n  #                 ^ function.method\n  #                      ^ variable.parameter\n  #                              ^ variable\n\n  seven\n  # ^ function.method (because the `seven` above was in the scope of the lambda)\nend\n"
  },
  {
    "path": "tree-sitter.json",
    "content": "{\n  \"grammars\": [\n    {\n      \"name\": \"ruby\",\n      \"camelcase\": \"Ruby\",\n      \"scope\": \"source.ruby\",\n      \"path\": \".\",\n      \"file-types\": [\n        \"rb\"\n      ],\n      \"highlights\": \"queries/highlights.scm\",\n      \"tags\": \"queries/tags.scm\",\n      \"injection-regex\": \"ruby\"\n    }\n  ],\n  \"metadata\": {\n    \"version\": \"0.23.1\",\n    \"license\": \"MIT\",\n    \"description\": \"Ruby grammar for tree-sitter\",\n    \"authors\": [\n      {\n        \"name\": \"Rob Rix\",\n        \"email\": \"rob.rix@github.com\"\n      },\n      {\n        \"name\": \"Max Brunsfeld\",\n        \"email\": \"maxbrunsfeld@gmail.com\"\n      },\n      {\n        \"name\": \"Amaan Qureshi\",\n        \"email\": \"amaanq12@gmail.com\"\n      }\n    ],\n    \"links\": {\n      \"repository\": \"https://github.com/tree-sitter/tree-sitter-ruby\"\n    }\n  },\n  \"bindings\": {\n    \"c\": true,\n    \"go\": true,\n    \"node\": true,\n    \"python\": true,\n    \"rust\": true,\n    \"swift\": true\n  }\n}\n"
  }
]