regexp_parser 2.1.1 → 2.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
 - data/CHANGELOG.md +19 -1
 - data/LICENSE +1 -1
 - data/README.md +17 -23
 - data/Rakefile +10 -19
 - data/lib/regexp_parser/expression/base.rb +123 -0
 - data/lib/regexp_parser/expression/classes/anchor.rb +0 -2
 - data/lib/regexp_parser/expression/classes/{backref.rb → backreference.rb} +0 -0
 - data/lib/regexp_parser/expression/classes/{set → character_set}/intersection.rb +0 -0
 - data/lib/regexp_parser/expression/classes/{set → character_set}/range.rb +0 -0
 - data/lib/regexp_parser/expression/classes/{set.rb → character_set.rb} +0 -0
 - data/lib/regexp_parser/expression/classes/{escape.rb → escape_sequence.rb} +13 -7
 - data/lib/regexp_parser/expression/classes/free_space.rb +0 -2
 - data/lib/regexp_parser/expression/classes/literal.rb +1 -5
 - data/lib/regexp_parser/expression/classes/property.rb +0 -2
 - data/lib/regexp_parser/expression/classes/root.rb +0 -1
 - data/lib/regexp_parser/expression/classes/type.rb +0 -2
 - data/lib/regexp_parser/expression/methods/strfregexp.rb +1 -1
 - data/lib/regexp_parser/expression/quantifier.rb +1 -1
 - data/lib/regexp_parser/expression/sequence.rb +0 -1
 - data/lib/regexp_parser/expression/subexpression.rb +0 -1
 - data/lib/regexp_parser/expression.rb +6 -130
 - data/lib/regexp_parser/lexer.rb +7 -5
 - data/lib/regexp_parser/scanner/properties/long.csv +604 -0
 - data/lib/regexp_parser/scanner/properties/short.csv +242 -0
 - data/lib/regexp_parser/scanner/scanner.rl +6 -4
 - data/lib/regexp_parser/scanner.rb +126 -124
 - data/lib/regexp_parser/syntax/any.rb +1 -3
 - data/lib/regexp_parser/syntax/base.rb +12 -14
 - data/lib/regexp_parser/syntax/token/anchor.rb +15 -0
 - data/lib/regexp_parser/syntax/{tokens → token}/assertion.rb +2 -2
 - data/lib/regexp_parser/syntax/token/backreference.rb +30 -0
 - data/lib/regexp_parser/syntax/{tokens → token}/character_set.rb +2 -2
 - data/lib/regexp_parser/syntax/{tokens → token}/character_type.rb +3 -3
 - data/lib/regexp_parser/syntax/{tokens → token}/conditional.rb +3 -3
 - data/lib/regexp_parser/syntax/token/escape.rb +31 -0
 - data/lib/regexp_parser/syntax/{tokens → token}/group.rb +7 -7
 - data/lib/regexp_parser/syntax/{tokens → token}/keep.rb +1 -1
 - data/lib/regexp_parser/syntax/{tokens → token}/meta.rb +2 -2
 - data/lib/regexp_parser/syntax/{tokens → token}/posix_class.rb +3 -3
 - data/lib/regexp_parser/syntax/token/quantifier.rb +35 -0
 - data/lib/regexp_parser/syntax/token/unicode_property.rb +696 -0
 - data/lib/regexp_parser/syntax/token.rb +45 -0
 - data/lib/regexp_parser/syntax/versions/1.8.6.rb +2 -2
 - data/lib/regexp_parser/syntax/versions/1.9.1.rb +1 -1
 - data/lib/regexp_parser/syntax/versions/3.1.0.rb +10 -0
 - data/lib/regexp_parser/syntax.rb +1 -1
 - data/lib/regexp_parser/token.rb +9 -20
 - data/lib/regexp_parser/version.rb +1 -1
 - data/lib/regexp_parser.rb +0 -2
 - data/regexp_parser.gemspec +20 -22
 - metadata +32 -164
 - data/lib/regexp_parser/scanner/properties/long.yml +0 -594
 - data/lib/regexp_parser/scanner/properties/short.yml +0 -237
 - data/lib/regexp_parser/syntax/tokens/anchor.rb +0 -15
 - data/lib/regexp_parser/syntax/tokens/backref.rb +0 -24
 - data/lib/regexp_parser/syntax/tokens/escape.rb +0 -30
 - data/lib/regexp_parser/syntax/tokens/quantifier.rb +0 -35
 - data/lib/regexp_parser/syntax/tokens/unicode_property.rb +0 -675
 - data/lib/regexp_parser/syntax/tokens.rb +0 -45
 - data/spec/expression/base_spec.rb +0 -104
 - data/spec/expression/clone_spec.rb +0 -152
 - data/spec/expression/conditional_spec.rb +0 -89
 - data/spec/expression/free_space_spec.rb +0 -27
 - data/spec/expression/methods/match_length_spec.rb +0 -161
 - data/spec/expression/methods/match_spec.rb +0 -25
 - data/spec/expression/methods/strfregexp_spec.rb +0 -224
 - data/spec/expression/methods/tests_spec.rb +0 -99
 - data/spec/expression/methods/traverse_spec.rb +0 -161
 - data/spec/expression/options_spec.rb +0 -128
 - data/spec/expression/subexpression_spec.rb +0 -50
 - data/spec/expression/to_h_spec.rb +0 -26
 - data/spec/expression/to_s_spec.rb +0 -108
 - data/spec/lexer/all_spec.rb +0 -22
 - data/spec/lexer/conditionals_spec.rb +0 -53
 - data/spec/lexer/delimiters_spec.rb +0 -68
 - data/spec/lexer/escapes_spec.rb +0 -14
 - data/spec/lexer/keep_spec.rb +0 -10
 - data/spec/lexer/literals_spec.rb +0 -64
 - data/spec/lexer/nesting_spec.rb +0 -99
 - data/spec/lexer/refcalls_spec.rb +0 -60
 - data/spec/parser/all_spec.rb +0 -43
 - data/spec/parser/alternation_spec.rb +0 -88
 - data/spec/parser/anchors_spec.rb +0 -17
 - data/spec/parser/conditionals_spec.rb +0 -179
 - data/spec/parser/errors_spec.rb +0 -30
 - data/spec/parser/escapes_spec.rb +0 -121
 - data/spec/parser/free_space_spec.rb +0 -130
 - data/spec/parser/groups_spec.rb +0 -108
 - data/spec/parser/keep_spec.rb +0 -6
 - data/spec/parser/options_spec.rb +0 -28
 - data/spec/parser/posix_classes_spec.rb +0 -8
 - data/spec/parser/properties_spec.rb +0 -115
 - data/spec/parser/quantifiers_spec.rb +0 -68
 - data/spec/parser/refcalls_spec.rb +0 -117
 - data/spec/parser/set/intersections_spec.rb +0 -127
 - data/spec/parser/set/ranges_spec.rb +0 -111
 - data/spec/parser/sets_spec.rb +0 -178
 - data/spec/parser/types_spec.rb +0 -18
 - data/spec/scanner/all_spec.rb +0 -18
 - data/spec/scanner/anchors_spec.rb +0 -21
 - data/spec/scanner/conditionals_spec.rb +0 -128
 - data/spec/scanner/delimiters_spec.rb +0 -52
 - data/spec/scanner/errors_spec.rb +0 -67
 - data/spec/scanner/escapes_spec.rb +0 -64
 - data/spec/scanner/free_space_spec.rb +0 -165
 - data/spec/scanner/groups_spec.rb +0 -61
 - data/spec/scanner/keep_spec.rb +0 -10
 - data/spec/scanner/literals_spec.rb +0 -39
 - data/spec/scanner/meta_spec.rb +0 -18
 - data/spec/scanner/options_spec.rb +0 -36
 - data/spec/scanner/properties_spec.rb +0 -64
 - data/spec/scanner/quantifiers_spec.rb +0 -25
 - data/spec/scanner/refcalls_spec.rb +0 -55
 - data/spec/scanner/sets_spec.rb +0 -151
 - data/spec/scanner/types_spec.rb +0 -14
 - data/spec/spec_helper.rb +0 -16
 - data/spec/support/runner.rb +0 -42
 - data/spec/support/shared_examples.rb +0 -77
 - data/spec/support/warning_extractor.rb +0 -60
 - data/spec/syntax/syntax_spec.rb +0 -48
 - data/spec/syntax/syntax_token_map_spec.rb +0 -23
 - data/spec/syntax/versions/1.8.6_spec.rb +0 -17
 - data/spec/syntax/versions/1.9.1_spec.rb +0 -10
 - data/spec/syntax/versions/1.9.3_spec.rb +0 -9
 - data/spec/syntax/versions/2.0.0_spec.rb +0 -13
 - data/spec/syntax/versions/2.2.0_spec.rb +0 -9
 - data/spec/syntax/versions/aliases_spec.rb +0 -37
 - data/spec/token/token_spec.rb +0 -85
 
    
        data/spec/scanner/types_spec.rb
    DELETED
    
    | 
         @@ -1,14 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            require 'spec_helper'
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
            RSpec.describe('Type scanning') do
         
     | 
