mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	* ext/ripper/lib/ripper.rb: Documentation for Ripper.
* ext/ripper/lib/ripper/lexer.rb: ditto. * ext/ripper/lib/ripper/sexp.rb: ditto. * ext/ripper/lib/ripper/filter.rb: ditto. * ext/ripper/lib/ripper/core.rb: ditto. [Bug #6929] [ruby-core:47309] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@36954 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
		
							parent
							
								
									857ec7118f
								
							
						
					
					
						commit
						8f0d172f58
					
				
					 6 changed files with 109 additions and 20 deletions
				
			
		|  | @ -1,3 +1,12 @@ | ||||||
|  | Thu Sep 13 08:00:00 2012  Zachary Scott  <zzak@ruby-lang.org> | ||||||
|  | 
 | ||||||
|  | 	* ext/ripper/lib/ripper.rb: Documentation for Ripper. | ||||||
|  | 	* ext/ripper/lib/ripper/lexer.rb: ditto. | ||||||
|  | 	* ext/ripper/lib/ripper/sexp.rb: ditto. | ||||||
|  | 	* ext/ripper/lib/ripper/filter.rb: ditto. | ||||||
|  | 	* ext/ripper/lib/ripper/core.rb: ditto. | ||||||
|  | 	  [Bug #6929] [ruby-core:47309] | ||||||
|  | 
 | ||||||
| Wed Sep 12 22:59:07 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org> | Wed Sep 12 22:59:07 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org> | ||||||
| 
 | 
 | ||||||
| 	* vm_insnhelper.c (vm_method_missing, vm_call_method): reuse arguments | 	* vm_insnhelper.c (vm_method_missing, vm_call_method): reuse arguments | ||||||
|  |  | ||||||
|  | @ -2,3 +2,73 @@ require 'ripper/core' | ||||||
| require 'ripper/lexer' | require 'ripper/lexer' | ||||||
| require 'ripper/filter' | require 'ripper/filter' | ||||||
| require 'ripper/sexp' | require 'ripper/sexp' | ||||||
|  | 
 | ||||||
|  | # Ripper is a Ruby script parser. | ||||||
|  | # | ||||||
|  | # You can get information from the parser with event-based style. | ||||||
|  | # Information such as abstract syntax trees or simple lexical analysis of the | ||||||
|  | # Ruby program. | ||||||
|  | # | ||||||
|  | # == Usage | ||||||
|  | # | ||||||
|  | # Ripper provides an easy interface for parsing your program into a symbolic | ||||||
|  | # expression tree (or S-expression). | ||||||
|  | # | ||||||
|  | # Understanding the output of the parser may come as a challenge, it's | ||||||
|  | # recommended you use PP to format the output for legibility. | ||||||
|  | # | ||||||
|  | #   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, | ||||||
|  | #             [[:void_stmt], | ||||||
|  | #              [:string_literal, | ||||||
|  | #               [:string_content, | ||||||
|  | #                [:@tstring_content, "Hello, ", [1, 19]], | ||||||
|  | #                [:string_embexpr, [[:var_ref, [:@ident, "world", [1, 28]]]]], | ||||||
|  | #                [:@tstring_content, "!", [1, 34]]]]], | ||||||
|  | #             nil, | ||||||
|  | #             nil, | ||||||
|  | #             nil]]]] | ||||||
|  | # | ||||||
|  | # You can see in the example above, the expression starts with +:program+. | ||||||
|  | # | ||||||
|  | # From here, a method definition at +:def+, followed by the method's identifier | ||||||
|  | # <code>:@ident</code>. After the method's identifier comes the parentheses | ||||||
|  | # +:paren+ and the method parameters under +:params+. | ||||||
|  | # | ||||||
|  | # Next is the method body, starting at +:bodystmt+ (+stmt+ meaning statement), | ||||||
|  | # which contains the full definition of the method. | ||||||
|  | # | ||||||
|  | # In our case, we're simply returning a String, so next we have the | ||||||
|  | # +:void_stmt+ followed by a +:string_literal+. | ||||||
|  | # | ||||||
|  | # Within our +:string_literal+ you'll notice two <code>@tstring_content</code>, | ||||||
|  | # this is the literal part for <code>Hello, </code> and <code>!</code>. Between | ||||||
|  | # the two <code>@tstring_content</code> statements is a +:string_embexpr+, | ||||||
|  | # where _embexpr_ is an embedded expression. Our expression consists of a local | ||||||
|  | # variable, or +var_ref+, with the identifier (<code>@ident</code>) of +world+. | ||||||
|  | # | ||||||
|  | # == Resources | ||||||
|  | # | ||||||
|  | # * {Ruby Inside}[http://www.rubyinside.com/using-ripper-to-see-how-ruby-is-parsing-your-code-5270.html] | ||||||
|  | # | ||||||
|  | # == Requirements | ||||||
|  | # | ||||||
|  | # * ruby 1.9 (support CVS HEAD only) | ||||||
|  | # * bison 1.28 or later (Other yaccs do not work) | ||||||
|  | # | ||||||
|  | # == License | ||||||
|  | # | ||||||
|  | #   Ruby License. | ||||||
|  | # | ||||||
|  | #                                                 Minero Aoki | ||||||
|  | #                                         aamine@loveruby.net | ||||||
|  | #                                       http://i.loveruby.net | ||||||
|  | class Ripper; end | ||||||
|  |  | ||||||
|  | @ -12,8 +12,8 @@ require 'ripper.so' | ||||||
| 
 | 
 | ||||||
| class Ripper | class Ripper | ||||||
| 
 | 
 | ||||||
|   # Parses Ruby program read from _src_. |   # Parses the given Ruby program read from +src+. | ||||||
|   # _src_ must be a String or a IO or a object which has #gets method. |   # +src+ must be a String or an IO or a object with a #gets method. | ||||||
|   def Ripper.parse(src, filename = '(ripper)', lineno = 1) |   def Ripper.parse(src, filename = '(ripper)', lineno = 1) | ||||||
|     new(src, filename, lineno).parse |     new(src, filename, lineno).parse | ||||||
|   end |   end | ||||||
|  | @ -42,12 +42,12 @@ class Ripper | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|   # This method is called when weak warning is produced by the parser. |   # This method is called when weak warning is produced by the parser. | ||||||
|   # _fmt_ and _args_ is printf style. |   # +fmt+ and +args+ is printf style. | ||||||
|   def warn(fmt, *args) |   def warn(fmt, *args) | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|   # This method is called when strong warning is produced by the parser. |   # This method is called when strong warning is produced by the parser. | ||||||
|   # _fmt_ and _args_ is printf style. |   # +fmt+ and +args+ is printf style. | ||||||
|   def warning(fmt, *args) |   def warning(fmt, *args) | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -13,9 +13,13 @@ require 'ripper/lexer' | ||||||
| class Ripper | class Ripper | ||||||
| 
 | 
 | ||||||
|   # This class handles only scanner events, |   # This class handles only scanner events, | ||||||
|   # and they are dispatched in the `right' order (same with input). |   # which are dispatched in the 'right' order (same with input). | ||||||
|   class Filter |   class Filter | ||||||
| 
 | 
 | ||||||
|  |     # Creates a new Ripper::Filter instance, passes parameters +src+, | ||||||
|  |     # +filename+, and +lineno+ to Ripper::Lexer.new | ||||||
|  |     # | ||||||
|  |     # The lexer is for internal use only. | ||||||
|     def initialize(src, filename = '-', lineno = 1) |     def initialize(src, filename = '-', lineno = 1) | ||||||
|       @__lexer = Lexer.new(src, filename, lineno) |       @__lexer = Lexer.new(src, filename, lineno) | ||||||
|       @__line = nil |       @__line = nil | ||||||
|  | @ -41,8 +45,9 @@ class Ripper | ||||||
|       @__col |       @__col | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     # Starts parsing.  _init_ is a data accumulator. |     # Starts the parser. | ||||||
|     # It is passed to the next event handler (as of Enumerable#inject). |     # +init+ is a data accumulator and is passed to the next event handler (as | ||||||
|  |     # of Enumerable#inject). | ||||||
|     def parse(init = nil) |     def parse(init = nil) | ||||||
|       data = init |       data = init | ||||||
|       @__lexer.lex.each do |pos, event, tok| |       @__lexer.lex.each do |pos, event, tok| | ||||||
|  | @ -57,10 +62,12 @@ class Ripper | ||||||
| 
 | 
 | ||||||
|     private |     private | ||||||
| 
 | 
 | ||||||
|     # This method is called when some event handler have not defined. |     # This method is called when some event handler is undefined. | ||||||
|     # _event_ is :on_XXX, _token_ is scanned token, _data_ is a data |     # +event+ is :on_XXX, +token+ is the scanned token, and +data+ is a data | ||||||
|     # accumulator.  The return value of this method is passed to the |     # accumulator. | ||||||
|     # next event handler (as of Enumerable#inject). |     # | ||||||
|  |     # The return value of this method is passed to the next event handler (as | ||||||
|  |     # of Enumerable#inject). | ||||||
|     def on_default(event, token, data) |     def on_default(event, token, data) | ||||||
|       data |       data | ||||||
|     end |     end | ||||||
|  |  | ||||||
|  | @ -12,13 +12,13 @@ require 'ripper/core' | ||||||
| 
 | 
 | ||||||
| class Ripper | class Ripper | ||||||
| 
 | 
 | ||||||
|   # Tokenizes Ruby program and returns an Array of String. |   # Tokenizes the Ruby program and returns an Array of String. | ||||||
|   def Ripper.tokenize(src, filename = '-', lineno = 1) |   def Ripper.tokenize(src, filename = '-', lineno = 1) | ||||||
|     Lexer.new(src, filename, lineno).tokenize |     Lexer.new(src, filename, lineno).tokenize | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|   # Tokenizes Ruby program and returns an Array of Array, |   # Tokenizes the Ruby program and returns an Array of an Array, | ||||||
|   # which is formatted like [[lineno, column], type, token]. |   # which is formatted like <code>[[lineno, column], type, token]</code>. | ||||||
|   # |   # | ||||||
|   #   require 'ripper' |   #   require 'ripper' | ||||||
|   #   require 'pp' |   #   require 'pp' | ||||||
|  | @ -90,9 +90,12 @@ class Ripper | ||||||
| 
 | 
 | ||||||
|   class TokenPattern   #:nodoc: |   class TokenPattern   #:nodoc: | ||||||
| 
 | 
 | ||||||
|     class Error < ::StandardError; end |     class Error < ::StandardError # :nodoc: | ||||||
|     class CompileError < Error; end |     end | ||||||
|     class MatchError < Error; end |     class CompileError < Error # :nodoc: | ||||||
|  |     end | ||||||
|  |     class MatchError < Error # :nodoc: | ||||||
|  |     end | ||||||
| 
 | 
 | ||||||
|     class << self |     class << self | ||||||
|       alias compile new |       alias compile new | ||||||
|  | @ -155,7 +158,7 @@ class Ripper | ||||||
|       MAP[tok]  or raise CompileError, "unknown token: #{tok}" |       MAP[tok]  or raise CompileError, "unknown token: #{tok}" | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     class MatchData |     class MatchData # :nodoc: | ||||||
|       def initialize(tokens, match) |       def initialize(tokens, match) | ||||||
|         @tokens = tokens |         @tokens = tokens | ||||||
|         @match = match |         @match = match | ||||||
|  |  | ||||||
|  | @ -15,7 +15,7 @@ class Ripper | ||||||
|   # [EXPERIMENTAL] |   # [EXPERIMENTAL] | ||||||
|   # Parses +src+ and create S-exp tree. |   # Parses +src+ and create S-exp tree. | ||||||
|   # Returns more readable tree rather than Ripper.sexp_raw. |   # Returns more readable tree rather than Ripper.sexp_raw. | ||||||
|   # This method is for mainly developer use. |   # This method is mainly for developer use. | ||||||
|   # |   # | ||||||
|   #   require 'ripper' |   #   require 'ripper' | ||||||
|   #   require 'pp' |   #   require 'pp' | ||||||
|  | @ -33,7 +33,7 @@ class Ripper | ||||||
| 
 | 
 | ||||||
|   # [EXPERIMENTAL] |   # [EXPERIMENTAL] | ||||||
|   # Parses +src+ and create S-exp tree. |   # Parses +src+ and create S-exp tree. | ||||||
|   # This method is for mainly developer use. |   # This method is mainly for developer use. | ||||||
|   # |   # | ||||||
|   #   require 'ripper' |   #   require 'ripper' | ||||||
|   #   require 'pp' |   #   require 'pp' | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 zzak
						zzak