1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#!/usr/bin/ruby 2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# encoding: utf-8 3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermodule ANTLR3 5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermodule Util 6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermodule_function 8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def snake_case( str ) 10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver str = str.to_s.gsub( /([A-Z]+)([A-Z][a-z])/,'\1_\2' ) 11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver str.gsub!( /([a-z\d])([A-Z])/,'\1_\2' ) 12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver str.tr!( "-", "_" ) 13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver str.downcase! 14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver str 15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def parse_version( version_string ) 18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver version_string.split( '.' ).map! do | segment | 19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver segment.to_i 20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end.freeze 21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def tidy( here_doc, flow = false ) 24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver here_doc.gsub!( /^ *\| ?/, '' ) 25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if flow 26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver here_doc.strip! 27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver here_doc.gsub!( /\s+/, ' ' ) 28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return here_doc 30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def silence_warnings 33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver verbosity, $VERBOSE = $VERBOSE, nil 34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return yield 35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ensure 36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $VERBOSE = verbosity 37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend 40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermodule ClassMacros 42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprivate 44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def shared_attribute( name, *additional_members ) 46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver attr_reader name 47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver additional_writers = additional_members.inject( '' ) do |src, attr| 49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver src << "@#{ attr } = value if @#{ attr }\n" 50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver file, line, = caller[ 1 ].split( ':', 3 ) 53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver class_eval( <<-END, file, line.to_i ) 54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def #{ name }= value 55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @#{ name } = value 56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver each_delegate do |del| 58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver del.#{ name } = value 59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver #{ additional_writers } 62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def abstract( name, message = nil ) 67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver message ||= "abstract method -- #{ self.class }::#{ name } has not been implemented" 68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver file, line, = caller[ 1 ].split( ':', 3 ) 69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver class_eval( <<-END, file, line.to_i ) 70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def #{ name }( * ) 71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver raise TypeError, #{ message.to_s.inspect } 72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def deprecate( name, extra_message = nil ) 77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver hidden_name = "deprecated_#{ name }" 78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver method_defined?( hidden_name ) and return 79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver alias_method( hidden_name, name ) 81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private( hidden_name ) 82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver message = "warning: method #{ self }##{ name } is deprecated" 84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver extra_message and message << '; ' << extra_message.to_s 85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver class_eval( <<-END ) 87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def #{ name }( *args, &block ) 88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver warn( #{ message.inspect } ) 89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver #{ hidden_name }( *args, &block ) 90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def alias_accessor( alias_name, attr_name ) 95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver alias_method( alias_name, attr_name ) 96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver alias_method( :"#{ alias_name }=", :"#{ attr_name }=" ) 97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend 100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend 102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass Integer 104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # Returns the lower of self or x. 106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # 107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # 4.at_least(5) #=> 5 108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # 6.at_least(5) #=> 6 109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # 110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # CREDIT Florian Gross 111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def at_least( x ) 113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ( self >= x ) ? self : x 114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # Returns the greater of self or x. 117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # 118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # 4.at_most(5) #=> 4 119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # 6.at_most(5) #=> 5 120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # 121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # CREDIT Florian Gross 122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def at_most( x ) 124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ( self <= x ) ? self : x 125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # Returns self if above the given lower bound, or 128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # within the given lower and upper bounds, 129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # otherwise returns the the bound of which the 130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # value falls outside. 131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # 132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # 4.bound(3) #=> 4 133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # 4.bound(5) #=> 5 134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # 4.bound(2,7) #=> 4 135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # 9.bound(2,7) #=> 7 136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # 1.bound(2,7) #=> 2 137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # 138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # CREDIT Trans 139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def bound( lower, upper=nil ) 141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return lower if self < lower 142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return self unless upper 143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return upper if self > upper 144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return self 145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend 148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass Range 151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def covers?( range ) 152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver range.first >= first or return false 153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if exclude_end? 154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver range.exclude_end? ? last >= range.last : last > range.last 155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver range.exclude_end? ? last.succ >= range.last : last >= range.last 157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def covered_by?( range ) 161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver range.covers?( self ) 162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def overlaps?( range ) 165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver range.include?( first ) or include?( range.first ) 166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def disjoint?( range ) 169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver not overlaps?( range ) 170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend 173