rattler 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (182) hide show
  1. data/README.rdoc +57 -37
  2. data/features/command_line/dest_option.feature +8 -21
  3. data/features/command_line/lib_option.feature +37 -0
  4. data/features/command_line/parser_generator.feature +7 -4
  5. data/features/grammar/back_reference.feature +37 -0
  6. data/features/grammar/fail.feature +3 -3
  7. data/features/grammar/labels.feature +11 -3
  8. data/features/grammar/list_matching.feature +14 -5
  9. data/features/grammar/literal.feature +30 -4
  10. data/features/grammar/nonterminal.feature +1 -1
  11. data/features/grammar/ordered_choice.feature +2 -2
  12. data/features/grammar/skip_operator.feature +1 -1
  13. data/features/grammar/symantic_action.feature +7 -7
  14. data/features/grammar/whitespace.feature +2 -2
  15. data/features/step_definitions/grammar_steps.rb +2 -2
  16. data/lib/rattler/back_end.rb +1 -0
  17. data/lib/rattler/back_end/compiler.rb +19 -20
  18. data/lib/rattler/back_end/optimizer.rb +100 -0
  19. data/lib/rattler/back_end/optimizer/composite_reducing.rb +18 -0
  20. data/lib/rattler/back_end/optimizer/flatten_choice.rb +31 -0
  21. data/lib/rattler/back_end/optimizer/flatten_sequence.rb +59 -0
  22. data/lib/rattler/back_end/optimizer/flattening.rb +17 -0
  23. data/lib/rattler/back_end/optimizer/inline_regular_rules.rb +46 -0
  24. data/lib/rattler/back_end/optimizer/join_match_capturing_sequence.rb +71 -0
  25. data/lib/rattler/back_end/optimizer/join_match_choice.rb +37 -0
  26. data/lib/rattler/back_end/optimizer/join_match_matching_sequence.rb +38 -0
  27. data/lib/rattler/back_end/optimizer/join_match_sequence.rb +17 -0
  28. data/lib/rattler/back_end/optimizer/join_predicate_bare_match.rb +68 -0
  29. data/lib/rattler/back_end/optimizer/join_predicate_match.rb +17 -0
  30. data/lib/rattler/back_end/optimizer/join_predicate_nested_match.rb +37 -0
  31. data/lib/rattler/back_end/optimizer/join_predicate_or_bare_match.rb +68 -0
  32. data/lib/rattler/back_end/optimizer/join_predicate_or_match.rb +17 -0
  33. data/lib/rattler/back_end/optimizer/join_predicate_or_nested_match.rb +36 -0
  34. data/lib/rattler/back_end/optimizer/match_joining.rb +60 -0
  35. data/lib/rattler/back_end/optimizer/optimization.rb +94 -0
  36. data/lib/rattler/back_end/optimizer/optimization_context.rb +72 -0
  37. data/lib/rattler/back_end/optimizer/optimization_sequence.rb +37 -0
  38. data/lib/rattler/back_end/optimizer/optimize_children.rb +46 -0
  39. data/lib/rattler/back_end/optimizer/reduce_repeat_match.rb +44 -0
  40. data/lib/rattler/back_end/optimizer/remove_meaningless_wrapper.rb +32 -0
  41. data/lib/rattler/back_end/optimizer/simplify_redundant_repeat.rb +43 -0
  42. data/lib/rattler/back_end/optimizer/simplify_token_match.rb +38 -0
  43. data/lib/rattler/back_end/parser_generator.rb +21 -14
  44. data/lib/rattler/back_end/parser_generator/apply_generator.rb +35 -35
  45. data/lib/rattler/back_end/parser_generator/assert_generator.rb +29 -30
  46. data/lib/rattler/back_end/parser_generator/back_reference_generator.rb +93 -0
  47. data/lib/rattler/back_end/parser_generator/choice_generator.rb +33 -49
  48. data/lib/rattler/back_end/parser_generator/direct_action_generator.rb +14 -14
  49. data/lib/rattler/back_end/parser_generator/disallow_generator.rb +29 -30
  50. data/lib/rattler/back_end/parser_generator/dispatch_action_generator.rb +11 -13
  51. data/lib/rattler/back_end/parser_generator/expr_generator.rb +36 -56
  52. data/lib/rattler/back_end/parser_generator/fail_generator.rb +18 -18
  53. data/lib/rattler/back_end/parser_generator/group_match.rb +18 -0
  54. data/lib/rattler/back_end/parser_generator/group_match_generator.rb +76 -0
  55. data/lib/rattler/back_end/parser_generator/label_generator.rb +25 -6
  56. data/lib/rattler/back_end/parser_generator/list1_generator.rb +7 -7
  57. data/lib/rattler/back_end/parser_generator/list_generating.rb +19 -20
  58. data/lib/rattler/back_end/parser_generator/list_generator.rb +5 -5
  59. data/lib/rattler/back_end/parser_generator/match_generator.rb +52 -52
  60. data/lib/rattler/back_end/parser_generator/one_or_more_generator.rb +6 -6
  61. data/lib/rattler/back_end/parser_generator/optional_generator.rb +30 -29
  62. data/lib/rattler/back_end/parser_generator/predicate_propogating.rb +8 -8
  63. data/lib/rattler/back_end/parser_generator/repeat_generating.rb +23 -25
  64. data/lib/rattler/back_end/parser_generator/rule_generator.rb +27 -79
  65. data/lib/rattler/back_end/parser_generator/rule_set_generator.rb +102 -0
  66. data/lib/rattler/back_end/parser_generator/sequence_generator.rb +49 -41
  67. data/lib/rattler/back_end/parser_generator/skip_generator.rb +14 -20
  68. data/lib/rattler/back_end/parser_generator/skip_propogating.rb +4 -4
  69. data/lib/rattler/back_end/parser_generator/sub_generating.rb +6 -0
  70. data/lib/rattler/back_end/parser_generator/token_generator.rb +12 -12
  71. data/lib/rattler/back_end/parser_generator/token_propogating.rb +2 -2
  72. data/lib/rattler/back_end/parser_generator/zero_or_more_generator.rb +4 -4
  73. data/lib/rattler/grammar.rb +4 -3
  74. data/lib/rattler/grammar/analysis.rb +91 -0
  75. data/lib/rattler/grammar/grammar.rb +37 -25
  76. data/lib/rattler/grammar/grammar_parser.rb +19 -11
  77. data/lib/rattler/grammar/metagrammar.rb +569 -800
  78. data/lib/rattler/grammar/rattler.rtlr +162 -144
  79. data/lib/rattler/parsers.rb +5 -1
  80. data/lib/rattler/parsers/action_code.rb +29 -15
  81. data/lib/rattler/parsers/apply.rb +5 -5
  82. data/lib/rattler/parsers/assert.rb +4 -18
  83. data/lib/rattler/parsers/back_reference.rb +46 -0
  84. data/lib/rattler/parsers/choice.rb +6 -39
  85. data/lib/rattler/parsers/combinator_parser.rb +32 -0
  86. data/lib/rattler/parsers/combining.rb +3 -29
  87. data/lib/rattler/parsers/direct_action.rb +27 -30
  88. data/lib/rattler/parsers/disallow.rb +4 -18
  89. data/lib/rattler/parsers/dispatch_action.rb +30 -25
  90. data/lib/rattler/parsers/label.rb +9 -18
  91. data/lib/rattler/parsers/list.rb +3 -34
  92. data/lib/rattler/parsers/list1.rb +4 -36
  93. data/lib/rattler/parsers/list_parser.rb +64 -0
  94. data/lib/rattler/parsers/match.rb +7 -42
  95. data/lib/rattler/parsers/node_code.rb +44 -0
  96. data/lib/rattler/parsers/one_or_more.rb +7 -27
  97. data/lib/rattler/parsers/optional.rb +5 -25
  98. data/lib/rattler/parsers/parser.rb +16 -44
  99. data/lib/rattler/parsers/parser_dsl.rb +13 -3
  100. data/lib/rattler/parsers/predicate.rb +4 -12
  101. data/lib/rattler/parsers/rule.rb +18 -19
  102. data/lib/rattler/parsers/rule_set.rb +63 -0
  103. data/lib/rattler/parsers/sequence.rb +12 -46
  104. data/lib/rattler/parsers/skip.rb +12 -26
  105. data/lib/rattler/parsers/token.rb +6 -21
  106. data/lib/rattler/parsers/zero_or_more.rb +6 -26
  107. data/lib/rattler/runner.rb +66 -28
  108. data/lib/rattler/runtime/extended_packrat_parser.rb +26 -20
  109. data/lib/rattler/runtime/packrat_parser.rb +17 -21
  110. data/lib/rattler/runtime/parser.rb +12 -2
  111. data/lib/rattler/runtime/recursive_descent_parser.rb +3 -11
  112. data/lib/rattler/util.rb +2 -1
  113. data/lib/rattler/util/graphviz.rb +29 -0
  114. data/lib/rattler/util/graphviz/digraph_builder.rb +71 -0
  115. data/lib/rattler/util/graphviz/node_builder.rb +84 -0
  116. data/lib/rattler/util/node.rb +37 -19
  117. data/lib/rattler/util/parser_spec_helper.rb +61 -35
  118. data/spec/rattler/back_end/compiler_spec.rb +6 -860
  119. data/spec/rattler/back_end/optimizer/flatten_choice_spec.rb +70 -0
  120. data/spec/rattler/back_end/optimizer/flatten_sequence_spec.rb +130 -0
  121. data/spec/rattler/back_end/optimizer/inline_regular_rules_spec.rb +80 -0
  122. data/spec/rattler/back_end/optimizer/join_match_capturing_sequence_spec.rb +241 -0
  123. data/spec/rattler/back_end/optimizer/join_match_choice_spec.rb +100 -0
  124. data/spec/rattler/back_end/optimizer/join_match_matching_sequence_spec.rb +112 -0
  125. data/spec/rattler/back_end/optimizer/join_predicate_bare_match_spec.rb +194 -0
  126. data/spec/rattler/back_end/optimizer/join_predicate_nested_match_spec.rb +180 -0
  127. data/spec/rattler/back_end/optimizer/join_predicate_or_bare_match_spec.rb +153 -0
  128. data/spec/rattler/back_end/optimizer/join_predicate_or_nested_match_spec.rb +153 -0
  129. data/spec/rattler/back_end/optimizer/reduce_repeat_match_spec.rb +98 -0
  130. data/spec/rattler/back_end/optimizer/simplify_redundant_repeat_spec.rb +226 -0
  131. data/spec/rattler/back_end/optimizer/simplify_token_match_spec.rb +85 -0
  132. data/spec/rattler/back_end/parser_generator/apply_generator_spec.rb +38 -33
  133. data/spec/rattler/back_end/parser_generator/assert_generator_spec.rb +38 -33
  134. data/spec/rattler/back_end/parser_generator/back_reference_generator_spec.rb +181 -0
  135. data/spec/rattler/back_end/parser_generator/choice_generator_spec.rb +38 -33
  136. data/spec/rattler/back_end/parser_generator/direct_action_generator_spec.rb +38 -33
  137. data/spec/rattler/back_end/parser_generator/disallow_generator_spec.rb +38 -33
  138. data/spec/rattler/back_end/parser_generator/dispatch_action_generator_spec.rb +38 -33
  139. data/spec/rattler/back_end/parser_generator/group_match_generator_spec.rb +185 -0
  140. data/spec/rattler/back_end/parser_generator/label_generator_spec.rb +38 -33
  141. data/spec/rattler/back_end/parser_generator/list1_generator_spec.rb +10 -5
  142. data/spec/rattler/back_end/parser_generator/list_generator_spec.rb +10 -5
  143. data/spec/rattler/back_end/parser_generator/match_generator_spec.rb +38 -33
  144. data/spec/rattler/back_end/parser_generator/one_or_more_generator_spec.rb +38 -33
  145. data/spec/rattler/back_end/parser_generator/optional_generator_spec.rb +38 -33
  146. data/spec/rattler/back_end/parser_generator/rule_generator_spec.rb +13 -46
  147. data/spec/rattler/back_end/parser_generator/rule_set_generator_spec.rb +97 -0
  148. data/spec/rattler/back_end/parser_generator/sequence_generator_spec.rb +38 -33
  149. data/spec/rattler/back_end/parser_generator/skip_generator_spec.rb +38 -33
  150. data/spec/rattler/back_end/parser_generator/token_generator_spec.rb +38 -33
  151. data/spec/rattler/back_end/parser_generator/zero_or_more_generator_spec.rb +39 -34
  152. data/spec/rattler/back_end/shared_compiler_examples.rb +885 -0
  153. data/spec/rattler/grammar/analysis_spec.rb +167 -0
  154. data/spec/rattler/grammar/grammar_parser_spec.rb +169 -179
  155. data/spec/rattler/grammar/grammar_spec.rb +24 -21
  156. data/spec/rattler/parsers/action_code_spec.rb +64 -19
  157. data/spec/rattler/parsers/apply_spec.rb +9 -9
  158. data/spec/rattler/parsers/back_reference_spec.rb +38 -0
  159. data/spec/rattler/parsers/combinator_parser_spec.rb +14 -0
  160. data/spec/rattler/parsers/direct_action_spec.rb +16 -2
  161. data/spec/rattler/parsers/dispatch_action_spec.rb +15 -32
  162. data/spec/rattler/parsers/fail_spec.rb +6 -4
  163. data/spec/rattler/parsers/label_spec.rb +10 -28
  164. data/spec/rattler/parsers/node_code_spec.rb +48 -0
  165. data/spec/rattler/parsers/parser_dsl_spec.rb +1 -1
  166. data/spec/rattler/parsers/rule_set_spec.rb +35 -0
  167. data/spec/rattler/parsers/sequence_spec.rb +15 -24
  168. data/spec/rattler/runtime/extended_packrat_parser_spec.rb +22 -17
  169. data/spec/rattler/runtime/packrat_parser_spec.rb +1 -1
  170. data/spec/rattler/runtime/parse_node_spec.rb +15 -19
  171. data/spec/rattler/runtime/recursive_descent_parser_spec.rb +1 -1
  172. data/spec/rattler/runtime/shared_parser_examples.rb +61 -28
  173. data/spec/rattler/util/graphviz/node_builder_spec.rb +84 -0
  174. data/spec/rattler/util/node_spec.rb +92 -65
  175. data/spec/rattler_spec.rb +16 -16
  176. data/spec/support/combinator_parser_spec_helper.rb +19 -18
  177. data/spec/support/compiler_spec_helper.rb +56 -87
  178. data/spec/support/runtime_parser_spec_helper.rb +6 -14
  179. metadata +117 -22
  180. data/features/grammar/regex.feature +0 -24
  181. data/lib/rattler/parsers/match_joining.rb +0 -67
  182. data/lib/rattler/parsers/rules.rb +0 -43
