56 lines
1.2 KiB
Ruby
56 lines
1.2 KiB
Ruby
#!/usr/bin/ruby
|
|
# encoding: utf-8
|
|
|
|
module ANTLR3
|
|
module Debug
|
|
=begin rdoc ANTLR3::Debug::RuleTracer
|
|
|
|
RuleTracer is simple debug event listener that writes the names of rule methods
|
|
as they are entered and exitted to an output stream.
|
|
|
|
=end
|
|
class RuleTracer
|
|
include EventListener
|
|
|
|
ARROW_IN = '--> '.freeze
|
|
ARROW_OUT = '<-- '.freeze
|
|
|
|
attr_reader :level
|
|
attr_accessor :spaces_per_indent, :device
|
|
|
|
def initialize( options = {} )
|
|
@input = options[ :input ]
|
|
@level = 0
|
|
@spaces_per_indent = options[ :spaces_per_indent ] || 2
|
|
@device = options[ :device ] || options[ :output ] || $stderr
|
|
end
|
|
|
|
def enter_rule( grammar_file, name )
|
|
indent = @level * @spaces_per_indent
|
|
|
|
@device.print( ' ' * indent, ARROW_IN, name )
|
|
if @input
|
|
input_symbol = @input.look || :EOF
|
|
@device.puts( " look = %p" % input_symbol )
|
|
else @device.print( "\n" )
|
|
end
|
|
|
|
@level += 1
|
|
end
|
|
|
|
def exit_rule( grammar_file, name )
|
|
@level -= 1
|
|
|
|
indent = @level * @spaces_per_indent
|
|
|
|
@device.print( ' ' * indent, ARROW_OUT, name )
|
|
if @input
|
|
input_symbol = ( @input.look || :EOF )
|
|
@device.puts( " look = %p" % input_symbol )
|
|
else @device.print( "\n" )
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|