diff options
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | ext/ripper/lib/ripper/sexp.rb | 50 |
2 files changed, 52 insertions, 5 deletions
@@ -1,3 +1,10 @@ +Tue Jul 26 22:41:28 2005 Minero Aoki <aamine@loveruby.net> + + * ext/ripper/lib/ripper/sexp.rb: new method Ripper.sexp_raw. + + * ext/ripper/lib/ripper/sexp.rb (Ripper.sexp): returns more + readable tree. This is suggested by Kirill A. Shutemov. + Tue Jul 26 22:05:12 2005 Minero Aoki <aamine@loveruby.net> * lib/net/http.rb: merge a patch contributed by Daniel Berger, diff --git a/ext/ripper/lib/ripper/sexp.rb b/ext/ripper/lib/ripper/sexp.rb index a55e5f2658..621dd0e752 100644 --- a/ext/ripper/lib/ripper/sexp.rb +++ b/ext/ripper/lib/ripper/sexp.rb @@ -33,23 +33,63 @@ class Ripper # nil]]]] # def Ripper.sexp(src, filename = '-', lineno = 1) + SexpBuilderPP.new(src, filename, lineno).parse + end + + def Ripper.sexp_raw(src, filename = '-', lineno = 1) SexpBuilder.new(src, filename, lineno).parse end + class SexpBuilderPP < ::Ripper #:nodoc: + private + + PARSER_EVENTS.each do |event| + case event.to_s + when /_new\z/ + module_eval(<<-End, __FILE__, __LINE__ + 1) + def on_#{event}(*args) + [] + end + End + when /_add\z/ + module_eval(<<-End, __FILE__, __LINE__ + 1) + def on_#{event}(list, item) + list.push item + list + end + End + else + module_eval(<<-End, __FILE__, __LINE__ + 1) + def on_#{event}(*args) + [:#{event}, *args] + end + End + end + end + + SCANNER_EVENTS.each do |event| + module_eval(<<-End, __FILE__, __LINE__ + 1) + def on_#{event}(tok) + [:@#{event}, tok, [lineno(), column()]] + end + End + end + end + class SexpBuilder < ::Ripper #:nodoc: private PARSER_EVENTS.each do |event| - module_eval(<<-End) - def on_#{event}(*list) - list.unshift :#{event} - list + module_eval(<<-End, __FILE__, __LINE__ + 1) + def on_#{event}(*args) + args.unshift :#{event} + args end End end SCANNER_EVENTS.each do |event| - module_eval(<<-End) + module_eval(<<-End, __FILE__, __LINE__ + 1) def on_#{event}(tok) [:@#{event}, tok, [lineno(), column()]] end |