1*16467b97STreehugger Robot#!/usr/bin/ruby 2*16467b97STreehugger Robot# encoding: utf-8 3*16467b97STreehugger Robot 4*16467b97STreehugger Robotmodule ANTLR3 5*16467b97STreehugger Robotmodule Util 6*16467b97STreehugger Robot 7*16467b97STreehugger Robotmodule_function 8*16467b97STreehugger Robot 9*16467b97STreehugger Robot def snake_case( str ) 10*16467b97STreehugger Robot str = str.to_s.gsub( /([A-Z]+)([A-Z][a-z])/,'\1_\2' ) 11*16467b97STreehugger Robot str.gsub!( /([a-z\d])([A-Z])/,'\1_\2' ) 12*16467b97STreehugger Robot str.tr!( "-", "_" ) 13*16467b97STreehugger Robot str.downcase! 14*16467b97STreehugger Robot str 15*16467b97STreehugger Robot end 16*16467b97STreehugger Robot 17*16467b97STreehugger Robot def parse_version( version_string ) 18*16467b97STreehugger Robot version_string.split( '.' ).map! do | segment | 19*16467b97STreehugger Robot segment.to_i 20*16467b97STreehugger Robot end.freeze 21*16467b97STreehugger Robot end 22*16467b97STreehugger Robot 23*16467b97STreehugger Robot def tidy( here_doc, flow = false ) 24*16467b97STreehugger Robot here_doc.gsub!( /^ *\| ?/, '' ) 25*16467b97STreehugger Robot if flow 26*16467b97STreehugger Robot here_doc.strip! 27*16467b97STreehugger Robot here_doc.gsub!( /\s+/, ' ' ) 28*16467b97STreehugger Robot end 29*16467b97STreehugger Robot return here_doc 30*16467b97STreehugger Robot end 31*16467b97STreehugger Robot 32*16467b97STreehugger Robot def silence_warnings 33*16467b97STreehugger Robot verbosity, $VERBOSE = $VERBOSE, nil 34*16467b97STreehugger Robot return yield 35*16467b97STreehugger Robot ensure 36*16467b97STreehugger Robot $VERBOSE = verbosity 37*16467b97STreehugger Robot end 38*16467b97STreehugger Robot 39*16467b97STreehugger Robotend 40*16467b97STreehugger Robot 41*16467b97STreehugger Robotmodule ClassMacros 42*16467b97STreehugger Robot 43*16467b97STreehugger Robotprivate 44*16467b97STreehugger Robot 45*16467b97STreehugger Robot def shared_attribute( name, *additional_members ) 46*16467b97STreehugger Robot attr_reader name 47*16467b97STreehugger Robot 48*16467b97STreehugger Robot additional_writers = additional_members.inject( '' ) do |src, attr| 49*16467b97STreehugger Robot src << "@#{ attr } = value if @#{ attr }\n" 50*16467b97STreehugger Robot end 51*16467b97STreehugger Robot 52*16467b97STreehugger Robot file, line, = caller[ 1 ].split( ':', 3 ) 53*16467b97STreehugger Robot class_eval( <<-END, file, line.to_i ) 54*16467b97STreehugger Robot def #{ name }= value 55*16467b97STreehugger Robot @#{ name } = value 56*16467b97STreehugger Robot 57*16467b97STreehugger Robot each_delegate do |del| 58*16467b97STreehugger Robot del.#{ name } = value 59*16467b97STreehugger Robot end 60*16467b97STreehugger Robot 61*16467b97STreehugger Robot #{ additional_writers } 62*16467b97STreehugger Robot end 63*16467b97STreehugger Robot END 64*16467b97STreehugger Robot end 65*16467b97STreehugger Robot 66*16467b97STreehugger Robot def abstract( name, message = nil ) 67*16467b97STreehugger Robot message ||= "abstract method -- #{ self.class }::#{ name } has not been implemented" 68*16467b97STreehugger Robot file, line, = caller[ 1 ].split( ':', 3 ) 69*16467b97STreehugger Robot class_eval( <<-END, file, line.to_i ) 70*16467b97STreehugger Robot def #{ name }( * ) 71*16467b97STreehugger Robot raise TypeError, #{ message.to_s.inspect } 72*16467b97STreehugger Robot end 73*16467b97STreehugger Robot END 74*16467b97STreehugger Robot end 75*16467b97STreehugger Robot 76*16467b97STreehugger Robot def deprecate( name, extra_message = nil ) 77*16467b97STreehugger Robot hidden_name = "deprecated_#{ name }" 78*16467b97STreehugger Robot method_defined?( hidden_name ) and return 79*16467b97STreehugger Robot 80*16467b97STreehugger Robot alias_method( hidden_name, name ) 81*16467b97STreehugger Robot private( hidden_name ) 82*16467b97STreehugger Robot 83*16467b97STreehugger Robot message = "warning: method #{ self }##{ name } is deprecated" 84*16467b97STreehugger Robot extra_message and message << '; ' << extra_message.to_s 85*16467b97STreehugger Robot 86*16467b97STreehugger Robot class_eval( <<-END ) 87*16467b97STreehugger Robot def #{ name }( *args, &block ) 88*16467b97STreehugger Robot warn( #{ message.inspect } ) 89*16467b97STreehugger Robot #{ hidden_name }( *args, &block ) 90*16467b97STreehugger Robot end 91*16467b97STreehugger Robot END 92*16467b97STreehugger Robot end 93*16467b97STreehugger Robot 94*16467b97STreehugger Robot def alias_accessor( alias_name, attr_name ) 95*16467b97STreehugger Robot alias_method( alias_name, attr_name ) 96*16467b97STreehugger Robot alias_method( :"#{ alias_name }=", :"#{ attr_name }=" ) 97*16467b97STreehugger Robot end 98*16467b97STreehugger Robot 99*16467b97STreehugger Robotend 100*16467b97STreehugger Robot 101*16467b97STreehugger Robotend 102*16467b97STreehugger Robot 103*16467b97STreehugger Robotclass Integer 104*16467b97STreehugger Robot 105*16467b97STreehugger Robot # Returns the lower of self or x. 106*16467b97STreehugger Robot # 107*16467b97STreehugger Robot # 4.at_least(5) #=> 5 108*16467b97STreehugger Robot # 6.at_least(5) #=> 6 109*16467b97STreehugger Robot # 110*16467b97STreehugger Robot # CREDIT Florian Gross 111*16467b97STreehugger Robot 112*16467b97STreehugger Robot def at_least( x ) 113*16467b97STreehugger Robot ( self >= x ) ? self : x 114*16467b97STreehugger Robot end 115*16467b97STreehugger Robot 116*16467b97STreehugger Robot # Returns the greater of self or x. 117*16467b97STreehugger Robot # 118*16467b97STreehugger Robot # 4.at_most(5) #=> 4 119*16467b97STreehugger Robot # 6.at_most(5) #=> 5 120*16467b97STreehugger Robot # 121*16467b97STreehugger Robot # CREDIT Florian Gross 122*16467b97STreehugger Robot 123*16467b97STreehugger Robot def at_most( x ) 124*16467b97STreehugger Robot ( self <= x ) ? self : x 125*16467b97STreehugger Robot end 126*16467b97STreehugger Robot 127*16467b97STreehugger Robot # Returns self if above the given lower bound, or 128*16467b97STreehugger Robot # within the given lower and upper bounds, 129*16467b97STreehugger Robot # otherwise returns the the bound of which the 130*16467b97STreehugger Robot # value falls outside. 131*16467b97STreehugger Robot # 132*16467b97STreehugger Robot # 4.bound(3) #=> 4 133*16467b97STreehugger Robot # 4.bound(5) #=> 5 134*16467b97STreehugger Robot # 4.bound(2,7) #=> 4 135*16467b97STreehugger Robot # 9.bound(2,7) #=> 7 136*16467b97STreehugger Robot # 1.bound(2,7) #=> 2 137*16467b97STreehugger Robot # 138*16467b97STreehugger Robot # CREDIT Trans 139*16467b97STreehugger Robot 140*16467b97STreehugger Robot def bound( lower, upper=nil ) 141*16467b97STreehugger Robot return lower if self < lower 142*16467b97STreehugger Robot return self unless upper 143*16467b97STreehugger Robot return upper if self > upper 144*16467b97STreehugger Robot return self 145*16467b97STreehugger Robot end 146*16467b97STreehugger Robot 147*16467b97STreehugger Robotend 148*16467b97STreehugger Robot 149*16467b97STreehugger Robot 150*16467b97STreehugger Robotclass Range 151*16467b97STreehugger Robot def covers?( range ) 152*16467b97STreehugger Robot range.first >= first or return false 153*16467b97STreehugger Robot if exclude_end? 154*16467b97STreehugger Robot range.exclude_end? ? last >= range.last : last > range.last 155*16467b97STreehugger Robot else 156*16467b97STreehugger Robot range.exclude_end? ? last.succ >= range.last : last >= range.last 157*16467b97STreehugger Robot end 158*16467b97STreehugger Robot end 159*16467b97STreehugger Robot 160*16467b97STreehugger Robot def covered_by?( range ) 161*16467b97STreehugger Robot range.covers?( self ) 162*16467b97STreehugger Robot end 163*16467b97STreehugger Robot 164*16467b97STreehugger Robot def overlaps?( range ) 165*16467b97STreehugger Robot range.include?( first ) or include?( range.first ) 166*16467b97STreehugger Robot end 167*16467b97STreehugger Robot 168*16467b97STreehugger Robot def disjoint?( range ) 169*16467b97STreehugger Robot not overlaps?( range ) 170*16467b97STreehugger Robot end 171*16467b97STreehugger Robot 172*16467b97STreehugger Robotend 173