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.
- data/README.rdoc +57 -37
- data/features/command_line/dest_option.feature +8 -21
- data/features/command_line/lib_option.feature +37 -0
- data/features/command_line/parser_generator.feature +7 -4
- data/features/grammar/back_reference.feature +37 -0
- data/features/grammar/fail.feature +3 -3
- data/features/grammar/labels.feature +11 -3
- data/features/grammar/list_matching.feature +14 -5
- data/features/grammar/literal.feature +30 -4
- data/features/grammar/nonterminal.feature +1 -1
- data/features/grammar/ordered_choice.feature +2 -2
- data/features/grammar/skip_operator.feature +1 -1
- data/features/grammar/symantic_action.feature +7 -7
- data/features/grammar/whitespace.feature +2 -2
- data/features/step_definitions/grammar_steps.rb +2 -2
- data/lib/rattler/back_end.rb +1 -0
- data/lib/rattler/back_end/compiler.rb +19 -20
- data/lib/rattler/back_end/optimizer.rb +100 -0
- data/lib/rattler/back_end/optimizer/composite_reducing.rb +18 -0
- data/lib/rattler/back_end/optimizer/flatten_choice.rb +31 -0
- data/lib/rattler/back_end/optimizer/flatten_sequence.rb +59 -0
- data/lib/rattler/back_end/optimizer/flattening.rb +17 -0
- data/lib/rattler/back_end/optimizer/inline_regular_rules.rb +46 -0
- data/lib/rattler/back_end/optimizer/join_match_capturing_sequence.rb +71 -0
- data/lib/rattler/back_end/optimizer/join_match_choice.rb +37 -0
- data/lib/rattler/back_end/optimizer/join_match_matching_sequence.rb +38 -0
- data/lib/rattler/back_end/optimizer/join_match_sequence.rb +17 -0
- data/lib/rattler/back_end/optimizer/join_predicate_bare_match.rb +68 -0
- data/lib/rattler/back_end/optimizer/join_predicate_match.rb +17 -0
- data/lib/rattler/back_end/optimizer/join_predicate_nested_match.rb +37 -0
- data/lib/rattler/back_end/optimizer/join_predicate_or_bare_match.rb +68 -0
- data/lib/rattler/back_end/optimizer/join_predicate_or_match.rb +17 -0
- data/lib/rattler/back_end/optimizer/join_predicate_or_nested_match.rb +36 -0
- data/lib/rattler/back_end/optimizer/match_joining.rb +60 -0
- data/lib/rattler/back_end/optimizer/optimization.rb +94 -0
- data/lib/rattler/back_end/optimizer/optimization_context.rb +72 -0
- data/lib/rattler/back_end/optimizer/optimization_sequence.rb +37 -0
- data/lib/rattler/back_end/optimizer/optimize_children.rb +46 -0
- data/lib/rattler/back_end/optimizer/reduce_repeat_match.rb +44 -0
- data/lib/rattler/back_end/optimizer/remove_meaningless_wrapper.rb +32 -0
- data/lib/rattler/back_end/optimizer/simplify_redundant_repeat.rb +43 -0
- data/lib/rattler/back_end/optimizer/simplify_token_match.rb +38 -0
- data/lib/rattler/back_end/parser_generator.rb +21 -14
- data/lib/rattler/back_end/parser_generator/apply_generator.rb +35 -35
- data/lib/rattler/back_end/parser_generator/assert_generator.rb +29 -30
- data/lib/rattler/back_end/parser_generator/back_reference_generator.rb +93 -0
- data/lib/rattler/back_end/parser_generator/choice_generator.rb +33 -49
- data/lib/rattler/back_end/parser_generator/direct_action_generator.rb +14 -14
- data/lib/rattler/back_end/parser_generator/disallow_generator.rb +29 -30
- data/lib/rattler/back_end/parser_generator/dispatch_action_generator.rb +11 -13
- data/lib/rattler/back_end/parser_generator/expr_generator.rb +36 -56
- data/lib/rattler/back_end/parser_generator/fail_generator.rb +18 -18
- data/lib/rattler/back_end/parser_generator/group_match.rb +18 -0
- data/lib/rattler/back_end/parser_generator/group_match_generator.rb +76 -0
- data/lib/rattler/back_end/parser_generator/label_generator.rb +25 -6
- data/lib/rattler/back_end/parser_generator/list1_generator.rb +7 -7
- data/lib/rattler/back_end/parser_generator/list_generating.rb +19 -20
- data/lib/rattler/back_end/parser_generator/list_generator.rb +5 -5
- data/lib/rattler/back_end/parser_generator/match_generator.rb +52 -52
- data/lib/rattler/back_end/parser_generator/one_or_more_generator.rb +6 -6
- data/lib/rattler/back_end/parser_generator/optional_generator.rb +30 -29
- data/lib/rattler/back_end/parser_generator/predicate_propogating.rb +8 -8
- data/lib/rattler/back_end/parser_generator/repeat_generating.rb +23 -25
- data/lib/rattler/back_end/parser_generator/rule_generator.rb +27 -79
- data/lib/rattler/back_end/parser_generator/rule_set_generator.rb +102 -0
- data/lib/rattler/back_end/parser_generator/sequence_generator.rb +49 -41
- data/lib/rattler/back_end/parser_generator/skip_generator.rb +14 -20
- data/lib/rattler/back_end/parser_generator/skip_propogating.rb +4 -4
- data/lib/rattler/back_end/parser_generator/sub_generating.rb +6 -0
- data/lib/rattler/back_end/parser_generator/token_generator.rb +12 -12
- data/lib/rattler/back_end/parser_generator/token_propogating.rb +2 -2
- data/lib/rattler/back_end/parser_generator/zero_or_more_generator.rb +4 -4
- data/lib/rattler/grammar.rb +4 -3
- data/lib/rattler/grammar/analysis.rb +91 -0
- data/lib/rattler/grammar/grammar.rb +37 -25
- data/lib/rattler/grammar/grammar_parser.rb +19 -11
- data/lib/rattler/grammar/metagrammar.rb +569 -800
- data/lib/rattler/grammar/rattler.rtlr +162 -144
- data/lib/rattler/parsers.rb +5 -1
- data/lib/rattler/parsers/action_code.rb +29 -15
- data/lib/rattler/parsers/apply.rb +5 -5
- data/lib/rattler/parsers/assert.rb +4 -18
- data/lib/rattler/parsers/back_reference.rb +46 -0
- data/lib/rattler/parsers/choice.rb +6 -39
- data/lib/rattler/parsers/combinator_parser.rb +32 -0
- data/lib/rattler/parsers/combining.rb +3 -29
- data/lib/rattler/parsers/direct_action.rb +27 -30
- data/lib/rattler/parsers/disallow.rb +4 -18
- data/lib/rattler/parsers/dispatch_action.rb +30 -25
- data/lib/rattler/parsers/label.rb +9 -18
- data/lib/rattler/parsers/list.rb +3 -34
- data/lib/rattler/parsers/list1.rb +4 -36
- data/lib/rattler/parsers/list_parser.rb +64 -0
- data/lib/rattler/parsers/match.rb +7 -42
- data/lib/rattler/parsers/node_code.rb +44 -0
- data/lib/rattler/parsers/one_or_more.rb +7 -27
- data/lib/rattler/parsers/optional.rb +5 -25
- data/lib/rattler/parsers/parser.rb +16 -44
- data/lib/rattler/parsers/parser_dsl.rb +13 -3
- data/lib/rattler/parsers/predicate.rb +4 -12
- data/lib/rattler/parsers/rule.rb +18 -19
- data/lib/rattler/parsers/rule_set.rb +63 -0
- data/lib/rattler/parsers/sequence.rb +12 -46
- data/lib/rattler/parsers/skip.rb +12 -26
- data/lib/rattler/parsers/token.rb +6 -21
- data/lib/rattler/parsers/zero_or_more.rb +6 -26
- data/lib/rattler/runner.rb +66 -28
- data/lib/rattler/runtime/extended_packrat_parser.rb +26 -20
- data/lib/rattler/runtime/packrat_parser.rb +17 -21
- data/lib/rattler/runtime/parser.rb +12 -2
- data/lib/rattler/runtime/recursive_descent_parser.rb +3 -11
- data/lib/rattler/util.rb +2 -1
- data/lib/rattler/util/graphviz.rb +29 -0
- data/lib/rattler/util/graphviz/digraph_builder.rb +71 -0
- data/lib/rattler/util/graphviz/node_builder.rb +84 -0
- data/lib/rattler/util/node.rb +37 -19
- data/lib/rattler/util/parser_spec_helper.rb +61 -35
- data/spec/rattler/back_end/compiler_spec.rb +6 -860
- data/spec/rattler/back_end/optimizer/flatten_choice_spec.rb +70 -0
- data/spec/rattler/back_end/optimizer/flatten_sequence_spec.rb +130 -0
- data/spec/rattler/back_end/optimizer/inline_regular_rules_spec.rb +80 -0
- data/spec/rattler/back_end/optimizer/join_match_capturing_sequence_spec.rb +241 -0
- data/spec/rattler/back_end/optimizer/join_match_choice_spec.rb +100 -0
- data/spec/rattler/back_end/optimizer/join_match_matching_sequence_spec.rb +112 -0
- data/spec/rattler/back_end/optimizer/join_predicate_bare_match_spec.rb +194 -0
- data/spec/rattler/back_end/optimizer/join_predicate_nested_match_spec.rb +180 -0
- data/spec/rattler/back_end/optimizer/join_predicate_or_bare_match_spec.rb +153 -0
- data/spec/rattler/back_end/optimizer/join_predicate_or_nested_match_spec.rb +153 -0
- data/spec/rattler/back_end/optimizer/reduce_repeat_match_spec.rb +98 -0
- data/spec/rattler/back_end/optimizer/simplify_redundant_repeat_spec.rb +226 -0
- data/spec/rattler/back_end/optimizer/simplify_token_match_spec.rb +85 -0
- data/spec/rattler/back_end/parser_generator/apply_generator_spec.rb +38 -33
- data/spec/rattler/back_end/parser_generator/assert_generator_spec.rb +38 -33
- data/spec/rattler/back_end/parser_generator/back_reference_generator_spec.rb +181 -0
- data/spec/rattler/back_end/parser_generator/choice_generator_spec.rb +38 -33
- data/spec/rattler/back_end/parser_generator/direct_action_generator_spec.rb +38 -33
- data/spec/rattler/back_end/parser_generator/disallow_generator_spec.rb +38 -33
- data/spec/rattler/back_end/parser_generator/dispatch_action_generator_spec.rb +38 -33
- data/spec/rattler/back_end/parser_generator/group_match_generator_spec.rb +185 -0
- data/spec/rattler/back_end/parser_generator/label_generator_spec.rb +38 -33
- data/spec/rattler/back_end/parser_generator/list1_generator_spec.rb +10 -5
- data/spec/rattler/back_end/parser_generator/list_generator_spec.rb +10 -5
- data/spec/rattler/back_end/parser_generator/match_generator_spec.rb +38 -33
- data/spec/rattler/back_end/parser_generator/one_or_more_generator_spec.rb +38 -33
- data/spec/rattler/back_end/parser_generator/optional_generator_spec.rb +38 -33
- data/spec/rattler/back_end/parser_generator/rule_generator_spec.rb +13 -46
- data/spec/rattler/back_end/parser_generator/rule_set_generator_spec.rb +97 -0
- data/spec/rattler/back_end/parser_generator/sequence_generator_spec.rb +38 -33
- data/spec/rattler/back_end/parser_generator/skip_generator_spec.rb +38 -33
- data/spec/rattler/back_end/parser_generator/token_generator_spec.rb +38 -33
- data/spec/rattler/back_end/parser_generator/zero_or_more_generator_spec.rb +39 -34
- data/spec/rattler/back_end/shared_compiler_examples.rb +885 -0
- data/spec/rattler/grammar/analysis_spec.rb +167 -0
- data/spec/rattler/grammar/grammar_parser_spec.rb +169 -179
- data/spec/rattler/grammar/grammar_spec.rb +24 -21
- data/spec/rattler/parsers/action_code_spec.rb +64 -19
- data/spec/rattler/parsers/apply_spec.rb +9 -9
- data/spec/rattler/parsers/back_reference_spec.rb +38 -0
- data/spec/rattler/parsers/combinator_parser_spec.rb +14 -0
- data/spec/rattler/parsers/direct_action_spec.rb +16 -2
- data/spec/rattler/parsers/dispatch_action_spec.rb +15 -32
- data/spec/rattler/parsers/fail_spec.rb +6 -4
- data/spec/rattler/parsers/label_spec.rb +10 -28
- data/spec/rattler/parsers/node_code_spec.rb +48 -0
- data/spec/rattler/parsers/parser_dsl_spec.rb +1 -1
- data/spec/rattler/parsers/rule_set_spec.rb +35 -0
- data/spec/rattler/parsers/sequence_spec.rb +15 -24
- data/spec/rattler/runtime/extended_packrat_parser_spec.rb +22 -17
- data/spec/rattler/runtime/packrat_parser_spec.rb +1 -1
- data/spec/rattler/runtime/parse_node_spec.rb +15 -19
- data/spec/rattler/runtime/recursive_descent_parser_spec.rb +1 -1
- data/spec/rattler/runtime/shared_parser_examples.rb +61 -28
- data/spec/rattler/util/graphviz/node_builder_spec.rb +84 -0
- data/spec/rattler/util/node_spec.rb +92 -65
- data/spec/rattler_spec.rb +16 -16
- data/spec/support/combinator_parser_spec_helper.rb +19 -18
- data/spec/support/compiler_spec_helper.rb +56 -87
- data/spec/support/runtime_parser_spec_helper.rb +6 -14
- metadata +117 -22
- data/features/grammar/regex.feature +0 -24
- data/lib/rattler/parsers/match_joining.rb +0 -67
- 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
|
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,
|
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,
|
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,
|
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,
|
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
|
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,
|
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,
|
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,
|
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,
|
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
|
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,
|
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,
|
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,
|
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,
|
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
|
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,
|
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,
|
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,
|
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,
|
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
|