| 
       4 
     | 
    
         
            -
              include_examples 'scan', 'a\\dc', 1 => [:type, :digit,     '\\d', 1, 3]
         
     | 
| 
       5 
     | 
    
         
            -
              include_examples 'scan', 'a\\Dc', 1 => [:type, :nondigit,  '\\D', 1, 3]
         
     | 
| 
       6 
     | 
    
         
            -
              include_examples 'scan', 'a\\hc', 1 => [:type, :hex,       '\\h', 1, 3]
         
     | 
| 
       7 
     | 
    
         
            -
              include_examples 'scan', 'a\\Hc', 1 => [:type, :nonhex,    '\\H', 1, 3]
         
     | 
| 
       8 
     | 
    
         
            -
              include_examples 'scan', 'a\\sc', 1 => [:type, :space,     '\\s', 1, 3]
         
     | 
| 
       9 
     | 
    
         
            -
              include_examples 'scan', 'a\\Sc', 1 => [:type, :nonspace,  '\\S', 1, 3]
         
     | 
| 
       10 
     | 
    
         
            -
              include_examples 'scan', 'a\\wc', 1 => [:type, :word,      '\\w', 1, 3]
         
     | 
| 
       11 
     | 
    
         
            -
              include_examples 'scan', 'a\\Wc', 1 => [:type, :nonword,   '\\W', 1, 3]
         
     | 
| 
       12 
     | 
    
         
            -
              include_examples 'scan', 'a\\Rc', 1 => [:type, :linebreak, '\\R', 1, 3]
         
     | 
| 
       13 
     | 
    
         
            -
              include_examples 'scan', 'a\\Xc', 1 => [:type, :xgrapheme, '\\X', 1, 3]
         
     | 
| 
       14 
     | 
    
         
            -
            end
         
     | 
    
        data/spec/spec_helper.rb
    DELETED
    
    | 
         @@ -1,16 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            require 'ice_nine'
         
     | 
| 
       2 
     | 
    
         
            -
            require 'regexp_parser'
         
     | 
| 
       3 
     | 
    
         
            -
            require 'regexp_property_values'
         
     | 
| 
       4 
     | 
    
         
            -
            require_relative 'support/shared_examples'
         
     | 
| 
       5 
     | 
    
         
            -
             
     | 
| 
       6 
     | 
    
         
            -
            RS = Regexp::Scanner
         
     | 
| 
       7 
     | 
    
         
            -
            RL = Regexp::Lexer
         
     | 
| 
       8 
     | 
    
         
            -
            RP = Regexp::Parser
         
     | 
| 
       9 
     | 
    
         
            -
            RE = Regexp::Expression
         
     | 
| 
       10 
     | 
    
         
            -
            T = Regexp::Syntax::Token
         
     | 
| 
       11 
     | 
    
         
            -
             
     | 
| 
       12 
     | 
    
         
            -
            include Regexp::Expression
         
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
       14 
     | 
    
         
            -
            def ruby_version_at_least(version)
         
     | 
| 
       15 
     | 
    
         
            -
              Gem::Version.new(RUBY_VERSION.dup) >= Gem::Version.new(version)
         
     | 
| 
       16 
     | 
    
         
            -
            end
         
     | 
    
        data/spec/support/runner.rb
    DELETED
    
    | 
         @@ -1,42 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            require 'pathname'
         
     | 
| 
       2 
     | 
    
         
            -
            require 'rspec'
         
     | 
| 
       3 
     | 
    
         
            -
             
     | 
| 
       4 
     | 
    
         
            -
            module RegexpParserSpec
         
     | 
| 
       5 
     | 
    
         
            -
              class Runner
         
     | 
| 
       6 
     | 
    
         
            -
                def initialize(arguments, warning_whitelist)
         
     | 
