diff --git a/lib/imbecile/regex/parser.rb b/lib/imbecile/regex/parser.rb index d730a56..0a692aa 100644 --- a/lib/imbecile/regex/parser.rb +++ b/lib/imbecile/regex/parser.rb @@ -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 diff --git a/spec/imbecile/regex/parser_spec.rb b/spec/imbecile/regex/parser_spec.rb index 3976250..4d96e07 100644 --- a/spec/imbecile/regex/parser_spec.rb +++ b/spec/imbecile/regex/parser_spec.rb @@ -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