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