| 
       7 
     | 
    
         
            -
                  @arguments = arguments
         
     | 
| 
       8 
     | 
    
         
            -
                  @warning_whitelist = warning_whitelist
         
     | 
| 
       9 
     | 
    
         
            -
                end
         
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
                def run
         
     | 
| 
       12 
     | 
    
         
            -
                  spec_status = nil
         
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
       14 
     | 
    
         
            -
                  Warning::Filter.new(warning_whitelist).assert_expected_warnings_only do
         
     | 
| 
       15 
     | 
    
         
            -
                    setup
         
     | 
| 
       16 
     | 
    
         
            -
                    spec_status = run_rspec
         
     | 
| 
       17 
     | 
    
         
            -
                  end
         
     | 
| 
       18 
     | 
    
         
            -
             
     | 
| 
       19 
     | 
    
         
            -
                  spec_status
         
     | 
| 
       20 
     | 
    
         
            -
                end
         
     | 
| 
       21 
     | 
    
         
            -
             
     | 
| 
       22 
     | 
    
         
            -
                private
         
     | 
| 
       23 
     | 
    
         
            -
             
     | 
| 
       24 
     | 
    
         
            -
                def setup
         
     | 
| 
       25 
     | 
    
         
            -
                  $VERBOSE = true
         
     | 
| 
       26 
     | 
    
         
            -
             
     | 
| 
       27 
     | 
    
         
            -
                  spec_files.each(&method(:require))
         
     | 
| 
       28 
     | 
    
         
            -
                end
         
     | 
| 
       29 
     | 
    
         
            -
             
     | 
| 
       30 
     | 
    
         
            -
                def run_rspec
         
     | 
| 
       31 
     | 
    
         
            -
                  RSpec::Core::Runner.run([])
         
     | 
| 
       32 
     | 
    
         
            -
                end
         
     | 
| 
       33 
     | 
    
         
            -
             
     | 
| 
       34 
     | 
    
         
            -
                def spec_files
         
     | 
| 
       35 
     | 
    
         
            -
                  arguments
         
     | 
| 
       36 
     | 
    
         
            -
                    .map { |path| Pathname.new(path).expand_path.freeze }
         
     | 
| 
       37 
     | 
    
         
            -
                    .select(&:file?)
         
     | 
| 
       38 
     | 
    
         
            -
                end
         
     | 
| 
       39 
     | 
    
         
            -
             
     | 
| 
       40 
     | 
    
         
            -
                attr_reader :arguments, :warning_whitelist
         
     | 
| 
       41 
     | 
    
         
            -
              end
         
     | 
| 
       42 
     | 
    
         
            -
            end
         
     | 
| 
         @@ -1,77 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            RSpec.shared_examples 'syntax' do |klass, opts|
         
     | 
| 
       2 
     | 
    
         
            -
              opts[:implements].each do |type, tokens|
         
     | 
| 
       3 
     | 
    
         
            -
                tokens.each do |token|
         
     | 
| 
       4 
     | 
    
         
            -
                  it("implements #{token} #{type}") do
         
     | 
| 
       5 
     | 
    
         
            -
                    expect(klass.implements?(type, token)).to be true
         
     | 
| 
       6 
     | 
    
         
            -
                  end
         
     | 
| 
       7 
     | 
    
         
            -
                end
         
     | 
| 
       8 
     | 
    
         
            -
              end
         
     | 
| 
       9 
     | 
    
         
            -
             
     | 
| 
       10 
     | 
    
         
            -
              opts[:excludes] && opts[:excludes].each do |type, tokens|
         
     | 
| 
       11 
     | 
    
         
            -
                tokens.each do |token|
         
     | 
| 
       12 
     | 
    
         
            -
                  it("does not implement #{token} #{type}") do
         
     | 
| 
       13 
     | 
    
         
            -
                    expect(klass.implements?(type, token)).to be false
         
     | 
| 
       14 
     | 
    
         
            -
                  end
         
     | 
| 
       15 
     | 
    
         
            -
                end
         
     | 
| 
       16 
     | 
    
         
            -
              end
         
     | 
| 
       17 
     | 
    
         
            -
            end
         
     | 
| 
       18 
     | 
    
         
            -
             
     | 
| 
       19 
     | 
    
         
            -
            RSpec.shared_examples 'scan' do |pattern, checks|
         
     | 
| 
       20 
     | 
    
         
            -
              context "given the pattern #{pattern}" do
         
     | 
| 
       21 
     | 
    
         
            -
                before(:all) { @tokens = Regexp::Scanner.scan(pattern) }
         
     | 
| 
       22 
     | 
    
         
            -
             
     | 
| 
       23 
     | 
    
         
            -
                checks.each do |index, (type, token, text, ts, te)|
         
     | 
| 
       24 
     | 
    
         
            -
                  it "scans token #{index} as #{token} #{type} at #{ts}..#{te}" do
         
     | 
| 
       25 
     | 
    
         
            -
                    result = @tokens.at(index)
         
     | 
| 
       26 
     | 
    
         
            -
             
     | 
| 
       27 
     | 
    
         
            -
                    expect(result[0]).to eq type
         
     | 
| 
       28 
     | 
    
         
            -
                    expect(result[1]).to eq token
         
     | 
| 
       29 
     | 
    
         
            -
                    expect(result[2]).to eq text
         
     | 
| 
       30 
     | 
    
         
            -
                    expect(result[3]).to eq ts
         
     | 
| 
       31 
     | 
    
         
            -
                    expect(result[4]).to eq te
         
     | 
| 
       32 
     | 
    
         
            -
                  end
         
     | 
| 
       33 
     | 
    
         
            -
                end
         
     | 
| 
       34 
     | 
    
         
            -
              end
         
     | 
| 
       35 
     | 
    
         
            -
            end
         
     | 
| 
       36 
     | 
    
         
            -
             
     | 
| 
       37 
     | 
    
         
            -
            RSpec.shared_examples 'lex' do |pattern, checks|
         
     | 
| 
       38 
     | 
    
         
            -
              context "given the pattern #{pattern}" do
         
     | 
| 
       39 
     | 
    
         
            -
                before(:all) { @tokens = Regexp::Lexer.lex(pattern) }
         
     | 
| 
       40 
     | 
    
         
            -
             
     | 
| 
       41 
     | 
    
         
            -
                checks.each do |index, (type, token, text, ts, te, lvl, set_lvl, cond_lvl)|
         
     | 
