antlr3 1.8.0 → 1.8.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (111) hide show
  1. data/History.txt +35 -0
  2. data/Manifest.txt +73 -0
  3. data/README.txt +6 -13
  4. data/java/RubyTarget.java +43 -19
  5. data/java/antlr-full-3.2.1.jar +0 -0
  6. data/lib/antlr3/debug.rb +2 -0
  7. data/lib/antlr3/debug/event-hub.rb +55 -55
  8. data/lib/antlr3/debug/record-event-listener.rb +2 -2
  9. data/lib/antlr3/debug/rule-tracer.rb +14 -14
  10. data/lib/antlr3/debug/socket.rb +47 -47
  11. data/lib/antlr3/debug/trace-event-listener.rb +8 -8
  12. data/lib/antlr3/main.rb +29 -9
  13. data/lib/antlr3/modes/ast-builder.rb +7 -7
  14. data/lib/antlr3/modes/filter.rb +19 -17
  15. data/lib/antlr3/profile.rb +34 -6
  16. data/lib/antlr3/recognizers.rb +50 -1
  17. data/lib/antlr3/streams.rb +19 -15
  18. data/lib/antlr3/streams/rewrite.rb +241 -229
  19. data/lib/antlr3/template/group-file-lexer.rb +6 -8
  20. data/lib/antlr3/template/group-file-parser.rb +16 -16
  21. data/lib/antlr3/template/group-file.rb +1 -1
  22. data/lib/antlr3/test/call-stack.rb +13 -13
  23. data/lib/antlr3/test/core-extensions.rb +69 -69
  24. data/lib/antlr3/test/functional.rb +0 -4
  25. data/lib/antlr3/test/grammar.rb +70 -70
  26. data/lib/antlr3/token.rb +41 -17
  27. data/lib/antlr3/tree.rb +11 -14
  28. data/lib/antlr3/tree/debug.rb +53 -53
  29. data/lib/antlr3/tree/visitor.rb +11 -11
  30. data/lib/antlr3/tree/wizard.rb +35 -35
  31. data/lib/antlr3/util.rb +18 -0
  32. data/lib/antlr3/version.rb +1 -1
  33. data/rakefile +1 -0
  34. data/samples/ANTLRv3Grammar.g +3 -3
  35. data/samples/JavaScript.g +702 -0
  36. data/samples/standard/C/C.g +543 -0
  37. data/samples/standard/C/C.tokens +175 -0
  38. data/samples/standard/C/C__testrig.st +0 -0
  39. data/samples/standard/C/c.rb +12 -0
  40. data/samples/standard/C/input +3479 -0
  41. data/samples/standard/C/output +171 -0
  42. data/samples/standard/LL-star/LLStar.g +101 -0
  43. data/samples/standard/LL-star/input +12 -0
  44. data/samples/standard/LL-star/ll-star.rb +12 -0
  45. data/samples/standard/LL-star/output +2 -0
  46. data/samples/standard/calc/Calculator.g +47 -0
  47. data/samples/standard/calc/Calculator.py +16 -0
  48. data/samples/standard/calc/Calculator.rb +28 -0
  49. data/samples/standard/cminus/CMinus.g +141 -0
  50. data/samples/standard/cminus/bytecode.group +80 -0
  51. data/samples/standard/cminus/cminus.rb +16 -0
  52. data/samples/standard/cminus/input +9 -0
  53. data/samples/standard/cminus/java.group +91 -0
  54. data/samples/standard/cminus/output +11 -0
  55. data/samples/standard/cminus/python.group +48 -0
  56. data/samples/standard/dynamic-scope/DynamicScopes.g +50 -0
  57. data/samples/standard/dynamic-scope/dynamic-scopes.rb +12 -0
  58. data/samples/standard/dynamic-scope/input +7 -0
  59. data/samples/standard/dynamic-scope/output +4 -0
  60. data/samples/standard/fuzzy/FuzzyJava.g +89 -0
  61. data/samples/standard/fuzzy/fuzzy.py +11 -0
  62. data/samples/standard/fuzzy/fuzzy.rb +9 -0
  63. data/samples/standard/fuzzy/input +13 -0
  64. data/samples/standard/fuzzy/output +12 -0
  65. data/samples/standard/hoisted-predicates/HoistedPredicates.g +40 -0
  66. data/samples/standard/hoisted-predicates/hoisted-predicates.rb +13 -0
  67. data/samples/standard/hoisted-predicates/input +1 -0
  68. data/samples/standard/hoisted-predicates/output +1 -0
  69. data/samples/standard/island-grammar/Javadoc.g +46 -0
  70. data/samples/standard/island-grammar/Simple.g +104 -0
  71. data/samples/standard/island-grammar/input +11 -0
  72. data/samples/standard/island-grammar/island.rb +12 -0
  73. data/samples/standard/island-grammar/output +16 -0
  74. data/samples/standard/java/Java.g +827 -0
  75. data/samples/standard/java/input +80 -0
  76. data/samples/standard/java/java.rb +13 -0
  77. data/samples/standard/java/output +1 -0
  78. data/samples/standard/python/Python.g +718 -0
  79. data/samples/standard/python/PythonTokenSource.rb +107 -0
  80. data/samples/standard/python/input +210 -0
  81. data/samples/standard/python/output +24 -0
  82. data/samples/standard/python/python.rb +14 -0
  83. data/samples/standard/rakefile +18 -0
  84. data/samples/standard/scopes/SymbolTable.g +66 -0
  85. data/samples/standard/scopes/input +12 -0
  86. data/samples/standard/scopes/output +3 -0
  87. data/samples/standard/scopes/scopes.rb +12 -0
  88. data/samples/standard/simplecTreeParser/SimpleC.g +113 -0
  89. data/samples/standard/simplecTreeParser/SimpleCWalker.g +64 -0
  90. data/samples/standard/simplecTreeParser/input +12 -0
  91. data/samples/standard/simplecTreeParser/output +1 -0
  92. data/samples/standard/simplecTreeParser/simplec.rb +18 -0
  93. data/samples/standard/treeparser/Lang.g +24 -0
  94. data/samples/standard/treeparser/LangDumpDecl.g +17 -0
  95. data/samples/standard/treeparser/input +1 -0
  96. data/samples/standard/treeparser/output +2 -0
  97. data/samples/standard/treeparser/treeparser.rb +18 -0
  98. data/samples/standard/tweak/Tweak.g +68 -0
  99. data/samples/standard/tweak/input +9 -0
  100. data/samples/standard/tweak/output +16 -0
  101. data/samples/standard/tweak/tweak.rb +13 -0
  102. data/samples/standard/xml/README +16 -0
  103. data/samples/standard/xml/XML.g +123 -0
  104. data/samples/standard/xml/input +21 -0
  105. data/samples/standard/xml/output +39 -0
  106. data/samples/standard/xml/xml.rb +9 -0
  107. data/templates/Ruby.stg +4 -4
  108. data/test/functional/ast-output/auto-ast.rb +0 -5
  109. data/test/functional/ast-output/rewrites.rb +4 -4
  110. data/test/unit/test-scope.rb +45 -0
  111. metadata +96 -8
