Store all characters as ranges; add CharacterClassUnit#to_nfa

This commit is contained in:
josh committed 2021-05-14 13:52:03 -04:00
1 parent 2e8e72a1e8
commit 70b3e56de2
2 files changed
+90 -69

No files matched your search

+47 -47
View File
@@ -16,7 +16,7 @@ module Imbecile
expect(parser.unit.alternates[0]).to be_a Parser::SequenceUnit
seq_unit = parser.unit.alternates[0]
expect(seq_unit.size).to eq 1
expect(seq_unit[0]).to be_a Parser::CharacterUnit
expect(seq_unit[0]).to be_a Parser::CharacterRangeUnit
end
it "parses a group with a single character unit expression" do
@@ -30,7 +30,7 @@ module Imbecile
alt_unit = seq_unit[0]
expect(alt_unit.alternates.size).to eq 1
expect(alt_unit.alternates[0]).to be_a Parser::SequenceUnit
expect(alt_unit.alternates[0][0]).to be_a Parser::CharacterUnit
expect(alt_unit.alternates[0][0]).to be_a Parser::CharacterRangeUnit
end
it "parses a *" do
@@ -44,7 +44,7 @@ module Imbecile
m_unit = seq_unit[0]
expect(m_unit.min_count).to eq 0
expect(m_unit.max_count).to be_nil
expect(m_unit.unit).to be_a Parser::CharacterUnit
expect(m_unit.unit).to be_a Parser::CharacterRangeUnit
end
it "parses a +" do
@@ -58,7 +58,7 @@ module Imbecile
m_unit = seq_unit[0]
expect(m_unit.min_count).to eq 1
expect(m_unit.max_count).to be_nil
expect(m_unit.unit).to be_a Parser::CharacterUnit
expect(m_unit.unit).to be_a Parser::CharacterRangeUnit
end
it "parses a ?" do
@@ -72,7 +72,7 @@ module Imbecile
m_unit = seq_unit[0]
expect(m_unit.min_count).to eq 0
expect(m_unit.max_count).to eq 1
expect(m_unit.unit).to be_a Parser::CharacterUnit
expect(m_unit.unit).to be_a Parser::CharacterRangeUnit
end
it "parses a multiplicity count" do
@@ -86,7 +86,7 @@ module Imbecile
m_unit = seq_unit[0]
expect(m_unit.min_count).to eq 5
expect(m_unit.max_count).to eq 5
expect(m_unit.unit).to be_a Parser::CharacterUnit
expect(m_unit.unit).to be_a Parser::CharacterRangeUnit
end
it "parses a minimum-only multiplicity count" do
@@ -100,7 +100,7 @@ module Imbecile
m_unit = seq_unit[0]
expect(m_unit.min_count).to eq 5
expect(m_unit.max_count).to be_nil
expect(m_unit.unit).to be_a Parser::CharacterUnit
expect(m_unit.unit).to be_a Parser::CharacterRangeUnit
end
it "parses a minimum and maximum multiplicity count" do
@@ -114,8 +114,8 @@ module Imbecile
m_unit = seq_unit[0]
expect(m_unit.min_count).to eq 5
expect(m_unit.max_count).to eq 8
expect(m_unit.unit).to be_a Parser::CharacterUnit
expect(m_unit.unit.code_point).to eq "a".ord
expect(m_unit.unit).to be_a Parser::CharacterRangeUnit
expect(m_unit.unit.range.first).to eq "a".ord
end
it "parses an escaped *" do
@@ -125,10 +125,10 @@ module Imbecile
expect(parser.unit.alternates[0]).to be_a Parser::SequenceUnit
seq_unit = parser.unit.alternates[0]
expect(seq_unit.size).to eq 2
expect(seq_unit[0]).to be_a Parser::CharacterUnit
expect(seq_unit[0].code_point).to eq "a".ord
expect(seq_unit[1]).to be_a Parser::CharacterUnit
expect(seq_unit[1].code_point).to eq "*".ord
expect(seq_unit[0]).to be_a Parser::CharacterRangeUnit
expect(seq_unit[0].min_code_point).to eq "a".ord
expect(seq_unit[1]).to be_a Parser::CharacterRangeUnit
expect(seq_unit[1].min_code_point).to eq "*".ord
end
it "parses an escaped +" do
@@ -138,10 +138,10 @@ module Imbecile
expect(parser.unit.alternates[0]).to be_a Parser::SequenceUnit
seq_unit = parser.unit.alternates[0]
expect(seq_unit.size).to eq 2
expect(seq_unit[0]).to be_a Parser::CharacterUnit
expect(seq_unit[0].code_point).to eq "a".ord
expect(seq_unit[1]).to be_a Parser::CharacterUnit
expect(seq_unit[1].code_point).to eq "+".ord
expect(seq_unit[0]).to be_a Parser::CharacterRangeUnit
expect(seq_unit[0].min_code_point).to eq "a".ord
expect(seq_unit[1]).to be_a Parser::CharacterRangeUnit
expect(seq_unit[1].min_code_point).to eq "+".ord
end
it "parses an escaped \\" do
@@ -151,10 +151,10 @@ module Imbecile
expect(parser.unit.alternates[0]).to be_a Parser::SequenceUnit
seq_unit = parser.unit.alternates[0]
expect(seq_unit.size).to eq 2
expect(seq_unit[0]).to be_a Parser::CharacterUnit
expect(seq_unit[0].code_point).to eq "\\".ord
expect(seq_unit[1]).to be_a Parser::CharacterUnit
expect(seq_unit[1].code_point).to eq "d".ord
expect(seq_unit[0]).to be_a Parser::CharacterRangeUnit
expect(seq_unit[0].min_code_point).to eq "\\".ord
expect(seq_unit[1]).to be_a Parser::CharacterRangeUnit
expect(seq_unit[1].min_code_point).to eq "d".ord
end
it "parses a character class" do
@@ -171,8 +171,8 @@ module Imbecile
expect(ccu[0]).to be_a Parser::CharacterRangeUnit
expect(ccu[0].min_code_point).to eq "a".ord
expect(ccu[0].max_code_point).to eq "z".ord
expect(ccu[1]).to be_a Parser::CharacterUnit
expect(ccu[1].code_point).to eq "_".ord
expect(ccu[1]).to be_a Parser::CharacterRangeUnit
expect(ccu[1].min_code_point).to eq "_".ord
end
it "parses a negated character class" do
@@ -186,8 +186,8 @@ module Imbecile
ccu = seq_unit[0]
expect(ccu.negate).to be_truthy
expect(ccu.size).to eq 3
expect(ccu[0]).to be_a Parser::CharacterUnit
expect(ccu[0].code_point).to eq "x".ord
expect(ccu[0]).to be_a Parser::CharacterRangeUnit
expect(ccu[0].min_code_point).to eq "x".ord
end
it "parses - as a plain character at beginning of a character class" do
@@ -200,8 +200,8 @@ module Imbecile
expect(seq_unit[0]).to be_a Parser::CharacterClassUnit
ccu = seq_unit[0]
expect(ccu.size).to eq 2
expect(ccu[0]).to be_a Parser::CharacterUnit
expect(ccu[0].code_point).to eq "-".ord
expect(ccu[0]).to be_a Parser::CharacterRangeUnit
expect(ccu[0].min_code_point).to eq "-".ord
end
it "parses - as a plain character at end of a character class" do
@@ -214,10 +214,10 @@ module Imbecile
expect(seq_unit[0]).to be_a Parser::CharacterClassUnit
ccu = seq_unit[0]
expect(ccu.size).to eq 2
expect(ccu[0]).to be_a Parser::CharacterUnit
expect(ccu[0].code_point).to eq "0".ord
expect(ccu[1]).to be_a Parser::CharacterUnit
expect(ccu[1].code_point).to eq "-".ord
expect(ccu[0]).to be_a Parser::CharacterRangeUnit
expect(ccu[0].min_code_point).to eq "0".ord
expect(ccu[1]).to be_a Parser::CharacterRangeUnit
expect(ccu[1].min_code_point).to eq "-".ord
end
it "parses - as a plain character at beginning of a negated character class" do
@@ -231,8 +231,8 @@ module Imbecile
ccu = seq_unit[0]
expect(ccu.negate).to be_truthy
expect(ccu.size).to eq 2
expect(ccu[0]).to be_a Parser::CharacterUnit
expect(ccu[0].code_point).to eq "-".ord
expect(ccu[0]).to be_a Parser::CharacterRangeUnit
expect(ccu[0].min_code_point).to eq "-".ord
end
it "parses . as a plain character in a negated character class" do
@@ -246,8 +246,8 @@ module Imbecile
ccu = seq_unit[0]
expect(ccu.negate).to be_falsey
expect(ccu.size).to eq 1
expect(ccu[0]).to be_a Parser::CharacterUnit
expect(ccu[0].code_point).to eq ".".ord
expect(ccu[0]).to be_a Parser::CharacterRangeUnit
expect(ccu[0].min_code_point).to eq ".".ord
end
it "parses - as a plain character when escaped in middle of character class" do
@@ -261,12 +261,12 @@ module Imbecile
ccu = seq_unit[0]
expect(ccu.negate).to be_falsey
expect(ccu.size).to eq 3
expect(ccu[0]).to be_a Parser::CharacterUnit
expect(ccu[0].code_point).to eq "0".ord
expect(ccu[1]).to be_a Parser::CharacterUnit
expect(ccu[1].code_point).to eq "-".ord
expect(ccu[2]).to be_a Parser::CharacterUnit
expect(ccu[2].code_point).to eq "9".ord
expect(ccu[0]).to be_a Parser::CharacterRangeUnit
expect(ccu[0].min_code_point).to eq "0".ord
expect(ccu[1]).to be_a Parser::CharacterRangeUnit
expect(ccu[1].min_code_point).to eq "-".ord
expect(ccu[2]).to be_a Parser::CharacterRangeUnit
expect(ccu[2].min_code_point).to eq "9".ord
end
it "parses alternates" do
@@ -292,7 +292,7 @@ module Imbecile
expect(parser.unit.alternates[0][0].unit.alternates.size).to eq 2
expect(parser.unit.alternates[0][0].unit.alternates[0]).to be_a Parser::SequenceUnit
expect(parser.unit.alternates[0][0].unit.alternates[0].size).to eq 1
expect(parser.unit.alternates[0][0].unit.alternates[0][0]).to be_a Parser::CharacterUnit
expect(parser.unit.alternates[0][0].unit.alternates[0][0]).to be_a Parser::CharacterRangeUnit
expect(parser.unit.alternates[0][0].unit.alternates[1]).to be_a Parser::SequenceUnit
expect(parser.unit.alternates[0][0].unit.alternates[1].size).to eq 0
expect(parser.unit.alternates[1]).to be_a Parser::SequenceUnit
@@ -300,13 +300,13 @@ module Imbecile
expect(parser.unit.alternates[1][0]).to be_a Parser::CharacterClassUnit
expect(parser.unit.alternates[1][0].negate).to be_truthy
expect(parser.unit.alternates[1][0].size).to eq 1
expect(parser.unit.alternates[1][0][0]).to be_a Parser::CharacterUnit
expect(parser.unit.alternates[1][0][0]).to be_a Parser::CharacterRangeUnit
expect(parser.unit.alternates[2]).to be_a Parser::SequenceUnit
expect(parser.unit.alternates[2].size).to eq 2
expect(parser.unit.alternates[2][0]).to be_a Parser::CharacterUnit
expect(parser.unit.alternates[2][0].code_point).to eq "|".ord
expect(parser.unit.alternates[2][1]).to be_a Parser::CharacterUnit
expect(parser.unit.alternates[2][1].code_point).to eq "v".ord
expect(parser.unit.alternates[2][0]).to be_a Parser::CharacterRangeUnit
expect(parser.unit.alternates[2][0].min_code_point).to eq "|".ord
expect(parser.unit.alternates[2][1]).to be_a Parser::CharacterRangeUnit
expect(parser.unit.alternates[2][1].min_code_point).to eq "v".ord
expect(parser.unit.alternates[3]).to be_a Parser::SequenceUnit
expect(parser.unit.alternates[3].size).to eq 1
expect(parser.unit.alternates[3][0]).to be_a Parser::MultiplicityUnit