| 
       42 
     | 
    
         
            -
                  it "lexes token #{index} as #{token} #{type} at #{lvl}, #{set_lvl}, #{cond_lvl}" do
         
     | 
| 
       43 
     | 
    
         
            -
                    struct = @tokens.at(index)
         
     | 
| 
       44 
     | 
    
         
            -
             
     | 
| 
       45 
     | 
    
         
            -
                    expect(struct.type).to eq type
         
     | 
| 
       46 
     | 
    
         
            -
                    expect(struct.token).to eq token
         
     | 
| 
       47 
     | 
    
         
            -
                    expect(struct.text).to eq text
         
     | 
| 
       48 
     | 
    
         
            -
                    expect(struct.ts).to eq ts
         
     | 
| 
       49 
     | 
    
         
            -
                    expect(struct.te).to eq te
         
     | 
| 
       50 
     | 
    
         
            -
                    expect(struct.level).to eq lvl
         
     | 
| 
       51 
     | 
    
         
            -
                    expect(struct.set_level).to eq set_lvl
         
     | 
| 
       52 
     | 
    
         
            -
                    expect(struct.conditional_level).to eq cond_lvl
         
     | 
| 
       53 
     | 
    
         
            -
                  end
         
     | 
| 
       54 
     | 
    
         
            -
                end
         
     | 
| 
       55 
     | 
    
         
            -
              end
         
     | 
| 
       56 
     | 
    
         
            -
            end
         
     | 
| 
       57 
     | 
    
         
            -
             
     | 
| 
       58 
     | 
    
         
            -
            RSpec.shared_examples 'parse' do |pattern, checks|
         
     | 
| 
       59 
     | 
    
         
            -
              context "given the pattern #{pattern}" do
         
     | 
| 
       60 
     | 
    
         
            -
                before(:all) { @root = Regexp::Parser.parse(pattern, '*') }
         
     | 
| 
       61 
     | 
    
         
            -
             
     | 
| 
       62 
     | 
    
         
            -
                checks.each do |path, (type, token, klass, attributes)|
         
     | 
| 
       63 
     | 
    
         
            -
                  it "parses expression at #{path} as #{klass}" do
         
     | 
| 
       64 
     | 
    
         
            -
                    exp = @root.dig(*path)
         
     | 
| 
       65 
     | 
    
         
            -
             
     | 
| 
       66 
     | 
    
         
            -
                    expect(exp).to be_instance_of(klass)
         
     | 
| 
       67 
     | 
    
         
            -
                    expect(exp.type).to eq type
         
     | 
| 
       68 
     | 
    
         
            -
                    expect(exp.token).to eq token
         
     | 
| 
       69 
     | 
    
         
            -
             
     | 
| 
       70 
     | 
    
         
            -
                    attributes && attributes.each do |method, value|
         
     | 
| 
       71 
     | 
    
         
            -
                      expect(exp.send(method)).to eq(value),
         
     | 
| 
       72 
     | 
    
         
            -
                        "expected expression at #{path} to have #{method} #{value}"
         
     | 
| 
       73 
     | 
    
         
            -
                    end
         
     | 
| 
       74 
     | 
    
         
            -
                  end
         
     | 
| 
       75 
     | 
    
         
            -
                end
         
     | 
| 
       76 
     | 
    
         
            -
              end
         
     | 
| 
       77 
     | 
    
         
            -
            end
         
     | 
| 
         @@ -1,60 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            require 'set'
         
     | 
| 
       2 
     | 
    
         
            -
            require 'delegate'
         
     | 
| 
       3 
     | 
    
         
            -
             
     | 
| 
       4 
     | 
    
         
            -
            module RegexpParserSpec
         
     | 
| 
       5 
     | 
    
         
            -
              class Warning
         
     | 
| 
       6 
     | 
    
         
            -
                class UnexpectedWarnings < StandardError
         
     | 
| 
       7 
     | 
    
         
            -
                  MSG = 'Unexpected warnings: %s'.freeze
         
     | 
| 
       8 
     | 
    
         
            -
             
     | 
| 
       9 
     | 
    
         
            -
                  def initialize(warnings)
         
     | 
| 
       10 
     | 
    
         
            -
                    super(MSG % warnings.join("\n"))
         
     | 
| 
       11 
     | 
    
         
            -
                  end
         
     | 
| 
       12 
     | 
    
         
            -
                end
         
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
       14 
     | 
    
         
            -
                class Filter
         
     | 
| 
       15 
     | 
    
         
            -
                  def initialize(whitelist)
         
     | 
| 
       16 
     | 
    
         
            -
                    @whitelist = whitelist
         
     | 
| 
       17 
     | 
    
         
            -
                  end
         
     | 
| 
       18 
     | 
    
         
            -
             
     | 
| 
       19 
     | 
    
         
            -
                  def assert_expected_warnings_only
         
     | 
| 
       20 
     | 
    
         
            -
                    original = $stderr
         
     | 
| 
       21 
     | 
    
         
            -
                    $stderr  = Extractor.new(original, @whitelist)
         
     | 
| 
       22 
     | 
    
         
            -
             
     | 
| 
       23 
     | 
    
         
            -
                    yield
         
     | 
| 
       24 
     | 
    
         
            -
             
     | 
| 
       25 
     | 
    
         
            -
                    assert_no_warnings($stderr.warnings)
         
     | 
| 
       26 
     | 
    
         
            -
                  ensure
         
     | 
| 
       27 
     | 
    
         
            -
                    $stderr = original
         
     | 
| 
       28 
     | 
    
         
            -
                  end
         
     | 
| 
       29 
     | 
    
         
            -
             
     | 
| 
       30 
     | 
    
         
            -
                  private
         
     | 
| 
       31 
     | 
    
         
            -
             
     | 
| 
       32 
     | 
    
         
            -
                  def assert_no_warnings(warnings)
         
     | 
| 
       33 
     | 
    
         
            -
                    raise UnexpectedWarnings, warnings.to_a if warnings.any?
         
     | 
| 
       34 
     | 
    
         
            -
                  end
         
     | 
| 
       35 
     | 
    
         
            -
                end
         
     | 
| 
       36 
     | 
    
         
            -
             
     | 
| 
       37 
     | 
    
         
            -
                class Extractor < DelegateClass(IO)
         
     | 
| 
       38 
     | 
    
         
            -
                  PATTERN = /\A(?:.+):(?:\d+): warning: (?:.+)\n\z/
         
     | 
