regexp_parser 0.1.6 → 0.2.0

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.
Files changed (84) hide show
  1. checksums.yaml +4 -4
  2. data/ChangeLog +57 -0
  3. data/Gemfile +8 -0
  4. data/LICENSE +1 -1
  5. data/README.md +225 -206
  6. data/Rakefile +9 -3
  7. data/lib/regexp_parser.rb +7 -11
  8. data/lib/regexp_parser/expression.rb +72 -14
  9. data/lib/regexp_parser/expression/classes/alternation.rb +3 -16
  10. data/lib/regexp_parser/expression/classes/conditional.rb +57 -0
  11. data/lib/regexp_parser/expression/classes/free_space.rb +17 -0
  12. data/lib/regexp_parser/expression/classes/keep.rb +7 -0
  13. data/lib/regexp_parser/expression/classes/set.rb +28 -7
  14. data/lib/regexp_parser/expression/methods/strfregexp.rb +113 -0
  15. data/lib/regexp_parser/expression/methods/tests.rb +116 -0
  16. data/lib/regexp_parser/expression/methods/traverse.rb +63 -0
  17. data/lib/regexp_parser/expression/quantifier.rb +10 -0
  18. data/lib/regexp_parser/expression/sequence.rb +45 -0
  19. data/lib/regexp_parser/expression/subexpression.rb +29 -1
  20. data/lib/regexp_parser/lexer.rb +31 -8
  21. data/lib/regexp_parser/parser.rb +118 -45
  22. data/lib/regexp_parser/scanner.rb +1745 -1404
  23. data/lib/regexp_parser/scanner/property.rl +57 -3
  24. data/lib/regexp_parser/scanner/scanner.rl +161 -34
  25. data/lib/regexp_parser/syntax.rb +12 -2
  26. data/lib/regexp_parser/syntax/ruby/1.9.1.rb +3 -3
  27. data/lib/regexp_parser/syntax/ruby/1.9.3.rb +2 -7
  28. data/lib/regexp_parser/syntax/ruby/2.0.0.rb +4 -1
  29. data/lib/regexp_parser/syntax/ruby/2.1.4.rb +13 -0
  30. data/lib/regexp_parser/syntax/ruby/2.1.5.rb +13 -0
  31. data/lib/regexp_parser/syntax/ruby/2.1.rb +2 -2
  32. data/lib/regexp_parser/syntax/ruby/2.2.0.rb +16 -0
  33. data/lib/regexp_parser/syntax/ruby/2.2.rb +8 -0
  34. data/lib/regexp_parser/syntax/tokens.rb +19 -2
  35. data/lib/regexp_parser/syntax/tokens/conditional.rb +22 -0
  36. data/lib/regexp_parser/syntax/tokens/keep.rb +14 -0
  37. data/lib/regexp_parser/syntax/tokens/unicode_property.rb +45 -4
  38. data/lib/regexp_parser/token.rb +23 -8
  39. data/lib/regexp_parser/version.rb +5 -0
  40. data/regexp_parser.gemspec +35 -0
  41. data/test/expression/test_all.rb +6 -1
  42. data/test/expression/test_base.rb +19 -0
  43. data/test/expression/test_conditionals.rb +114 -0
  44. data/test/expression/test_free_space.rb +33 -0
  45. data/test/expression/test_set.rb +61 -0
  46. data/test/expression/test_strfregexp.rb +214 -0
  47. data/test/expression/test_subexpression.rb +24 -0
  48. data/test/expression/test_tests.rb +99 -0
  49. data/test/expression/test_to_h.rb +48 -0
  50. data/test/expression/test_to_s.rb +46 -0
  51. data/test/expression/test_traverse.rb +164 -0
  52. data/test/lexer/test_all.rb +16 -3
  53. data/test/lexer/test_conditionals.rb +101 -0
  54. data/test/lexer/test_keep.rb +24 -0
  55. data/test/lexer/test_literals.rb +51 -51
  56. data/test/lexer/test_nesting.rb +62 -62
  57. data/test/lexer/test_refcalls.rb +18 -20
  58. data/test/parser/test_all.rb +18 -3
  59. data/test/parser/test_alternation.rb +11 -14
  60. data/test/parser/test_conditionals.rb +148 -0
  61. data/test/parser/test_escapes.rb +29 -5
  62. data/test/parser/test_free_space.rb +139 -0
  63. data/test/parser/test_groups.rb +40 -0
  64. data/test/parser/test_keep.rb +21 -0
  65. data/test/scanner/test_all.rb +8 -2
  66. data/test/scanner/test_conditionals.rb +166 -0
  67. data/test/scanner/test_escapes.rb +8 -5
  68. data/test/scanner/test_free_space.rb +133 -0
  69. data/test/scanner/test_groups.rb +28 -0
  70. data/test/scanner/test_keep.rb +33 -0
  71. data/test/scanner/test_properties.rb +4 -0
  72. data/test/scanner/test_scripts.rb +71 -1
  73. data/test/syntax/ruby/test_1.9.3.rb +2 -2
  74. data/test/syntax/ruby/test_2.0.0.rb +38 -0
  75. data/test/syntax/ruby/test_2.2.0.rb +38 -0
  76. data/test/syntax/ruby/test_all.rb +1 -8
  77. data/test/syntax/ruby/test_files.rb +104 -0
  78. data/test/test_all.rb +2 -1
  79. data/test/token/test_all.rb +2 -0
  80. data/test/token/test_token.rb +109 -0
  81. metadata +75 -21
  82. data/VERSION.yml +0 -5
  83. data/lib/regexp_parser/ctype.rb +0 -48
  84. data/test/syntax/ruby/test_2.x.rb +0 -46