@@ -0,0 +1,97 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../../spec_helper')
2
+
3
+ include Rattler::Parsers
4
+
5
+ describe Rattler::BackEnd::ParserGenerator::RuleSetGenerator do
6
+
7
+ include ParserGeneratorSpecHelper
8
+
9
+ describe '#generate' do
10
+ context 'given rules with no start rule defined' do
11
+
12
+ let(:rules) { RuleSet[
13
+
14
+ Rule[:a, Choice[
15
+ Match['a'],
16
+ Apply[:b]
17
+ ]],
18
+
19
+ Rule[:b, Match['b']]
20
+
21
+ ] }
22
+
23
+ it 'generates #match_<rule> methods' do
24
+ generated_code {|g| g.generate rules }.
25
+ should == (<<-CODE).strip
26
+ # @private
27
+ def match_a #:nodoc:
28
+ apply :match_a!
29
+ end
30
+
31
+ # @private
32
+ def match_a! #:nodoc:
33
+ @scanner.scan("a") ||
34
+ match(:b)
35
+ end
36
+
37
+ # @private
38
+ def match_b #:nodoc:
39
+ apply :match_b!
40
+ end
41
+
42
+ # @private
43
+ def match_b! #:nodoc:
44
+ @scanner.scan("b")
45
+ end
46
+ CODE
47
+ end
48
+ end
49
+
50
+ context 'given rules with a start rule defined' do
51
+
52
+ let(:rules) { RuleSet[
53
+
54
+ Rule[:a, Choice[
55
+ Match['a'],
56
+ Apply[:b]
57
+ ]],
58
+
59
+ Rule[:b, Match['b']],
60
+
61
+ { :start_rule => :a }
62
+ ] }
63
+
64
+ it 'generates #start_rule and #match_<rule> methods' do
65
+ generated_code {|g| g.generate rules }.
66
+ should == (<<-CODE).strip
67
+ # @private
68
+ def start_rule #:nodoc:
69
+ :a
70
+ end
71
+
72
+ # @private
73
+ def match_a #:nodoc:
74
+ apply :match_a!
75
+ end
76
+
77
+ # @private
78
+ def match_a! #:nodoc:
79
+ @scanner.scan("a") ||
80
+ match(:b)
81
+ end
82
+
83
+ # @private
84
+ def match_b #:nodoc:
85
+ apply :match_b!
86
+ end
87
+
88
+ # @private
89
+ def match_b! #:nodoc:
90
+ @scanner.scan("b")
91
+ end
92
+ CODE
93
+ end
94
+ end
95
+ end
96
+
97
+ end
@@ -1,15 +1,16 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/../../../spec_helper')
2
2
 