| 
       39 
     | 
    
         
            -
             
     | 
| 
       40 
     | 
    
         
            -
                  def initialize(io, whitelist)
         
     | 
| 
       41 
     | 
    
         
            -
                    @whitelist = whitelist
         
     | 
| 
       42 
     | 
    
         
            -
                    @warnings  = Set.new
         
     | 
| 
       43 
     | 
    
         
            -
                    super(io)
         
     | 
| 
       44 
     | 
    
         
            -
                  end
         
     | 
| 
       45 
     | 
    
         
            -
             
     | 
| 
       46 
     | 
    
         
            -
                  def write(message)
         
     | 
| 
       47 
     | 
    
         
            -
                    return super if PATTERN !~ message
         
     | 
| 
       48 
     | 
    
         
            -
             
     | 
| 
       49 
     | 
    
         
            -
                    warning = message.chomp
         
     | 
| 
       50 
     | 
    
         
            -
                    @warnings << warning if @whitelist.none?(&warning.method(:include?))
         
     | 
| 
       51 
     | 
    
         
            -
             
     | 
| 
       52 
     | 
    
         
            -
                    self
         
     | 
| 
       53 
     | 
    
         
            -
                  end
         
     | 
| 
       54 
     | 
    
         
            -
             
     | 
| 
       55 
     | 
    
         
            -
                  def warnings
         
     | 
| 
       56 
     | 
    
         
            -
                    @warnings.dup.freeze
         
     | 
| 
       57 
     | 
    
         
            -
                  end
         
     | 
| 
       58 
     | 
    
         
            -
                end
         
     | 
| 
       59 
     | 
    
         
            -
              end
         
     | 
| 
       60 
     | 
    
         
            -
            end
         
     | 
    
        data/spec/syntax/syntax_spec.rb
    DELETED
    
    | 
         @@ -1,48 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            require 'spec_helper'
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
            RSpec.describe(Regexp::Syntax) do
         
     | 
| 
       4 
     | 
    
         
            -
              specify('unknown name') do
         
     | 
| 
       5 
     | 
    
         
            -
                expect { Regexp::Syntax.new('ruby/1.0') }.to raise_error(Regexp::Syntax::UnknownSyntaxNameError)
         
     | 
| 
       6 
     | 
    
         
            -
              end
         
     | 
| 
       7 
     | 
    
         
            -
             
     | 
| 
       8 
     | 
    
         
            -
              specify('new') do
         
     | 
| 
       9 
     | 
    
         
            -
                expect(Regexp::Syntax.new('ruby/1.9.3')).to be_instance_of(Regexp::Syntax::V1_9_3)
         
     | 
| 
       10 
     | 
    
         
            -
              end
         
     | 
| 
       11 
     | 
    
         
            -
             
     | 
| 
       12 
     | 
    
         
            -
              specify('new any') do
         
     | 
| 
       13 
     | 
    
         
            -
                expect(Regexp::Syntax.new('any')).to be_instance_of(Regexp::Syntax::Any)
         
     | 
| 
       14 
     | 
    
         
            -
                expect(Regexp::Syntax.new('*')).to be_instance_of(Regexp::Syntax::Any)
         
     | 
| 
       15 
     | 
    
         
            -
              end
         
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
       17 
     | 
    
         
            -
              specify('not implemented') do
         
     | 
| 
       18 
     | 
    
         
            -
                expect { RP.parse('\\p{alpha}', 'ruby/1.8') }.to raise_error(Regexp::Syntax::NotImplementedError)
         
     | 
| 
       19 
     | 
    
         
            -
              end
         
     | 
| 
       20 
     | 
    
         
            -
             
     | 
| 
       21 
     | 
    
         
            -
              specify('supported?') do
         
     | 
| 
       22 
     | 
    
         
            -
                expect(Regexp::Syntax.supported?('ruby/1.1.1')).to be false
         
     | 
| 
       23 
     | 
    
         
            -
                expect(Regexp::Syntax.supported?('ruby/2.4.3')).to be true
         
     | 
| 
       24 
     | 
    
         
            -
                expect(Regexp::Syntax.supported?('ruby/2.5')).to be true
         
     | 
| 
       25 
     | 
    
         
            -
              end
         
     | 
| 
       26 
     | 
    
         
            -
             
     | 
| 
       27 
     | 
    
         
            -
              specify('invalid version') do
         
     | 
| 
       28 
     | 
    
         
            -
                expect { Regexp::Syntax.version_class('2.0.0') }.to raise_error(Regexp::Syntax::InvalidVersionNameError)
         
     | 
| 
       29 
     | 
    
         
            -
             
     | 
| 
       30 
     | 
    
         
            -
                expect { Regexp::Syntax.version_class('ruby/20') }.to raise_error(Regexp::Syntax::InvalidVersionNameError)
         
     | 
| 
       31 
     | 
    
         
            -
              end
         
     | 
| 
       32 
     | 
    
         
            -
             
     | 
| 
       33 
     | 
    
         
            -
              specify('version class tiny version') do
         
     | 
| 
       34 
     | 
    
         
            -
                expect(Regexp::Syntax.version_class('ruby/1.9.3')).to eq Regexp::Syntax::V1_9_3
         
     | 
| 
       35 
     | 
    
         
            -
             
     | 
| 
       36 
     | 
    
         
            -
                expect(Regexp::Syntax.version_class('ruby/2.3.1')).to eq Regexp::Syntax::V2_3_1
         
     | 
| 
       37 
     | 
    
         
            -
              end
         
     | 
| 
       38 
     | 
    
         
            -
             
     | 
| 
       39 
     | 
    
         
            -
              specify('version class minor version') do
         
     | 
| 
       40 
     | 
    
         
            -
                expect(Regexp::Syntax.version_class('ruby/1.9')).to eq Regexp::Syntax::V1_9
         
     | 
| 
       41 
     | 
    
         
            -
             
     | 
| 
       42 
     | 
    
         
            -
                expect(Regexp::Syntax.version_class('ruby/2.3')).to eq Regexp::Syntax::V2_3
         
     | 
| 
       43 
     | 
    
         
            -
              end
         
     | 
| 
       44 
     | 
    
         
            -
             
     | 
| 
       45 
     | 
    
         
            -
              specify('raises for unknown constant lookups') do
         
     | 
| 
       46 
     | 
    
         
            -
                expect { Regexp::Syntax::V1 }.to raise_error(/V1/)
         
     | 
