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
@@ -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::LabelGenerator do
6
-
6
+ describe LabelGenerator do
7
+
7
8
  include ParserGeneratorSpecHelper
8
-
9
+
9
10
  let(:label) { Label[:word, Match[/\w+/]] }
10
-
11
+
11
12
  describe '#gen_basic' do
12
-
13
+
13
14
  context 'when nested' do
14
15
  it 'generates nested matching code' do
15
16
  nested_code {|g| g.gen_basic label }.
16
17
  should == '@scanner.scan(/\w+/)'
17
18
  end
18
19
  end
19
-
20
+
20
21
  context 'when top-level' do
21
22
  it 'generates top level matching code' do
22
23
  top_level_code {|g| g.gen_basic label }.
@@ -24,16 +25,16 @@ describe Rattler::BackEnd::ParserGenerator::LabelGenerator 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 label }.
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 label }.
@@ -41,16 +42,16 @@ describe Rattler::BackEnd::ParserGenerator::LabelGenerator 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 label }.
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 label }.
@@ -58,12 +59,14 @@ describe Rattler::BackEnd::ParserGenerator::LabelGenerator 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 label, 'Word', 'parsed' }.
69
+ nested_code {|g| g.gen_dispatch_action label, code }.
67
70
  should == (<<-CODE).strip
68
71
  begin
69
72
  (r = @scanner.scan(/\\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 label, 'Word', 'parsed' }.
81
+ top_level_code {|g| g.gen_dispatch_action label, code }.
79
82
  should == (<<-CODE).strip
80
83
  (r = @scanner.scan(/\\w+/)) &&
81
84
  Word.parsed([r])
@@ -83,12 +86,14 @@ Word.parsed([r])
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('|_| _.to_sym') }
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 label, ActionCode.new('|_| _.to_sym') }.
96
+ nested_code {|g| g.gen_direct_action label, code }.
92
97
  should == (<<-CODE).strip
93
98
  begin
94
99
  (r = @scanner.scan(/\\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 label, ActionCode.new('|_| _.to_sym') }.
108
+ top_level_code {|g| g.gen_direct_action label, code }.
104
109
  should == (<<-CODE).strip
105
110
  (r = @scanner.scan(/\\w+/)) &&
106
111
  (r.to_sym)
@@ -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 matching code' do
116
121
  nested_code {|g| g.gen_token label }.
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 matching code' do
123
128
  top_level_code {|g| g.gen_token label }.
@@ -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 label }.
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 label }.
@@ -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 matching code' do
148
153
  nested_code {|g| g.gen_intermediate label }.
149
154
  should == '@scanner.scan(/\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 label }.
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 label }.
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 label }.
170
175
  should == '@scanner.skip(/\w+/)'
171
176
  end
172
177
  end
173
-
178
+
174
179
  end
@@ -1,8 +1,9 @@
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::List1Generator do
6
+ describe List1Generator do
6
7
 
7
8
  include ParserGeneratorSpecHelper
8
9
 
@@ -134,9 +135,11 @@ r
134
135
 
135
136
  describe '#gen_dispatch_action' do
136
137
 
138
+ let(:code) { NodeCode.new('Word', 'parsed') }
139
+
137
140
  context 'when nested' do
138
141
  it 'generates nested list matching code with a dispatch action' do
139
- nested_code {|g| g.gen_dispatch_action list, 'Word', 'parsed' }.
142
+ nested_code {|g| g.gen_dispatch_action list, code }.
140
143
  should == (<<-CODE).strip
141
144
  begin
142
145
  a = []
@@ -155,7 +158,7 @@ end
155
158
 
156
159
  context 'when top-level' do
157
160
  it 'generates top level list matching code with a dispatch action' do
158
- top_level_code {|g| g.gen_dispatch_action list, 'Word', 'parsed' }.
161
+ top_level_code {|g| g.gen_dispatch_action list, code }.
159
162
  should == (<<-CODE).strip
160
163
  a = []
161
164
  lp = nil
@@ -173,9 +176,11 @@ Word.parsed(select_captures(a)) unless a.empty?
173
176
 
174
177
  describe '#gen_direct_action' do
175
178
 
179
+ let(:code) { ActionCode.new('|_| _.size') }
180
+
176
181
  context 'when nested' do
177
182
  it 'generates nested list matching code with a dispatch action' do
178
- nested_code {|g| g.gen_direct_action list, ActionCode.new('|_| _.size') }.
183
+ nested_code {|g| g.gen_direct_action list, code }.
179
184
  should == (<<-CODE).strip
180
185
  begin
181
186
  a = []
@@ -194,7 +199,7 @@ end
194
199
 
195
200
  context 'when top-level' do
196
201
  it 'generates top level list matching code with a dispatch action' do
197
- top_level_code {|g| g.gen_direct_action list, ActionCode.new('|_| _.size') }.
202
+ top_level_code {|g| g.gen_direct_action list, code }.
198
203
  should == (<<-CODE).strip
199
204
  a = []
200
205
  lp = nil
@@ -1,8 +1,9 @@
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::ListGenerator do
6
+ describe ListGenerator do
6
7
 
7
8
  include ParserGeneratorSpecHelper
8
9
 
@@ -126,9 +127,11 @@ true
126
127
 
127
128
  describe '#gen_dispatch_action' do
128
129
 
130
+ let(:code) { NodeCode.new('Word', 'parsed') }
131
+
129
132
  context 'when nested' do
130
133
  it 'generates nested list matching code with a dispatch action' do
131
- nested_code {|g| g.gen_dispatch_action list, 'Word', 'parsed' }.
134
+ nested_code {|g| g.gen_dispatch_action list, code }.
132
135
  should == (<<-CODE).strip