3
+ include Rattler::BackEnd::ParserGenerator
3
4
  include Rattler::Parsers
4
5
 
5
- describe Rattler::BackEnd::ParserGenerator::SequenceGenerator do
6
-
6
+ describe SequenceGenerator do
7
+
7
8
  include ParserGeneratorSpecHelper
8
-
9
+
9
10
  let(:sequence) { Sequence[Match[/[[:alpha:]]+/], Match[/[[:digit:]]+/]] }
10
-
11
+
11
12
  describe '#gen_basic' do
12
-
13
+
13
14
  context 'when nested' do
14
15
  it 'generates nested sequence matching code' do
15
16
  nested_code(:sequence_level => 2) {|g| g.gen_basic sequence }.
@@ -28,7 +29,7 @@ end
28
29
  CODE
29
30
  end
30
31
  end
31
-
32
+
32
33
  context 'when top-level' do
33
34
  it 'generates top-level sequence matching code' do
34
35
  top_level_code(:sequence_level => 0) {|g| g.gen_basic sequence }.
@@ -46,9 +47,9 @@ end
46
47
  end
47
48
  end
48
49
  end
49
-
50
+
50
51
  describe '#gen_assert' do
51
-
52
+
52
53
  context 'when nested' do
53
54
  it 'generates nested sequence positive lookahead code' do