| 
       47 
     | 
    
         
            -
              end
         
     | 
| 
       48 
     | 
    
         
            -
            end
         
     | 
| 
         @@ -1,23 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            require 'spec_helper'
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
            RSpec.describe(Regexp::Syntax::Token::Map) do
         
     | 
| 
       4 
     | 
    
         
            -
              let(:map) { Regexp::Syntax::Token::Map }
         
     | 
| 
       5 
     | 
    
         
            -
             
     | 
| 
       6 
     | 
    
         
            -
              specify('is complete') do
         
     | 
| 
       7 
     | 
    
         
            -
                latest_syntax = Regexp::Syntax.new('ruby/2.9')
         
     | 
| 
       8 
     | 
    
         
            -
             
     | 
| 
       9 
     | 
    
         
            -
                latest_syntax.features.each do |type, tokens|
         
     | 
| 
       10 
     | 
    
         
            -
                  tokens.each { |token| expect(map[type]).to include(token) }
         
     | 
| 
       11 
     | 
    
         
            -
                end
         
     | 
| 
       12 
     | 
    
         
            -
              end
         
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
       14 
     | 
    
         
            -
              specify('contains no duplicate type/token combinations') do
         
     | 
| 
       15 
     | 
    
         
            -
                combinations = map.flat_map do |type, tokens|
         
     | 
| 
       16 
     | 
    
         
            -
                  tokens.map { |token| "#{type} #{token}" }
         
     | 
| 
       17 
     | 
    
         
            -
                end
         
     | 
| 
       18 
     | 
    
         
            -
             
     | 
| 
       19 
     | 
    
         
            -
                non_uniq = combinations.group_by { |str| str }.select { |_, v| v.count > 1 }
         
     | 
| 
       20 
     | 
    
         
            -
             
     | 
| 
       21 
     | 
    
         
            -
                expect(non_uniq.keys).to be_empty
         
     | 
| 
       22 
     | 
    
         
            -
              end
         
     | 
| 
       23 
     | 
    
         
            -
            end
         
     | 
| 
         @@ -1,17 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            require 'spec_helper'
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
            RSpec.describe(Regexp::Syntax::V1_8_6) do
         
     | 
| 
       4 
     | 
    
         
            -
              include_examples 'syntax', Regexp::Syntax.new('ruby/1.8.6'),
         
     | 
| 
       5 
     | 
    
         
            -
              implements: {
         
     | 
| 
       6 
     | 
    
         
            -
                assertion: T::Assertion::Lookahead,
         
     | 
| 
       7 
     | 
    
         
            -
                backref: [:number],
         
     | 
| 
       8 
     | 
    
         
            -
                escape: T::Escape::Basic + T::Escape::ASCII + T::Escape::Meta + T::Escape::Control,
         
     | 
| 
       9 
     | 
    
         
            -
                group: T::Group::V1_8_6,
         
     | 
| 
       10 
     | 
    
         
            -
                quantifier: T::Quantifier::Greedy + T::Quantifier::Reluctant + T::Quantifier::Interval + T::Quantifier::IntervalReluctant
         
     | 
| 
       11 
     | 
    
         
            -
              },
         
     | 
| 
       12 
     | 
    
         
            -
              excludes: {
         
     | 
| 
       13 
     | 
    
         
            -
                assertion: T::Assertion::Lookbehind,
         
     | 
| 
       14 
     | 
    
         
            -
                backref: T::Backreference::All - [:number] + T::SubexpressionCall::All,
         
     | 
| 
       15 
     | 
    
         
            -
                quantifier: T::Quantifier::Possessive
         
     | 
| 
       16 
     | 
    
         
            -
              }
         
     | 
| 
       17 
     | 
    
         
            -
            end
         
     | 
| 
         @@ -1,10 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            require 'spec_helper'
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
            RSpec.describe(Regexp::Syntax::V1_9_1) do
         
     | 
| 
       4 
     | 
    
         
            -
              include_examples 'syntax', Regexp::Syntax.new('ruby/1.9.1'),
         
     | 
| 
       5 
     | 
    
         
            -
              implements: {
         
     | 
| 
       6 
     | 
    
         
            -
                escape: T::Escape::Hex + T::Escape::Octal + T::Escape::Unicode,
         
     | 
| 
       7 
     | 
    
         
            -
                type: T::CharacterType::Hex,
         
     | 
| 
       8 
     | 
    
         
            -
                quantifier: T::Quantifier::Greedy + T::Quantifier::Reluctant + T::Quantifier::Possessive
         
     | 
| 
       9 
     | 
    
         
            -
              }
         
     | 
| 
       10 
     | 
    
         
            -
            end
         
     | 
| 
         @@ -1,9 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            require 'spec_helper'
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
            RSpec.describe(Regexp::Syntax::V1_9_3) do
         
     | 
| 
       4 
     | 
    
         
            -
              include_examples 'syntax', Regexp::Syntax.new('ruby/1.9.3'),
         
     | 
| 
       5 
     | 
    
         
            -
              implements: {
         
     | 
| 
       6 
     | 
    
         
            -
                property: T::UnicodeProperty::Script_V1_9_3 + T::UnicodeProperty::Age_V1_9_3,
         
     | 
| 
       7 
     | 
    
         
            -
                nonproperty: T::UnicodeProperty::Script_V1_9_3 + T::UnicodeProperty::Age_V1_9_3
         
     | 
| 
       8 
     | 
    
         
            -
              }
         
     | 
| 
       9 
     | 
    
         
            -
            end
         
     | 
| 
         @@ -1,13 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            require 'spec_helper'
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
            RSpec.describe(Regexp::Syntax::V2_0_0) do
         
     | 
| 
       4 
     | 
    
         
            -
              include_examples 'syntax', Regexp::Syntax.new('ruby/2.0.0'),
         
     | 
| 
       5 
     | 
    
         
            -
              implements: {
         
     | 
| 
       6 
     | 
    
         
            -
                property: T::UnicodeProperty::Age_V2_0_0,
         
     | 
| 
       7 
     | 
    
         
            -
                nonproperty: T::UnicodeProperty::Age_V2_0_0
         
     | 
| 
       8 
     | 
    
         
            -
              },
         
     | 
| 
       9 
     | 
    
         
            -
              excludes: {
         
     | 
| 
       10 
     | 
    
         
            -
                property: [:newline],
         
     | 
| 
       11 
     | 
    
         
            -
                nonproperty: [:newline]
         
     | 
| 
       12 
     | 
    
         
            -
              }
         
     | 
