#!/usr/bin/ruby # encoding: utf-8 require 'antlr3/test/functional' class TestRuleTracing < ANTLR3::Test::Functional inline_grammar( <<-'END' ) grammar Traced; options { language = Ruby; } @parser::init { @stack = nil @traces = [] } @parser::members { attr_accessor :stack, :traces def trace_in(rule_name, rule_index) @traces << ">#{rule_name}" end def trace_out(rule_name, rule_index) @traces << "<#{rule_name}" end } @lexer::init { @stack = nil @traces = [] } @lexer::members { attr_accessor :stack, :traces def trace_in(rule_name, rule_index) @traces << ">#{rule_name}" end def trace_out(rule_name, rule_index) @traces << "<#{rule_name}" end } a: '<' ((INT '+')=>b|c) '>'; b: c ('+' c)*; c: INT ; INT: ('0'..'9')+; WS: (' ' | '\n' | '\t')+ {$channel = HIDDEN;}; END compile_options :trace => true example "setting up rule tracing" do lexer = Traced::Lexer.new( '< 1 + 2 + 3 >' ) parser = Traced::Parser.new lexer parser.a lexer.traces.should == [ '>t__6!', 'ws!', 'int!', 'ws!', 't__8!', 'ws!', 'int!', 'ws!', 't__8!', 'ws!', 'int!', 'ws!', 't__7!', 'a', '>synpred1_Traced', 'b', '>c', 'c', 'c', '