srl_ruby 0.4.3 → 0.4.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. checksums.yaml +5 -5
  2. data/.rubocop.yml +278 -22
  3. data/CHANGELOG.md +43 -1
  4. data/Gemfile +2 -0
  5. data/LICENSE.txt +1 -1
  6. data/README.md +1 -1
  7. data/Rakefile +3 -0
  8. data/appveyor.yml +15 -14
  9. data/bin/srl2ruby +17 -12
  10. data/bin/srl2ruby_cli_parser.rb +6 -6
  11. data/features/lib/step_definitions/srl_testing_steps.rb +2 -0
  12. data/features/lib/support/env..rb +2 -0
  13. data/lib/regex/abstract_method.rb +2 -0
  14. data/lib/regex/alternation.rb +3 -3
  15. data/lib/regex/anchor.rb +3 -0
  16. data/lib/regex/atomic_expression.rb +2 -0
  17. data/lib/regex/capturing_group.rb +8 -3
  18. data/lib/regex/char_class.rb +4 -2
  19. data/lib/regex/char_range.rb +4 -3
  20. data/lib/regex/char_shorthand.rb +3 -0
  21. data/lib/regex/character.rb +7 -2
  22. data/lib/regex/compound_expression.rb +2 -0
  23. data/lib/regex/concatenation.rb +3 -1
  24. data/lib/regex/expression.rb +6 -1
  25. data/lib/regex/lookaround.rb +3 -1
  26. data/lib/regex/match_option.rb +2 -0
  27. data/lib/regex/monadic_expression.rb +2 -0
  28. data/lib/regex/multiplicity.rb +9 -9
  29. data/lib/regex/non_capturing_group.rb +3 -1
  30. data/lib/regex/polyadic_expression.rb +4 -0
  31. data/lib/regex/quantifiable.rb +3 -1
  32. data/lib/regex/raw_expression.rb +2 -0
  33. data/lib/regex/repetition.rb +2 -0
  34. data/lib/regex/wildcard.rb +2 -5
  35. data/lib/srl_ruby/ast_builder.rb +12 -1
  36. data/lib/srl_ruby/grammar.rb +48 -46
  37. data/lib/srl_ruby/regex_repr.rb +2 -0
  38. data/lib/srl_ruby/tokenizer.rb +14 -8
  39. data/lib/srl_ruby/version.rb +3 -1
  40. data/lib/srl_ruby.rb +2 -0
  41. data/spec/acceptance/srl_test_suite_spec.rb +2 -0
  42. data/spec/acceptance/support/rule_file_ast_builder.rb +2 -0
  43. data/spec/acceptance/support/rule_file_grammar.rb +7 -5
  44. data/spec/acceptance/support/rule_file_nodes.rb +2 -0
  45. data/spec/acceptance/support/rule_file_parser.rb +2 -0
  46. data/spec/acceptance/support/rule_file_tokenizer.rb +14 -8
  47. data/spec/regex/atomic_expression_spec.rb +2 -0
  48. data/spec/regex/character_spec.rb +12 -6
  49. data/spec/regex/match_option_spec.rb +2 -0
  50. data/spec/regex/monadic_expression_spec.rb +2 -0
  51. data/spec/regex/multiplicity_spec.rb +4 -0
  52. data/spec/regex/repetition_spec.rb +2 -0
  53. data/spec/spec_helper.rb +2 -0
  54. data/spec/srl_ruby/srl_ruby_spec.rb +2 -0
  55. data/spec/srl_ruby/tokenizer_spec.rb +3 -1
  56. data/spec/srl_ruby_spec.rb +8 -6
  57. data/srl_ruby.gemspec +7 -5
  58. metadata +16 -18
  59. data/lib/srl_ruby/srl_token.rb +0 -23
  60. data/spec/acceptance/support/rule_file_token.rb +0 -22
data/Gemfile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source 'https://rubygems.org'
2
4
 
3
5
  git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
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.x+ MRI, JRuby
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: 3
2
+ max_jobs: 5
3
3
  environment:
4
4
  matrix:
5
- - Ruby_version: 21
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
- # These are failing
17
- # - Ruby_version: 26
18
- # - Ruby_version: 26-x64
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'.freeze
11
- DefDirname = '/templates'.freeze
12
- DefTemplate = 'base.erb'.freeze
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 + '/' + fname
56
+ t_filepath = "#{Dir.getwd}/#{fname}"
50
57
  else
51
- t_filepath = def_template_dir + '/' + fname
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 + '/' + DefTemplate
62
+ t_filepath = "#{def_template_dir}/#{DefTemplate}"
56
63
  end
57
64
  path = Pathname.new(t_filepath)
58
- erb_template = ERB.new(path.read, nil, '<>')
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)
@@ -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
- descr = <<-DESCR
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
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  When('I define the following SRL expression:') do |srl_source|
2
4
  @regex = SrlRuby::parse(srl_source)
3
5
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rspec'
2
4
  require 'cucumber'
3
5
  require 'srl_ruby'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # File: abstract_method.rb
2
4
 
3
5
  # Mix-in module. Provides the method 'abstract_method' that raises an exception
@@ -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
- result = '(?:' + result_children.join('|') + ')'
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: atomic_expression.rb
2
4
 
3
5
  require_relative 'expression' # Access the superclass
@@ -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
- result = '(' + atomic + prefix + child.child.to_str + ')'
47
+ suffix = child.child.to_str
44
48
  else
45
- result = '(' + atomic + prefix + child.to_str + ')'
49
+ suffix = child.to_str
46
50
  end
47
- return result
51
+ "(#{atomic}#{prefix}#{suffix})"
48
52
  end
53
+ # rubocop: enable Style/OptionalBooleanParameter
49
54
  end # class
50
55
  end # module
51
56
 
@@ -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 = '[' + (negated ? '^' : '') + result_children + ']'
33
+ result = "[#{negated ? '^' : ''}#{result_children}]"
32
34
 
33
35
  return result
34
36
  end
@@ -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
- result = lower.to_str + '-' + upper.to_str
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
@@ -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
 
@@ -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 = '\^$.|+?*()[]{}'.freeze
29
- MetaCharsInClass = '\^[]-'.freeze # Characters with special meaning in char. class
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
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # File: compound_expression.rb
2
4
 
3
5
  require_relative 'expression' # Access the superclass
@@ -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
 
@@ -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