| 
       13 
     | 
    
         
            -
            end
         
     | 
| 
         @@ -1,9 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            require 'spec_helper'
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
            RSpec.describe(Regexp::Syntax::V2_2_0) do
         
     | 
| 
       4 
     | 
    
         
            -
              include_examples 'syntax', Regexp::Syntax.new('ruby/2.2.0'),
         
     | 
| 
       5 
     | 
    
         
            -
              implements: {
         
     | 
| 
       6 
     | 
    
         
            -
                property: T::UnicodeProperty::Script_V2_2_0 + T::UnicodeProperty::Age_V2_2_0,
         
     | 
| 
       7 
     | 
    
         
            -
                nonproperty: T::UnicodeProperty::Script_V2_2_0 + T::UnicodeProperty::Age_V2_2_0
         
     | 
| 
       8 
     | 
    
         
            -
              }
         
     | 
| 
       9 
     | 
    
         
            -
            end
         
     | 
| 
         @@ -1,37 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            require 'spec_helper'
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
            RSpec.describe(Regexp::Syntax) do
         
     | 
| 
       4 
     | 
    
         
            -
              RSpec.shared_examples 'syntax alias' do |string, klass|
         
     | 
| 
       5 
     | 
    
         
            -
                it "aliases #{string} to #{klass}" do
         
     | 
| 
       6 
     | 
    
         
            -
                  syntax = Regexp::Syntax.new(string)
         
     | 
| 
       7 
     | 
    
         
            -
                  expect(syntax).to be_a klass
         
     | 
| 
       8 
     | 
    
         
            -
                end
         
     | 
| 
       9 
     | 
    
         
            -
              end
         
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
              include_examples 'syntax alias', 'ruby/1.8.6',  Regexp::Syntax::V1_8_6
         
     | 
| 
       12 
     | 
    
         
            -
              include_examples 'syntax alias', 'ruby/1.8',    Regexp::Syntax::V1_8_6
         
     | 
| 
       13 
     | 
    
         
            -
              include_examples 'syntax alias', 'ruby/1.9.1',  Regexp::Syntax::V1_9_1
         
     | 
| 
       14 
     | 
    
         
            -
              include_examples 'syntax alias', 'ruby/1.9',    Regexp::Syntax::V1_9_3
         
     | 
| 
       15 
     | 
    
         
            -
              include_examples 'syntax alias', 'ruby/2.0.0',  Regexp::Syntax::V1_9
         
     | 
| 
       16 
     | 
    
         
            -
              include_examples 'syntax alias', 'ruby/2.0',    Regexp::Syntax::V2_0_0
         
     | 
| 
       17 
     | 
    
         
            -
              include_examples 'syntax alias', 'ruby/2.1',    Regexp::Syntax::V2_0_0
         
     | 
| 
       18 
     | 
    
         
            -
              include_examples 'syntax alias', 'ruby/2.2.0',  Regexp::Syntax::V2_0_0
         
     | 
| 
       19 
     | 
    
         
            -
              include_examples 'syntax alias', 'ruby/2.2.10', Regexp::Syntax::V2_0_0
         
     | 
| 
       20 
     | 
    
         
            -
              include_examples 'syntax alias', 'ruby/2.2',    Regexp::Syntax::V2_0_0
         
     | 
| 
       21 
     | 
    
         
            -
              include_examples 'syntax alias', 'ruby/2.3.0',  Regexp::Syntax::V2_3_0
         
     | 
| 
       22 
     | 
    
         
            -
              include_examples 'syntax alias', 'ruby/2.3',    Regexp::Syntax::V2_3_0
         
     | 
| 
       23 
     | 
    
         
            -
              include_examples 'syntax alias', 'ruby/2.4.0',  Regexp::Syntax::V2_4_0
         
     | 
| 
       24 
     | 
    
         
            -
              include_examples 'syntax alias', 'ruby/2.4.1',  Regexp::Syntax::V2_4_1
         
     | 
| 
       25 
     | 
    
         
            -
              include_examples 'syntax alias', 'ruby/2.5.0',  Regexp::Syntax::V2_4_1
         
     | 
| 
       26 
     | 
    
         
            -
              include_examples 'syntax alias', 'ruby/2.5',    Regexp::Syntax::V2_5_0
         
     | 
| 
       27 
     | 
    
         
            -
              include_examples 'syntax alias', 'ruby/2.6.0',  Regexp::Syntax::V2_5_0
         
     | 
| 
       28 
     | 
    
         
            -
              include_examples 'syntax alias', 'ruby/2.6.2',  Regexp::Syntax::V2_6_2
         
     | 
| 
       29 
     | 
    
         
            -
              include_examples 'syntax alias', 'ruby/2.6.3',  Regexp::Syntax::V2_6_3
         
     | 
| 
       30 
     | 
    
         
            -
              include_examples 'syntax alias', 'ruby/2.6',    Regexp::Syntax::V2_6_3
         
     | 
| 
       31 
     | 
    
         
            -
             
     | 
| 
       32 
     | 
    
         
            -
              specify('future alias warning') do
         
     | 
| 
       33 
     | 
    
         
            -
                expect { Regexp::Syntax.new('ruby/5.0') }
         
     | 
| 
       34 
     | 
    
         
            -
                  .to output(/This library .* but you are running .* \(feature set of .*\)/)
         
     | 
| 
       35 
     | 
    
         
            -
                  .to_stderr
         
     | 
| 
       36 
     | 
    
         
            -
              end
         
     | 
| 
       37 
     | 
    
         
            -
            end
         
     | 
    
        data/spec/token/token_spec.rb
    DELETED
    
    | 
         @@ -1,85 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            require 'spec_helper'
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
            RSpec.describe(Regexp::Token) do
         
     | 
| 
       4 
     | 
    
         
            -
              specify('#offset') do
         
     | 
| 
       5 
     | 
    
         
            -
                regexp = /ab?cd/
         
     | 
| 
       6 
     | 
    
         
            -
                tokens = RL.lex(regexp)
         
     | 
| 
       7 
     | 
    
         
            -
             
     | 
| 
       8 
     | 
    
         
            -
                expect(tokens[1].text).to eq 'b'
         
     | 
| 
       9 
     | 
    
         
            -
                expect(tokens[1].offset).to eq [1, 2]
         
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
                expect(tokens[2].text).to eq '?'
         
     | 
