srl_ruby 0.4.3 → 0.4.7
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 +5 -5
 - data/.rubocop.yml +278 -22
 - data/CHANGELOG.md +43 -1
 - data/Gemfile +2 -0
 - data/LICENSE.txt +1 -1
 - data/README.md +1 -1
 - data/Rakefile +3 -0
 - data/appveyor.yml +15 -14
 - data/bin/srl2ruby +17 -12
 - data/bin/srl2ruby_cli_parser.rb +6 -6
 - data/features/lib/step_definitions/srl_testing_steps.rb +2 -0
 - data/features/lib/support/env..rb +2 -0
 - data/lib/regex/abstract_method.rb +2 -0
 - data/lib/regex/alternation.rb +3 -3
 - data/lib/regex/anchor.rb +3 -0
 - data/lib/regex/atomic_expression.rb +2 -0
 - data/lib/regex/capturing_group.rb +8 -3
 - data/lib/regex/char_class.rb +4 -2
 - data/lib/regex/char_range.rb +4 -3
 - data/lib/regex/char_shorthand.rb +3 -0
 - data/lib/regex/character.rb +7 -2
 - data/lib/regex/compound_expression.rb +2 -0
 - data/lib/regex/concatenation.rb +3 -1
 - data/lib/regex/expression.rb +6 -1
 - data/lib/regex/lookaround.rb +3 -1
 - data/lib/regex/match_option.rb +2 -0
 - data/lib/regex/monadic_expression.rb +2 -0
 - data/lib/regex/multiplicity.rb +9 -9
 - data/lib/regex/non_capturing_group.rb +3 -1
 - data/lib/regex/polyadic_expression.rb +4 -0
 - data/lib/regex/quantifiable.rb +3 -1
 - data/lib/regex/raw_expression.rb +2 -0
 - data/lib/regex/repetition.rb +2 -0
 - data/lib/regex/wildcard.rb +2 -5
 - data/lib/srl_ruby/ast_builder.rb +12 -1
 - data/lib/srl_ruby/grammar.rb +48 -46
 - data/lib/srl_ruby/regex_repr.rb +2 -0
 - data/lib/srl_ruby/tokenizer.rb +14 -8
 - data/lib/srl_ruby/version.rb +3 -1
 - data/lib/srl_ruby.rb +2 -0
 - data/spec/acceptance/srl_test_suite_spec.rb +2 -0
 - data/spec/acceptance/support/rule_file_ast_builder.rb +2 -0
 - data/spec/acceptance/support/rule_file_grammar.rb +7 -5
 - data/spec/acceptance/support/rule_file_nodes.rb +2 -0
 - data/spec/acceptance/support/rule_file_parser.rb +2 -0
 - data/spec/acceptance/support/rule_file_tokenizer.rb +14 -8
 - data/spec/regex/atomic_expression_spec.rb +2 -0
 - data/spec/regex/character_spec.rb +12 -6
 - data/spec/regex/match_option_spec.rb +2 -0
 - data/spec/regex/monadic_expression_spec.rb +2 -0
 - data/spec/regex/multiplicity_spec.rb +4 -0
 - data/spec/regex/repetition_spec.rb +2 -0
 - data/spec/spec_helper.rb +2 -0
 - data/spec/srl_ruby/srl_ruby_spec.rb +2 -0
 - data/spec/srl_ruby/tokenizer_spec.rb +3 -1
 - data/spec/srl_ruby_spec.rb +8 -6
 - data/srl_ruby.gemspec +7 -5
 - metadata +16 -18
 - data/lib/srl_ruby/srl_token.rb +0 -23
 - data/spec/acceptance/support/rule_file_token.rb +0 -22
 
    
        data/Gemfile
    CHANGED
    
    
    
        data/LICENSE.txt
    CHANGED
    
    | 
         @@ -5,7 +5,7 @@ the 'srl_test' directory, which is subject to its own license. 
     | 
|
| 
       5 
5 
     | 
    
         | 
| 
       6 
6 
     | 
    
         
             
            The MIT License (MIT)
         
     | 
| 
       7 
7 
     | 
    
         | 
| 
       8 
     | 
    
         
            -
            Copyright (c) 2018 Dimitri Geshef
         
     | 
| 
      
 8 
     | 
    
         
            +
            Copyright (c) 2018-2019 Dimitri Geshef
         
     | 
| 
       9 
9 
     | 
    
         | 
| 
       10 
10 
     | 
    
         
             
            Permission is hereby granted, free of charge, to any person obtaining a copy
         
     | 
| 
       11 
11 
     | 
    
         
             
            of this software and associated documentation files (the "Software"), to deal
         
     | 
    
        data/README.md
    CHANGED
    
    | 
         @@ -15,7 +15,7 @@ With **srl_ruby** you can easily design your patterns in SRL and let *srl_ruby* 
     | 
|
| 
       15 
