Parse . in a regex

This commit is contained in:
Josh Holtrop 2021-05-17 17:20:56 -04:00
parent 70b3e56de2
commit 39f164a7db
2 changed files with 21 additions and 1 deletions

View File

@ -214,6 +214,8 @@ module Imbecile
au.new_alternate!
when "\\"
au << parse_backslash
when "."
au << period_character_class
else
au << CharacterRangeUnit.new(c)
end
@ -307,6 +309,13 @@ module Imbecile
end
end
def period_character_class
ccu = CharacterClassUnit.new
ccu << CharacterRangeUnit.new(0, "\n".ord - 1)
ccu << CharacterRangeUnit.new("\n".ord + 1, 0xFFFFFFFF)
ccu
end
end
end

View File

@ -235,7 +235,7 @@ module Imbecile
expect(ccu[0].min_code_point).to eq "-".ord
end
it "parses . as a plain character in a negated character class" do
it "parses . as a plain character in a character class" do
parser = Parser.new("[.]")
expect(parser.unit).to be_a Parser::AlternatesUnit
expect(parser.unit.alternates.size).to eq 1
@ -279,6 +279,17 @@ module Imbecile
expect(parser.unit.alternates[1].size).to eq 1
end
it "parses a ." do
parser = Parser.new("a.b")
expect(parser.unit).to be_a Parser::AlternatesUnit
expect(parser.unit.alternates.size).to eq 1
expect(parser.unit.alternates[0]).to be_a Parser::SequenceUnit
expect(parser.unit.alternates[0][0]).to be_a Parser::CharacterRangeUnit
expect(parser.unit.alternates[0][1]).to be_a Parser::CharacterClassUnit
expect(parser.unit.alternates[0][1].units.size).to eq 2
expect(parser.unit.alternates[0][2]).to be_a Parser::CharacterRangeUnit
end
it "parses something complex" do
parser = Parser.new("(a|)*|[^^]|\\|v|[x-y]+")
expect(parser.unit).to be_a Parser::AlternatesUnit