#!/usr/bin/ruby # encoding: utf-8 module ANTLR3 module Util module_function def snake_case( str ) str = str.to_s.gsub( /([A-Z]+)([A-Z][a-z])/,'\1_\2' ) str.gsub!( /([a-z\d])([A-Z])/,'\1_\2' ) str.tr!( "-", "_" ) str.downcase! str end def parse_version( version_string ) version_string.split( '.' ).map! do | segment | segment.to_i end.freeze end def tidy( here_doc, flow = false ) here_doc.gsub!( /^ *\| ?/, '' ) if flow here_doc.strip! here_doc.gsub!( /\s+/, ' ' ) end return here_doc end def silence_warnings verbosity, $VERBOSE = $VERBOSE, nil return yield ensure $VERBOSE = verbosity end end module ClassMacros private def shared_attribute( name, *additional_members ) attr_reader name additional_writers = additional_members.inject( '' ) do |src, attr| src << "@#{ attr } = value if @#{ attr }\n" end file, line, = caller[ 1 ].split( ':', 3 ) class_eval( <<-END, file, line.to_i ) def #{ name }= value @#{ name } = value each_delegate do |del| del.#{ name } = value end #{ additional_writers } end END end def abstract( name, message = nil ) message ||= "abstract method -- #{ self.class }::#{ name } has not been implemented" file, line, = caller[ 1 ].split( ':', 3 ) class_eval( <<-END, file, line.to_i ) def #{ name }( * ) raise TypeError, #{ message.to_s.inspect } end END end def deprecate( name, extra_message = nil ) hidden_name = "deprecated_#{ name }" method_defined?( hidden_name ) and return alias_method( hidden_name, name ) private( hidden_name ) message = "warning: method #{ self }##{ name } is deprecated" extra_message and message << '; ' << extra_message.to_s class_eval( <<-END ) def #{ name }( *args, &block ) warn( #{ message.inspect } ) #{ hidden_name }( *args, &block ) end END end def alias_accessor( alias_name, attr_name ) alias_method( alias_name, attr_name ) alias_method( :"#{ alias_name }=", :"#{ attr_name }=" ) end end end class Integer # Returns the lower of self or x. # # 4.at_least(5) #=> 5 # 6.at_least(5) #=> 6 # # CREDIT Florian Gross def at_least( x ) ( self >= x ) ? self : x end # Returns the greater of self or x. # # 4.at_most(5) #=> 4 # 6.at_most(5) #=> 5 # # CREDIT Florian Gross def at_most( x ) ( self <= x ) ? self : x end # Returns self if above the given lower bound, or # within the given lower and upper bounds, # otherwise returns the the bound of which the # value falls outside. # # 4.bound(3) #=> 4 # 4.bound(5) #=> 5 # 4.bound(2,7) #=> 4 # 9.bound(2,7) #=> 7 # 1.bound(2,7) #=> 2 # # CREDIT Trans def bound( lower, upper=nil ) return lower if self < lower return self unless upper return upper if self > upper return self end end class Range def covers?( range ) range.first >= first or return false if exclude_end? range.exclude_end? ? last >= range.last : last > range.last else range.exclude_end? ? last.succ >= range.last : last >= range.last end end def covered_by?( range ) range.covers?( self ) end def overlaps?( range ) range.include?( first ) or include?( range.first ) end def disjoint?( range ) not overlaps?( range ) end end