@@ -159,10 +159,6 @@ class Functional < ::Test::Unit::TestCase
159
159
  klass.test_path = call_stack[ 0 ].file
160
160
  end
161
161
 
162
- def self.example( *args, &b )
163
- super
164
- end
165
-
166
162
  def local_path( *args )
167
163
  self.class.local_path( *args )
168
164
  end
@@ -24,17 +24,17 @@ module DependantFile
24
24
  @dependencies ||= GLOBAL_DEPENDENCIES.clone
25
25
  end
26
26
 
27
- def depends_on(path)
27
+ def depends_on( path )
28
28
  path = File.expand_path path.to_s
29
- dependencies << path if test(?f, path)
29
+ dependencies << path if test( ?f, path )
30
30
  return path
31
31
  end
32
32
 
33
33
  def stale?
34
- force and return(true)
34
+ force and return( true )
35
35
  target_files.any? do |target|
36
- not test(?f, target) or
37
- dependencies.any? { |dep| test(?>, dep, target) }
36
+ not test( ?f, target ) or
37
+ dependencies.any? { |dep| test( ?>, dep, target ) }
38
38
  end
39
39
  end
40
40
  end # module DependantFile
@@ -43,35 +43,35 @@ class Grammar
43
43
  include DependantFile
44
44
 
45
45
  GRAMMAR_TYPES = %w(lexer parser tree combined)
