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
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
|