@@ -0,0 +1,33 @@
1
+ require File.expand_path("../../helpers", __FILE__)
2
+
3
+ class ExpressionFreeSpace < Test::Unit::TestCase
4
+
5
+ def test_expression_white_space_quantify_raises_error
6
+ regexp = %r{
7
+ a # Comment
8
+ }x
9
+
10
+ root = RP.parse(regexp)
11
+
12
+ space = root[0]
13
+ assert_equal( FreeSpace::WhiteSpace, space.class )
14
+ assert_raise( RuntimeError ) {
15
+ space.quantify(:dummy, '#')
16
+ }
17
+ end
18
+
19
+ def test_expression_comment_quantify_raises_error
20
+ regexp = %r{
21
+ a # Comment
22
+ }x
23
+
24
+ root = RP.parse(regexp)
25
+
26
+ comment = root[3]
27
+ assert_equal( FreeSpace::Comment, comment.class )
28
+ assert_raise( RuntimeError ) {
29
+ comment.quantify(:dummy, '#')
30
+ }
31
+ end
32
+
33
+ end
@@ -0,0 +1,61 @@
1
+ require File.expand_path("../../helpers", __FILE__)
2
+
3
+ class ExpressionSet < Test::Unit::TestCase
4
+
5
+ def test_expression_set_exapnd_members_digit
6
+ set = RP.parse('[\d]').first
7
+
8
+ assert_equal( ['0-9'], set.expand_members )
9
+ assert_equal( ['\p{Digit}'], set.expand_members(true) )
10
+ end
11
+
12
+ def test_expression_set_exapnd_members_nondigit
13
+ set = RP.parse('[\D]').first
14
+
15
+ assert_equal( ['^0-9'], set.expand_members )
16
+ assert_equal( ['\P{Digit}'], set.expand_members(true) )
17
+ end
18
+
19
+ def test_expression_set_exapnd_members_word
20
+ set = RP.parse('[\w]').first
21
+
22
+ assert_equal( ['A-Za-z0-9_'], set.expand_members )
23
+ assert_equal( ['\p{Word}'], set.expand_members(true) )
24
+ end
25
+
26
+ def test_expression_set_exapnd_members_nonword
27
+ set = RP.parse('[\W]').first
28
+
29
+ assert_equal( ['^A-Za-z0-9_'], set.expand_members )
30
+ assert_equal( ['\P{Word}'], set.expand_members(true) )
31
+ end
32
+
33
+ def test_expression_set_exapnd_members_space
34
+ set = RP.parse('[\s]').first
35
+
36
+ assert_equal( [' \t\f\v\n\r'], set.expand_members )
37
+ assert_equal( ['\p{Space}'], set.expand_members(true) )
38
+ end
39
+
40
+ def test_expression_set_exapnd_members_nonspace
41
+ set = RP.parse('[\S]').first
42
+
43
+ assert_equal( ['^ \t\f\v\n\r'], set.expand_members )
44
+ assert_equal( ['\P{Space}'], set.expand_members(true) )
45
+ end
46
+
47
+ def test_expression_set_exapnd_members_xdigit
48
+ set = RP.parse('[\h]').first
49
+
50
+ assert_equal( ['0-9A-Fa-f'], set.expand_members )
51
+ assert_equal( ['\p{Xdigit}'], set.expand_members(true) )
52
+ end
53
+
54
+ def test_expression_set_exapnd_members_nonxdigit
55
+ set = RP.parse('[\H]').first
56
+
57
+ assert_equal( ['^0-9A-Fa-f'], set.expand_members )
58
+ assert_equal( ['\P{Xdigit}'], set.expand_members(true) )
59
+ end
60
+
61
+ end
@@ -0,0 +1,214 @@
1
+ require File.expand_path("../../helpers", __FILE__)
2
+
3
+ class Expressionstrfregexp < Test::Unit::TestCase
4
+
5
+ def test_expression_strfre_alias
6
+ assert_equal( true, RP.parse(/a/).respond_to?(:strfre) )
7
+ end
8
+
9
+ def test_expression_strfregexp_level
10
+ root = RP.parse(/a(b(c))/)
11
+
12
+ assert_equal( 'root', root.strfregexp('%l') )
13
+
14
+ a = root.first
15
+ assert_equal( '%0', a.strfregexp('%%l') )
16
+
17
+ b = root[1].first
18
+ assert_equal( '<1>', b.strfregexp('<%l>') )
19
+
20
+ c = root[1][1].first
21
+ assert_equal( '[at: 2]', c.strfregexp('[at: %l]') )
22
+ end
23
+
24
+ def test_expression_strfregexp_start_end
25
+ root = RP.parse(/a(b(c))/)
26
+
27
+ assert_equal( '0', root.strfregexp('%s') )
28
+ assert_equal( '7', root.strfregexp('%e') )
29
+
30
+ a = root.first
31
+ assert_equal( '%0', a.strfregexp('%%s') )
32
+ assert_equal( '1', a.strfregexp('%e') )
33
+
34
+ group_1 = root[1]
35
+ assert_equal( 'GRP:1', group_1.strfregexp('GRP:%s') )
36
+ assert_equal( '7', group_1.strfregexp('%e') )
37
+
38
+ b = group_1.first
39
+ assert_equal( '<@2>', b.strfregexp('<@%s>') )
40
+ assert_equal( '3', b.strfregexp('%e') )
41
+
42
+ c = group_1.last.first
43
+ assert_equal( '[at: 4]', c.strfregexp('[at: %s]') )
44
+ assert_equal( '5', c.strfregexp('%e') )
45
+ end
46
+
47
+ def test_expression_strfregexp_length
48
+ root = RP.parse(/a[b]c/)
49
+
50
+ assert_equal( '5', root.strfregexp('%S') )
51
+
52
+ a = root.first
53
+ assert_equal( '1', a.strfregexp('%S') )
54
+
55
+ set = root[1]
56
+ assert_equal( '3', set.strfregexp('%S') )
57
+ end
58
+
59
+ def test_expression_strfregexp_coded_offset
60
+ root = RP.parse(/a[b]c/)
61
+
62
+ assert_equal( '@0+5', root.strfregexp('%o') )
63
+
64
+ a = root.first
65
+ assert_equal( '@0+1', a.strfregexp('%o') )
66
+
67
+ set = root[1]
68
+ assert_equal( '@1+3', set.strfregexp('%o') )
69
+ end
70
+
71
+ def test_expression_strfregexp_type_token
72
+ root = RP.parse(/a[b](c)/)
73
+
74
+ assert_equal( 'expression', root.strfregexp('%y') )
75
+ assert_equal( 'root', root.strfregexp('%k') )
76
+ assert_equal( 'expression:root', root.strfregexp('%i') )
77
+ assert_equal( 'Regexp::Expression::Root', root.strfregexp('%c') )
78
+
79
+ a = root.first
80
+ assert_equal( 'literal', a.strfregexp('%y') )
81
+ assert_equal( 'literal', a.strfregexp('%k') )
82
+ assert_equal( 'literal:literal', a.strfregexp('%i') )
83
+ assert_equal( 'Regexp::Expression::Literal', a.strfregexp('%c') )
84
+
85
+ set = root[1]
86
+ assert_equal( 'set', set.strfregexp('%y') )
87
+ assert_equal( 'character', set.strfregexp('%k') )
88
+ assert_equal( 'set:character', set.strfregexp('%i') )
89
+ assert_equal( 'Regexp::Expression::CharacterSet', set.strfregexp('%c') )
90
+
91
+ group = root.last
92
+ assert_equal( 'group', group.strfregexp('%y') )
93
+ assert_equal( 'capture', group.strfregexp('%k') )
94
+ assert_equal( 'group:capture', group.strfregexp('%i') )
95
+ assert_equal( 'Regexp::Expression::Group::Capture', group.strfregexp('%c') )
96
+ end
97
+
98
+ def test_expression_strfregexp_quantifier
99
+ root = RP.parse(/a+[b](c)?d{3,4}/)
100
+
101
+ assert_equal( '{1}', root.strfregexp('%q') )
102
+ assert_equal( '', root.strfregexp('%Q') )
103
+ assert_equal( '1, 1', root.strfregexp('%z, %Z') )
104
+
105
+ a = root.first
106
+ assert_equal( '{1, or-more}', a.strfregexp('%q') )
107
+ assert_equal( '+', a.strfregexp('%Q') )
108
+ assert_equal( '1, -1', a.strfregexp('%z, %Z') )
109
+
110
+ set = root[1]
111
+ assert_equal( '{1}', set.strfregexp('%q') )
112
+ assert_equal( '', set.strfregexp('%Q') )
113
+ assert_equal( '1, 1', set.strfregexp('%z, %Z') )
114
+
115
+ group = root[2]
116
+ assert_equal( '{0, 1}', group.strfregexp('%q') )
117
+ assert_equal( '?', group.strfregexp('%Q') )
118
+ assert_equal( '0, 1', group.strfregexp('%z, %Z') )
119
+
120
+ d = root.last
121
+ assert_equal( '{3, 4}', d.strfregexp('%q') )
122
+ assert_equal( '{3,4}', d.strfregexp('%Q') )
123
+ assert_equal( '3, 4', d.strfregexp('%z, %Z') )
124
+ end
125
+
126
+ def test_expression_strfregexp_text
127
+ root = RP.parse(/a(b(c))|[d-gk-p]+/)
128
+
129
+ assert_equal( 'a(b(c))|[d-gk-p]+', root.strfregexp('%t') )
130
+ assert_equal( 'expression:root', root.strfregexp('%~t') )
131
+
132
+ alt = root.first
133
+ assert_equal( 'a(b(c))|[d-gk-p]+', alt.strfregexp('%t') )
134
+ assert_equal( 'a(b(c))|[d-gk-p]+', alt.strfregexp('%T') )
135
+ assert_equal( 'meta:alternation', alt.strfregexp('%~t') )
136
+
137
+ seq_1 = alt.first
138
+ assert_equal( 'a(b(c))', seq_1.strfregexp('%t') )
139
+ assert_equal( 'a(b(c))', seq_1.strfregexp('%T') )
140
+ assert_equal( 'expression:sequence', seq_1.strfregexp('%~t') )
141
+
142
+ group = seq_1[1]
143
+ assert_equal( '(b(c))', group.strfregexp('%t') )
144
+ assert_equal( '(b(c))', group.strfregexp('%T') )
145
+ assert_equal( 'group:capture', group.strfregexp('%~t') )
146
+
147
+ seq_2 = alt.last
148
+ assert_equal( '[d-gk-p]+', seq_2.strfregexp('%t') )
149
+ assert_equal( '[d-gk-p]+', seq_2.strfregexp('%T') )
150
+
151
+ set = seq_2.first
152
+ assert_equal( '[d-gk-p]', set.strfregexp('%t') )
153
+ assert_equal( '[d-gk-p]+', set.strfregexp('%T') )
154
+ assert_equal( '[d-gk-p]+', set.strfregexp('%~t') )
155
+ end
156
+
157
+ def test_expression_strfregexp_combined
158
+ root = RP.parse(/a{5}|[b-d]+/)
159
+
160
+ assert_equal( '@0+11 expression:root', root.strfregexp('%b') )
161
+ assert_equal( root.strfregexp('%o %i'), root.strfregexp('%b') )
162
+
163
+ assert_equal( '@0+11 expression:root {1}', root.strfregexp('%m') )
164
+ assert_equal( root.strfregexp('%b %q'), root.strfregexp('%m') )
165
+
166
+ assert_equal( '@0+11 expression:root {1} a{5}|[b-d]+', root.strfregexp('%a') )
167
+ assert_equal( root.strfregexp('%m %t'), root.strfregexp('%a') )
168
+ end
169
+
170
+ def test_expression_strfregexp_tree
171
+ root = RP.parse(/a[b-d]*(e(f+))?/)
172
+
173
+ assert_equal(
174
+ "@0+15 expression:root\n" +
175
+ " @0+1 a\n" +
176
+ " @1+6 [b-d]*\n" +
177
+ " @7+8 group:capture\n" +
178
+ " @8+1 e\n" +
179
+ " @9+4 group:capture\n" +
180
+ " @10+2 f+",
181
+ root.strfregexp_tree('%>%o %~t')
182
+ )
183
+ end
184
+
185
+ def test_expression_strfregexp_tree_separator
186
+ root = RP.parse(/a[b-d]*(e(f+))?/)
187
+
188
+ assert_equal(
189
+ "@0+15 expression:root-SEP-" +
190
+ " @0+1 a-SEP-" +
191
+ " @1+6 [b-d]*-SEP-" +
192
+ " @7+8 group:capture-SEP-" +
193
+ " @8+1 e-SEP-" +
194
+ " @9+4 group:capture-SEP-" +
195
+ " @10+2 f+",
196
+ root.strfregexp_tree('%>%o %~t', true, '-SEP-')
197
+ )
198
+ end
199
+
200
+ def test_expression_strfregexp_tree_exclude_self
201
+ root = RP.parse(/a[b-d]*(e(f+))?/)
202
+
203
+ assert_equal(
204
+ "@0+1 a\n" +
205
+ "@1+6 [b-d]*\n" +
206
+ "@7+8 group:capture\n" +
207
+ " @8+1 e\n" +
208
+ " @9+4 group:capture\n" +
209
+ " @10+2 f+",
210
+ root.strfregexp_tree('%>%o %~t', false)
211
+ )
212
+ end
213
+
214
+ end
@@ -0,0 +1,24 @@
1
+ require File.expand_path("../../helpers", __FILE__)
2
+
3
+ class ExpressionSubexpression < Test::Unit::TestCase
4
+
5
+ def test_subexpression_ts_te
6
+ regx = /abcd|ghij|klmn|pqur/
7
+ root = RP.parse(regx)
8
+
9
+ alt = root.first
10
+
11
+ {
12
+ 0 => [ 0, 4 ],
13
+ 1 => [ 5, 9 ],
14
+ 2 => [ 10, 14 ],
15
+ 3 => [ 15, 19 ],
16
+ }.each do |index, span|
17
+ sequence = alt[index]
18
+
19
+ assert_equal( span[0], sequence.ts )
20
+ assert_equal( span[1], sequence.te )
21
+ end
22
+ end
23
+
24
+ end
@@ -0,0 +1,99 @@
1
+ require File.expand_path("../../helpers", __FILE__)
2
+
3
+ class ExpressionTests < Test::Unit::TestCase
4
+
5
+ def test_expression_type?
6
+ root = RP.parse(/abcd|(ghij)|[klmn]/)
7
+
8
+ alt = root.first
9
+
10
+ assert_equal( true, alt.type?(:meta) )
11
+ assert_equal( false, alt.type?(:escape) )
12
+ assert_equal( true, alt.type?([:meta, :escape]) )
13
+ assert_equal( false, alt.type?([:literal, :escape]) )
14
+ assert_equal( true, alt.type?(:*) )
15
+ assert_equal( true, alt.type?([:*]) )
16
+ assert_equal( true, alt.type?([:literal, :escape, :*]) )
17
+
18
+ seq_1 = alt[0]
19
+ assert_equal( true, seq_1.type?(:expression) )
20
+ assert_equal( true, seq_1.first.type?(:literal) )
21
+
22
+ seq_2 = alt[1]
23
+ assert_equal( true, seq_2.type?(:*) )
24
+ assert_equal( true, seq_2.first.type?(:group) )
25
+
26
+ seq_3 = alt[2]
27
+ assert_equal( true, seq_3.first.type?(:set) )
28
+ end
29
+
30
+ def test_expression_is?
31
+ root = RP.parse(/.+|\.?/)
32
+
33
+ assert_equal( true, root.is?(:*) )
34
+
35
+ alt = root.first
36
+ assert_equal( true, alt.is?(:*) )
37
+ assert_equal( true, alt.is?(:alternation) )
38
+ assert_equal( true, alt.is?(:alternation, :meta) )
39
+
40
+ seq_1 = alt[0]
41
+ assert_equal( true, seq_1.is?(:sequence) )
42
+ assert_equal( true, seq_1.is?(:sequence, :expression) )
43
+
44
+ assert_equal( true, seq_1.first.is?(:dot) )
45
+ assert_equal( false, seq_1.first.is?(:dot, :escape) )
46
+ assert_equal( true, seq_1.first.is?(:dot, :meta) )
47
+ assert_equal( true, seq_1.first.is?(:dot, [:escape, :meta]) )
48
+
49
+ seq_2 = alt[1]
50
+ assert_equal( true, seq_2.first.is?(:dot) )
51
+ assert_equal( true, seq_2.first.is?(:dot, :escape) )
52
+ assert_equal( false, seq_2.first.is?(:dot, :meta) )
53
+ assert_equal( true, seq_2.first.is?(:dot, [:meta, :escape]) )
54
+ end
55
+
56
+ def test_expression_one_of?
57
+ root = RP.parse(/\Aab(c[\w])d|e.\z/)
58
+
59
+ assert_equal( true, root.one_of?(:*) )
60
+ assert_equal( true, root.one_of?(:* => :*) )
61
+ assert_equal( true, root.one_of?(:* => [:*]) )
62
+
63
+ alt = root.first
64
+ assert_equal( true, alt.one_of?(:*) )
65
+ assert_equal( true, alt.one_of?(:meta) )
66
+ assert_equal( true, alt.one_of?(:meta, :alternation) )
67
+ assert_equal( false, alt.one_of?(:meta => [:dot, :bogus]) )
68
+ assert_equal( true, alt.one_of?(:meta => [:dot, :alternation]) )
69
+
70
+ seq_1 = alt[0]
71
+ assert_equal( true, seq_1.one_of?(:expression) )
72
+ assert_equal( true, seq_1.one_of?(:expression => :sequence) )
73
+
74
+ assert_equal( true, seq_1.first.one_of?(:anchor) )
75
+ assert_equal( true, seq_1.first.one_of?(:anchor => :bos) )
76
+ assert_equal( false, seq_1.first.one_of?(:anchor => :eos) )
77
+ assert_equal( true, seq_1.first.one_of?(:anchor => [:escape, :meta, :bos]) )
78
+ assert_equal( false, seq_1.first.one_of?(:anchor => [:escape, :meta, :eos]) )
79
+
80
+ seq_2 = alt[1]
81
+ assert_equal( true, seq_2.first.one_of?(:literal) )
82
+
83
+ assert_equal( true, seq_2[1].one_of?(:meta) )
84
+ assert_equal( true, seq_2[1].one_of?(:meta => :dot) )
85
+ assert_equal( false, seq_2[1].one_of?(:meta => :alternation) )
86
+ assert_equal( true, seq_2[1].one_of?(:meta => [:dot]) )
87
+
88
+ assert_equal( false, seq_2.last.one_of?(:group) )
89
+ assert_equal( false, seq_2.last.one_of?(:group => [:*]) )
90
+ assert_equal( false, seq_2.last.one_of?(:group => [:*], :meta => :*) )
91
+
92
+ assert_equal( true, seq_2.last.one_of?(:meta => [:*], :* => :*) )
93
+ assert_equal( true, seq_2.last.one_of?(:meta => [:*], :anchor => :*) )
94
+ assert_equal( true, seq_2.last.one_of?(:meta => [:*], :anchor => :eos) )
95
+ assert_equal( false, seq_2.last.one_of?(:meta => [:*], :anchor => [:bos]) )
96
+ assert_equal( true, seq_2.last.one_of?(:meta => [:*], :anchor => [:bos, :eos]) )
97
+ end
98
+
99
+ end
@@ -0,0 +1,48 @@
1
+ require File.expand_path("../../helpers", __FILE__)
2
+
3
+ class ExpressionToH < Test::Unit::TestCase
4
+
5
+ def test_expression_to_h
6
+ h = RP.parse('abc').to_h
7
+
8
+ assert_equal( h, {
9
+ :token => :root,
10
+ :type => :expression,
11
+ :text => 'abc',
12
+ :starts_at => 0,
13
+ :length => 3,
14
+ :quantifier => nil,
15
+ :options => nil,
16
+ :level => nil,
17
+ :set_level => nil,
18
+ :conditional_level => nil,
19
+ :expressions => [
20
+ {
21
+ :token => :literal,
22
+ :type => :literal,
23
+ :text => 'abc',
24
+ :starts_at => 0,
25
+ :length => 3,
26
+ :quantifier => nil,
27
+ :options => nil,
28
+ :level => 0,
29
+ :set_level => 0,
30
+ :conditional_level => 0
31
+ }
32
+ ]
33
+ })
34
+ end
35
+
36
+ def test_expression_quantifier_to_h
37
+ h = RP.parse('a{2,4}')[0].quantifier.to_h
38
+
39
+ assert_equal( h, {
40
+ :max => 4,
41
+ :min => 2,
42
+ :mode => :greedy,
43
+ :text => '{2,4}',
44
+ :token => :interval
45
+ })
46
+ end
47
+
48
+ end