要約
Ruby プログラムを解析するための、エラー耐性のあるパーサライブラリです。
prism は Ruby 3.3 で default gem として導入され、Ruby 3.4 以降は
CRuby 本体が Ruby プログラムをコンパイルする際に使われるデフォルトのパーサの実装になっています(3.3 の時点では ruby --parser=prism
オプションで試験的に切り替えられる位置づけでした)。
設計上の目標として、構文エラーがあっても可能な限り解析を継続する「エラー耐性(error tolerant)」を重視しており、エディタや IDE、linter といった、エラーを含む可能性があるコードも解析する必要があるツールから利用しやすくなっています。また C99 で実装された移植性の高いライブラリ (libprism)でもあり、CRuby 以外の Ruby 処理系やツール、他言語のバインディングからも利用できます。
構文解析の結果得られる構文木の各ノードは Prism::Node のサブクラス (150 種類以上)として表現されます。すべてのノードに共通する API は Prism::Node で扱いますが、個々のノードクラスの詳細はこのリファレンスでは扱いません。ノードクラスも含めた完全な API については公式ドキュメントを参照してください。
- プロジェクトページ: https://github.com/ruby/prism
- リファレンス(YARD): https://www.rubydoc.info/gems/prism
- ドキュメントサイト: https://ruby.github.io/prism/
require "prism"
result = Prism.parse("1 + 2")
p result.class # => Prism::ParseResult
p result.value.class # => Prism::ProgramNode
p result.success? # => true
クラス
| Prism::Comment | Prism::ParseResult#comments や Prism.#parse_comments で得られる、ソースコード中のコメントを表す抽象基底クラスです。 |
| Prism::EmbDocComment |
|
| Prism::InlineComment |
|
| Prism::Location |
ソースコード上の範囲(開始バイトオフセットと長さ)を表すクラスです。構文木の各ノードのほか、Prism::Comment・Prism::MagicComment・
Prism::ParseError・Prism::ParseWarning・Prism::Token などの
|
| Prism::MagicComment |
Prism::ParseResult#magic_comments で得られる、マジックコメント
( |
| Prism::Node |
構文解析の結果得られる構文木の各ノードを表す抽象基底クラスです。
Prism.#parse などが返す構文木は、このクラスのサブクラス
(150 種類以上)のインスタンスで構成されます。 |
| Prism::ParseError | Prism::ParseResult#errors で得られる、構文解析中に発生したエラーを表すクラスです。 |
| Prism::ParseResult | Prism.#parse や Prism.#parse_file などの戻り値のクラスです。構文解析によって得られた構文木そのものに加えて、解析中に見つかったコメント・マジックコメント・エラー・警告などの付随情報をまとめて保持します。 |
| Prism::ParseWarning | Prism::ParseResult#warnings で得られる、構文解析中に発生した警告を表すクラスです。インターフェースは Prism::ParseError と同様です。 |
| Prism::Source | 解析対象のソースコード全体と各行の開始オフセットの表を保持し、バイトオフセットから行番号・桁位置への変換などを提供するクラスです。 Prism::ParseResult#source で得られます。 |
| Prism::Token | Prism.#lex や Prism.#parse_lex の結果に含まれる、字句解析で得られたトークンを表すクラスです。 |
モジュール
| Prism | Ruby プログラムの構文解析・字句解析を行うためのモジュール関数を提供するモジュールです。文字列を直接解析する Prism.#parse や Prism.#lex の他、ファイルを指定して解析する Prism.#parse_file などが用意されています。 |