46
- TYPE_TO_CLASS = {
46
+ TYPE_TO_CLASS = {
47
47
  'lexer' => 'Lexer',
48
48
  'parser' => 'Parser',
49
49
  'tree' => 'TreeParser'
50
50
  }
51
51
  CLASS_TO_TYPE = TYPE_TO_CLASS.invert
52
52
 
53
- def self.global_dependency(path)
53
+ def self.global_dependency( path )
54
54
  path = File.expand_path path.to_s
55
- GLOBAL_DEPENDENCIES << path if test(?f, path)
55
+ GLOBAL_DEPENDENCIES << path if test( ?f, path )
56
56
  return path
57
57
  end
58
58
 
59
- def self.inline(source, *args)
60
- InlineGrammar.new(source, *args)
59
+ def self.inline( source, *args )
60
+ InlineGrammar.new( source, *args )
61
61
  end
62
62
 
63
63
  ##################################################################
64
64
  ######## CONSTRUCTOR #############################################
65
65
  ##################################################################
66
- def initialize(path, options = {})
66
+ def initialize( path, options = {} )
67
67
  @path = path.to_s
68
68
  @source = File.read( @path )
69
- @output_directory = options.fetch(:output_directory, '.')
69
+ @output_directory = options.fetch( :output_directory, '.' )
70
70
  @verbose = options.fetch( :verbose, $VERBOSE )
71
71
  study
72
72
  build_dependencies
73
73
 
74
- yield(self) if block_given?
74
+ yield( self ) if block_given?
75
75
  end
76
76
 
77
77
  ##################################################################
@@ -87,9 +87,9 @@ class Grammar
87
87
  def lexer_file_name
88
88
  if lexer? then base = name
89
89
  elsif combined? then base = name + 'Lexer'
90
- else return(nil)
90
+ else return( nil )
91
91
  end
92
- return(base + '.rb')
92
+ return( base + '.rb' )
93
93
  end
94
94
 
95
95
  def parser_class_name
@@ -99,9 +99,9 @@ class Grammar
99
99
  def parser_file_name
100
100
  if parser? then base = name
101
101
  elsif combined? then base = name + 'Parser'
102
- else return(nil)
102
+ else return( nil )
103
103
  end
104
- return(base + '.rb')
104
+ return( base + '.rb' )
105
105
  end
106
106
 
107
107
  def tree_parser_class_name
@@ -138,11 +138,11 @@ class Grammar
138
138
  @type == "combined"
139
139
  end
140
140
 
141
- def target_files(include_imports = true)
141
+ def target_files( include_imports = true )
142
142
  targets = []
143
143
 
144
144
  for target_type in %w(lexer parser tree_parser)
145
- target_name = self.send(:"#{target_type}_file_name") and
145
+ target_name = self.send( :"#{ target_type }_file_name" ) and
146
146
  targets.push( output_directory / target_name )
147
147
  end
148
148
 
@@ -151,37 +151,37 @@ class Grammar
151
151
  end
152
152
 
153
153
  def imports
154
- @source.scan(/^\s*import\s+(\w+)\s*;/).
154
+ @source.scan( /^\s*import\s+(\w+)\s*;/ ).
155
155
  tap { |list| list.flatten! }
156
156
  end
157
157
 
158
158
  def imported_target_files
159
159
  imports.map! do |delegate|
160
- output_directory / "#{@name}_#{delegate}.rb"
160
+ output_directory / "#{ @name }_#{ delegate }.rb"
161
161
  end
162
162
  end
163
163
 
164
164
  ##################################################################
165
165
  ##### COMMAND METHODS ############################################
166
166
  ##################################################################
167
- def compile(options = {})
168
- if options[:force] or stale?
169
- compile!(options)
167
+ def compile( options = {} )
168
+ if options[ :force ] or stale?
169
+ compile!( options )
170
170
  end
171
171
  end
172
172
 
173
- def compile!(options = {})
174
- command = build_command(options)
173
+ def compile!( options = {} )
174
+ command = build_command( options )
175
175
 
176
176
  blab( command )
177
- output = IO.popen(command) do |pipe|
177
+ output = IO.popen( command ) do |pipe|
178
178
  pipe.read
179
179
  end
180
180
 
181
181
  case status = $?.exitstatus
182
182
  when 0, 130
183
- post_compile(options)
184
- else compilation_failure!(command, status, output)
183
+ post_compile( options )
184
+ else compilation_failure!( command, status, output )
185
185
  end
186
186
 
187
187
  return target_files
@@ -190,8 +190,8 @@ class Grammar
190
190
  def clean!
191
191
  deleted = []
192
192
  for target in target_files
193
- if test(?f, target)
194
- File.delete(target)
193
+ if test( ?f, target )
194
+ File.delete( target )
195
195
  deleted << target
196
196
  end
197
197
  end
@@ -204,7 +204,7 @@ class Grammar
204
204
 
205
205
  private
206
206
 
207
- def post_compile(options)
207
+ def post_compile( options )
208
208
  # do nothing for now
209
209
  end
210
210
 
@@ -216,50 +216,50 @@ private
216
216
  ENV[ 'ANTLR_JAR' ] || ANTLR3.antlr_jar
217
217
  end
218
218
 
219
- def compilation_failure!(command, status, output)
219
+ def compilation_failure!( command, status, output )
220
220
  for f in target_files
221
- test(?f, f) and File.delete(f)
221
+ test( ?f, f ) and File.delete( f )
222
222
  end
223
- raise CompilationFailure.new(self, command, status, output)
223
+ raise CompilationFailure.new( self, command, status, output )
224
224
  end
225
225
 
226
226
  def build_dependencies
227
- depends_on(@path)
227
+ depends_on( @path )
228
228
 
229
229
  if @source =~ /tokenVocab\s*=\s*(\S+)\s*;/
230
230
  foreign_grammar_name = $1
231
231
  token_file = output_directory / foreign_grammar_name + '.tokens'
232
232
  grammar_file = File.dirname( path ) / foreign_grammar_name << '.g'
233
- depends_on(token_file)
234
- depends_on(grammar_file)
233
+ depends_on( token_file )
234
+ depends_on( grammar_file )
235
235
  end
236
236
  end
237
237
 
238
- def shell_escape(token)
238
+ def shell_escape( token )
239
239
  token = token.to_s.dup
240
240
  token.empty? and return "''"
241
- token.gsub!(/([^A-Za-z0-9_\-.,:\/@\n])/n, '\\\1')
242
- token.gsub!(/\n/, "'\n'")
241
+ token.gsub!( /([^A-Za-z0-9_\-.,:\/@\n])/n, '\\\1' )
242
+ token.gsub!( /\n/, "'\n'" )
243
243
  return token
244
244
  end
245
245
 
246
- def build_command(options)
246
+ def build_command( options )
247
247
  parts = %w(java)
248
248
  jar_path = options.fetch( :antlr_jar, default_antlr_jar )
249
- parts.push('-cp', jar_path)
249
+ parts.push( '-cp', jar_path )
250
250
  parts << 'org.antlr.Tool'
251
- parts.push('-fo', output_directory)
252
- options[:profile] and parts << '-profile'
253
- options[:debug] and parts << '-debug'
254
- options[:trace] and parts << '-trace'
255
- options[:debug_st] and parts << '-XdbgST'
256
- parts << File.expand_path(@path)
257
- parts.map! { |part| shell_escape(part) }.join(' ') << ' 2>&1'
251
+ parts.push( '-fo', output_directory )
252
+ options[ :profile ] and parts << '-profile'
253
+ options[ :debug ] and parts << '-debug'
254
+ options[ :trace ] and parts << '-trace'
255
+ options[ :debug_st ] and parts << '-XdbgST'
256
+ parts << File.expand_path( @path )
257
+ parts.map! { |part| shell_escape( part ) }.join( ' ' ) << ' 2>&1'
258
258
  end
259
259
 
260
260
  def study
261
261
  @source =~ /^\s*(lexer|parser|tree)?\s*grammar\s*(\S+)\s*;/ or
262
- raise Grammar::FormatError[source, path]
262
+ raise Grammar::FormatError[ source, path ]
263
263
  @name = $2
264
264
  @type = $1 || 'combined'
265
265
  end
@@ -271,9 +271,9 @@ class Grammar::InlineGrammar < Grammar
271
271
  def initialize( source, options = {} )
272
272
  host = call_stack.find { |call| call.file != __FILE__ }
273
273
 
274
- @host_file = File.expand_path(options[:file] || host.file)
275
- @host_line = (options[:line] || host.line)
276
- @output_directory = options.fetch(:output_directory, File.dirname(@host_file))
274
+ @host_file = File.expand_path( options[ :file ] || host.file )
275
+ @host_line = ( options[ :line ] || host.line )
276
+ @output_directory = options.fetch( :output_directory, File.dirname( @host_file ) )
277
277
  @verbose = options.fetch( :verbose, $VERBOSE )
278
278
 
279
279
  @source = source.to_s.fixed_indent( 0 )
@@ -291,7 +291,7 @@ class Grammar::InlineGrammar < Grammar
291
291
  File.basename( @host_file )
292
292
  end
293
293
 
294
- def path=(v)
294
+ def path=( v )
295
295
  previous, @path = @path, v.to_s
296
296
  previous == @path or write_to_disk
297
297
  end
@@ -304,9 +304,9 @@ private
304
304
 
305
305
  def write_to_disk
306
306
  @path ||= output_directory / @name + '.g'
307
- test(?d, output_directory) or Dir.mkdir( output_directory )
308
- unless test(?f, @path) and MD5.digest(@source) == MD5.digest(File.read(@path))
309
- open(@path, 'w') { |f| f.write(@source) }
307
+ test( ?d, output_directory ) or Dir.mkdir( output_directory )
308
+ unless test( ?f, @path ) and MD5.digest( @source ) == MD5.digest( File.read( @path ) )
309
+ open( @path, 'w' ) { |f| f.write( @source ) }
310
310
  end
311
311
  end
312
312
  end # class Grammar::InlineGrammar
@@ -315,12 +315,12 @@ class Grammar::CompilationFailure < StandardError
315
315
  JAVA_TRACE = /^(org\.)?antlr\.\S+\(\S+\.java:\d+\)\s*/
316
316
  attr_reader :grammar, :command, :status, :output
317
317
 
318
- def initialize(grammar, command, status, output)
318
+ def initialize( grammar, command, status, output )
319
319
  @command = command
320
320
  @status = status
321
321
  @output = output.gsub( JAVA_TRACE, '' )
322
322
 
323
- message = <<-END.here_indent! % [command, status, grammar, @output]
323
+ message = <<-END.here_indent! % [ command, status, grammar, @output ]
324
324
  | command ``%s'' failed with status %s
325
325
  | %p
326
326
  | ~ ~ ~ command output ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
@@ -334,32 +334,32 @@ end # error Grammar::CompilationFailure
334
334
  class Grammar::FormatError < StandardError
335
335
  attr_reader :file, :source
336
336
 
337
- def self.[](*args)
338
- new(*args)
337
+ def self.[]( *args )
338
+ new( *args )
339
339
  end
340
340
 
341
- def initialize(source, file = nil)
341
+ def initialize( source, file = nil )
342
342
  @file = file
343
343
  @source = source
344
344
  message = ''
345
345
  if file.nil? # inline
346
346
  message << "bad inline grammar source:\n"
347
- message << ("-" * 80) << "\n"
347
+ message << ( "-" * 80 ) << "\n"
348
348
  message << @source
349
- message[-1] == ?\n or message << "\n"
350
- message << ("-" * 80) << "\n"
349
+ message[ -1 ] == ?\n or message << "\n"
350
+ message << ( "-" * 80 ) << "\n"
351
351
  message << "could not locate a grammar name and type declaration matching\n"
352
352
  message << "/^\s*(lexer|parser|tree)?\s*grammar\s*(\S+)\s*;/"
353
353
  else
354
354
  message << 'bad grammar source in file %p' % @file
355
- message << ("-" * 80) << "\n"
355
+ message << ( "-" * 80 ) << "\n"
356
356
  message << @source
357
- message[-1] == ?\n or message << "\n"
358
- message << ("-" * 80) << "\n"
357
+ message[ -1 ] == ?\n or message << "\n"
358
+ message << ( "-" * 80 ) << "\n"
359
359
  message << "could not locate a grammar name and type declaration matching\n"
360
360
  message << "/^\s*(lexer|parser|tree)?\s*grammar\s*(\S+)\s*;/"
361
361
  end
362
- super(message)
362
+ super( message )
363
363
  end
364
364
  end # error Grammar::FormatError
365
365
 
@@ -101,16 +101,32 @@ module Token
101
101
  alias :token_index :index
102
102
  alias :token_index= :index=
103
103
 
104
+ #
105
+ # The match operator has been implemented to match against several different
106
+ # attributes of a token for convenience in quick scripts
107
+ #
108
+ # @example Match against an integer token type constant
109
+ # token =~ VARIABLE_NAME => true/false
110
+ # @example Match against a token type name as a Symbol
111
+ # token =~ :FLOAT => true/false
112
+ # @example Match the token text against a Regular Expression
113
+ # token =~ /^@[a-z_]\w*$/i
114
+ # @example Compare the token's text to a string
115
+ # token =~ "class"
116
+ #
104
117
  def =~ obj
105
118
  case obj
106
119
  when Integer then type == obj
107
- when Symbol then name.to_sym == obj
120
+ when Symbol then name == obj.to_s
108
121
  when Regexp then obj =~ text
109
122
  when String then text == obj
110
123
  else super
111
124
  end
112
125
  end
113
126
 
127
+ #
128
+ # Tokens are comparable by their stream index values
129
+ #
114
130
  def <=> tk2
115
131
  index <=> tk2.index
116
132
  end
@@ -139,6 +155,10 @@ module Token
139
155
  token_name( type )
140
156
  end
141
157
 
158
+ def source_name
159
+ i = input and i.source_name
160
+ end
161
+
142
162
  def hidden?
143
163
  channel == HIDDEN_CHANNEL
144
164
  end
@@ -147,28 +167,19 @@ module Token
147
167
  concrete? ? input.substring( start, stop ) : text
148
168
  end
149
169
 
170
+ #
171
+ # Sets the token's channel value to HIDDEN_CHANNEL
172
+ #
150
173
  def hide!
151
174
  self.channel = HIDDEN_CHANNEL
152
175
  end
153
176
 
154
- def range
155
- start..stop rescue nil
156
- end
157
-
158
- def to_i
159
- index.to_i
160
- end
161
-
162
- def to_s
163
- text.to_s
164
- end
165
-
166
177
  def inspect
167
- text_inspect = text ? '[%p] ' % text : ' '
168
- text_position = line != 0 ? '@ line %s col %s ' % [ line, column ] : ''
169
- stream_position = start ? '(%s..%s)' % [ start, stop ] : ''
178
+ text_inspect = text ? "[#{ text.inspect }] " : ' '
179
+ text_position = line > 0 ? "@ line #{ line } col #{ column } " : ''
180
+ stream_position = start ? "(#{ range.inspect })" : ''
170
181
 
171
- front = index != -1 ? index.to_s << ' ' : ''
182
+ front = index >= 0 ? "#{ index } " : ''
172
183
  rep = front << name << text_inspect <<
173
184
  text_position << stream_position
174
185
  rep.strip!
@@ -180,6 +191,18 @@ module Token
180
191
  printer.text( inspect )
181
192
  end
182
193
 
194
+ def range
195
+ start..stop rescue nil
196
+ end
197
+
198
+ def to_i
199
+ index.to_i
200
+ end
201
+
202
+ def to_s
203
+ text.to_s
204
+ end
205
+
183
206
  private
184
207
 
185
208
  def token_name( type )
@@ -526,6 +549,7 @@ class TokenScheme < ::Module
526
549
  mod.extend( self )
527
550
  end
528
551
  private :included
552
+
529
553
  attr_reader :unused, :types
530
554
 
531
555
  def define_tokens( token_map = {} )
@@ -355,8 +355,6 @@ class BaseTree < ::Array
355
355
  alias add_children concat
356
356
  alias each_child each
357
357
 
358
-
359
-
360
358
  def set_child( index, tree )
361
359
  return if tree.nil?
362
360
  tree.flat_list? and raise ArgumentError, "Can't set single child to a list"
@@ -443,9 +441,6 @@ class BaseTree < ::Array
443
441
 
444
442
  def root?() @parent.nil? end
445
443
  alias leaf? empty?
446
-
447
-
448
-
449
444
  end
450
445
 
451
446
 
@@ -828,6 +823,7 @@ builds and manipulates CommonTree nodes.
828
823
  =end
829
824
 
830
825
  class CommonTreeAdaptor
826
+ extend ClassMacros
831
827
  include TreeAdaptor
832
828
  include ANTLR3::Constants
833
829
 
@@ -892,16 +888,17 @@ class CommonTreeAdaptor
892
888
  end
893
889
  end
894
890
 
895
- # TODO: deprecate create...! methods -- they don't make sense
891
+ creation_methods = %w(
892
+ create_from_token create_from_type
893
+ create_error_node create_with_payload
894
+ create
895
+ )
896
896
 
897
- # aliases in preparation for deprecation to avoid breaking
898
- # backward compatibility
899
-
900
- alias create_from_token! create_from_token
901
- alias create_from_type! create_from_type
902
- alias create_error_node! create_error_node
903
- alias create_with_payload! create_with_payload
904
- alias create! create
897
+ for method_name in creation_methods
898
+ bang_method = method_name + '!'
899
+ alias_method( bang_method, method_name )
900
+ deprecate( bang_method, "use method ##{ method_name } instead" )
901
+ end
905
902
 
906
903
  def rule_post_processing( root )
907
904
  if root and root.flat_list?