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,85 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../../spec_helper')
2
+
3
+ include Rattler::Parsers
4
+
5
+ describe Rattler::BackEnd::Optimizer::SimplifyTokenMatch do
6
+
7
+ describe '#apply' do
8
+
9
+ context 'given a token of a match' do
10
+
11
+ let(:parser) { Token[Match[/a/]] }
12
+
13
+ it 'returns the match' do
14
+ subject.apply(parser, :any).should == Match[/a/]
15
+ end
16
+ end
17
+
18
+ context 'given a token of a back reference' do
19
+
20
+ let(:parser) { Token[BackReference[:a]] }
21
+
22
+ it 'returns the back reference' do
23
+ subject.apply(parser, :any).should == BackReference[:a]
24
+ end
25
+ end
26
+
27
+ context 'given a token of a token' do
28
+
29
+ let(:parser) { Token[Token[Apply[:foo]]] }
30
+
31
+ it 'returns the inner token' do
32
+ subject.apply(parser, :any).should == Token[Apply[:foo]]
33
+ end
34
+ end
35
+ end
36
+
37
+ describe '#applies_to?' do
38
+
39
+ context 'given a token of a match' do
40
+
41
+ let(:parser) { Token[Match[/a/]] }
42
+
43
+ it 'returns true' do
44
+ subject.applies_to?(parser, :any).should be_true
45
+ end
46
+ end
47
+
48
+ context 'given a token of a back reference' do
49
+
50
+ let(:parser) { Token[BackReference[:a]] }
51
+
52
+ it 'returns true' do
53
+ subject.applies_to?(parser, :any).should be_true
54
+ end
55
+ end
56
+
57
+ context 'given a token of a token' do
58
+
59
+ let(:parser) { Token[Token[Apply[:foo]]] }
60
+
61
+ it 'returns true' do
62
+ subject.applies_to?(parser, :any).should be_true
63
+ end
64
+ end
65
+
66
+ context 'given a token of something other than a terminal parser' do
67
+
68
+ let(:parser) { Token[Apply[:foo]] }
69
+
70
+ it 'returns false' do
71
+ subject.applies_to?(parser, :any).should be_false
72
+ end
73
+ end
74
+
75
+ context 'given something other than a token' do
76
+
77
+ let(:parser) { Apply[:foo] }
78
+
79
+ it 'returns false' do
80
+ subject.applies_to?(parser, :any).should be_false
81
+ end
82
+ end
83
+ end
84
+
85
+ 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::ApplyGenerator do
6
-
6
+ describe ApplyGenerator do
7
+
7
8
  include ParserGeneratorSpecHelper
8
-
9
+
9
10
  let(:apply) { Apply[:foo] }
10
-
11
+
11
12
  describe '#gen_basic' do
12
-
13
+
13
14
  context 'when nested' do
14
15
  it 'generates basic apply-rule code' do
15
16
  nested_code {|g| g.gen_basic apply }.
16
17
  should == 'match(:foo)'
17
18
  end
18
19
  end
19
-
20
+
20
21
  context 'when top-level' do
21
22
  it 'generates basic apply-rule code' do
22
23
  top_level_code {|g| g.gen_basic apply }.
@@ -24,9 +25,9 @@ describe Rattler::BackEnd::ParserGenerator::ApplyGenerator 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 rule positive lookahead code' do
32
33
  nested_code {|g| g.gen_assert apply }.
@@ -40,7 +41,7 @@ end
40
41
  CODE
41
42
  end
42
43
  end
43
-
44
+
44
45
  context 'when top-level' do
45
46
  it 'generates top level rule positive lookahead code' do
46
47
  top_level_code {|g| g.gen_assert apply }.
@@ -53,9 +54,9 @@ r
53
54
  end
54
55
  end
55
56
  end
56
-
57
+
57
58
  describe '#gen_disallow' do
58
-
59
+
59
60
  context 'when nested' do
60
61
  it 'generates nested rule negative lookahead code' do
61
62
  nested_code {|g| g.gen_disallow apply }.
@@ -69,7 +70,7 @@ end
69
70
  CODE
70
71
  end
71
72
  end
72
-
73
+
73
74
  context 'when top-level' do
74
75
  it 'generates top level rule negative lookahead code' do
75
76
  top_level_code {|g| g.gen_disallow apply }.
@@ -82,43 +83,47 @@ r
82
83
  end
83
84
  end
84
85
  end
85
-
86
+
86
87
  describe '#gen_dispatch_action' do
87
-
88
+
89
+ let(:code) { NodeCode.new('Word', 'parsed') }
90
+
88
91
  context 'when nested' do
89
92
  it 'generates nested apply-rule code with a dispatch action' do
90
- nested_code {|g| g.gen_dispatch_action(Apply[:foo], 'Word', 'parsed') }.
93
+ nested_code {|g| g.gen_dispatch_action apply, code }.
91
94
  should == '((r = match(:foo)) && Word.parsed([r]))'
92
95
  end
93
96
  end
94
-
97
+
95
98
  context 'when top-level' do
96
99
  it 'generates top level apply-rule code with a dispatch action' do
