2011-08-01 15 views
7

Czy można pobrać blok AST od samego Rubiego?Wyodrębnij AST z bloku Ruby

Spojrzałem na ParseTree i ruby_parser, ale oba wydają się mieć szkicową obsługę (z tego, co przeczytałem) dla Ruby 1.9.2. Potrzebuję czegoś, co działa dobrze z wersją 1.9.2.

Odpowiedz

7

Ripper jest zawarty w MRI 1.9 po wyjęciu z pudełka.

ruby-1.9.2-p180 :004 > require 'ripper' 
=> true 
ruby-1.9.2-p180 :005 > Ripper.sexp("def a; end") 
=> [:program, [[:def, [:@ident, "a", [1, 4]], [:params, nil, nil, nil, nil, nil], [:bodystmt, [[:void_stmt]], nil, nil, nil]]]] 

w 1,8, Ruby wykonuje kod przez przejeżdżające AST, więc jest to możliwe, aby uzyskać AST dla danej metody/bloku. W 1.9 tak nie jest; kod jest najpierw analizowany, następnie konwertowany na kod bajtowy YARV, a następnie wykonywany. Nie źródło, ani AST nie jest trzymane po etapie tłumaczenia, a drugie nie jest odwracalne; w związku z tym nie można uzyskać AST za blok w 1.9.

+0

Jak używać Rippera do pobrania AST z bloku? Zakładam, że w jakiś sposób będę musiał pobrać kod źródłowy bloku. –

+0

Dzięki za informacje! Wygląda na to, że musisz "wymagać" rippera ", aby działał. –

+0

Oh. Przepraszam, powinienem uważniej przeczytać Twój wpis. Zaktualizowałem odpowiedź. – whitequark