15 
     | 
    
         
             
            - Ruby API for integrating a SRL parser or compiler with your code.
         
     | 
| 
       16 
16 
     | 
    
         
             
            - 100% pure Ruby with clean design (_not a port from some other language_)
         
     | 
| 
       17 
17 
     | 
    
         
             
            - Minimal runtime dependency ([Rley](https://rubygems.org/gems/rley) gem). Won't drag a bunch of gems...
         
     | 
| 
       18 
     | 
    
         
            -
            - Compatibility: works with 2. 
     | 
| 
      
 18 
     | 
    
         
            +
            - Compatibility: works with Ruby 2.3+ MRI, JRuby
         
     | 
| 
       19 
19 
     | 
    
         
             
            - Portability: tested on both Linux and Windows,...
         
     | 
| 
       20 
20 
     | 
    
         | 
| 
       21 
21 
     | 
    
         
             
            ## Installation
         
     | 
    
        data/Rakefile
    CHANGED
    
    | 
         @@ -1,3 +1,5 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
       1 
3 
     | 
    
         
             
            require 'bundler/gem_tasks'
         
     | 
| 
       2 
4 
     | 
    
         
             
            require 'rspec/core/rake_task' # Rspec as testing tool
         
     | 
| 
       3 
5 
     | 
    
         
             
            require 'cucumber/rake/task' # Cucumber as testing tool
         
     | 
| 
         @@ -8,6 +10,7 @@ RSpec::Core::RakeTask.new do |spec| 
     | 
|
| 
       8 
10 
     | 
    
         
             
            end
         
     | 
| 
       9 
11 
     | 
    
         | 
| 
       10 
12 
     | 
    
         
             
            Cucumber::Rake::Task.new do |_|
         
     | 
| 
      
 13 
     | 
    
         
            +
              # Comment
         
     | 
| 
       11 
14 
     | 
    
         
             
            end
         
     | 
| 
       12 
15 
     | 
    
         | 
| 
       13 
16 
     | 
    
         
             
            # Combine RSpec and Cucumber tests
         
     | 
    
        data/appveyor.yml
    CHANGED
    
    | 
         @@ -1,27 +1,28 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            version: '{build}'
         
     | 
| 
       2 
     | 
    
         
            -
            max_jobs:  
     | 
| 
      
 2 
     | 
    
         
            +
            max_jobs: 5
         
     | 
| 
       3 
3 
     | 
    
         
             
            environment:
         
     | 
| 
       4 
4 
     | 
    
         
             
              matrix:
         
     | 
| 
       5 
     | 
    
         
            -
              - Ruby_version:  
     | 
| 
       6 
     | 
    
         
            -
              - Ruby_version: 21-x64
         
     | 
| 
       7 
     | 
    
         
            -
              - Ruby_version: 22
         
     | 
| 
       8 
     | 
    
         
            -
              - Ruby_version: 22-x64
         
     | 
| 
       9 
     | 
    
         
            -
              - Ruby_version: 23
         
     | 
| 
       10 
     | 
    
         
            -
              - Ruby_version: 23-x64
         
     | 
| 
       11 
     | 
    
         
            -
              - Ruby_version: 24  
         
     | 
| 
       12 
     | 
    
         
            -
              - Ruby_version: 24-x64
         
     | 
| 
       13 
     | 
    
         
            -
              - Ruby_version: 25  
         
     | 
| 
      
 5 
     | 
    
         
            +
              - Ruby_version: 26-x64
         
     | 
| 
       14 
6 
     | 
    
         
             
              - Ruby_version: 25-x64
         
     | 
| 
       15 
     | 
    
         
            -
             
         
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
       17 
     | 
    
         
            -
             
     | 
| 
       18 
     | 
    
         
            -
             
     | 
| 
      
 7 
     | 
    
         
            +
              - Ruby_version: 24-x64
         
     | 
| 
      
 8 
     | 
    
         
            +
              - Ruby_version: 23-x64
         
     | 
| 
      
 9 
     | 
    
         
            +
              - Ruby_version: 26
         
     | 
| 
      
 10 
     | 
    
         
            +
              - Ruby_version: 25
         
     | 
| 
      
 11 
     | 
    
         
            +
              - Ruby_version: 24
         
     | 
| 
      
 12 
     | 
    
         
            +
              - Ruby_version: 23
         
     | 
| 
       19 
13 
     | 
    
         | 
| 
       20 
14 
     | 
    
         
             
            install:
         
     | 
| 
       21 
15 
     | 
    
         
             
              - set PATH=C:\Ruby%Ruby_version%\bin;%PATH%
         
     | 
| 
      
 16 
     | 
    
         
            +
              - gem update --system
         
     | 
| 
      
 17 
     | 
    
         
            +
              - gem install bundler
         
     | 
| 
       22 
18 
     | 
    
         
             
              - bundle install --retry=3 --clean --force
         
     | 
| 
       23 
19 
     | 
    
         | 
| 
       24 
20 
     | 
    
         
             
            build: off
         
     | 
| 
       25 
21 
     | 
    
         | 
| 
      
 22 
     | 
    
         
            +
            before_test:
         
     | 
| 
      
 23 
     | 
    
         
            +
              - ruby -v
         
     | 
| 
      
 24 
     | 
    
         
            +
              - gem -v
         
     | 
| 
      
 25 
     | 
    
         
            +
              - bundle -v
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
       26 
27 
     | 
    
         
             
            test_script:
         
     | 
| 
       27 
28 
     | 
    
         
             
              - bundle exec rake
         
     | 
    
        data/bin/srl2ruby
    CHANGED
    
    | 
         @@ -1,4 +1,6 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            #!/usr/bin/env ruby
         
     | 
| 
      
 2 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
       2 
4 
     | 
    
         
             
            require 'erb'
         
     | 
| 
       3 
5 
     | 
    
         
             
            require 'rubygems'
         
     | 
| 
       4 
6 
     | 
    
         
             
            require 'pathname'
         
     | 
| 
         @@ -7,10 +9,14 @@ require_relative '../lib/srl_ruby' 
     | 
|
| 
       7 
9 
     | 
    
         
             
            require_relative 'srl2ruby_cli_parser'
         
     | 
| 
       8 
10 
     | 
    
         | 
| 
       9 
11 
     | 
    
         
             
            class Srl2RubyProg
         
     | 
| 
       10 
     | 
    
         
            -
              DefaultSRLExtension = 'srl' 
     | 
| 
       11 
     | 
    
         
            -
              DefDirname = '/templates' 
     | 
| 
       12 
     | 
    
         
            -
              DefTemplate = 'base.erb' 
     | 
| 
      
 12 
     | 
    
         
            +
              DefaultSRLExtension = 'srl'
         
     | 
| 
      
 13 
     | 
    
         
            +
              DefDirname = '/templates'
         
     | 
| 
      
 14 
     | 
    
         
            +
              DefTemplate = 'base.erb'
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
              # @return [Hash]
         
     | 
| 
       13 
17 
     | 
    
         
             
              attr_reader(:cli_options)
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
              # @return [ERB]
         
     | 
| 
       14 
20 
     | 
    
         
             
              attr_reader(:template)
         
     | 
| 
       15 
21 
     | 
    
         | 
| 
       16 
22 
     | 
    
         
             
              def initialize(prog_name, args)
         
     | 
| 
         @@ -23,11 +29,12 @@ class Srl2RubyProg 
     | 
|
| 
       23 
29 
     | 
    
         
             
              def run!(file_names)
         
     | 
| 
       24 
30 
     | 
    
         
             
                if cli_options.include?(:pattern)
         
     | 
| 
       25 
31 
     | 
    
         
             
                  srl_source = cli_options[:pattern]
         
     | 
| 
       26 
     | 
    
         
            -
                  process_srl(srl_source) 
     | 
| 
      
 32 
     | 
    
         
            +
                  process_srl(srl_source)
         
     | 
| 
       27 
33 
     | 
    
         
             
                end
         
     | 
| 
       28 
34 
     | 
    
         
             
                file_names.each do |srl_file|
         
     | 
| 
       29 
35 
     | 
    
         
             
                  fname = validate_filename(srl_file)
         
     | 
| 
       30 
36 
     | 
    
         
             
                  next unless file_exist?(fname)
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
       31 
38 
     | 
    
         
             
                  puts "Parsing file '#{fname}'"
         
     | 
| 
       32 
39 
     | 
    
         
             
                  srl_source = File.read(fname)
         
     | 
| 
       33 
40 
     | 
    
         
             
                  process_srl(srl_source)
         
     | 
| 
         @@ -46,18 +53,16 @@ class Srl2RubyProg 
     | 
|
| 
       46 
53 
     | 
    
         
             
                  fname = cli_options[:template]
         
     | 
| 
       47 
54 
     | 
    
         
             
                  exists = File.exist?(fname)
         
     | 
| 
       48 
55 
     | 
    
         
             
                  if exists
         
     | 
| 
       49 
     | 
    
         
            -
                    t_filepath = Dir.getwd 
     | 
| 
      
 56 
     | 
    
         
            +
                    t_filepath = "#{Dir.getwd}/#{fname}"
         
     | 
| 
       50 
57 
     | 
    
         
             
                  else
         
     | 
| 
       51 
     | 
    
         
            -
                    t_filepath = def_template_dir 
     | 
| 
      
 58 
     | 
    
         
            +
                    t_filepath = "#{def_template_dir}/#{fname}"
         
     | 
| 
       52 
59 
     | 
    
         
             
                    exit(1) unless file_exist?(t_filepath)
         
     | 
| 
       53 
60 
     | 
    
         
             
                  end
         
     | 
| 
       54 
61 
     | 
    
         
             
                else
         
     | 
| 
       55 
     | 
    
         
            -
                  t_filepath = def_template_dir 
     | 
| 
      
 62 
     | 
    
         
            +
                  t_filepath = "#{def_template_dir}/#{DefTemplate}"
         
     | 
| 
       56 
63 
     | 
    
         
             
                end
         
     | 
| 
       57 
64 
     | 
    
         
             
                path = Pathname.new(t_filepath)
         
     | 
| 
       58 
     | 
    
         
            -
                 
     | 
| 
       59 
     | 
    
         
            -
             
     | 
| 
       60 
     | 
    
         
            -
                erb_template
         
     | 
| 
      
 65 
     | 
    
         
            +
                ERB.new(path.read, nil, '<>')
         
     | 
| 
       61 
66 
     | 
    
         
             
              end
         
     | 
| 
       62 
67 
     | 
    
         | 
| 
       63 
68 
     | 
    
         
             
              def validate_filename(raw_fname)
         
     | 
| 
         @@ -76,7 +81,7 @@ class Srl2RubyProg 
     | 
|
| 
       76 
81 
     | 
    
         | 
| 
       77 
82 
     | 
    
         
             
                exists
         
     | 
| 
       78 
83 
     | 
    
         
             
              end
         
     | 
| 
       79 
     | 
    
         
            -
             
     | 
| 
      
 84 
     | 
    
         
            +
             
     | 
| 
       80 
85 
     | 
    
         
             
              def process_srl(srl_source)
         
     | 
| 
       81 
86 
     | 
    
         
             
                result = SrlRuby.parse(srl_source)
         
     | 
| 
       82 
87 
     | 
    
         
             
                destination = $stdout
         
     | 
| 
         @@ -85,7 +90,7 @@ class Srl2RubyProg 
     | 
|
| 
       85 
90 
     | 
    
         
             
                  destination = File.open(filepath, 'w')
         
     | 
| 
       86 
91 
     | 
    
         
             
                end
         
     | 
| 
       87 
92 
     | 
    
         
             
                puts "Writing to file '#{filepath}'" unless destination == $stdout
         
     | 
| 
       88 
     | 
    
         
            -
                destination.puts emit_code(template, srl_source, result) 
     | 
| 
      
 93 
     | 
    
         
            +
                destination.puts emit_code(template, srl_source, result)
         
     | 
| 
       89 
94 
     | 
    
         
             
              end
         
     | 
| 
       90 
95 
     | 
    
         | 
| 
       91 
96 
     | 
    
         
             
              def emit_code(template, srl_source, regexp)
         
     | 
    
        data/bin/srl2ruby_cli_parser.rb
    CHANGED
    
    | 
         @@ -1,3 +1,5 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
       1 
3 
     | 
    
         
             
            require 'optparse' # Use standard OptionParser class for command-line parsing
         
     | 
| 
       2 
4 
     | 
    
         | 
| 
       3 
5 
     | 
    
         
             
            # A command-line option parser for the srl2ruby compiler.
         
     | 
| 
         @@ -13,7 +15,7 @@ class Srl2RubyCLIParser < OptionParser 
     | 
|
| 
       13 
15 
     | 
    
         | 
| 
       14 
16 
     | 
    
         
             
                heading
         
     | 
| 
       15 
17 
     | 
    
         
             
                separator 'Options:'
         
     | 
| 
       16 
     | 
    
         
            -
                add_p_option 
     | 
| 
      
 18 
     | 
    
         
            +
                add_p_option
         
     | 
| 
       17 
19 
     | 
    
         
             
                add_o_option
         
     | 
| 
       18 
20 
     | 
    
         
             
                add_t_option
         
     | 
| 
       19 
21 
     | 
    
         
             
                separator ''
         
     | 
| 
         @@ -35,7 +37,7 @@ class Srl2RubyCLIParser < OptionParser 
     | 
|
| 
       35 
37 
     | 
    
         
             
              end
         
     | 
| 
       36 
38 
     | 
    
         | 
| 
       37 
39 
     | 
    
         
             
              def description
         
     | 
| 
       38 
     | 
    
         
            -
                 
     | 
| 
      
 40 
     | 
    
         
            +
                <<-DESCR
         
     | 
| 
       39 
41 
     | 
    
         
             
            Description:
         
     | 
| 
       40 
42 
     | 
    
         
             
              Parses a SRL file and compiles it into a Ruby Regexp literal.
         
     | 
| 
       41 
43 
     | 
    
         
             
              Simple Regex Language (SRL) website: https://simple-regex.com
         
     | 
| 
         @@ -45,8 +47,6 @@ Examples: 
     | 
|
| 
       45 
47 
     | 
    
         
             
              #{program_name} -p 'begin with literally "Hello world!"'
         
     | 
| 
       46 
48 
     | 
    
         
             
              #{program_name} example.srl -o example_re.rb -t srl_and_ruby.erb
         
     | 
| 
       47 
49 
     | 
    
         
             
            DESCR
         
     | 
| 
       48 
     | 
    
         
            -
             
     | 
| 
       49 
     | 
    
         
            -
                descr
         
     | 
| 
       50 
50 
     | 
    
         
             
              end
         
     | 
| 
       51 
51 
     | 
    
         | 
| 
       52 
52 
     | 
    
         
             
              def heading
         
     | 
| 
         @@ -63,14 +63,14 @@ DESCR 
     | 
|
| 
       63 
63 
     | 
    
         
             
                  @parsed_options[:output] = pathname
         
     | 
| 
       64 
64 
     | 
    
         
             
                end
         
     | 
| 
       65 
65 
     | 
    
         
             
              end
         
     | 
| 
       66 
     | 
    
         
            -
             
     | 
| 
      
 66 
     | 
    
         
            +
             
     | 
| 
       67 
67 
     | 
    
         
             
              def add_p_option
         
     | 
| 
       68 
68 
     | 
    
         
             
                explanation = 'One-liner SRL pattern.'
         
     | 
| 
       69 
69 
     | 
    
         | 
| 
       70 
70 
     | 
    
         
             
                on '-p', '--pattern SRL_PATT', explanation do |pattern_arg|
         
     | 
| 
       71 
71 
     | 
    
         
             
                   @parsed_options[:pattern] = pattern_arg.gsub(/^'|'$/, '')
         
     | 
| 
       72 
72 
     | 
    
         
             
                end
         
     | 
| 
       73 
     | 
    
         
            -
              end 
     | 
| 
      
 73 
     | 
    
         
            +
              end
         
     | 
| 
       74 
74 
     | 
    
         | 
| 
       75 
75 
     | 
    
         
             
              def add_t_option
         
     | 
| 
       76 
76 
     | 
    
         
             
                explanation = <<-EXPLANATION
         
     | 
    
        data/lib/regex/alternation.rb
    CHANGED
    
    | 
         @@ -1,3 +1,5 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
       1 
3 
     | 
    
         
             
            # File: alternation.rb
         
     | 
| 
       2 
4 
     | 
    
         | 
| 
       3 
5 
     | 
    
         
             
            require_relative 'polyadic_expression' # Access the superclass
         
     | 
| 
         @@ -17,9 +19,7 @@ module Regex # This module is used as a namespace 
     | 
|
| 
       17 
19 
     | 
    
         
             
                # Purpose: Return the String representation of the concatented expressions.
         
     | 
| 
       18 
20 
     | 
    
         
             
                def text_repr
         
     | 
| 
       19 
21 
     | 
    
         
             
                  result_children = children.map(&:to_str)
         
     | 
| 
       20 
     | 
    
         
            -
                   
     | 
| 
       21 
     | 
    
         
            -
             
     | 
| 
       22 
     | 
    
         
            -
                  return result
         
     | 
| 
      
 22 
     | 
    
         
            +
                  "(?:#{result_children.join('|')})"
         
     | 
| 
       23 
23 
     | 
    
         
             
                end
         
     | 
| 
       24 
24 
     | 
    
         
             
              end # class
         
     | 
| 
       25 
25 
     | 
    
         
             
            end # module
         
     | 
    
        data/lib/regex/anchor.rb
    CHANGED
    
    | 
         @@ -1,3 +1,5 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
       1 
3 
     | 
    
         
             
            # File: anchor.rb
         
     | 
| 
       2 
4 
     | 
    
         | 
| 
       3 
5 
     | 
    
         
             
            require_relative 'atomic_expression' # Access the superclass
         
     | 
| 
         @@ -24,6 +26,7 @@ module Regex # This module is used as a namespace 
     | 
|
| 
       24 
26 
     | 
    
         
             
                # Constructor
         
     | 
| 
       25 
27 
     | 
    
         
             
                # @param aKind [String] Lexeme representation of the anchor
         
     | 
| 
       26 
28 
     | 
    
         
             
                def initialize(aKind)
         
     | 
| 
      
 29 
     | 
    
         
            +
                  super()
         
     | 
| 
       27 
30 
     | 
    
         
             
                  @kind = valid_kind(aKind)
         
     | 
| 
       28 
31 
     | 
    
         
             
                end
         
     | 
| 
       29 
32 
     | 
    
         | 
| 
         @@ -1,3 +1,5 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
       1 
3 
     | 
    
         
             
            # File: capturing_group.rb
         
     | 
| 
       2 
4 
     | 
    
         | 
| 
       3 
5 
     | 
    
         
             
            require_relative 'monadic_expression' # Access the superclass
         
     | 
| 
         @@ -6,6 +8,8 @@ module Regex # This module is used as a namespace 
     | 
|
| 
       6 
8 
     | 
    
         
             
              # An association between a capture variable and an expression
         
     | 
| 
       7 
9 
     | 
    
         
             
              # the subject text in the same serial arrangement
         
     | 
| 
       8 
10 
     | 
    
         
             
              class CapturingGroup < MonadicExpression
         
     | 
| 
      
 11 
     | 
    
         
            +
                # rubocop: disable Style/OptionalBooleanParameter
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
       9 
13 
     | 
    
         
             
                # The capture variable id. It is a Fixnum when the capture group gets
         
     | 
| 
       10 
14 
     | 
    
         
             
                # a sequence number,
         
     | 
| 
       11 
15 
     | 
    
         
             
                # a String when it is an user-defined name
         
     | 
| 
         @@ -40,12 +44,13 @@ module Regex # This module is used as a namespace 
     | 
|
| 
       40 
44 
     | 
    
         
             
                  atomic = no_backtrack ? '?>' : ''
         
     | 
| 
       41 
45 
     | 
    
         
             
                  if child.is_a?(Regex::NonCapturingGroup)
         
     | 
| 
       42 
46 
     | 
    
         
             
                    # Minor optimization
         
     | 
| 
       43 
     | 
    
         
            -
                     
     | 
| 
      
 47 
     | 
    
         
            +
                    suffix = child.child.to_str
         
     | 
| 
       44 
48 
     | 
    
         
             
                  else
         
     | 
| 
       45 
     | 
    
         
            -
                     
     | 
| 
      
 49 
     | 
    
         
            +
                    suffix = child.to_str
         
     | 
| 
       46 
50 
     | 
    
         
             
                  end
         
     | 
| 
       47 
     | 
    
         
            -
                   
     | 
| 
      
 51 
     | 
    
         
            +
                  "(#{atomic}#{prefix}#{suffix})"
         
     | 
| 
       48 
52 
     | 
    
         
             
                end
         
     | 
| 
      
 53 
     | 
    
         
            +
                # rubocop: enable Style/OptionalBooleanParameter
         
     | 
| 
       49 
54 
     | 
    
         
             
              end # class
         
     | 
| 
       50 
55 
     | 
    
         
             
            end # module
         
     | 
| 
       51 
56 
     | 
    
         | 
    
        data/lib/regex/char_class.rb
    CHANGED
    
    | 
         @@ -1,3 +1,5 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
       1 
3 
     | 
    
         
             
            # File: char_class.rb
         
     | 
| 
       2 
4 
     | 
    
         | 
| 
       3 
5 
     | 
    
         
             
            require_relative 'polyadic_expression' # Access the superclass
         
     | 
| 
         @@ -22,13 +24,13 @@ module Regex # This module is used as a namespace 
     | 
|
| 
       22 
24 
     | 
    
         
             
                # Conversion method re-definition.
         
     | 
| 
       23 
25 
     | 
    
         
             
                # Purpose: Return the String representation of the character class.
         
     | 
| 
       24 
26 
     | 
    
         
             
                def text_repr
         
     | 
| 
       25 
     | 
    
         
            -
                  result_children = children.inject('') do |sub_result, child|
         
     | 
| 
      
 27 
     | 
    
         
            +
                  result_children = children.inject(+'') do |sub_result, child|
         
     | 
| 
       26 
28 
     | 
    
         
             
                    if child.kind_of?(Regex::Character) && Metachars.include?(child.codepoint)
         
     | 
| 
       27 
29 
     | 
    
         
             
                      sub_result << '\\' # Escape meta-character...
         
     | 
| 
       28 
30 
     | 
    
         
             
                    end
         
     | 
| 
       29 
31 
     | 
    
         
             
                    sub_result << child.to_str
         
     | 
| 
       30 
32 
     | 
    
         
             
                  end
         
     | 
| 
       31 
     | 
    
         
            -
                  result =  
     | 
| 
      
 33 
     | 
    
         
            +
                  result = "[#{negated ? '^' : ''}#{result_children}]"
         
     | 
| 
       32 
34 
     | 
    
         | 
| 
       33 
35 
     | 
    
         
             
                  return result
         
     | 
| 
       34 
36 
     | 
    
         
             
                end
         
     | 
    
        data/lib/regex/char_range.rb
    CHANGED
    
    | 
         @@ -1,3 +1,5 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
       1 
3 
     | 
    
         
             
            # File: char_range.rb
         
     | 
| 
       2 
4 
     | 
    
         | 
| 
       3 
5 
     | 
    
         
             
            require_relative 'polyadic_expression' # Access the superclass
         
     | 
| 
         @@ -32,9 +34,7 @@ module Regex # This module is used as a namespace 
     | 
|
| 
       32 
34 
     | 
    
         
             
                # Conversion method re-definition.
         
     | 
| 
       33 
35 
     | 
    
         
             
                # Purpose: Return the String representation of the concatented expressions.
         
     | 
| 
       34 
36 
     | 
    
         
             
                def text_repr
         
     | 
| 
       35 
     | 
    
         
            -
                   
     | 
| 
       36 
     | 
    
         
            -
             
     | 
| 
       37 
     | 
    
         
            -
                  return result
         
     | 
| 
      
 37 
     | 
    
         
            +
                  "#{lower.to_str}-#{upper.to_str}"
         
     | 
| 
       38 
38 
     | 
    
         
             
                end
         
     | 
| 
       39 
39 
     | 
    
         | 
| 
       40 
40 
     | 
    
         
             
                private
         
     | 
| 
         @@ -43,6 +43,7 @@ module Regex # This module is used as a namespace 
     | 
|
| 
       43 
43 
     | 
    
         
             
                def validated_range(theLowerBound, theUpperBound)
         
     | 
| 
       44 
44 
     | 
    
         
             
                  msg = 'Character range error: lower bound is greater than upper bound.'
         
     | 
| 
       45 
45 
     | 
    
         
             
                  raise StandardError, msg if theLowerBound.codepoint > theUpperBound.codepoint
         
     | 
| 
      
 46 
     | 
    
         
            +
             
     | 
| 
       46 
47 
     | 
    
         
             
                  return [theLowerBound, theUpperBound]
         
     | 
| 
       47 
48 
     | 
    
         
             
                end
         
     | 
| 
       48 
49 
     | 
    
         
             
              end # class
         
     | 
    
        data/lib/regex/char_shorthand.rb
    CHANGED
    
    | 
         @@ -1,3 +1,5 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
       1 
3 
     | 
    
         
             
            # File: char_shorthand.rb
         
     | 
| 
       2 
4 
     | 
    
         | 
| 
       3 
5 
     | 
    
         
             
            require_relative 'atomic_expression' # Access the superclass
         
     | 
| 
         @@ -24,6 +26,7 @@ module Regex # This module is used as a namespace 
     | 
|
| 
       24 
26 
     | 
    
         | 
| 
       25 
27 
     | 
    
         
             
                # Constructor
         
     | 
| 
       26 
28 
     | 
    
         
             
                def initialize(aShortname)
         
     | 
| 
      
 29 
     | 
    
         
            +
                  super()
         
     | 
| 
       27 
30 
     | 
    
         
             
                  @shortname = valid_shortname(aShortname)
         
     | 
| 
       28 
31 
     | 
    
         
             
                end
         
     | 
| 
       29 
32 
     | 
    
         | 
    
        data/lib/regex/character.rb
    CHANGED
    
    | 
         @@ -1,3 +1,5 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
       1 
3 
     | 
    
         
             
            # File: character.rb
         
     | 
| 
       2 
4 
     | 
    
         | 
| 
       3 
5 
     | 
    
         
             
            require_relative 'atomic_expression' # Access the superclass
         
     | 
| 
         @@ -25,8 +27,8 @@ module Regex # This module is used as a namespace 
     | 
|
| 
       25 
27 
     | 
    
         
             
                  '\7' => 7
         
     | 
| 
       26 
28 
     | 
    
         
             
                }.freeze
         
     | 
| 
       27 
29 
     | 
    
         | 
| 
       28 
     | 
    
         
            -
                MetaChars = '\^$.|+?*()[]{}' 
     | 
| 
       29 
     | 
    
         
            -
                MetaCharsInClass = '\^[]-' 
     | 
| 
      
 30 
     | 
    
         
            +
                MetaChars = '\^$.|+?*()[]{}'
         
     | 
| 
      
 31 
     | 
    
         
            +
                MetaCharsInClass = '\^[]-' # Characters with special meaning in char. class
         
     | 
| 
       30 
32 
     | 
    
         | 
| 
       31 
33 
     | 
    
         
             
                # The integer value that uniquely identifies the character.
         
     | 
| 
       32 
34 
     | 
    
         
             
                attr_reader(:codepoint)
         
     | 
| 
         @@ -57,6 +59,7 @@ module Regex # This module is used as a namespace 
     | 
|
| 
       57 
59 
     | 
    
         
             
                # RegAn::Character.new('\n')    # Represents a newline
         
     | 
| 
       58 
60 
     | 
    
         
             
                # RegAn::Character.new('\u03a3')  # Represents a Σ
         
     | 
| 
       59 
61 
     | 
    
         
             
                def initialize(aValue)
         
     | 
| 
      
 62 
     | 
    
         
            +
                  super()
         
     | 
| 
       60 
63 
     | 
    
         
             
                  case aValue
         
     | 
| 
       61 
64 
     | 
    
         
             
                    when String
         
     | 
| 
       62 
65 
     | 
    
         
             
                      if aValue.size == 1
         
     | 
| 
         @@ -103,6 +106,7 @@ module Regex # This module is used as a namespace 
     | 
|
| 
       103 
106 
     | 
    
         
             
                def self.esc2codepoint(esc_seq)
         
     | 
| 
       104 
107 
     | 
    
         
             
                  msg = "Escape sequence #{esc_seq} does not begin with a backslash (\)."
         
     | 
| 
       105 
108 
     | 
    
         
             
                  raise StandardError, msg unless esc_seq[0] == '\\'
         
     | 
| 
      
 109 
     | 
    
         
            +
             
     | 
| 
       106 
110 
     | 
    
         
             
                  result = (esc_seq.length == 2) ? digram2codepoint(esc_seq) : esc_number2codepoint(esc_seq)
         
     | 
| 
       107 
111 
     | 
    
         | 
| 
       108 
112 
     | 
    
         
             
                  return result
         
     | 
| 
         @@ -155,6 +159,7 @@ module Regex # This module is used as a namespace 
     | 
|
| 
       155 
159 
     | 
    
         
             
                # Otherwise the character corresponding to the codepoint is returned.
         
     | 
| 
       156 
160 
     | 
    
         
             
                def text_repr
         
     | 
| 
       157 
161 
     | 
    
         
             
                  return char if lexeme.nil?
         
     | 
| 
      
 162 
     | 
    
         
            +
             
     | 
| 
       158 
163 
     | 
    
         
             
                  return lexeme.dup
         
     | 
| 
       159 
164 
     | 
    
         
             
                end
         
     | 
| 
       160 
165 
     | 
    
         | 
    
        data/lib/regex/concatenation.rb
    CHANGED
    
    | 
         @@ -1,3 +1,5 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
       1 
3 
     | 
    
         
             
            # File: concatenation.rb
         
     | 
| 
       2 
4 
     | 
    
         | 
| 
       3 
5 
     | 
    
         
             
            require_relative 'polyadic_expression' # Access the superclass
         
     | 
| 
         @@ -17,7 +19,7 @@ module Regex # This module is used as a namespace 
     | 
|
| 
       17 
19 
     | 
    
         
             
                # Conversion method re-definition.
         
     | 
| 
       18 
20 
     | 
    
         
             
                # Purpose: Return the String representation of the concatented expressions.
         
     | 
| 
       19 
21 
     | 
    
         
             
                def text_repr
         
     | 
| 
       20 
     | 
    
         
            -
                  outcome = children.inject('') do |result, child|
         
     | 
| 
      
 22 
     | 
    
         
            +
                  outcome = children.inject(+'') do |result, child|
         
     | 
| 
       21 
23 
     | 
    
         
             
                    result << child.to_str
         
     | 
| 
       22 
24 
     | 
    
         
             
                  end
         
     | 
| 
       23 
25 
     | 
    
         | 
    
        data/lib/regex/expression.rb
    CHANGED
    
    | 
         @@ -1,3 +1,5 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
       1 
3 
     | 
    
         
             
            # File: expression.rb
         
     | 
| 
       2 
4 
     | 
    
         | 
| 
       3 
5 
     | 
    
         
             
            require_relative 'abstract_method'
         
     | 
| 
         @@ -5,7 +7,10 @@ require_relative 'abstract_method' 
     | 
|
| 
       5 
7 
     | 
    
         
             
            module Regex # This module is used as a namespace
         
     | 
| 
       6 
8 
     | 
    
         
             
              # Abstract class. The generalization of any valid regular (sub)expression.
         
     | 
| 
       7 
9 
     | 
    
         
             
              class Expression
         
     | 
| 
      
 10 
     | 
    
         
            +
                # @return [NilClass, Anchor]
         
     | 
| 
       8 
11 
     | 
    
         
             
                attr_accessor :begin_anchor
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
                # @return [NilClass, Anchor]
         
     | 
| 
       9 
14 
     | 
    
         
             
                attr_accessor :end_anchor
         
     | 
| 
       10 
15 
     | 
    
         | 
| 
       11 
16 
     | 
    
         
             
                # Constructor
         
     | 
| 
         @@ -31,7 +36,7 @@ module Regex # This module is used as a namespace 
     | 
|
| 
       31 
36 
     | 
    
         
             
                # Template method.
         
     | 
| 
       32 
37 
     | 
    
         
             
                # @return [String] text representation of the expression.
         
     | 
| 
       33 
38 
     | 
    
         
             
                def to_str
         
     | 
| 
       34 
     | 
    
         
            -
                  result = ''
         
     | 
| 
      
 39 
     | 
    
         
            +
                  result = +''
         
     | 
| 
       35 
40 
     | 
    
         
             
                  result << prefix
         
     | 
| 
       36 
41 
     | 
    
         
             
                  result << text_repr
         
     | 
| 
       37 
42 
     | 
    
         
             
                  result << suffix
         
     |