97
- top_level_code {|g| g.gen_dispatch_action(Apply[:foo], 'Word', 'parsed') }.
100
+ top_level_code {|g| g.gen_dispatch_action apply, code }.
98
101
  should == '(r = match(:foo)) && Word.parsed([r])'
99
102
  end
100
103
  end
101
104
  end
102
-
105
+
103
106
  describe '#gen_direct_action' do
104
-
107
+
108
+ let(:code) { ActionCode.new('|_| _.to_sym') }
109
+
105
110
  context 'when nested' do
106
111
  it 'generates nested apply-rule code with a direct action' do
107
- nested_code {|g| g.gen_direct_action(Apply[:foo], ActionCode.new('|_| _.to_sym')) }.
112
+ nested_code {|g| g.gen_direct_action apply, code }.
108
113
  should == '((r = match(:foo)) && (r.to_sym))'
109
114
  end
110
115
  end
111
-
116
+
112
117
  context 'when top-level' do
113
118
  it 'generates top level apply-rule code with a direct action' do
114
- top_level_code {|g| g.gen_direct_action(Apply[:foo], ActionCode.new('|_| _.to_sym')) }.
119
+ top_level_code {|g| g.gen_direct_action apply, code }.
115
120
  should == '(r = match(:foo)) && (r.to_sym)'
116
121
  end
117
122
  end
118
123
  end
119
-
124
+
120
125
  describe '#gen_token' do
121
-
126
+
122
127
  context 'when nested' do
123
128
  it 'generates nested apply-rule code returning the matched string' do
124
129
  nested_code {|g| g.gen_token apply }.
@@ -131,7 +136,7 @@ end
131
136
  CODE
132
137
  end
133
138
  end
134
-
139
+
135
140
  context 'when top-level' do
136
141
  it 'generates top level apply-rule code returning the matched string' do
137
142
  top_level_code {|g| g.gen_token apply }.
@@ -143,16 +148,16 @@ match(:foo) &&
143
148
  end
144
149
  end
145
150
  end
146
-
151
+
147
152
  describe '#gen_skip' do
148
-
153
+
149
154
  context 'when nested' do
150
155
  it 'generates nested rule skipping code' do
151
156
  nested_code {|g| g.gen_skip apply }.
152
157
  should == '(match(:foo) && true)'
153
158
  end
154
159
  end
155
-
160
+
156
161
  context 'when top-level' do
157
162
  it 'generates top level rule skipping code' do
158
163
  top_level_code {|g| g.gen_skip apply }.
@@ -160,14 +165,14 @@ match(:foo) &&
160
165
  end
161
166
  end
162
167
  end
163
-
168
+
164
169
  describe '#gen_intermediate' do
165
170
  it 'generates basic apply-rule code' do
166
171
  nested_code {|g| g.gen_intermediate apply }.
167
172
  should == 'match(:foo)'
168
173
  end
169
174
  end
170
-
175
+
171
176
  describe '#gen_intermediate_assert' do
172
177
  it 'generates nested rule positive lookahead code' do
173
178
  nested_code {|g| g.gen_intermediate_assert apply }.
@@ -181,7 +186,7 @@ end
181
186
  CODE
182
187
  end
183
188
  end
184
-
189
+
185
190
  describe '#gen_intermediate_disallow' do
186
191
  it 'generates nested rule negative lookahead code' do
187
192
  nested_code {|g| g.gen_intermediate_disallow apply }.
@@ -195,12 +200,12 @@ end
195
200
  CODE
196
201
  end
197
202
  end
198
-
203
+
199
204
  describe '#gen_intermediate_skip' do
200
205
  it 'generates basic apply-rule code' do
201
206
  nested_code {|g| g.gen_intermediate_skip apply }.
202
207
  should == 'match(:foo)'
203
208
  end
204
209
  end
205
-
210
+
206
211
  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::AssertGenerator do
6
-
6
+ describe AssertGenerator do
7
+
7
8
  include ParserGeneratorSpecHelper
8
-
9
+
9
10
  let(:assert) { Assert[Match[/\d/]] }
10
-
11
+
11
12
  describe '#gen_basic' do
12
-
13
+
13
14
  context 'when nested' do
14
15
  it 'generates nested positive lookahead code' do
15
16
  nested_code {|g| g.gen_basic assert }.
16
17
  should == '(@scanner.skip(/(?=\d)/) && true)'
17
18
  end
18
19
  end
19
-
20
+
20
21
  context 'when top-level' do
21
22
  it 'generates top level positive lookahead code' do
22
23
  top_level_code {|g| g.gen_basic assert }.
@@ -24,16 +25,16 @@ describe Rattler::BackEnd::ParserGenerator::AssertGenerator 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 assert }.
33
34
  should == '(@scanner.skip(/(?=\d)/) && 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 assert }.
@@ -41,27 +42,29 @@ describe Rattler::BackEnd::ParserGenerator::AssertGenerator 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 "false"' do
49
50
  nested_code {|g| g.gen_disallow assert }.should == 'false'
50
51
  end
51
52
  end
52
-
53
+
53
54
  context 'when top-level' do