| 
       12 
     | 
    
         
            -
                expect(tokens[2].offset).to eq [2, 3]
         
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
       14 
     | 
    
         
            -
                expect(tokens[3].text).to eq 'cd'
         
     | 
| 
       15 
     | 
    
         
            -
                expect(tokens[3].offset).to eq [3, 5]
         
     | 
| 
       16 
     | 
    
         
            -
              end
         
     | 
| 
       17 
     | 
    
         
            -
             
     | 
| 
       18 
     | 
    
         
            -
              specify('#length') do
         
     | 
| 
       19 
     | 
    
         
            -
                regexp = /abc?def/
         
     | 
| 
       20 
     | 
    
         
            -
                tokens = RL.lex(regexp)
         
     | 
| 
       21 
     | 
    
         
            -
             
     | 
| 
       22 
     | 
    
         
            -
                expect(tokens[0].text).to eq 'ab'
         
     | 
| 
       23 
     | 
    
         
            -
                expect(tokens[0].length).to eq 2
         
     | 
| 
       24 
     | 
    
         
            -
             
     | 
| 
       25 
     | 
    
         
            -
                expect(tokens[1].text).to eq 'c'
         
     | 
| 
       26 
     | 
    
         
            -
                expect(tokens[1].length).to eq 1
         
     | 
| 
       27 
     | 
    
         
            -
             
     | 
| 
       28 
     | 
    
         
            -
                expect(tokens[2].text).to eq '?'
         
     | 
| 
       29 
     | 
    
         
            -
                expect(tokens[2].length).to eq 1
         
     | 
| 
       30 
     | 
    
         
            -
             
     | 
| 
       31 
     | 
    
         
            -
                expect(tokens[3].text).to eq 'def'
         
     | 
| 
       32 
     | 
    
         
            -
                expect(tokens[3].length).to eq 3
         
     | 
| 
       33 
     | 
    
         
            -
              end
         
     | 
| 
       34 
     | 
    
         
            -
             
     | 
| 
       35 
     | 
    
         
            -
              specify('#to_h') do
         
     | 
| 
       36 
     | 
    
         
            -
                regexp = /abc?def/
         
     | 
| 
       37 
     | 
    
         
            -
                tokens = RL.lex(regexp)
         
     | 
| 
       38 
     | 
    
         
            -
             
     | 
| 
       39 
     | 
    
         
            -
                expect(tokens[0].text).to eq 'ab'
         
     | 
| 
       40 
     | 
    
         
            -
                expect(tokens[0].to_h).to eq type: :literal, token: :literal, text: 'ab', ts: 0, te: 2, level: 0, set_level: 0, conditional_level: 0
         
     | 
| 
       41 
     | 
    
         
            -
             
     | 
| 
       42 
     | 
    
         
            -
                expect(tokens[2].text).to eq '?'
         
     | 
| 
       43 
     | 
    
         
            -
                expect(tokens[2].to_h).to eq type: :quantifier, token: :zero_or_one, text: '?', ts: 3, te: 4, level: 0, set_level: 0, conditional_level: 0
         
     | 
| 
       44 
     | 
    
         
            -
              end
         
     | 
| 
       45 
     | 
    
         
            -
             
     | 
| 
       46 
     | 
    
         
            -
              specify('#next') do
         
     | 
| 
       47 
     | 
    
         
            -
                regexp = /a+b?c*d{2,3}/
         
     | 
| 
       48 
     | 
    
         
            -
                tokens = RL.lex(regexp)
         
     | 
| 
       49 
     | 
    
         
            -
             
     | 
| 
       50 
     | 
    
         
            -
                a = tokens.first
         
     | 
| 
       51 
     | 
    
         
            -
                expect(a.text).to eq 'a'
         
     | 
| 
       52 
     | 
    
         
            -
             
     | 
| 
       53 
     | 
    
         
            -
                plus = a.next
         
     | 
| 
       54 
     | 
    
         
            -
                expect(plus.text).to eq '+'
         
     | 
| 
       55 
     | 
    
         
            -
             
     | 
| 
       56 
     | 
    
         
            -
                b = plus.next
         
     | 
| 
       57 
     | 
    
         
            -
                expect(b.text).to eq 'b'
         
     | 
| 
       58 
     | 
    
         
            -
             
     | 
| 
       59 
     | 
    
         
            -
                interval = tokens.last
         
     | 
| 
       60 
     | 
    
         
            -
                expect(interval.text).to eq '{2,3}'
         
     | 
| 
       61 
     | 
    
         
            -
             
     | 
| 
       62 
     | 
    
         
            -
                expect(interval.next).to be_nil
         
     | 
| 
       63 
     | 
    
         
            -
              end
         
     | 
| 
       64 
     | 
    
         
            -
             
     | 
| 
       65 
     | 
    
         
            -
              specify('#previous') do
         
     | 
| 
       66 
     | 
    
         
            -
                regexp = /a+b?c*d{2,3}/
         
     | 
| 
       67 
     | 
    
         
            -
                tokens = RL.lex(regexp)
         
     | 
| 
       68 
     | 
    
         
            -
             
     | 
| 
       69 
     | 
    
         
            -
                interval = tokens.last
         
     | 
| 
       70 
     | 
    
         
            -
                expect(interval.text).to eq '{2,3}'
         
     | 
| 
       71 
     | 
    
         
            -
             
     | 
| 
       72 
     | 
    
         
            -
                d = interval.previous
         
     | 
| 
       73 
     | 
    
         
            -
                expect(d.text).to eq 'd'
         
     | 
| 
       74 
     | 
    
         
            -
             
     | 
| 
       75 
     | 
    
         
            -
                star = d.previous
         
     | 
| 
       76 
     | 
    
         
            -
                expect(star.text).to eq '*'
         
     | 
| 
       77 
     | 
    
         
            -
             
     | 
| 
       78 
     | 
    
         
            -
                c = star.previous
         
     | 
| 
       79 
     | 
    
         
            -
                expect(c.text).to eq 'c'
         
     | 
| 
       80 
     | 
    
         
            -
             
     | 
| 
       81 
     | 
    
         
            -
                a = tokens.first
         
     | 
| 
       82 
     | 
    
         
            -
                expect(a.text).to eq 'a'
         
     | 
| 
       83 
     | 
    
         
            -
                expect(a.previous).to be_nil
         
     | 
| 
       84 
     | 
    
         
            -
              end
         
     | 
| 
       85 
     | 
    
         
            -
            end
         
     |