You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

74 lines
1.6 KiB

#!/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!', '<t__6!', '>ws!', '<ws!', '>int!', '<int!', '>ws!', '<ws!',
'>t__8!', '<t__8!', '>ws!', '<ws!', '>int!', '<int!', '>ws!', '<ws!',
'>t__8!', '<t__8!', '>ws!', '<ws!', '>int!', '<int!', '>ws!', '<ws!',
'>t__7!', '<t__7!'
]
parser.traces.should == [
'>a', '>synpred1_Traced', '<synpred1_Traced',
'>b', '>c', '<c', '>c', '<c', '>c', '<c', '<b', '<a'
]
end
end