mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
![aamine](/assets/img/avatar_default.png)
* ext/ripper/lib/ripper/sexp.rb (Ripper.sexp): returns more readable tree. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@8841 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
100 lines
2.3 KiB
Ruby
100 lines
2.3 KiB
Ruby
#
|
|
# ripper/sexp.rb
|
|
#
|
|
# Copyright (C) 2004,2005 Minero Aoki
|
|
#
|
|
# This program is free software.
|
|
# You can distribute and/or modify this program under the Ruby License.
|
|
# For details of Ruby License, see ruby/COPYING.
|
|
#
|
|
|
|
require 'ripper/core'
|
|
|
|
class Ripper
|
|
|
|
# [EXPERIMENTAL]
|
|
# Parses +src+ and create S-exp tree.
|
|
# This method is for mainly developper use.
|
|
#
|
|
# require 'ripper'
|
|
# require 'pp
|
|
#
|
|
# pp Ripper.sexp("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]]]]
|
|
#
|
|
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, __FILE__, __LINE__ + 1)
|
|
def on_#{event}(*args)
|
|
args.unshift :#{event}
|
|
args
|
|
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
|
|
|
|
end
|