54
55
  nested_code(:sequence_level => 2) {|g| g.gen_assert sequence }.
@@ -66,7 +67,7 @@ end
66
67
  CODE
67
68
  end
68
69
  end
69
-
70
+
70
71
  context 'when top-level' do
71
72
  it 'generates top-level sequence positive lookahead code' do
72
73
  top_level_code(:sequence_level => 0) {|g| g.gen_assert sequence }.
@@ -83,9 +84,9 @@ r
83
84
  end
84
85
  end
85
86
  end
86
-
87
+
87
88
  describe '#gen_disallow' do
88
-
89
+
89
90
  context 'when nested' do
90
91
  it 'generates nested sequence negative lookahead code' do
91
92
  nested_code(:sequence_level => 2) {|g| g.gen_disallow sequence }.
@@ -102,7 +103,7 @@ end
102
103
  CODE
103
104
  end
104
105
  end
105
-
106
+
106
107
  context 'when top-level' do
107
108
  it 'generates top-level sequence negative lookahead code' do
108
109
  top_level_code(:sequence_level => 0) {|g| g.gen_disallow sequence }.
@@ -118,12 +119,14 @@ r
118
119
  end
119
120
  end
120
121
  end
121
-
122
+
122
123
  describe '#gen_dispatch_action' do
