diff options
Diffstat (limited to 'runtime/Ruby/lib/antlr3/debug/rule-tracer.rb')
-rw-r--r-- | runtime/Ruby/lib/antlr3/debug/rule-tracer.rb | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/runtime/Ruby/lib/antlr3/debug/rule-tracer.rb b/runtime/Ruby/lib/antlr3/debug/rule-tracer.rb new file mode 100644 index 0000000..f1e2b5f --- /dev/null +++ b/runtime/Ruby/lib/antlr3/debug/rule-tracer.rb @@ -0,0 +1,55 @@ +#!/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 |