singleton method Ripper.lex

lex(src, filename = '-', lineno = 1, raise_errors: false) -> [[Integer, Integer], Symbol, String, Ripper::Lexer::State][permalink][rdoc][edit] [added by ripper/lexer]

Ruby プログラム str をトークンに分割し、そのリストを返します。ただし Ripper.tokenize と違い、トークンの種類と位置情報も付属します。

[PARAM] src:
Ruby プログラムを文字列か IO オブジェクトで指定します。
[PARAM] filename:
src のファイル名を文字列で指定します。省略すると "-" になります。
[PARAM] lineno:
src の開始行番号を指定します。省略すると 1 になります。
[PARAM] raise_errors:
true を指定すると、src にエラーがある場合に例外(SyntaxError)を発生させます。省略すると false になります。
[EXCEPTION] SyntaxError:
raise_errors が true で、src に文法エラーがある場合に発生します。

require 'ripper'

pp Ripper.lex("def m(a) nil end")
# => [[[1, 0], :on_kw, "def", FNAME],
#     [[1, 3], :on_sp, " ", FNAME],
#     [[1, 4], :on_ident, "m", ENDFN],
#     [[1, 5], :on_lparen, "(", BEG|LABEL],
#     [[1, 6], :on_ident, "a", ARG],
#     [[1, 7], :on_rparen, ")", ENDFN],
#     [[1, 8], :on_sp, " ", BEG],
#     [[1, 9], :on_kw, "nil", END],
#     [[1, 12], :on_sp, " ", END],
#     [[1, 13], :on_kw, "end", END]]

Ripper.lex("def req(true) end", raise_errors: true)
# => SyntaxError (syntax error, unexpected `true', expecting ')')

Ripper.lex は分割したトークンを詳しい情報とともに返します。返り値の配列の要素は 4 要素の配列 (概念的にはタプル) です。その内訳を以下に示します。

位置情報 (Integer,Integer)

トークンが置かれている行 (1-origin) と桁 (0-origin) の 2 要素の配列です。

種類 (Symbol)

トークンの種類が「:on_XXX」の形式のシンボルで渡されます。

トークン (String)

トークン文字列です。

ステート (Ripper::Lexer::State)

トークンの状態を表す Ripper::Lexer::State のインスタンスです。