133
136
  begin
134
137
  a = []
@@ -147,7 +150,7 @@ end
147
150
 
148
151
  context 'when top-level' do
149
152
  it 'generates top level list matching code with a dispatch action' do
150
- top_level_code {|g| g.gen_dispatch_action list, 'Word', 'parsed' }.
153
+ top_level_code {|g| g.gen_dispatch_action list, code }.
151
154
  should == (<<-CODE).strip
152
155
  a = []
153
156
  lp = nil
@@ -165,9 +168,11 @@ Word.parsed(select_captures(a))
165
168
 
166
169
  describe '#gen_direct_action' do
167
170
 
171
+ let(:code) { ActionCode.new('|_| _.size') }
172
+
168
173
  context 'when nested' do
169
174
  it 'generates nested list matching code with a dispatch action' do
170
- nested_code {|g| g.gen_direct_action list, ActionCode.new('|_| _.size') }.
175
+ nested_code {|g| g.gen_direct_action list, code }.
171
176
  should == (<<-CODE).strip
172
177
  begin
173
178
  a = []
@@ -186,7 +191,7 @@ end
186
191
 
187
192
  context 'when top-level' do
188
193
  it 'generates top level list matching code with a dispatch action' do
189
- top_level_code {|g| g.gen_direct_action list, ActionCode.new('|_| _.size') }.
194
+ top_level_code {|g| g.gen_direct_action list, code }.
190
195
  should == (<<-CODE).strip
191
196
  a = []
192
197
  lp = nil
@@ -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::MatchGenerator do
6
-
6
+ describe MatchGenerator do
7
+
7
8
  include ParserGeneratorSpecHelper
8
-
9
+
9
10
  let(:match) { Match[/\w+/] }
10
-
11
+
11
12
  describe '#gen_basic' do
12
-
13
+
13
14
  context 'when nested' do
14
15
  it 'generates nested regex matching code' do
15
16
  nested_code {|g| g.gen_basic match }.
16
17
  should == '@scanner.scan(/\w+/)'
17
18
  end
18
19
  end
19
-
20
+
20
21
  context 'when top-level' do
21
22
  it 'generates top level regex matching code' do
22
23
  top_level_code {|g| g.gen_basic match }.
@@ -24,16 +25,16 @@ describe Rattler::BackEnd::ParserGenerator::MatchGenerator 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 regex positive lookahead code' do
32
33
  nested_code {|g| g.gen_assert match }.
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 regex positive lookahead code' do
39
40
  top_level_code {|g| g.gen_assert match }.
@@ -41,16 +42,16 @@ describe Rattler::BackEnd::ParserGenerator::MatchGenerator 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 regex negative lookahead code' do
49
50
  nested_code {|g| g.gen_disallow match }.
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 regex negative lookahead code' do
56
57
  top_level_code {|g| g.gen_disallow match }.
@@ -58,12 +59,14 @@ describe Rattler::BackEnd::ParserGenerator::MatchGenerator 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 regex matching code with a dispatch action' do
66
- nested_code {|g| g.gen_dispatch_action match, 'Word', 'parsed' }.
69
+ nested_code {|g| g.gen_dispatch_action match, code }.
67
70
  should == (<<-CODE).strip
68
71
  begin
69
72
  (r = @scanner.scan(/\\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 regex matching code with a dispatch action' do
78
- top_level_code {|g| g.gen_dispatch_action match, 'Word', 'parsed' }.
81
+ top_level_code {|g| g.gen_dispatch_action match, code }.
79
82
  should == (<<-CODE).strip
80
83
  (r = @scanner.scan(/\\w+/)) &&
81
84
  Word.parsed([r])
@@ -83,12 +86,14 @@ Word.parsed([r])
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('|_| _.to_sym') }
93
+
89
94
  context 'when nested' do
90
95
  it 'generates nested regex matching code with a direct action' do
91
- nested_code {|g| g.gen_direct_action match, ActionCode.new('|_| _.to_sym') }.
96
+ nested_code {|g| g.gen_direct_action match, code }.
92
97
  should == (<<-CODE).strip
93
98
  begin
94
99
  (r = @scanner.scan(/\\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 regex matching code with a direct action' do
103
- top_level_code {|g| g.gen_direct_action match, ActionCode.new('|_| _.to_sym') }.
108
+ top_level_code {|g| g.gen_direct_action match, code }.
104
109
  should == (<<-CODE).strip
105
110
  (r = @scanner.scan(/\\w+/)) &&
106
111
  (r.to_sym)
@@ -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 regex matching code' do
116
121
  nested_code {|g| g.gen_token match }.
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 regex matching code' do
123
128
  top_level_code {|g| g.gen_token match }.
@@ -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 regex skipping code' do
133
138
  nested_code {|g| g.gen_skip match }.
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 regex skipping code' do
140
145
  top_level_code {|g| g.gen_skip match }.
@@ -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 basic regex matching code' do
148
153
  nested_code {|g| g.gen_intermediate match }.
149
154
  should == '@scanner.scan(/\w+/)'
150
155
  end
151
156
  end
152
-
157
+
153
158
  describe '#gen_intermediate_assert' do
154
159
  it 'generates intermediate regex positive lookahead code' do
155
160
  nested_code {|g| g.gen_intermediate_assert match }.
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 regex negative lookahead code' do
162
167
  nested_code {|g| g.gen_intermediate_disallow match }.
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 regex skipping code' do
169
174
  nested_code {|g| g.gen_intermediate_skip match }.
170
175
  should == '@scanner.skip(/\w+/)'
171
176
  end
172
177
  end
173
-
178
+
174
179
  end