123
-
124
+
125
+ let(:code) { NodeCode.new('Atom', 'parsed') }
126
+
124
127
  context 'when nested' do
125
128
  it 'generates nested sequence matching code with a dispatch action' do
126
- nested_code(:sequence_level => 2) {|g| g.gen_dispatch_action sequence, 'Atom', 'parsed' }.
129
+ nested_code(:sequence_level => 2) {|g| g.gen_dispatch_action sequence, code }.
127
130
  should == (<<-CODE).strip
128
131
  begin
129
132
  p2 = @scanner.pos
@@ -139,10 +142,10 @@ end
139
142
  CODE
140
143
  end
141
144
  end
142
-
145
+
143
146
  context 'when top-level' do
144
147
  it 'generates top-level sequence matching code with a dispatch action' do
145
- top_level_code(:sequence_level => 0) {|g| g.gen_dispatch_action sequence, 'Atom', 'parsed' }.
148
+ top_level_code(:sequence_level => 0) {|g| g.gen_dispatch_action sequence, code }.
146
149
  should == (<<-CODE).strip
147
150
  p0 = @scanner.pos
148
151
  begin
@@ -157,12 +160,14 @@ end
157
160
  end
158
161
  end
159
162
  end
160
-
163
+
161
164
  describe '#gen_direct_action' do
