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/lib/regex/lookaround.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# File: Lookaround.rb
|
2
4
|
|
3
5
|
########################
|
@@ -40,7 +42,7 @@ module Regex # This module is used as a namespace
|
|
40
42
|
def to_str
|
41
43
|
dir_syntax = (dir == :ahead) ? '' : '<'
|
42
44
|
kind_syntax = (kind == :positive) ? '=' : '!'
|
43
|
-
result =
|
45
|
+
result = "(?#{dir_syntax}#{kind_syntax}#{child.to_str})"
|
44
46
|
return result
|
45
47
|
end
|
46
48
|
end # class
|
data/lib/regex/match_option.rb
CHANGED
data/lib/regex/multiplicity.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# File: Multiplicity.rb
|
2
4
|
|
3
5
|
module Regex # This module is used as a namespace
|
@@ -48,16 +50,13 @@ module Regex # This module is used as a namespace
|
|
48
50
|
end
|
49
51
|
end
|
50
52
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
when :possessive
|
57
|
-
'+'
|
58
|
-
end
|
53
|
+
policy2suffix = {
|
54
|
+
greedy: '',
|
55
|
+
lazy: '?',
|
56
|
+
possessive: '+'
|
57
|
+
}
|
59
58
|
|
60
|
-
return subresult +
|
59
|
+
return subresult + policy2suffix[policy]
|
61
60
|
end
|
62
61
|
|
63
62
|
private
|
@@ -66,6 +65,7 @@ module Regex # This module is used as a namespace
|
|
66
65
|
def valid_lower_bound(aLowerBound)
|
67
66
|
err_msg = "Invalid lower bound of repetition count #{aLowerBound}"
|
68
67
|
raise StandardError, err_msg unless aLowerBound.kind_of?(Integer)
|
68
|
+
|
69
69
|
return aLowerBound
|
70
70
|
end
|
71
71
|
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# File: non_capturing_group.rb
|
2
4
|
|
3
5
|
require_relative 'monadic_expression' # Access the superclass
|
@@ -20,7 +22,7 @@ module Regex # This module is used as a namespace
|
|
20
22
|
# Conversion method re-definition.
|
21
23
|
# Purpose: Return the String representation of the captured expression.
|
22
24
|
def text_repr
|
23
|
-
result =
|
25
|
+
result = "(?:#{all_child_text})"
|
24
26
|
return result
|
25
27
|
end
|
26
28
|
end # class
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# File: polyadic_expression.rb
|
2
4
|
|
3
5
|
require_relative 'compound_expression' # Access the superclass
|
@@ -30,6 +32,7 @@ module Regex # This module is used as a namespace
|
|
30
32
|
children.each(&:done!)
|
31
33
|
children.each_with_index do |child, index|
|
32
34
|
break if index == children.size - 1
|
35
|
+
|
33
36
|
next_child = children[index + 1]
|
34
37
|
if next_child.kind_of?(Lookaround) && next_child.dir == :behind
|
35
38
|
# Swap children: lookbehind regex must precede pattern
|
@@ -57,6 +60,7 @@ module Regex # This module is used as a namespace
|
|
57
60
|
top = visit_stack.pop
|
58
61
|
if top.kind_of?(Array)
|
59
62
|
next if top.empty?
|
63
|
+
|
60
64
|
currChild = top.pop
|
61
65
|
visit_stack.push top
|
62
66
|
else
|
data/lib/regex/quantifiable.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# File: quantifiable.rb
|
2
4
|
|
3
5
|
require_relative 'multiplicity'
|
@@ -6,7 +8,7 @@ module Regex # This module is used as a namespace
|
|
6
8
|
module Quantifiable
|
7
9
|
# Redefined method. Return true since it may not have any child.
|
8
10
|
def quantified?
|
9
|
-
return
|
11
|
+
return !@quantifier.nil?
|
10
12
|
end
|
11
13
|
|
12
14
|
def quantifier
|
data/lib/regex/raw_expression.rb
CHANGED
data/lib/regex/repetition.rb
CHANGED
data/lib/regex/wildcard.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# File: wildcard.rb
|
2
4
|
|
3
5
|
require_relative 'atomic_expression' # Access the superclass
|
@@ -5,11 +7,6 @@ require_relative 'atomic_expression' # Access the superclass
|
|
5
7
|
module Regex # This module is used as a namespace
|
6
8
|
# A wildcard matches any character (except for the newline).
|
7
9
|
class Wildcard < AtomicExpression
|
8
|
-
# Constructor
|
9
|
-
def initialize
|
10
|
-
super
|
11
|
-
end
|
12
|
-
|
13
10
|
protected
|
14
11
|
|
15
12
|
# Conversion method re-definition.
|
data/lib/srl_ruby/ast_builder.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'stringio'
|
2
4
|
require_relative 'regex_repr'
|
3
5
|
|
@@ -44,6 +46,7 @@ module SrlRuby
|
|
44
46
|
end
|
45
47
|
end
|
46
48
|
return if regexp_opts.empty?
|
49
|
+
|
47
50
|
new_root = Regex::MatchOption.new(tree_root, regexp_opts)
|
48
51
|
result.instance_variable_set(:@root, new_root)
|
49
52
|
end
|
@@ -65,6 +68,8 @@ module SrlRuby
|
|
65
68
|
return Regex::Multiplicity.new(lowerBound, upperBound, :greedy)
|
66
69
|
end
|
67
70
|
|
71
|
+
# rubocop: disable Style/OptionalBooleanParameter
|
72
|
+
|
68
73
|
def string_literal(aString, to_escape = true)
|
69
74
|
if aString.size > 1
|
70
75
|
chars = []
|
@@ -85,6 +90,7 @@ module SrlRuby
|
|
85
90
|
|
86
91
|
return result
|
87
92
|
end
|
93
|
+
# rubocop: enable Style/OptionalBooleanParameter
|
88
94
|
|
89
95
|
def char_range(lowerBound, upperBound)
|
90
96
|
lower = Regex::Character.new(lowerBound)
|
@@ -120,7 +126,12 @@ module SrlRuby
|
|
120
126
|
|
121
127
|
# rule('pattern' => %w[pattern separator sub_pattern]).as 'pattern_sequence'
|
122
128
|
def reduce_pattern_sequence(_production, _range, _tokens, theChildren)
|
123
|
-
|
129
|
+
third_member = theChildren[2]
|
130
|
+
if third_member.kind_of?(Regex::Lookaround) && third_member.dir == :behind
|
131
|
+
Regex::Concatenation.new(theChildren[2], theChildren[0])
|
132
|
+
else
|
133
|
+
Regex::Concatenation.new(theChildren[0], theChildren[2])
|
134
|
+
end
|
124
135
|
end
|
125
136
|
|
126
137
|
# rule('pattern' => 'sub_pattern').as 'basic_pattern'
|
data/lib/srl_ruby/grammar.rb
CHANGED
@@ -1,9 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# Grammar for SRL (Simple Regex Language)
|
2
4
|
require 'rley' # Load the gem
|
3
5
|
module SrlRuby
|
4
6
|
########################################
|
5
7
|
# SRL grammar
|
6
|
-
builder = Rley::
|
8
|
+
builder = Rley::Notation::GrammarBuilder.new do
|
7
9
|
# Separators...
|
8
10
|
add_terminals('LPAREN', 'RPAREN', 'COMMA')
|
9
11
|
|
@@ -30,33 +32,33 @@ module SrlRuby
|
|
30
32
|
|
31
33
|
# Grammar rules...
|
32
34
|
rule('srl' => 'expression').as 'start_rule'
|
33
|
-
rule('expression' =>
|
35
|
+
rule('expression' => 'pattern flags').as 'flagged_expr'
|
34
36
|
rule('expression' => 'pattern').as 'simple_expr'
|
35
|
-
rule('pattern' =>
|
37
|
+
rule('pattern' => 'pattern separator sub_pattern').as 'pattern_sequence'
|
36
38
|
rule('pattern' => 'sub_pattern').as 'basic_pattern'
|
37
39
|
rule('sub_pattern' => 'quantifiable').as 'quantifiable_sub_pattern'
|
38
40
|
rule('sub_pattern' => 'assertion').as 'assertion_sub_pattern'
|
39
41
|
rule('separator' => 'COMMA').as 'comma_separator'
|
40
42
|
rule('separator' => []).as 'void_separator'
|
41
|
-
rule('flags' =>
|
42
|
-
rule('flags' =>
|
43
|
-
rule('single_flag' =>
|
44
|
-
rule('single_flag' =>
|
45
|
-
rule('single_flag' =>
|
46
|
-
rule('quantifiable' =>
|
47
|
-
rule('quantifiable' =>
|
48
|
-
rule('quantifiable' =>
|
43
|
+
rule('flags' => 'flags separator single_flag').as 'flag_sequence'
|
44
|
+
rule('flags' => 'separator single_flag').as 'flag_simple'
|
45
|
+
rule('single_flag' => 'CASE INSENSITIVE').as 'case_insensitive'
|
46
|
+
rule('single_flag' => 'MULTI LINE').as 'multi_line'
|
47
|
+
rule('single_flag' => 'ALL LAZY').as 'all_lazy'
|
48
|
+
rule('quantifiable' => 'begin_anchor anchorable end_anchor').as 'pinned_quantifiable'
|
49
|
+
rule('quantifiable' => 'begin_anchor anchorable').as 'begin_anchor_quantifiable'
|
50
|
+
rule('quantifiable' => 'anchorable end_anchor').as 'end_anchor_quantifiable'
|
49
51
|
rule('quantifiable' => 'anchorable').as 'simple_quantifiable'
|
50
|
-
rule('begin_anchor' =>
|
51
|
-
rule('begin_anchor' =>
|
52
|
-
rule('end_anchor' =>
|
52
|
+
rule('begin_anchor' => 'STARTS WITH').as 'starts_with'
|
53
|
+
rule('begin_anchor' => 'BEGIN WITH').as 'begin_with'
|
54
|
+
rule('end_anchor' => 'separator MUST END').as 'end_anchor'
|
53
55
|
rule('anchorable' => 'assertable').as 'simple_anchorable'
|
54
|
-
rule('assertion' =>
|
55
|
-
rule('assertion' =>
|
56
|
-
rule('assertion' =>
|
57
|
-
rule('assertion' =>
|
56
|
+
rule('assertion' => 'IF FOLLOWED BY assertable').as 'if_followed'
|
57
|
+
rule('assertion' => 'IF NOT FOLLOWED BY assertable').as 'if_not_followed'
|
58
|
+
rule('assertion' => 'IF ALREADY HAD assertable').as 'if_had'
|
59
|
+
rule('assertion' => 'IF NOT ALREADY HAD assertable').as 'if_not_had'
|
58
60
|
rule('assertable' => 'term').as 'simple_assertable'
|
59
|
-
rule('assertable' =>
|
61
|
+
rule('assertable' => 'term quantifier').as 'quantified_assertable'
|
60
62
|
rule('term' => 'atom').as 'atom_term'
|
61
63
|
rule('term' => 'alternation').as 'alternation_term'
|
62
64
|
rule('term' => 'grouping').as 'grouping_term'
|
@@ -67,20 +69,20 @@ module SrlRuby
|
|
67
69
|
rule('atom' => 'special_char').as 'special_char_atom'
|
68
70
|
rule('atom' => 'literal').as 'literal_atom'
|
69
71
|
rule('atom' => 'raw').as 'raw_atom'
|
70
|
-
rule('letter_range' =>
|
71
|
-
rule('letter_range' =>
|
72
|
+
rule('letter_range' => 'LETTER FROM LETTER_LIT TO LETTER_LIT').as 'lowercase_from_to'
|
73
|
+
rule('letter_range' => 'UPPERCASE LETTER FROM LETTER_LIT TO LETTER_LIT').as 'uppercase_from_to'
|
72
74
|
rule('letter_range' => 'LETTER').as 'any_lowercase'
|
73
|
-
rule('letter_range' =>
|
74
|
-
rule('digit_range' =>
|
75
|
-
rule('character_class' =>
|
76
|
-
rule('character_class' =>
|
75
|
+
rule('letter_range' => 'UPPERCASE LETTER').as 'any_uppercase'
|
76
|
+
rule('digit_range' => 'digit_or_number FROM DIGIT_LIT TO DIGIT_LIT').as 'digits_from_to'
|
77
|
+
rule('character_class' => 'ANY CHARACTER').as 'any_character'
|
78
|
+
rule('character_class' => 'NO CHARACTER').as 'no_character'
|
77
79
|
rule('character_class' => 'digit_or_number').as 'digit'
|
78
|
-
rule('character_class' =>
|
80
|
+
rule('character_class' => 'NO DIGIT').as 'non_digit'
|
79
81
|
rule('character_class' => 'WHITESPACE').as 'whitespace'
|
80
|
-
rule('character_class' =>
|
82
|
+
rule('character_class' => 'NO WHITESPACE').as 'no_whitespace'
|
81
83
|
rule('character_class' => 'ANYTHING').as 'anything'
|
82
|
-
rule('character_class' =>
|
83
|
-
rule('character_class' =>
|
84
|
+
rule('character_class' => 'ONE OF cclass').as 'one_of'
|
85
|
+
rule('character_class' => 'NONE OF cclass').as 'none_of'
|
84
86
|
rule('cclass' => 'STRING_LIT').as 'quoted_cclass' # Preferred syntax
|
85
87
|
rule('cclass' => 'INTEGER').as 'digits_cclass'
|
86
88
|
rule('cclass' => 'IDENTIFIER').as 'identifier_cclass'
|
@@ -88,32 +90,32 @@ module SrlRuby
|
|
88
90
|
rule('special_char' => 'TAB').as 'tab'
|
89
91
|
rule('special_char' => 'VERTICAL TAB').as 'vtab'
|
90
92
|
rule('special_char' => 'BACKSLASH').as 'backslash'
|
91
|
-
rule('special_char' =>
|
92
|
-
rule('special_char' =>
|
93
|
-
rule('special_char' =>
|
94
|
-
rule('special_char' =>
|
95
|
-
rule('literal' =>
|
93
|
+
rule('special_char' => 'NEW LINE').as 'new_line'
|
94
|
+
rule('special_char' => 'CARRIAGE RETURN').as 'carriage_return'
|
95
|
+
rule('special_char' => 'WORD').as 'word'
|
96
|
+
rule('special_char' => 'NO WORD').as 'no_word'
|
97
|
+
rule('literal' => 'LITERALLY STRING_LIT').as 'literally'
|
96
98
|
rule('raw' => 'RAW STRING_LIT').as 'raw_literal'
|
97
|
-
rule('alternation' =>
|
98
|
-
rule('alternatives' =>
|
99
|
+
rule('alternation' => 'any_or_either OF LPAREN alternatives RPAREN').as 'any_of'
|
100
|
+
rule('alternatives' => 'alternatives separator quantifiable').as 'alternative_list'
|
99
101
|
rule('alternatives' => 'quantifiable').as 'simple_alternative'
|
100
102
|
rule('any_or_either' => 'ANY').as 'any_keyword'
|
101
103
|
rule('any_or_either' => 'EITHER').as 'either_keyword'
|
102
|
-
rule('grouping' =>
|
103
|
-
rule('capturing_group' =>
|
104
|
-
rule('capturing_group' =>
|
105
|
-
rule('capturing_group' =>
|
106
|
-
rule('capturing_group' =>
|
104
|
+
rule('grouping' => 'LPAREN pattern RPAREN').as 'grouping_parenthenses'
|
105
|
+
rule('capturing_group' => 'CAPTURE assertable').as 'capture'
|
106
|
+
rule('capturing_group' => 'CAPTURE assertable UNTIL assertable').as 'capture_until'
|
107
|
+
rule('capturing_group' => 'CAPTURE assertable AS var_name').as 'named_capture'
|
108
|
+
rule('capturing_group' => 'CAPTURE assertable AS var_name UNTIL assertable').as 'named_capture_until'
|
107
109
|
rule('var_name' => 'STRING_LIT').as 'var_name'
|
108
110
|
rule('var_name' => 'IDENTIFIER').as 'var_ident' # capture name not enclosed between quotes
|
109
111
|
rule('quantifier' => 'ONCE').as 'once'
|
110
112
|
rule('quantifier' => 'TWICE').as 'twice'
|
111
|
-
rule('quantifier' =>
|
112
|
-
rule('quantifier' =>
|
113
|
+
rule('quantifier' => 'EXACTLY count TIMES').as 'exactly'
|
114
|
+
rule('quantifier' => 'BETWEEN count AND count times_suffix').as 'between_and'
|
113
115
|
rule('quantifier' => 'OPTIONAL').as 'optional'
|
114
|
-
rule('quantifier' =>
|
115
|
-
rule('quantifier' =>
|
116
|
-
rule('quantifier' =>
|
116
|
+
rule('quantifier' => 'ONCE OR MORE').as 'once_or_more'
|
117
|
+
rule('quantifier' => 'NEVER OR MORE').as 'never_or_more'
|
118
|
+
rule('quantifier' => 'AT LEAST count TIMES').as 'at_least'
|
117
119
|
rule('digit_or_number' => 'DIGIT').as 'digit_keyword'
|
118
120
|
rule('digit_or_number' => 'NUMBER').as 'number_keyword'
|
119
121
|
rule('count' => 'DIGIT_LIT').as 'single_digit'
|
data/lib/srl_ruby/regex_repr.rb
CHANGED
data/lib/srl_ruby/tokenizer.rb
CHANGED
@@ -1,7 +1,9 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# File: srl_tokenizer.rb
|
2
4
|
# Tokenizer for SRL (Simple Regex Language)
|
3
5
|
require 'strscan'
|
4
|
-
|
6
|
+
require 'rley'
|
5
7
|
|
6
8
|
|
7
9
|
module SrlRuby
|
@@ -15,10 +17,14 @@ module SrlRuby
|
|
15
17
|
# Delimiters: parentheses '(' and ')'
|
16
18
|
# Separators: comma (optional)
|
17
19
|
class Tokenizer
|
20
|
+
# @return [StringScanner]
|
18
21
|
attr_reader(:scanner)
|
22
|
+
|
23
|
+
# @return [Integer] current line number
|
19
24
|
attr_reader(:lineno)
|
25
|
+
|
26
|
+
# @return [Integer] offset of start of current line within input
|
20
27
|
attr_reader(:line_start)
|
21
|
-
# attr_reader(:column)
|
22
28
|
|
23
29
|
@@lexeme2name = {
|
24
30
|
'(' => 'LPAREN',
|
@@ -84,7 +90,7 @@ module SrlRuby
|
|
84
90
|
WHITESPACE
|
85
91
|
WITH
|
86
92
|
WORD
|
87
|
-
].map { |x| [x, x] }
|
93
|
+
].map { |x| [x, x] }.to_h
|
88
94
|
|
89
95
|
class ScanError < StandardError; end
|
90
96
|
|
@@ -132,7 +138,7 @@ module SrlRuby
|
|
132
138
|
token = build_token('LETTER_LIT', lexeme)
|
133
139
|
elsif (lexeme = scanner.scan(/[a-zA-Z_][a-zA-Z0-9_]+/))
|
134
140
|
keyw = @@keywords[lexeme.upcase]
|
135
|
-
tok_type = keyw
|
141
|
+
tok_type = keyw || 'IDENTIFIER'
|
136
142
|
token = build_token(tok_type, lexeme)
|
137
143
|
elsif (lexeme = scanner.scan(/[^,"\s]{2,}/))
|
138
144
|
token = build_token('CHAR_CLASS', lexeme)
|
@@ -149,11 +155,11 @@ module SrlRuby
|
|
149
155
|
def build_token(aSymbolName, aLexeme)
|
150
156
|
begin
|
151
157
|
col = scanner.pos - aLexeme.size - @line_start + 1
|
152
|
-
pos = Position.new(@lineno, col)
|
153
|
-
token =
|
154
|
-
rescue StandardError =>
|
158
|
+
pos = Rley::Lexical::Position.new(@lineno, col)
|
159
|
+
token = Rley::Lexical::Token.new(aLexeme, aSymbolName, pos)
|
160
|
+
rescue StandardError => e
|
155
161
|
puts "Failing with '#{aSymbolName}' and '#{aLexeme}'"
|
156
|
-
raise
|
162
|
+
raise e
|
157
163
|
end
|
158
164
|
|
159
165
|
return token
|
data/lib/srl_ruby/version.rb
CHANGED
data/lib/srl_ruby.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# File: rule_file_grammar.rb
|
2
4
|
require 'rley' # Load the Rley gem
|
3
5
|
|
@@ -5,20 +7,20 @@ require 'rley' # Load the Rley gem
|
|
5
7
|
# [File format](https://github.com/SimpleRegex/Test-Rules/blob/master/README.md)
|
6
8
|
########################################
|
7
9
|
# Define a grammar for basic arithmetical expressions
|
8
|
-
builder = Rley::
|
10
|
+
builder = Rley::Notation::GrammarBuilder.new do
|
9
11
|
# Punctuation
|
10
12
|
add_terminals('COLON', 'DASH')
|
11
13
|
|
12
14
|
# Keywords
|
13
15
|
add_terminals('CAPTURE', 'FOR')
|
14
|
-
add_terminals('MATCH
|
16
|
+
add_terminals('MATCH', 'NO', 'SRL')
|
15
17
|
|
16
18
|
# Literals
|
17
19
|
add_terminals('INTEGER', 'STRING_LIT')
|
18
20
|
add_terminals('IDENTIFIER', 'SRL_SOURCE')
|
19
21
|
|
20
22
|
rule('rule_file' => 'srl_heading srl_tests').as 'start_rule'
|
21
|
-
rule('srl_heading' => 'SRL
|
23
|
+
rule('srl_heading' => 'SRL SRL_SOURCE').as 'srl_source'
|
22
24
|
rule('srl_tests' => 'srl_tests single_test').as 'test_list'
|
23
25
|
rule('srl_tests' => 'single_test').as 'one_test'
|
24
26
|
rule('single_test' => 'atomic_test').as 'single_atomic_test'
|
@@ -26,8 +28,8 @@ builder = Rley::Syntax::GrammarBuilder.new do
|
|
26
28
|
rule('atomic_test' => 'match_test').as 'atomic_match'
|
27
29
|
rule('atomic_test' => 'no_match_test').as 'atomic_no_match'
|
28
30
|
rule('compound_test' => 'capture_test').as 'compound_capture'
|
29
|
-
rule('match_test' => 'MATCH
|
30
|
-
rule('no_match_test' => 'NO MATCH
|
31
|
+
rule('match_test' => 'MATCH STRING_LIT').as 'match_string'
|
32
|
+
rule('no_match_test' => 'NO MATCH STRING_LIT').as 'no_match_string'
|
31
33
|
rule('capture_test' => 'capture_heading capture_expectations').as 'capture_test'
|
32
34
|
rule('capture_heading' => 'CAPTURE FOR STRING_LIT COLON').as 'capture_string'
|
33
35
|
rule('capture_expectations' => 'capture_expectations single_expectation').as 'assertion_list'
|