Ripper
Simple Ruby tokenizer; used to parse a Ruby program into an Array of tokens suitable for rendering in some other form.
Returns true if the Ripper parser loaded okay. If this is false, the token reactor will not be functional.
# File /Users/ged/source/ruby/Arrow/lib/arrow/rubytokenreactor.rb, line 75 75: def self::loaded? 76: return ! $fakedRipper 77: end
Create a new RubyTokenReactor object that will parse the specified source (either a String or an object that responds to #gets) and call registered callbacks for parsed tokens. The fname and lineno are for building error messages. See Ripper.new for more info.
# File /Users/ged/source/ruby/Arrow/lib/arrow/rubytokenreactor.rb, line 89 89: def initialize( source, fname="(string)", lineno=1 ) 90: @callbacks = Hash.new {|hsh, key| 91: hsh[ key ] = [] 92: } 93: super 94: end
Parse the specified source and call the callback when any of the given events are seen.
# File /Users/ged/source/ruby/Arrow/lib/arrow/rubytokenreactor.rb, line 57 57: def self::parse( source, *events, &callback ) 58: reactor = self.new( source ) 59: if callback.nil? 60: tokens = Hash.new {|h,k| h[k] = []} 61: reactor.onEvents( *events ) {|tok, *args| 62: tokens[ tok ].push args 63: } 64: reactor.parse 65: return tokens 66: else 67: reactor.onEvents( *events, &callback ) 68: reactor.parse 69: end 70: end
Remove the specified callback from the specified event. If event is nil, the callback is removed from all events that it is registered for.
# File /Users/ged/source/ruby/Arrow/lib/arrow/rubytokenreactor.rb, line 133 133: def cancelCallback( callback, event=nil ) 134: if event.nil? 135: @callbacks.each {|evsym,callbacks| 136: callbacks.delete( callback ) 137: } 138: else 139: evsym = self.eventSym( event ) 140: @callbacks[ evsym ].delete( callback ) 141: end 142: end
Remove all callbacks for the specified events. Returns the callbacks that were removed.
# File /Users/ged/source/ruby/Arrow/lib/arrow/rubytokenreactor.rb, line 119 119: def cancelEvents( *events ) 120: callbacks = [] 121: events.each {|ev| 122: evsym = self.eventSym( ev ) 123: callbacks << @callbacks.delete( evsym ) 124: } 125: 126: return callbacks.flatten 127: end
Return a normalized version of the given event as a symbol. Prepends ‘on__’ if it isn‘t already, and turns strings into symbols.
# File /Users/ged/source/ruby/Arrow/lib/arrow/rubytokenreactor.rb, line 147 147: def eventSym( event ) 148: return event if event.to_s == "all" 149: event.to_s.sub( /^(?!on__)/, 'on__' ).intern 150: end
Register a callback for the given events. Events are either strings or symbols that match the events generated by Ripper, optionally without the ‘on__’ prefix.
# File /Users/ged/source/ruby/Arrow/lib/arrow/rubytokenreactor.rb, line 108 108: def onEvents( *events, &callback ) 109: events.each {|ev| 110: evsym = self.eventSym( ev ) 111: self.log.debug "Registering for the %p event" % evsym 112: @callbacks[ evsym ] << callback 113: } 114: end
Log a parse error
# File /Users/ged/source/ruby/Arrow/lib/arrow/rubytokenreactor.rb, line 171 171: def compile_error( fmt, *args ) 172: self.log.error( "Parser compile error: " + fmt, *args ) 173: end
Handle any calls to methods not explicitly handled
# File /Users/ged/source/ruby/Arrow/lib/arrow/rubytokenreactor.rb, line 177 177: def method_missing( sym, *args ) 178: #self.log.debug "Parser: %s( %p )" % [ sym, args ] 179: if @callbacks.key?( sym ) 180: @callbacks[ sym ].each {|callback| 181: callback.call( self, *args ) 182: } 183: end 184: if @callbacks.key?( :all ) 185: @callbacks[ :all ].each {|callback| 186: callback.call( self, sym, *args ) 187: } 188: end 189: end
Log a warning
# File /Users/ged/source/ruby/Arrow/lib/arrow/rubytokenreactor.rb, line 159 159: def warn( fmt, *args ) 160: self.log.warning( "Parser warn: " + fmt, *args ) 161: end
Log a warning
# File /Users/ged/source/ruby/Arrow/lib/arrow/rubytokenreactor.rb, line 165 165: def warning( fmt, *args ) 166: self.log.warning( "Parser warning: " + fmt, *args ) 167: end
--- SEC00098
--- ""
--- - name: callbacks rw: R a_desc: |+ The Hash of events => [ callbacks ]
--- - methods: - visibility: public aref: M000304 name: loaded? sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/rubytokenreactor.rb, line 75</span>\n\ 75: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-keyword kw\">self</span><span class=\"ruby-operator\">::</span><span class=\"ruby-identifier\">loaded?</span>\n\ 76: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-operator\">!</span> <span class=\"ruby-identifier\">$fakedRipper</span>\n\ 77: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Returns <tt>true</tt> if the Ripper parser loaded okay. If this is false, the token reactor will not be functional. </p> params: () - visibility: public aref: M000305 name: new sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/rubytokenreactor.rb, line 89</span>\n\ 89: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">initialize</span>( <span class=\"ruby-identifier\">source</span>, <span class=\"ruby-identifier\">fname</span>=<span class=\"ruby-value str\">"(string)"</span>, <span class=\"ruby-identifier\">lineno</span>=<span class=\"ruby-value\">1</span> )\n\ 90: <span class=\"ruby-ivar\">@callbacks</span> = <span class=\"ruby-constant\">Hash</span>.<span class=\"ruby-identifier\">new</span> {<span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">hsh</span>, <span class=\"ruby-identifier\">key</span><span class=\"ruby-operator\">|</span>\n\ 91: <span class=\"ruby-identifier\">hsh</span>[ <span class=\"ruby-identifier\">key</span> ] = []\n\ 92: }\n\ 93: <span class=\"ruby-keyword kw\">super</span>\n\ 94: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Create a <a href="RubyTokenReactor.html#M000305">new</a> <a href="RubyTokenReactor.html">RubyTokenReactor</a> object that will <a href="RubyTokenReactor.html#M000303">parse</a> the specified <tt>source</tt> (either a String or an object that responds to #gets) and call registered callbacks for parsed tokens. The <tt>fname</tt> and <tt>lineno</tt> are for building error messages. See Ripper.new for more info. </p> params: ( source, fname="(string)", lineno=1 ) - visibility: public aref: M000303 name: parse sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/rubytokenreactor.rb, line 57</span>\n\ 57: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-keyword kw\">self</span><span class=\"ruby-operator\">::</span><span class=\"ruby-identifier\">parse</span>( <span class=\"ruby-identifier\">source</span>, <span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">events</span>, <span class=\"ruby-operator\">&</span><span class=\"ruby-identifier\">callback</span> )\n\ 58: <span class=\"ruby-identifier\">reactor</span> = <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">new</span>( <span class=\"ruby-identifier\">source</span> )\n\ 59: <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-identifier\">callback</span>.<span class=\"ruby-identifier\">nil?</span>\n\ 60: <span class=\"ruby-identifier\">tokens</span> = <span class=\"ruby-constant\">Hash</span>.<span class=\"ruby-identifier\">new</span> {<span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">h</span>,<span class=\"ruby-identifier\">k</span><span class=\"ruby-operator\">|</span> <span class=\"ruby-identifier\">h</span>[<span class=\"ruby-identifier\">k</span>] = []}\n\ 61: <span class=\"ruby-identifier\">reactor</span>.<span class=\"ruby-identifier\">onEvents</span>( <span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">events</span> ) {<span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">tok</span>, <span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">args</span><span class=\"ruby-operator\">|</span>\n\ 62: <span class=\"ruby-identifier\">tokens</span>[ <span class=\"ruby-identifier\">tok</span> ].<span class=\"ruby-identifier\">push</span> <span class=\"ruby-identifier\">args</span>\n\ 63: }\n\ 64: <span class=\"ruby-identifier\">reactor</span>.<span class=\"ruby-identifier\">parse</span>\n\ 65: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-identifier\">tokens</span>\n\ 66: <span class=\"ruby-keyword kw\">else</span>\n\ 67: <span class=\"ruby-identifier\">reactor</span>.<span class=\"ruby-identifier\">onEvents</span>( <span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">events</span>, <span class=\"ruby-operator\">&</span><span class=\"ruby-identifier\">callback</span> )\n\ 68: <span class=\"ruby-identifier\">reactor</span>.<span class=\"ruby-identifier\">parse</span>\n\ 69: <span class=\"ruby-keyword kw\">end</span>\n\ 70: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Parse the specified <tt>source</tt> and call the <tt>callback</tt> when any of the given <tt>events</tt> are seen. </p> params: ( source, *events, &callback ) category: Class type: Public - methods: - visibility: public aref: M000308 name: cancelCallback sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/rubytokenreactor.rb, line 133</span>\n\ 133: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">cancelCallback</span>( <span class=\"ruby-identifier\">callback</span>, <span class=\"ruby-identifier\">event</span>=<span class=\"ruby-keyword kw\">nil</span> )\n\ 134: <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-identifier\">event</span>.<span class=\"ruby-identifier\">nil?</span>\n\ 135: <span class=\"ruby-ivar\">@callbacks</span>.<span class=\"ruby-identifier\">each</span> {<span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">evsym</span>,<span class=\"ruby-identifier\">callbacks</span><span class=\"ruby-operator\">|</span>\n\ 136: <span class=\"ruby-identifier\">callbacks</span>.<span class=\"ruby-identifier\">delete</span>( <span class=\"ruby-identifier\">callback</span> )\n\ 137: }\n\ 138: <span class=\"ruby-keyword kw\">else</span>\n\ 139: <span class=\"ruby-identifier\">evsym</span> = <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">eventSym</span>( <span class=\"ruby-identifier\">event</span> )\n\ 140: <span class=\"ruby-ivar\">@callbacks</span>[ <span class=\"ruby-identifier\">evsym</span> ].<span class=\"ruby-identifier\">delete</span>( <span class=\"ruby-identifier\">callback</span> )\n\ 141: <span class=\"ruby-keyword kw\">end</span>\n\ 142: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Remove the specified <tt>callback</tt> from the specified <tt>event</tt>. If <tt>event</tt> is nil, the callback is removed from all events that it is registered for. </p> params: ( callback, event=nil ) - visibility: public aref: M000307 name: cancelEvents sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/rubytokenreactor.rb, line 119</span>\n\ 119: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">cancelEvents</span>( <span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">events</span> )\n\ 120: <span class=\"ruby-identifier\">callbacks</span> = []\n\ 121: <span class=\"ruby-identifier\">events</span>.<span class=\"ruby-identifier\">each</span> {<span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">ev</span><span class=\"ruby-operator\">|</span>\n\ 122: <span class=\"ruby-identifier\">evsym</span> = <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">eventSym</span>( <span class=\"ruby-identifier\">ev</span> )\n\ 123: <span class=\"ruby-identifier\">callbacks</span> <span class=\"ruby-operator\"><<</span> <span class=\"ruby-ivar\">@callbacks</span>.<span class=\"ruby-identifier\">delete</span>( <span class=\"ruby-identifier\">evsym</span> )\n\ 124: }\n\ 125: \n\ 126: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-identifier\">callbacks</span>.<span class=\"ruby-identifier\">flatten</span>\n\ 127: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Remove all callbacks for the specified <tt>events</tt>. Returns the callbacks that were removed. </p> params: ( *events ) - visibility: public aref: M000309 name: eventSym sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/rubytokenreactor.rb, line 147</span>\n\ 147: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">eventSym</span>( <span class=\"ruby-identifier\">event</span> )\n\ 148: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-identifier\">event</span> <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-identifier\">event</span>.<span class=\"ruby-identifier\">to_s</span> <span class=\"ruby-operator\">==</span> <span class=\"ruby-value str\">"all"</span>\n\ 149: <span class=\"ruby-identifier\">event</span>.<span class=\"ruby-identifier\">to_s</span>.<span class=\"ruby-identifier\">sub</span>( <span class=\"ruby-regexp re\">/^(?!on__)/</span>, <span class=\"ruby-value str\">'on__'</span> ).<span class=\"ruby-identifier\">intern</span>\n\ 150: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Return a normalized version of the given event as a symbol. Prepends ‘on__’ if it isn‘t already, and turns strings into symbols. </p> params: ( event ) - visibility: public aref: M000306 name: onEvents sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/rubytokenreactor.rb, line 108</span>\n\ 108: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">onEvents</span>( <span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">events</span>, <span class=\"ruby-operator\">&</span><span class=\"ruby-identifier\">callback</span> )\n\ 109: <span class=\"ruby-identifier\">events</span>.<span class=\"ruby-identifier\">each</span> {<span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">ev</span><span class=\"ruby-operator\">|</span>\n\ 110: <span class=\"ruby-identifier\">evsym</span> = <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">eventSym</span>( <span class=\"ruby-identifier\">ev</span> )\n\ 111: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">"Registering for the %p event"</span> <span class=\"ruby-operator\">%</span> <span class=\"ruby-identifier\">evsym</span>\n\ 112: <span class=\"ruby-ivar\">@callbacks</span>[ <span class=\"ruby-identifier\">evsym</span> ] <span class=\"ruby-operator\"><<</span> <span class=\"ruby-identifier\">callback</span>\n\ 113: }\n\ 114: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Register a <tt>callback</tt> for the given <tt>events</tt>. Events are either strings or symbols that match the events generated by Ripper, optionally without the ‘on__’ prefix. </p> params: ( *events, &callback ) category: Instance type: Public - methods: - visibility: protected aref: M000312 name: compile_error sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/rubytokenreactor.rb, line 171</span>\n\ 171: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">compile_error</span>( <span class=\"ruby-identifier\">fmt</span>, <span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">args</span> )\n\ 172: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">error</span>( <span class=\"ruby-value str\">"Parser compile error: "</span> <span class=\"ruby-operator\">+</span> <span class=\"ruby-identifier\">fmt</span>, <span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">args</span> )\n\ 173: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Log a <a href="RubyTokenReactor.html#M000303">parse</a> error </p> params: ( fmt, *args ) - visibility: protected aref: M000313 name: method_missing sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/rubytokenreactor.rb, line 177</span>\n\ 177: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">method_missing</span>( <span class=\"ruby-identifier\">sym</span>, <span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">args</span> )\n\ 178: <span class=\"ruby-comment cmt\">#self.log.debug "Parser: %s( %p )" % [ sym, args ]</span>\n\ 179: <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-ivar\">@callbacks</span>.<span class=\"ruby-identifier\">key?</span>( <span class=\"ruby-identifier\">sym</span> )\n\ 180: <span class=\"ruby-ivar\">@callbacks</span>[ <span class=\"ruby-identifier\">sym</span> ].<span class=\"ruby-identifier\">each</span> {<span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">callback</span><span class=\"ruby-operator\">|</span>\n\ 181: <span class=\"ruby-identifier\">callback</span>.<span class=\"ruby-identifier\">call</span>( <span class=\"ruby-keyword kw\">self</span>, <span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">args</span> )\n\ 182: }\n\ 183: <span class=\"ruby-keyword kw\">end</span>\n\ 184: <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-ivar\">@callbacks</span>.<span class=\"ruby-identifier\">key?</span>( <span class=\"ruby-identifier\">:all</span> )\n\ 185: <span class=\"ruby-ivar\">@callbacks</span>[ <span class=\"ruby-identifier\">:all</span> ].<span class=\"ruby-identifier\">each</span> {<span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">callback</span><span class=\"ruby-operator\">|</span>\n\ 186: <span class=\"ruby-identifier\">callback</span>.<span class=\"ruby-identifier\">call</span>( <span class=\"ruby-keyword kw\">self</span>, <span class=\"ruby-identifier\">sym</span>, <span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">args</span> )\n\ 187: }\n\ 188: <span class=\"ruby-keyword kw\">end</span>\n\ 189: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Handle any calls to methods not explicitly handled </p> params: ( sym, *args ) - visibility: protected aref: M000310 name: warn sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/rubytokenreactor.rb, line 159</span>\n\ 159: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">warn</span>( <span class=\"ruby-identifier\">fmt</span>, <span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">args</span> )\n\ 160: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">warning</span>( <span class=\"ruby-value str\">"Parser warn: "</span> <span class=\"ruby-operator\">+</span> <span class=\"ruby-identifier\">fmt</span>, <span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">args</span> )\n\ 161: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Log a <a href="RubyTokenReactor.html#M000311">warning</a> </p> params: ( fmt, *args ) - visibility: protected aref: M000311 name: warning sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/rubytokenreactor.rb, line 165</span>\n\ 165: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">warning</span>( <span class=\"ruby-identifier\">fmt</span>, <span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">args</span> )\n\ 166: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">warning</span>( <span class=\"ruby-value str\">"Parser warning: "</span> <span class=\"ruby-operator\">+</span> <span class=\"ruby-identifier\">fmt</span>, <span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">args</span> )\n\ 167: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Log a <a href="RubyTokenReactor.html#M000311">warning</a> </p> params: ( fmt, *args ) category: Instance type: Protected
---
--- - name: SVNRev desc: |+ SVN Revision value: "%q$Rev: 437 $" - name: SVNId desc: |+ SVN Id value: "%q$Id: rubytokenreactor.rb 437 2008-03-28 00:49:20Z deveiant $"
Generated with the Darkfish Rdoc Generator.