Log conflicting rules on reduce/reduce conflict - close #31
This commit is contained in:
parent
c24f323ff0
commit
36c74e439e
@ -14,6 +14,7 @@ class Propane
|
|||||||
@item_sets = []
|
@item_sets = []
|
||||||
@item_sets_set = {}
|
@item_sets_set = {}
|
||||||
@warnings = Set.new
|
@warnings = Set.new
|
||||||
|
@errors = Set.new
|
||||||
@options = options
|
@options = options
|
||||||
start_item = Item.new(grammar.rules.first, 0)
|
start_item = Item.new(grammar.rules.first, 0)
|
||||||
eval_item_sets = Set[ItemSet.new([start_item])]
|
eval_item_sets = Set[ItemSet.new([start_item])]
|
||||||
@ -41,8 +42,18 @@ class Propane
|
|||||||
build_reduce_actions!
|
build_reduce_actions!
|
||||||
build_tables!
|
build_tables!
|
||||||
write_log!
|
write_log!
|
||||||
|
errormessage = ""
|
||||||
|
if @errors.size > 0
|
||||||
|
errormessage += @errors.join("\n")
|
||||||
|
end
|
||||||
if @warnings.size > 0 && @options[:warnings_as_errors]
|
if @warnings.size > 0 && @options[:warnings_as_errors]
|
||||||
raise Error.new("Fatal errors (-w):\n" + @warnings.join("\n"))
|
if errormessage != ""
|
||||||
|
errormessage += "\n"
|
||||||
|
end
|
||||||
|
errormessage += "Fatal errors (-w):\n" + @warnings.join("\n")
|
||||||
|
end
|
||||||
|
if errormessage != ""
|
||||||
|
raise Error.new(errormessage)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -171,7 +182,7 @@ class Propane
|
|||||||
lookahead_tokens_for_rule = build_lookahead_tokens_to_reduce(reduce_rule, item_sets)
|
lookahead_tokens_for_rule = build_lookahead_tokens_to_reduce(reduce_rule, item_sets)
|
||||||
lookahead_tokens_for_rule.each do |lookahead_token|
|
lookahead_tokens_for_rule.each do |lookahead_token|
|
||||||
if existing_reduce_rule = reduce_actions[lookahead_token]
|
if existing_reduce_rule = reduce_actions[lookahead_token]
|
||||||
raise Error.new("Error: reduce/reduce conflict (state #{item_set.id}) between rule #{existing_reduce_rule.name}##{existing_reduce_rule.id} (defined on line #{existing_reduce_rule.line_number}) and rule #{reduce_rule.name}##{reduce_rule.id} (defined on line #{reduce_rule.line_number})")
|
@errors << "Error: reduce/reduce conflict (state #{item_set.id}) between rule #{existing_reduce_rule.name}##{existing_reduce_rule.id} (defined on line #{existing_reduce_rule.line_number}) and rule #{reduce_rule.name}##{reduce_rule.id} (defined on line #{reduce_rule.line_number}) for lookahead token #{lookahead_token}"
|
||||||
end
|
end
|
||||||
reduce_actions[lookahead_token] = reduce_rule
|
reduce_actions[lookahead_token] = reduce_rule
|
||||||
end
|
end
|
||||||
|
|||||||
@ -689,6 +689,7 @@ EOF
|
|||||||
results = run_propane(capture: true, language: language)
|
results = run_propane(capture: true, language: language)
|
||||||
expect(results.status).to_not eq 0
|
expect(results.status).to_not eq 0
|
||||||
expect(results.stderr).to match %r{Error: reduce/reduce conflict \(state \d+\) between rule E#\d+ \(defined on line 10\) and rule F#\d+ \(defined on line 11\)}
|
expect(results.stderr).to match %r{Error: reduce/reduce conflict \(state \d+\) between rule E#\d+ \(defined on line 10\) and rule F#\d+ \(defined on line 11\)}
|
||||||
|
expect(File.binread("spec/run/testparser.log")).to match %r{Reduce.actions:}
|
||||||
end
|
end
|
||||||
|
|
||||||
it "provides matched text to user code blocks" do
|
it "provides matched text to user code blocks" do
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user