162
-
165
+
166
+ let(:code) { ActionCode.new('|a,b| a + b') }
167
+
163
168
  context 'when nested' do
164
169
  it 'generates nested sequence matching code with a direct action' do
165
- nested_code(:sequence_level => 2) {|g| g.gen_direct_action sequence, ActionCode.new('|a,b| a + b') }.
170
+ nested_code(:sequence_level => 2) {|g| g.gen_direct_action sequence, code }.
166
171
  should == (<<-CODE).strip
167
172
  begin
168
173
  p2 = @scanner.pos
@@ -178,10 +183,10 @@ end
178
183
  CODE
179
184
  end
180
185
  end
181
-
186
+
182
187
  context 'when top-level' do
183
188
  it 'generates nested sequence matching code with a direct action' do
184
- top_level_code(:sequence_level => 0) {|g| g.gen_direct_action sequence, ActionCode.new('|a,b| a + b') }.
189
+ top_level_code(:sequence_level => 0) {|g| g.gen_direct_action sequence, code }.
185
190
  should == (<<-CODE).strip
186
191
  p0 = @scanner.pos
187
192
  begin
@@ -196,9 +201,9 @@ end
196
201
  end
197
202
  end
198
203
  end
199
-
204
+
200
205
  describe '#gen_skip' do
201
-
206
+
202
207
  context 'when nested' do
203
208
  it 'generates nested token sequence matching code' do
204
209
  nested_code(:sequence_level => 2) {|g| g.gen_skip sequence }.
@@ -217,7 +222,7 @@ end
217
222
  CODE
218
223
  end
219
224
  end
220
-
225
+
221
226
  context 'when top-level' do
222
227
  it 'generates top-level token sequence matching code' do
223
228
  top_level_code(:sequence_level => 0) {|g| g.gen_skip sequence }.
@@ -235,9 +240,9 @@ end
235
240
  end
236
241
  end
237
242
  end
238
-
243
+
239
244
  describe '#gen_token' do
240
-
245
+
241
246
  context 'when nested' do
242
247
  it 'generates nested token sequence matching code' do
243
248
  nested_code(:sequence_level => 2) {|g| g.gen_token sequence }.
@@ -256,7 +261,7 @@ end
256
261
  CODE
257
262
  end
258
263
  end
259
-
264
+
260
265
  context 'when top-level' do
261
266
  it 'generates top-level token sequence matching code' do
262
267
  top_level_code(:sequence_level => 0) {|g| g.gen_token sequence }.
@@ -274,7 +279,7 @@ end
274
279
  end
275
280
  end
276
281
  end
277
-
282
+
278
283
  describe '#gen_intermediate' do
279
284
  it 'generates nested sequence matching code' do
280
285
  nested_code(:sequence_level => 2) {|g| g.gen_intermediate sequence }.
@@ -293,7 +298,7 @@ end
293
298
  CODE
294
299
  end
295
300
  end
296
-
301
+
297
302
  describe '#gen_intermediate_assert' do
298
303
  it 'generates nested sequence positive lookahead code' do
