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,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