rattler 0.3.0 → 0.4.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 (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