299
304
  nested_code(:sequence_level => 2) {|g| g.gen_intermediate_assert sequence }.
@@ -311,7 +316,7 @@ end
311
316
  CODE
312
317
  end
313
318
  end
314
-
319
+
315
320
  describe '#gen_intermediate_disallow' do
316
321
  it 'generates nested sequence negative lookahead code' do
317
322
  nested_code(:sequence_level => 2) {|g| g.gen_intermediate_disallow sequence }.
@@ -328,7 +333,7 @@ end
328
333
  CODE
329
334
  end
330
335
  end
331
-
336
+
332
337
  describe '#gen_intermediate_skip' do
333
338
  it 'generates nested sequence skipping code' do
334
339
  nested_code(:sequence_level => 2) {|g| g.gen_intermediate_skip sequence }.
@@ -347,5 +352,5 @@ end
347
352
  CODE
348
353
  end
349
354
  end
350
-
355
+
351
356
  end
@@ -1,22 +1,23 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/../../../spec_helper')
2
2
 
3
+ include Rattler::BackEnd::ParserGenerator
3
4
  include Rattler::Parsers
4
5
 
5
- describe Rattler::BackEnd::ParserGenerator::SkipGenerator do
6
-
6
+ describe SkipGenerator do
7
+
7
8
  include ParserGeneratorSpecHelper
8
-
9
+
9
10
  let(:skip) { Skip[Match[/\w+/]] }
10
-
11
+
11
12
  describe '#gen_basic' do
12
-
13
+
13
14
  context 'when nested' do
14
15
  it 'generates nested skipping code' do
15
16
  nested_code {|g| g.gen_basic skip }.
16
17
  should == '(@scanner.skip(/\w+/) && true)'
17
18
  end
18
19
  end
19
-
20
+
20
21
  context 'when top-level' do
21
22
  it 'generates top level skipping code' do
22
23
  top_level_code {|g| g.gen_basic skip }.
@@ -24,16 +25,16 @@ describe Rattler::BackEnd::ParserGenerator::SkipGenerator do
24
25
  end
25
26
  end
26
27
  end
27
-
28
+
28
29
  describe '#gen_assert' do
29
-
30
+
30
31
  context 'when nested' do
31
32
  it 'generates nested positive lookahead code' do
32
33
  nested_code {|g| g.gen_assert skip }.
33
34
  should == '(@scanner.skip(/(?=\w+)/) && true)'
34
35
  end
35
36
  end
36
-
37
+
37
38
  context 'when top-level' do
38
39
  it 'generates top level positive lookahead code' do
39
40
  top_level_code {|g| g.gen_assert skip }.
@@ -41,16 +42,16 @@ describe Rattler::BackEnd::ParserGenerator::SkipGenerator do
41
42
  end
42
43
  end
43
44
  end
44
-
45
+
45
46
  describe '#gen_disallow' do
46
-
47
+
47
48
  context 'when nested' do
48
49
  it 'generates nested negative lookahead code' do
49
50
  nested_code {|g| g.gen_disallow skip }.
50
51
  should == '(@scanner.skip(/(?!\w+)/) && true)'
51
52
  end
52
53
  end
53
-
54
+
54
55
  context 'when top-level' do
55
56
  it 'generates top level negative lookahead code' do
56
57
  top_level_code {|g| g.gen_disallow skip }.
@@ -58,12 +59,14 @@ describe Rattler::BackEnd::ParserGenerator::SkipGenerator do
58
59
  end
59
60
  end
60
61
  end
61
-
62
+
62
63
  describe '#gen_dispatch_action' do
63
-
64
+
65
+ let(:code) { NodeCode.new('Word', 'parsed') }
66
+
64
67
  context 'when nested' do
65
68
  it 'generates nested matching code with a dispatch action' do
66
- nested_code {|g| g.gen_dispatch_action skip, 'Word', 'parsed' }.
69
+ nested_code {|g| g.gen_dispatch_action skip, code }.
67
70
  should == (<<-CODE).strip
68
71
  begin
69
72
  @scanner.skip(/\\w+/) &&
@@ -72,10 +75,10 @@ end
72
75
  CODE
73
76
  end
74
77
  end
