74 lines
1.6 KiB
Ruby
74 lines
1.6 KiB
Ruby
|
#!/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
|