1#!/usr/bin/ruby
2# encoding: utf-8
3
4module ANTLR3
5module Debug
6=begin rdoc ANTLR3::Debug::RuleTracer
7
8RuleTracer is simple debug event listener that writes the names of rule methods
9as they are entered and exitted to an output stream.
10
11=end
12class RuleTracer
13  include EventListener
14  
15  ARROW_IN = '--> '.freeze
16  ARROW_OUT = '<-- '.freeze
17  
18  attr_reader :level
19  attr_accessor :spaces_per_indent, :device
20  
21  def initialize( options = {} )
22    @input = options[ :input ]
23    @level = 0
24    @spaces_per_indent = options[ :spaces_per_indent ] || 2
25    @device = options[ :device ] || options[ :output ] || $stderr
26  end
27  
28  def enter_rule( grammar_file, name )
29    indent = @level * @spaces_per_indent
30    
31    @device.print( ' ' * indent, ARROW_IN, name )
32    if @input
33      input_symbol = @input.look || :EOF
34      @device.puts( " look = %p" % input_symbol )
35    else @device.print( "\n" )
36    end
37    
38    @level += 1
39  end
40  
41  def exit_rule( grammar_file, name )
42    @level -= 1
43    
44    indent = @level * @spaces_per_indent
45    
46    @device.print( ' ' * indent, ARROW_OUT, name )
47    if @input
48      input_symbol = ( @input.look || :EOF )
49      @device.puts( " look = %p" % input_symbol )
50    else @device.print( "\n" )
51    end
52  end
53end
54end
55end
56