From de93d23585e4905990fdd8b7a1d3262b2dd2a6d1 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Thu, 13 Oct 2022 05:17:06 -0400 Subject: [PATCH] Add test for non-LALR grammar failing to generate parser --- spec/propane_spec.rb | 34 ++++++++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/spec/propane_spec.rb b/spec/propane_spec.rb index dc55ed9..bf8e816 100644 --- a/spec/propane_spec.rb +++ b/spec/propane_spec.rb @@ -1,14 +1,22 @@ require "fileutils" require "open3" +Results = Struct.new(:stdout, :stderr, :status) + describe Propane do def write_grammar(grammar) File.write("spec/run/testparser.propane", grammar) end - def build_parser - result = system(*%w[./propane.sh spec/run/testparser.propane spec/run/testparser.d --log spec/run/testparser.log]) - expect(result).to be_truthy + def build_parser(options = {}) + command = %w[./propane.sh spec/run/testparser.propane spec/run/testparser.d --log spec/run/testparser.log] + if (options[:capture]) + stdout, stderr, status = Open3.capture3(*command) + Results.new(stdout, stderr, status) + else + result = system(*command) + expect(result).to be_truthy + end end def compile(test_file) @@ -16,7 +24,6 @@ describe Propane do expect(result).to be_truthy end - Results = Struct.new(:stdout, :stderr, :status) def run stdout, stderr, status = Open3.capture3("spec/run/testparser") File.binwrite("spec/run/.stderr", stderr) @@ -273,4 +280,23 @@ EOF expect(results.status).to eq 0 expect(results.stderr).to eq "" end + + it "fails to generate a parser for a LR(1) grammar that is not LALR" do + write_grammar < a E c; +Start -> a F d; +Start -> b F c; +Start -> b E d; +E -> e; +F -> e; +EOF + results = build_parser(capture: true) + expect(results.status).to_not eq 0 + expect(results.stderr).to match %r{reduce/reduce conflict.*\(E\).*\(F\)} + end end