aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--ext/ripper/lib/ripper/sexp.rb50
2 files changed, 52 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index ec179f94fb..a22b223138 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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