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.