spec/antelope/constructor_spec.rb in antelope-0.2.0 vs spec/antelope/constructor_spec.rb in antelope-0.2.2
- old
+ new
@@ -1,136 +1,133 @@
-describe Generation::Constructor do
- let(:grammar) { double("grammar") }
- let(:terminal) { token(:TERMINAL) }
- let(:epsilon) { token(:epsilon) }
-
- subject { described_class.new(grammar) }
-
- context "#nullable?" do
- context "when given an epsilon token" do
- it "returns true" do
- expect(subject.nullable?(epsilon)).to be true
- end
- end
-
- context "when given a terminal" do
- it "returns false" do
- expect(subject.nullable?(terminal)).to be false
- end
- end
-
- context "when given an array" do
- context "with one of the elements not nullable" do
- it "returns false" do
- expect(subject.nullable?([terminal, epsilon])).to be false
- end
- end
-
- context "with all of the elements nullable" do
- it "returns true" do
- expect(subject.nullable?([epsilon, epsilon])).to be true
- end
- end
- end
-
- context "when given a nonterminal" do
- let(:grammar) { with_recognizer }
-
- context "with no nullable productions" do
- let(:nonterminal) { Ace::Token::Nonterminal.new(:l) }
-
- it "returns false" do
- expect(subject.nullable?(nonterminal)).to be false
- end
- end
-
- context "with a nullable production" do
- let(:nonterminal) { Ace::Token::Nonterminal.new(:e) }
-
- it "returns true" do
- expect(subject.nullable?(nonterminal)).to be true
- end
- end
- end
-
- context "when given a bad argument" do
- it "raises an error" do
- expect { subject.nullable?(nil) }.to raise_error(ArgumentError)
- end
- end
- end
-
- context "#first" do
- context "when given an epsilon token" do
- it "generates an empty set" do
- expect(subject.first(epsilon)).to eq Set.new
- end
- end
-
- context "when given a terminal" do
- it "generates a set" do
- expect(subject.first(terminal)).to eq [terminal].to_set
- end
- end
-
- context "when given an array" do
- let(:terminal2) { token(:terminal, :TERMINAL2) }
-
- it "generates a set" do
- expect(subject.first([epsilon, terminal])).
- to eq [terminal].to_set
- expect(subject.first([terminal, terminal2])).
- to eq [terminal].to_set
- end
- end
-
- context "when given a nonterminal" do
- let(:grammar) { with_recognizer }
- let(:nonterminal) { token(:nonterminal, :e) }
-
- before do
- p grammar.terminals
- end
- it "generates a set" do
- expect(subject.first(nonterminal)).
- to eq [token(:terminal, :IDENT), token(:terminal, :STAR, "*")].to_set
- end
- end
-
- context "when given a bad argument" do
- it "raises an error" do
- expect { subject.first(nil) }.to raise_error(ArgumentError)
- end
- end
- end
-
- context "#follow" do
- context "when given a bad argument" do
- it "raises an error" do
- expect { subject.follow(nil) }.to raise_error(ArgumentError)
- end
- end
-
- context "when given a nonterminal" do
- let(:grammar) { with_recognizer }
- let(:nonterminal) { token(:nonterminal, :l) }
-
- before do
- subject.productions.merge grammar.productions.values.flatten
- end
-
- it "generates a set" do
- expect(subject.follow(nonterminal)).to eq [
- token(:terminal, :EQUALS, "="),
- token(:terminal, :"$end")
- ].to_set
- end
- end
- end
-
-
-
- def token(type, name = nil, value = nil, ttype = nil, id = nil)
- type = Ace::Token.const_get(type.to_s.capitalize)
- type.new(name, ttype, id, value)
- end
-end
+describe Generation::Constructor do
+ let(:grammar) { double("grammar") }
+ let(:terminal) { token(:TERMINAL) }
+ let(:epsilon) { token(:epsilon) }
+
+ subject { described_class.new(grammar) }
+
+ context "#nullable?" do
+ context "when given an epsilon token" do
+ it "returns true" do
+ expect(subject.nullable?(epsilon)).to be true
+ end
+ end
+
+ context "when given a terminal" do
+ it "returns false" do
+ expect(subject.nullable?(terminal)).to be false
+ end
+ end
+
+ context "when given an array" do
+ context "with one of the elements not nullable" do
+ it "returns false" do
+ expect(subject.nullable?([terminal, epsilon])).to be false
+ end
+ end
+
+ context "with all of the elements nullable" do
+ it "returns true" do
+ expect(subject.nullable?([epsilon, epsilon])).to be true
+ end
+ end
+ end
+
+ context "when given a nonterminal" do
+ let(:grammar) { with_recognizer }
+
+ context "with no nullable productions" do
+ let(:nonterminal) { Ace::Token::Nonterminal.new(:l) }
+
+ it "returns false" do
+ expect(subject.nullable?(nonterminal)).to be false
+ end
+ end
+
+ context "with a nullable production" do
+ let(:nonterminal) { Ace::Token::Nonterminal.new(:e) }
+
+ it "returns true" do
+ expect(subject.nullable?(nonterminal)).to be true
+ end
+ end
+ end
+
+ context "when given a bad argument" do
+ it "raises an error" do
+ expect { subject.nullable?(nil) }.to raise_error(ArgumentError)
+ end
+ end
+ end
+
+ context "#first" do
+ context "when given an epsilon token" do
+ it "generates an empty set" do
+ expect(subject.first(epsilon)).to eq Set.new
+ end
+ end
+
+ context "when given a terminal" do
+ it "generates a set" do
+ expect(subject.first(terminal)).to eq [terminal].to_set
+ end
+ end
+
+ context "when given an array" do
+ let(:terminal2) { token(:terminal, :TERMINAL2) }
+
+ it "generates a set" do
+ expect(subject.first([epsilon, terminal])).
+ to eq [terminal].to_set
+ expect(subject.first([terminal, terminal2])).
+ to eq [terminal].to_set
+ end
+ end
+
+ context "when given a nonterminal" do
+ let(:grammar) { with_recognizer }
+ let(:nonterminal) { token(:nonterminal, :e) }
+
+ it "generates a set" do
+ expect(subject.first(nonterminal)).
+ to eq [token(:terminal, :IDENT), token(:terminal, :STAR, "*")].to_set
+ end
+ end
+
+ context "when given a bad argument" do
+ it "raises an error" do
+ expect { subject.first(nil) }.to raise_error(ArgumentError)
+ end
+ end
+ end
+
+ context "#follow" do
+ context "when given a bad argument" do
+ it "raises an error" do
+ expect { subject.follow(nil) }.to raise_error(ArgumentError)
+ end
+ end
+
+ context "when given a nonterminal" do
+ let(:grammar) { with_recognizer }
+ let(:nonterminal) { token(:nonterminal, :l) }
+
+ before do
+ subject.productions.merge grammar.productions.values.flatten
+ end
+
+ it "generates a set" do
+ expect(subject.follow(nonterminal)).to eq [
+ token(:terminal, :EQUALS, "="),
+ token(:terminal, :"$end")
+ ].to_set
+ end
+ end
+ end
+
+
+
+ def token(type, name = nil, value = nil, ttype = nil, id = nil)
+ type = Ace::Token.const_get(type.to_s.capitalize)
+ type.new(name, ttype, id, value)
+ end
+end