54
55
  it 'generates "false"' do
55
56
  top_level_code {|g| g.gen_disallow assert }.should == 'false'
56
57
  end
57
58
  end
58
59
  end
59
-
60
+
60
61
  describe '#gen_dispatch_action' do
61
-
62
+
63
+ let(:code) { NodeCode.new('Word', 'parsed') }
64
+
62
65
  context 'when nested' do
63
66
  it 'generates nested positive lookahead code with a dispatch action' do
64
- nested_code {|g| g.gen_dispatch_action assert, 'Word', 'parsed' }.
67
+ nested_code {|g| g.gen_dispatch_action assert, code }.
65
68
  should == (<<-CODE).strip
66
69
  begin
67
70
  @scanner.skip(/(?=\\d)/) &&
@@ -70,10 +73,10 @@ end
70
73
  CODE
71
74
  end
72
75
  end
73
-
76
+
74
77
  context 'when top-level' do
75
78
  it 'generates top level positive lookahead code with a dispatch action' do
76
- top_level_code {|g| g.gen_dispatch_action assert, 'Word', 'parsed' }.
79
+ top_level_code {|g| g.gen_dispatch_action assert, code }.
77
80
  should == (<<-CODE).strip
78
81
  @scanner.skip(/(?=\\d)/) &&
79
82
  Word.parsed([])
@@ -81,12 +84,14 @@ Word.parsed([])
81
84
  end
82
85
  end
83
86
  end
84
-
87
+
85
88
  describe '#gen_direct_action' do
86
-
89
+
90
+ let(:code) { ActionCode.new(':t') }
91
+
87
92
  context 'when nested' do
88
93
  it 'generates nested positive lookahead code with a direct action' do
89
- nested_code {|g| g.gen_direct_action assert, ActionCode.new(':t') }.
94
+ nested_code {|g| g.gen_direct_action assert, code }.
90
95
  should == (<<-CODE).strip
91
96
  begin
92
97
  @scanner.skip(/(?=\\d)/) &&
@@ -95,10 +100,10 @@ end
95
100
  CODE
96
101
  end
97
102
  end
98
-
103
+
99
104
  context 'when top-level' do
100
105
  it 'generates top level positive lookahead code with a direct action' do
101
- top_level_code {|g| g.gen_direct_action assert, ActionCode.new(':t') }.
106
+ top_level_code {|g| g.gen_direct_action assert, code }.
102
107
  should == (<<-CODE).strip
103
108
  @scanner.skip(/(?=\\d)/) &&
104
109
  (:t)
@@ -106,9 +111,9 @@ end
106
111
  end
107
112
  end
108
113
  end
109
-
114
+
110
115
  describe '#gen_token' do
111
-
116
+
112
117
  context 'when nested' do
113
118
  it 'generates nested positive lookahead and empty string string code' do
114
119
  nested_code {|g| g.gen_token assert }.
@@ -120,7 +125,7 @@ end
120
125
  CODE
121
126
  end
122
127
  end
123
-
128
+
124
129
  context 'when top-level' do
125
130
  it 'generates top-level positive lookahead and empty string string code' do
126
131
  top_level_code {|g| g.gen_token assert }.
@@ -131,16 +136,16 @@ end
131
136
  end
132
137
  end
133
138
  end
134
-
139
+
135
140
  describe '#gen_skip' do
136
-
141
+
137
142
  context 'when nested' do
138
143
  it 'generates nested positive lookahead code' do
139
144
  nested_code {|g| g.gen_skip assert }.
140
145
  should == '(@scanner.skip(/(?=\d)/) && true)'
141
146
  end
142
147
  end
143
-
148
+
144
149
  context 'when top-level' do
145
150
  it 'generates top level positive lookahead code' do
146
151
  top_level_code {|g| g.gen_skip assert }.
@@ -148,32 +153,32 @@ end
148
153
  end
149
154
  end
150
155
  end
151
-
156
+
152
157
  describe '#gen_intermediate' do
153
158
  it 'generates intermediate positive lookahead code' do
154
159
  nested_code {|g| g.gen_intermediate assert }.
155
160
  should == '@scanner.skip(/(?=\d)/)'
156
161
  end
157
162
  end
158
-
163
+
159
164
  describe '#gen_intermediate_assert' do
160
165
  it 'generates intermediate positive lookahead code' do
161
166
  nested_code {|g| g.gen_intermediate_assert assert }.
162
167
  should == '@scanner.skip(/(?=\d)/)'
163
168
  end
164
169
  end
165
-
170
+
166
171
  describe '#gen_intermediate_disallow' do
167
172
  it 'generates "false"' do
168
173
  nested_code {|g| g.gen_intermediate_disallow assert }.should == 'false'
169
174
  end
170
175
  end
171
-
176
+
172
177
  describe '#gen_intermediate_skip' do
173
178
  it 'generates intermediate positive lookahead code' do
174
179
  nested_code {|g| g.gen_intermediate_skip assert }.
175
180
  should == '@scanner.skip(/(?=\d)/)'
176
181
  end
177
182
  end
178
-
183
+
179
184
  end