srl_ruby 0.2.0 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +13 -0
- data/lib/srl_ruby/ast_builder.rb +29 -28
- data/lib/srl_ruby/grammar.rb +3 -2
- data/lib/srl_ruby/regex_repr.rb +1 -0
- data/lib/srl_ruby/tokenizer.rb +4 -4
- data/lib/srl_ruby/version.rb +1 -1
- data/lib/srl_ruby.rb +2 -0
- data/spec/acceptance/srl_test_suite_spec.rb +21 -3
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 26a19da14fe9e1f84e095aa9eb4ac135915407ae
|
4
|
+
data.tar.gz: 2edefb6e8473d2e03df633fc35e2f1c5863df09a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 004a7a30442c6b5e49cf91a0eaa5689c1dd2f770a82593bb7bcc26450e91c009f743701e5d89a4afeb30c102fc8e2994e311ab70402600c7990b6c864e6b085f
|
7
|
+
data.tar.gz: b681c6cf73d7669cfd93b12c995b9844e0ad8b4933a7b0a98a130385a8f5f46608c39fcc114f1c625c469596a1cdc25e9b484b7023e2f968e293ede44d0a3da1
|
data/CHANGELOG.md
CHANGED
@@ -6,7 +6,20 @@
|
|
6
6
|
### Fixed
|
7
7
|
### Security
|
8
8
|
|
9
|
+
## [0.2.1] - 2018-03-15
|
10
|
+
SrlRuby passes 7 tests out of 15 standard SRL tests in total.
|
11
|
+
### Changed
|
12
|
+
- File `acceptance/srl_test_suite_spec.rb`. More examples in spec file.
|
13
|
+
- File `ast_builder.rb` updates to reflect grammar changes.
|
14
|
+
|
15
|
+
### Fixed
|
16
|
+
- SRL grammar now accepts a comma before 'must end' anchor
|
17
|
+
- SRL grammar now accepts a comma before an option
|
18
|
+
- Class `Tokenizer#_next_token` now recognizes correctly escaped quotes within string literal
|
19
|
+
- File `ast_builder.rb` fixed anchor implementation.
|
20
|
+
|
9
21
|
## [0.2.0] - 2018-03-14
|
22
|
+
SrlRuby passes 3 standard out of 15 standard SRL tests in total.
|
10
23
|
### Added
|
11
24
|
- Added `spec/acceptance/support` directory. It contains test harness to use the .rule files from standard SRL test suite.
|
12
25
|
- Added `acceptance/srl_test_suite_spec.rb`file. Spec file designed to standard SRL test suite. At this date, SrlRuby passes 3 tests out of 15 tests in total.
|
data/lib/srl_ruby/ast_builder.rb
CHANGED
@@ -15,7 +15,7 @@ module SrlRuby
|
|
15
15
|
attr_reader :options
|
16
16
|
|
17
17
|
protected
|
18
|
-
|
18
|
+
|
19
19
|
def terminal2node()
|
20
20
|
Terminal2NodeClass
|
21
21
|
end
|
@@ -80,14 +80,14 @@ module SrlRuby
|
|
80
80
|
def repetition(expressionToRepeat, aMultiplicity)
|
81
81
|
return Regex::Repetition.new(expressionToRepeat, aMultiplicity)
|
82
82
|
end
|
83
|
-
|
83
|
+
|
84
84
|
def begin_anchor
|
85
85
|
return Regex::Anchor.new('^')
|
86
86
|
end
|
87
|
-
|
88
|
-
# rule('expression' => %w[pattern
|
87
|
+
|
88
|
+
# rule('expression' => %w[pattern flags]).as 'flagged_expr'
|
89
89
|
def reduce_flagged_expr(_production, aRange, theTokens, theChildren)
|
90
|
-
@options = theChildren[
|
90
|
+
@options = theChildren[1] if theChildren[1]
|
91
91
|
return_first_child(aRange, theTokens, theChildren)
|
92
92
|
end
|
93
93
|
|
@@ -100,6 +100,11 @@ module SrlRuby
|
|
100
100
|
def reduce_flag_sequence(_production, _range, _tokens, theChildren)
|
101
101
|
theChildren[0] << theChildren[2]
|
102
102
|
end
|
103
|
+
|
104
|
+
# rule('flags' => %w[separator single_flag]).as 'flag_simple'
|
105
|
+
def reduce_flag_simple(_production, _range, _tokens, theChildren)
|
106
|
+
[theChildren.last]
|
107
|
+
end
|
103
108
|
|
104
109
|
# rule('single_flag' => %w[CASE INSENSITIVE]).as 'case_insensitive'
|
105
110
|
def reduce_case_insensitive(_production, _range, _tokens, _children)
|
@@ -118,21 +123,17 @@ module SrlRuby
|
|
118
123
|
|
119
124
|
# rule 'quantifiable' => %w[begin_anchor anchorable end_anchor]
|
120
125
|
def reduce_pinned_quantifiable(_production, _range, _tokens, theChildren)
|
121
|
-
|
122
|
-
theChildren[1].end_anchor = theChildren[2]
|
123
|
-
return theChildren[1]
|
126
|
+
return Regex::Concatenation.new(*theChildren)
|
124
127
|
end
|
125
128
|
|
126
129
|
# rule 'quantifiable' => %w[begin_anchor anchorable]
|
127
130
|
def reduce_begin_anchor_quantifiable(_production, _range, _tokens, theChildren)
|
128
|
-
|
129
|
-
return theChildren[1]
|
131
|
+
return Regex::Concatenation.new(*theChildren)
|
130
132
|
end
|
131
133
|
|
132
134
|
# rule 'quantifiable' => %w[anchorable end_anchor]
|
133
135
|
def reduce_end_anchor_quantifiable(_production, _range, _tokens, theChildren)
|
134
|
-
|
135
|
-
return theChildren[0]
|
136
|
+
return Regex::Concatenation.new(*theChildren)
|
136
137
|
end
|
137
138
|
|
138
139
|
# rule 'begin_anchor' => %w[STARTS WITH]
|
@@ -140,12 +141,12 @@ module SrlRuby
|
|
140
141
|
begin_anchor
|
141
142
|
end
|
142
143
|
|
143
|
-
# rule 'begin_anchor' => %w[BEGIN WITH]
|
144
|
+
# rule 'begin_anchor' => %w[BEGIN WITH]
|
144
145
|
def reduce_begin_with(_production, _range, _tokens, _children)
|
145
146
|
begin_anchor
|
146
|
-
end
|
147
|
+
end
|
147
148
|
|
148
|
-
# rule
|
149
|
+
# rule('end_anchor' => %w[separator MUST END]).as 'end_anchor'
|
149
150
|
def reduce_end_anchor(_production, _range, _tokens, _children)
|
150
151
|
return Regex::Anchor.new('$')
|
151
152
|
end
|
@@ -312,30 +313,30 @@ module SrlRuby
|
|
312
313
|
return Regex::Concatenation.new(group, theChildren[3])
|
313
314
|
end
|
314
315
|
|
315
|
-
# rule('capturing_group' => %w[CAPTURE assertable AS var_name]).as
|
316
|
+
# rule('capturing_group' => %w[CAPTURE assertable AS var_name]).as
|
316
317
|
# 'named_capture'
|
317
318
|
def reduce_named_capture(_production, _range, _tokens, theChildren)
|
318
319
|
name = theChildren[3].token.lexeme.dup
|
319
320
|
return Regex::CapturingGroup.new(theChildren[1], name)
|
320
321
|
end
|
321
322
|
|
322
|
-
# rule('capturing_group' => %w[CAPTURE assertable AS var_name
|
323
|
+
# rule('capturing_group' => %w[CAPTURE assertable AS var_name
|
323
324
|
# UNTIL assertable]).as 'named_capture_until'
|
324
325
|
def reduce_named_capture_until(_production, _range, _tokens, theChildren)
|
325
326
|
name = theChildren[3].token.lexeme.dup
|
326
327
|
group = Regex::CapturingGroup.new(theChildren[1], name)
|
327
328
|
return Regex::Concatenation.new(group, theChildren[5])
|
328
329
|
end
|
329
|
-
|
330
|
+
|
330
331
|
# rule('quantifier' => 'ONCE').as 'once'
|
331
332
|
def reduce_once(_production, _range, _tokens, _children)
|
332
333
|
multiplicity(1, 1)
|
333
334
|
end
|
334
|
-
|
335
|
+
|
335
336
|
# rule('quantifier' => 'TWICE').as 'twice'
|
336
337
|
def reduce_twice(_production, _range, _tokens, _children)
|
337
338
|
multiplicity(2, 2)
|
338
|
-
end
|
339
|
+
end
|
339
340
|
|
340
341
|
# rule('quantifier' => %w[EXACTLY count TIMES]).as 'exactly'
|
341
342
|
def reduce_exactly(_production, _range, _tokens, theChildren)
|
@@ -350,7 +351,7 @@ module SrlRuby
|
|
350
351
|
upper = theChildren[3].token.lexeme.to_i
|
351
352
|
multiplicity(lower, upper)
|
352
353
|
end
|
353
|
-
|
354
|
+
|
354
355
|
# rule('quantifier' => 'OPTIONAL').as 'optional'
|
355
356
|
def reduce_optional(_production, _range, _tokens, _children)
|
356
357
|
multiplicity(0, 1)
|
@@ -360,27 +361,27 @@ module SrlRuby
|
|
360
361
|
def reduce_once_or_more(_production, _range, _tokens, _children)
|
361
362
|
multiplicity(1, :more)
|
362
363
|
end
|
363
|
-
|
364
|
+
|
364
365
|
# rule('quantifier' => %w[NEVER OR MORE]).as 'never_or_more'
|
365
366
|
def reduce_never_or_more(_production, _range, _tokens, _children)
|
366
367
|
multiplicity(0, :more)
|
367
368
|
end
|
368
|
-
|
369
|
-
# rule('quantifier' => %w[AT LEAST count TIMES]).as 'at_least'
|
369
|
+
|
370
|
+
# rule('quantifier' => %w[AT LEAST count TIMES]).as 'at_least'
|
370
371
|
def reduce_at_least(_production, _range, _tokens, theChildren)
|
371
372
|
count = theChildren[2].token.lexeme.to_i
|
372
373
|
multiplicity(count, :more)
|
373
|
-
end
|
374
|
-
|
374
|
+
end
|
375
|
+
|
375
376
|
# rule('times_suffix' => 'TIMES').as 'times_keyword'
|
376
377
|
def reduce_times_keyword(_production, _range, _tokens, _children)
|
377
378
|
return nil
|
378
379
|
end
|
379
|
-
|
380
|
+
|
380
381
|
# rule('times_suffix' => []).as 'times_dropped'
|
381
382
|
def reduce_times_dropped(_production, _range, _tokens, _children)
|
382
383
|
return nil
|
383
|
-
end
|
384
|
+
end
|
384
385
|
end # class
|
385
386
|
end # module
|
386
387
|
# End of file
|
data/lib/srl_ruby/grammar.rb
CHANGED
@@ -24,13 +24,14 @@ module SrlRuby
|
|
24
24
|
add_terminals('LAZY')
|
25
25
|
|
26
26
|
rule('srl' => 'expression').as 'start_rule'
|
27
|
-
rule('expression' => %w[pattern
|
27
|
+
rule('expression' => %w[pattern flags]).as 'flagged_expr'
|
28
28
|
rule('expression' => 'pattern').as 'simple_expr'
|
29
29
|
rule('pattern' => %w[pattern separator quantifiable]).as 'pattern_sequence'
|
30
30
|
rule('pattern' => 'quantifiable').as 'basic_pattern'
|
31
31
|
rule('separator' => 'COMMA').as 'comma_separator'
|
32
32
|
rule('separator' => []).as 'void_separator'
|
33
33
|
rule('flags' => %w[flags separator single_flag]).as 'flag_sequence'
|
34
|
+
rule('flags' => %w[separator single_flag]).as 'flag_simple'
|
34
35
|
rule('single_flag' => %w[CASE INSENSITIVE]).as 'case_insensitive'
|
35
36
|
rule('single_flag' => %w[MULTI LINE]).as 'multi_line'
|
36
37
|
rule('single_flag' => %w[ALL LAZY]).as 'all_lazy'
|
@@ -40,7 +41,7 @@ module SrlRuby
|
|
40
41
|
rule('quantifiable' => 'anchorable').as 'simple_quantifiable'
|
41
42
|
rule('begin_anchor' => %w[STARTS WITH]).as 'starts_with'
|
42
43
|
rule('begin_anchor' => %w[BEGIN WITH]).as 'begin_with'
|
43
|
-
rule('end_anchor' => %w[MUST END]).as 'end_anchor'
|
44
|
+
rule('end_anchor' => %w[separator MUST END]).as 'end_anchor'
|
44
45
|
rule('anchorable' => 'assertable').as 'simple_anchorable'
|
45
46
|
rule('anchorable' => %w[assertable assertion]).as 'asserted_anchorable'
|
46
47
|
rule('assertion' => %w[IF FOLLOWED BY assertable]).as 'if_followed'
|
data/lib/srl_ruby/regex_repr.rb
CHANGED
data/lib/srl_ruby/tokenizer.rb
CHANGED
@@ -116,10 +116,10 @@ module SrlRuby
|
|
116
116
|
# TODO: handle case unknown identifier
|
117
117
|
elsif (lexeme = scanner.scan(/[a-zA-Z]((?=\s)|$)/))
|
118
118
|
token = build_token('LETTER_LIT', lexeme)
|
119
|
-
elsif (lexeme = scanner.scan(/"([^"]
|
119
|
+
elsif (lexeme = scanner.scan(/"(?:\\"|[^"])*"/)) # Double quotes literal?
|
120
120
|
unquoted = lexeme.gsub(/(^")|("$)/, '')
|
121
121
|
token = build_token('STRING_LIT', unquoted)
|
122
|
-
elsif (lexeme = scanner.scan(/'([^']
|
122
|
+
elsif (lexeme = scanner.scan(/'(?:\\'|[^'])*'/)) # Single quotes literal?
|
123
123
|
unquoted = lexeme.gsub(/(^')|('$)/, '')
|
124
124
|
token = build_token('STRING_LIT', unquoted)
|
125
125
|
else # Unknown token
|
@@ -137,9 +137,9 @@ module SrlRuby
|
|
137
137
|
col = scanner.pos - aLexeme.size - @line_start + 1
|
138
138
|
pos = Position.new(@lineno, col)
|
139
139
|
token = SrlToken.new(aLexeme, aSymbolName, pos)
|
140
|
-
rescue StandardError
|
140
|
+
rescue StandardError => exc
|
141
141
|
puts "Failing with '#{aSymbolName}' and '#{aLexeme}'"
|
142
|
-
raise
|
142
|
+
raise exc
|
143
143
|
end
|
144
144
|
|
145
145
|
return token
|
data/lib/srl_ruby/version.rb
CHANGED
data/lib/srl_ruby.rb
CHANGED
@@ -39,19 +39,37 @@ RSpec.describe Acceptance do
|
|
39
39
|
end
|
40
40
|
|
41
41
|
it 'should match a backslash' do
|
42
|
-
puts __FILE__
|
43
42
|
rule_file_repr = load_file('backslash.rule')
|
44
43
|
test_rule_file(rule_file_repr)
|
45
44
|
end
|
46
45
|
|
46
|
+
it 'should support named capture group' do
|
47
|
+
rule_file_repr = load_file('basename_capture_group.rule')
|
48
|
+
test_rule_file(rule_file_repr)
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'should match uppercase letter(s)' do
|
52
|
+
rule_file_repr = load_file('issue_17_uppercase_letter.rule')
|
53
|
+
test_rule_file(rule_file_repr)
|
54
|
+
end
|
55
|
+
|
47
56
|
it 'should not trim literal strings' do
|
48
57
|
rule_file_repr = load_file('literally_spaces.rule')
|
49
58
|
test_rule_file(rule_file_repr)
|
50
|
-
end
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'should match a tab' do
|
62
|
+
rule_file_repr = load_file('tab.rule')
|
63
|
+
test_rule_file(rule_file_repr)
|
64
|
+
end
|
65
|
+
|
66
|
+
it 'should match mail address' do
|
67
|
+
rule_file_repr = load_file('website_example_email.rule')
|
68
|
+
test_rule_file(rule_file_repr)
|
69
|
+
end
|
51
70
|
|
52
71
|
it 'should support lookahead' do
|
53
72
|
rule_file_repr = load_file('website_example_lookahead.rule')
|
54
73
|
test_rule_file(rule_file_repr)
|
55
74
|
end
|
56
|
-
|
57
75
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: srl_ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dimitri Geshef
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-03-
|
11
|
+
date: 2018-03-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rley
|