\FF\D8\FF\E0\00JFIF\00\00\00d\00d\00\00\FF\FE\00\border bs:0 bc:#000000 ps:0 pc:#ffffff es:0 ec:#000000 ck:feee6c715d26fd9f38b0ca4278c05026\FF\DB\00C\00P7<F<2PFAFZUP_xxnnx\F5\AF\B9\91\C8\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\DB\00CUZZxix‚\EB\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\FF\C0\00\00b\00d\00\FF\C4\00\00\00\00\00\00\00\00\00\00\00\00\00\00\FF\C4\00\00\00\00\00\00\00\00\00\00\001A!Q\FF\C4\00\00\00\00\00\00\00\00\00\00\00\00\00\FF\C4\00\00\00\00\00\00\00\00\00\00!1AQ\FF\DA\00\00\00?\00\F6\00\00\00\00\00\00\00\00\00\00\A0\00\00\C5\CF\F8\E7Ó\FCjD~\B9^\AD\%\B3]\D8cs-\BBs,-\A0\00"\80\00%\B83rÏ^K~F\A4ea\00E\00\C6\EE=u\B1\9B\D1\00@\00r\BE8\F9:\FE5#.M\00\E7\CB\C9q\CBq\D6\F2\BE\B7\C7>\C9n5×\D6?\BDê\9Ds\EBp\9F[`8m\B7)o\B5\E8\E6I\99\FE3]]A2\BA\8Cw\D6E\93\\DEv\C8\009\F2\F1NI?uc\\F5\EA\96k\xN<~buv\EA\C8\D7	\8B\84\CEcxI\BBg\AE\9E=\D6+n\EC\80\C8A\8C\AE\EB\CF\D5\DA\E9"2\A4\B9j5\EB\F3W\B63\96\B30Yu\DA\FC8\ED\DF\E7Ms\FB\F1\8E\B3\FA\EA\E8\E6(\883zs\F2_\8DFk\8Bh
\00\8C\DCw\D3R\B5+6X\BA\B2\C4j\AB0\B4\FCMw\C2I\8E\9B\E3\A9~9u\FA\D3l\80\C8%p\EE\FDn2€
\00$\FEj\C4e\A9\DB\~\95\A7\A5\80EK\BB\8DDsP\00@@AD'k\CF\E8\DB\D2(\80\9AK\D3\85\D6lb\F2\BA\8C*\80\00)\95
59\A3R:\F3\CE"\B6\80\88\00\00i1u4ê\E9\F2á\A6\A2\FACM\93WMb*\E0*\00\00\00\00\00(\A8\80\00\00\80\00\00\00\00\00\00\00\00\00\FF\D9<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>C///</title>
</head>
<h1 align="center">Prism Ruby parser</h1>
<div align="center">
  <img alt="Prism Ruby parser" height="256px" src="https://github.com/ruby/prism/blob/main/doc/images/prism.png?raw=true">
</div>

This is a parser for the Ruby programming language. It is designed to be portable, error tolerant, and maintainable. It is written in C99 and has no dependencies.

## Overview

The repository contains the infrastructure for both a shared library (libprism) and a native CRuby extension. The shared library has no bindings to CRuby itself, and so can be used by other projects. The native CRuby extension links against `ruby.h`, and so is suitable in the context of CRuby.

```
.
â”œâ”€â”€ Makefile              configuration to compile the shared library and native tests
â”œâ”€â”€ Rakefile              configuration to compile the native extension and run the Ruby tests
â”œâ”€â”€ bin
â”‚Â Â  â”œâ”€â”€ lex               runs the lexer on a file or string, prints the tokens, and compares to ripper
â”‚Â Â  â”œâ”€â”€ parse             runs the parse on a file or string and prints the AST
â”‚Â Â  â””â”€â”€ prism             a CLI for development and debugging
â”œâ”€â”€ config.yml            specification for tokens and nodes in the tree
â”œâ”€â”€ doc                   documentation website
â”œâ”€â”€ docs                  markdown documentation about the project
â”œâ”€â”€ ext
â”‚Â Â  â””â”€â”€ prism
â”‚Â Â      â”œâ”€â”€ extconf.rb    configuration to generate the Makefile for the native extension
â”‚Â Â      â””â”€â”€ extension.c   the native extension that interacts with libprism
â”œâ”€â”€ fuzz                  files related to fuzz testing
â”œâ”€â”€ gemfiles              gemfiles used by different Ruby versions in CI
â”œâ”€â”€ include
â”‚Â Â  â”œâ”€â”€ prism             header files for the shared library
â”‚Â Â  â””â”€â”€ prism.h           main header file for the shared library
â”œâ”€â”€ java                  Java bindings for the shared library
â”œâ”€â”€ java-wasm             Java WASM bindings for the shared library
â”œâ”€â”€ javascript            JavaScript WASM bindings for the shared library
â”œâ”€â”€ lib
â”‚Â Â  â”œâ”€â”€ prism             Ruby library files
â”‚Â Â  â””â”€â”€ prism.rb          main entrypoint for the Ruby library
â”œâ”€â”€ rakelib               various Rake tasks for the project
â”œâ”€â”€ rbi                   RBI type signatures for the Ruby library
â”œâ”€â”€ rust
â”‚Â Â  â”œâ”€â”€ ruby-prism        Rustified crate for the shared library
â”‚Â Â  â””â”€â”€ ruby-prism-sys    FFI binding for Rust
â”œâ”€â”€ sample
â”‚   â””â”€â”€ prism             Sample code that uses the Ruby API for documentation purposes
â”œâ”€â”€ sig                   RBS type signatures for the Ruby library
â”œâ”€â”€ src
â”‚Â Â  â”œâ”€â”€ util              various utility files
â”‚Â Â  â””â”€â”€ prism.c           main entrypoint for the shared library
â”œâ”€â”€ templates             contains ERB templates generated by templates/template.rb
â”‚Â Â  â””â”€â”€ template.rb       generates code from the nodes and tokens configured by config.yml
â””â”€â”€ test
    â””â”€â”€ prism
        â”œâ”€â”€ fixtures      Ruby code used for testing
        â””â”€â”€ snapshots     snapshots of generated syntax trees corresponding to fixtures
```

## Getting started

To compile the shared library, you will need:

* C99 compiler
* GNU make
* Ruby 2.7.0 or later

Once you have these dependencies, run:

```
bundle install
```

to fetch the Ruby dependencies. Finally, run:

```
bundle exec rake compile
```

to compile the shared library. It will be built in the `build` directory. To test that everything is working, run:

```
bin/parse -e "1 + 2"
```

to see the syntax tree for the expression `1 + 2`.

## Contributing

See the [CONTRIBUTING.md](CONTRIBUTING.md) file for more information. We additionally have documentation about the overall design of the project as well as various subtopics.

* [Build system](docs/build_system.md)
* [Configuration](docs/configuration.md)
* [CRuby compilation](docs/cruby_compilation.md)
* [Design](docs/design.md)
* [Encoding](docs/encoding.md)
* [Fuzzing](docs/fuzzing.md)
* [Heredocs](docs/heredocs.md)
* [JavaScript](docs/javascript.md)
* [Local variable depth](docs/local_variable_depth.md)
* [Mapping](docs/mapping.md)
* [Parser translation](docs/parser_translation.md)
* [Parsing rules](docs/parsing_rules.md)
* [Releasing](docs/releasing.md)
* [Ripper translation](docs/ripper_translation.md)
* [Ruby API](docs/ruby_api.md)
* [RubyParser translation](docs/ruby_parser_translation.md)
* [Serialization](docs/serialization.md)
* [Testing](d