class Ripper
Ripper ist ein Ruby-Skript-Parser.
Sie können Informationen vom Parser im ereignisbasierten Stil erhalten. Informationen wie abstrakte Syntaxbäume oder einfache lexikalische Analyse des Ruby-Programms.
Verwendung
Ripper bietet eine einfache Schnittstelle, um Ihr Programm in einen symbolischen Ausdrucksbaum (oder S-Ausdruck) zu parsen.
Das Verständnis der Ausgabe des Parsers kann eine Herausforderung sein. Es wird empfohlen, PP zu verwenden, um die Ausgabe leserlich zu formatieren.
require 'ripper'
require 'pp'
pp Ripper.sexp('def hello(world) "Hello, #{world}!"; end')
#=> [:program,
[[:def,
[:@ident, "hello", [1, 4]],
[:paren,
[:params, [[:@ident, "world", [1, 10]]], nil, nil, nil, nil, nil, nil]],
[:bodystmt,
[[:string_literal,
[:string_content,
[:@tstring_content, "Hello, ", [1, 18]],
[:string_embexpr, [[:var_ref, [:@ident, "world", [1, 27]]]]],
[:@tstring_content, "!", [1, 33]]]]],
nil,
nil,
nil]]]]
Wie Sie im obigen Beispiel sehen können, beginnt der Ausdruck mit :program.
Von hier aus folgt eine Methodendefinition bei :def, gefolgt vom Bezeichner der Methode :@ident. Nach dem Bezeichner der Methode kommen die Klammern :paren und die Methodenparameter unter :params.
Als nächstes kommt der Methodenrumpf, beginnend bei :bodystmt (stmt steht für Statement), der die vollständige Definition der Methode enthält.
In unserem Fall geben wir einfach einen String zurück, daher haben wir als nächstes den Ausdruck :string_literal.
Innerhalb unseres :string_literal werden Sie zwei @tstring_content bemerken. Dies ist der literale Teil für Hello, und !. Zwischen den beiden @tstring_content-Anweisungen befindet sich ein :string_embexpr, wobei embexpr ein eingebetteter Ausdruck ist. Unser Ausdruck besteht aus einer lokalen Variablen, oder var_ref, mit dem Bezeichner (@ident) von world.
Ressourcen
Voraussetzungen
-
ruby 1.9 (nur CVS HEAD wird unterstützt)
-
bison 1.28 oder neuer (Andere yaccs funktionieren nicht)
Lizenz
Ruby-Lizenz.
-
Minero Aoki
-
aamine@loveruby.net
Constants
- EREIGNISSE
-
Dieses Array enthält die Namen aller Ripper-Ereignisse.
- PARSER_EVENTS
-
Dieses Array enthält die Namen der Parser-Ereignisse.
- SCANNER_EVENTS
-
Dieses Array enthält die Namen der Scanner-Ereignisse.
Öffentliche Klassenmethoden
Source
# File ext/ripper/lib/ripper/lexer.rb, line 51 def Ripper.lex(src, filename = '-', lineno = 1, **kw) Lexer.new(src, filename, lineno).lex(**kw) end
Tokenisiert das Ruby-Programm und gibt ein Array von Arrays zurück, das wie folgt formatiert ist: [[lineno, column], type, token, state]. Das Argument filename wird größtenteils ignoriert. Standardmäßig behandelt diese Methode keine Syntaxfehler in src. Verwenden Sie das Schlüsselwort raise_errors, um einen SyntaxError bei einem Fehler in src auszulösen.
require 'ripper'
require 'pp'
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 ]]
Source
# File ext/ripper/lib/ripper/core.rb, line 18 def Ripper.parse(src, filename = '(ripper)', lineno = 1) new(src, filename, lineno).parse end
Source
# File ext/ripper/lib/ripper/sexp.rb, line 35 def Ripper.sexp(src, filename = '-', lineno = 1, raise_errors: false) builder = SexpBuilderPP.new(src, filename, lineno) sexp = builder.parse if builder.error? if raise_errors raise SyntaxError, builder.error end else sexp end end
- EXPERIMENTELL
-
Parst
srcund erstellt einen S-Ausdruck-Baum. Gibt einen besser lesbaren Baum zurück alsRipper.sexp_raw. Diese Methode ist hauptsächlich für Entwickler gedacht. Das Argumentfilenamewird größtenteils ignoriert. Standardmäßig behandelt diese Methode keine Syntaxfehler insrcund gibt in solchen Fällennilzurück. Verwenden Sie das Schlüsselwortraise_errors, um einenSyntaxErrorbei einem Fehler insrcauszulösen.require 'ripper' require 'pp' pp Ripper.sexp("def m(a) nil end") #=> [:program, [[:def, [:@ident, "m", [1, 4]], [:paren, [:params, [[:@ident, "a", [1, 6]]], nil, nil, nil, nil, nil, nil]], [:bodystmt, [[:var_ref, [:@kw, "nil", [1, 9]]]], nil, nil, nil]]]]
Source
# File ext/ripper/lib/ripper/sexp.rb, line 71 def Ripper.sexp_raw(src, filename = '-', lineno = 1, raise_errors: false) builder = SexpBuilder.new(src, filename, lineno) sexp = builder.parse if builder.error? if raise_errors raise SyntaxError, builder.error end else sexp end end
- EXPERIMENTELL
-
Parst
srcund erstellt einen S-Ausdruck-Baum. Diese Methode ist hauptsächlich für Entwickler gedacht. Das Argumentfilenamewird größtenteils ignoriert. Standardmäßig behandelt diese Methode keine Syntaxfehler insrcund gibt in solchen Fällennilzurück. Verwenden Sie das Schlüsselwortraise_errors, um einenSyntaxErrorbei einem Fehler insrcauszulösen.require 'ripper' require 'pp' pp Ripper.sexp_raw("def m(a) nil end") #=> [:program, [:stmts_add, [:stmts_new], [:def, [:@ident, "m", [1, 4]], [:paren, [:params, [[:@ident, "a", [1, 6]]], nil, nil, nil]], [:bodystmt, [:stmts_add, [:stmts_new], [:var_ref, [:@kw, "nil", [1, 9]]]], nil, nil, nil]]]]
Source
# File ext/ripper/lib/ripper/lexer.rb, line 277 def Ripper.slice(src, pattern, n = 0) if m = token_match(src, pattern) then m.string(n) else nil end end
- EXPERIMENTELL
-
Parst
srcund gibt einen String zurück, der mitpatternübereinstimmt.patternsollte alsRegexpbeschrieben werden.require 'ripper' p Ripper.slice('def m(a) nil end', 'ident') #=> "m" p Ripper.slice('def m(a) nil end', '[ident lparen rparen]+') #=> "m(a)" p Ripper.slice("<<EOS\nstring\nEOS", 'heredoc_beg nl $(tstring_content*) heredoc_end', 1) #=> "string\n"
Source
# File ext/ripper/lib/ripper/lexer.rb, line 25 def Ripper.tokenize(src, filename = '-', lineno = 1, **kw) Lexer.new(src, filename, lineno).tokenize(**kw) end
Tokenisiert das Ruby-Programm und gibt ein Array von Strings zurück. Die Argumente filename und lineno werden größtenteils ignoriert, da der Rückgabewert nur der tokenisierte Input ist. Standardmäßig behandelt diese Methode keine Syntaxfehler in src. Verwenden Sie das Schlüsselwort raise_errors, um einen SyntaxError bei einem Fehler in src auszulösen.
p Ripper.tokenize("def m(a) nil end") # => ["def", " ", "m", "(", "a", ")", " ", "nil", " ", "end"]
Private Instanzmethoden
Source
# File ext/ripper/lib/ripper/core.rb, line 63 def compile_error(msg) end
Diese Methode wird aufgerufen, wenn der Parser einen Syntaxfehler gefunden hat.
Source
# File ext/ripper/lib/ripper/core.rb, line 54 def warn(fmt, *args) end
Diese Methode wird aufgerufen, wenn eine schwache Warnung vom Parser erzeugt wird. fmt und args sind im printf-Stil.
Source
# File ext/ripper/lib/ripper/core.rb, line 59 def warning(fmt, *args) end
Diese Methode wird aufgerufen, wenn eine starke Warnung vom Parser erzeugt wird. fmt und args sind im printf-Stil.