75
-
78
+
76
79
  context 'when top-level' do
77
80
  it 'generates top level matching code with a dispatch action' do
78
- top_level_code {|g| g.gen_dispatch_action skip, 'Word', 'parsed' }.
81
+ top_level_code {|g| g.gen_dispatch_action skip, code }.
79
82
  should == (<<-CODE).strip
80
83
  @scanner.skip(/\\w+/) &&
81
84
  Word.parsed([])
@@ -83,12 +86,14 @@ Word.parsed([])
83
86
  end
84
87
  end
85
88
  end
86
-
89
+
87
90
  describe '#gen_direct_action' do
88
-
91
+
92
+ let(:code) { ActionCode.new('[]') }
93
+
89
94
  context 'when nested' do
90
95
  it 'generates nested matching code with a direct action' do
91
- nested_code {|g| g.gen_direct_action skip, ActionCode.new('[]') }.
96
+ nested_code {|g| g.gen_direct_action skip, code }.
92
97
  should == (<<-CODE).strip
93
98
  begin
94
99
  @scanner.skip(/\\w+/) &&
@@ -97,10 +102,10 @@ end
97
102
  CODE
98
103
  end
99
104
  end
100
-
105
+
101
106
  context 'when top-level' do
102
107
  it 'generates top level matching code with a direct action' do
103
- top_level_code {|g| g.gen_direct_action skip, ActionCode.new('[]') }.
108
+ top_level_code {|g| g.gen_direct_action skip, code }.
104
109
  should == (<<-CODE).strip
105
110
  @scanner.skip(/\\w+/) &&
106
111
  ([])
@@ -108,16 +113,16 @@ end
108
113
  end
109
114
  end
110
115
  end
111
-
116
+
112
117
  describe '#gen_token' do
113
-
118
+
114
119
  context 'when nested' do
115
120
  it 'generates nested token matching code' do
116
121
  nested_code {|g| g.gen_token skip }.
117
122
  should == '@scanner.scan(/\w+/)'
118
123
  end
119
124
  end
120
-
125
+
121
126
  context 'when top-level' do
122
127
  it 'generates top level token matching code' do
123
128
  top_level_code {|g| g.gen_token skip }.
@@ -125,16 +130,16 @@ end
125
130
  end
126
131
  end
127
132
  end
128
-
133
+
129
134
  describe '#gen_skip' do
130
-
135
+
131
136
  context 'when nested' do
132
137
  it 'generates nested skipping code' do
133
138
  nested_code {|g| g.gen_skip skip }.
134
139
  should == '(@scanner.skip(/\w+/) && true)'
135
140
  end
136
141
  end
137
-
142
+
138
143
  context 'when top-level' do
139
144
  it 'generates top level skipping code' do
140
145
  top_level_code {|g| g.gen_skip skip }.
@@ -142,33 +147,33 @@ end
142
147
  end
143
148
  end
144
149
  end
145
-
150
+
146
151
  describe '#gen_intermediate' do
147
152
  it 'generates intermediate skipping code' do
148
153
  nested_code {|g| g.gen_intermediate skip }.
149
154
  should == '@scanner.skip(/\w+/)'
150
155
  end
151
156
  end
152
-
157
+
153
158
  describe '#gen_intermediate_assert' do
154
159
  it 'generates intermediate positive lookahead code' do
155
160
  nested_code {|g| g.gen_intermediate_assert skip }.
156
161
  should == '@scanner.skip(/(?=\w+)/)'
157
162
  end
158
163
  end
159
-
164
+
160
165
  describe '#gen_intermediate_disallow' do
161
166
  it 'generates intermediate negative lookahead code' do
162
167
  nested_code {|g| g.gen_intermediate_disallow skip }.
163
168
  should == '@scanner.skip(/(?!\w+)/)'
164
169
  end
165
170
  end
166
-
171
+
167
172
  describe '#gen_intermediate_skip' do
168
173
  it 'generates intermediate skipping code' do
169
174
  nested_code {|g| g.gen_intermediate_skip skip }.
170
175
  should == '@scanner.skip(/\w+/)'
171
176
  end
172
177
  end
173
-
178
+
174
179
  end