spec/rley/parser/parsing_spec.rb in rley-0.2.03 vs spec/rley/parser/parsing_spec.rb in rley-0.2.04

- old
+ new

@@ -1,13 +1,15 @@ require_relative '../../spec_helper' +require 'stringio' require_relative '../../../lib/rley/syntax/non_terminal' require_relative '../../../lib/rley/syntax/verbatim_symbol' require_relative '../../../lib/rley/syntax/production' require_relative '../../../lib/rley/syntax/grammar_builder' require_relative '../../../lib/rley/parser/dotted_item' require_relative '../../../lib/rley/parser/token' +require_relative '../../../lib/rley/parser/parse_tracer' require_relative '../../../lib/rley/parser/earley_parser' require_relative '../support/grammar_abc_helper' require_relative '../support/grammar_b_expr_helper' @@ -46,56 +48,70 @@ ] end let(:start_dotted_rule) { DottedItem.new(prod_S, 0) } + let(:output) { StringIO.new('', 'w') } + let(:sample_tracer) { ParseTracer.new(0, output, grm1_tokens) } # Default instantiation rule - subject { Parsing.new(start_dotted_rule, grm1_tokens) } + subject { Parsing.new(start_dotted_rule, grm1_tokens, sample_tracer) } context 'Initialization:' do - it 'should be created with list of tokens and start dotted rule' do + it 'should be created with list of tokens, start dotted rule, trace' do start_rule = start_dotted_rule tokens = grm1_tokens - expect { Parsing.new(start_rule, tokens) }.not_to raise_error + tracer = sample_tracer + expect { Parsing.new(start_rule, tokens, tracer) }.not_to raise_error end it 'should know the input tokens' do expect(subject.tokens).to eq(grm1_tokens) end it 'should know its chart object' do expect(subject.chart).to be_kind_of(Chart) end + + it 'should emit trace level 1 info' do + tracer = ParseTracer.new(1, output, grm1_tokens) + instance = Parsing.new(start_dotted_rule, grm1_tokens, tracer) + expectations = <<-SNIPPET +['a', 'a', 'b', 'c', 'c'] +|. a . a . b . c . c .| +|> . . . . .| [0:0] S => . A +SNIPPET + expect(output.string).to eq(expectations) + end end # context context 'Parsing:' do it 'should push a state to a given chart entry' do expect(subject.chart[1]).to be_empty item = DottedItem.new(prod_A1, 1) - subject.push_state(item, 1, 1) + subject.push_state(item, 1, 1, :scanning) expect(subject.chart[1]).not_to be_empty expect(subject.chart[1].first.dotted_rule).to eq(item) # Pushing twice the same state must be no-op - subject.push_state(item, 1, 1) + subject.push_state(item, 1, 1, :scanning) expect(subject.chart[1].size).to eq(1) end it 'should complain when trying to push a nil dotted item' do err = StandardError msg = 'Dotted item may not be nil' - expect { subject.push_state(nil, 1, 1) }.to raise_error(err, msg) + expect{ subject.push_state(nil, 1, 1, :prediction) }.to raise_error(err, msg) end it 'should retrieve the parse states that expect a given terminal' do item1 = DottedItem.new(prod_A1, 2) item2 = DottedItem.new(prod_A1, 1) - subject.push_state(item1, 2, 2) - subject.push_state(item2, 2, 2) + subject.push_state(item1, 2, 2, :scanning) + subject.push_state(item2, 2, 2, :scanning) states = subject.states_expecting(c_, 2, false) expect(states.size).to eq(1) expect(states[0].dotted_rule).to eq(item1) end @@ -104,22 +120,22 @@ # then new parse states must be pushed to the following chart slot expect(subject.chart[1]).to be_empty item1 = DottedItem.new(prod_A1, 0) item2 = DottedItem.new(prod_A2, 0) - subject.push_state(item1, 0, 0) - subject.push_state(item2, 0, 0) + subject.push_state(item1, 0, 0, :completion) + subject.push_state(item2, 0, 0, :completion) subject.scanning(a_, 0) { |i| i } # Code block is mock # Expected side effect: a new state at chart[1] expect(subject.chart[1].size).to eq(1) new_state = subject.chart[1].states[0] expect(new_state.dotted_rule).to eq(item1) expect(new_state.origin).to eq(0) end end # context - +=begin context 'Parse tree building:' do let(:sample_grammar1) do builder = grammar_abc_builder builder.grammar end @@ -383,9 +399,10 @@ SNIPPET actual = ptree.root.to_string(0) expect(actual).to eq(expected_text.chomp) end end # context +=end end # describe end # module end # module # End of file