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
@@ -0,0 +1,97 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../../spec_helper')
|
2
|
+
|
3
|
+
include Rattler::Parsers
|
4
|
+
|
5
|
+
describe Rattler::BackEnd::ParserGenerator::RuleSetGenerator do
|
6
|
+
|
7
|
+
include ParserGeneratorSpecHelper
|
8
|
+
|
9
|
+
describe '#generate' do
|
10
|
+
context 'given rules with no start rule defined' do
|
11
|
+
|
12
|
+
let(:rules) { RuleSet[
|
13
|
+
|
14
|
+
Rule[:a, Choice[
|
15
|
+
Match['a'],
|
16
|
+
Apply[:b]
|
17
|
+
]],
|
18
|
+
|
19
|
+
Rule[:b, Match['b']]
|
20
|
+
|
21
|
+
] }
|
22
|
+
|
23
|
+
it 'generates #match_<rule> methods' do
|
24
|
+
generated_code {|g| g.generate rules }.
|
25
|
+
should == (<<-CODE).strip
|
26
|
+
# @private
|
27
|
+
def match_a #:nodoc:
|
28
|
+
apply :match_a!
|
29
|
+
end
|
30
|
+
|
31
|
+
# @private
|
32
|
+
def match_a! #:nodoc:
|
33
|
+
@scanner.scan("a") ||
|
34
|
+
match(:b)
|
35
|
+
end
|
36
|
+
|
37
|
+
# @private
|
38
|
+
def match_b #:nodoc:
|
39
|
+
apply :match_b!
|
40
|
+
end
|
41
|
+
|
42
|
+
# @private
|
43
|
+
def match_b! #:nodoc:
|
44
|
+
@scanner.scan("b")
|
45
|
+
end
|
46
|
+
CODE
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
context 'given rules with a start rule defined' do
|
51
|
+
|
52
|
+
let(:rules) { RuleSet[
|
53
|
+
|
54
|
+
Rule[:a, Choice[
|
55
|
+
Match['a'],
|
56
|
+
Apply[:b]
|
57
|
+
]],
|
58
|
+
|
59
|
+
Rule[:b, Match['b']],
|
60
|
+
|
61
|
+
{ :start_rule => :a }
|
62
|
+
] }
|
63
|
+
|
64
|
+
it 'generates #start_rule and #match_<rule> methods' do
|
65
|
+
generated_code {|g| g.generate rules }.
|
66
|
+
should == (<<-CODE).strip
|
67
|
+
# @private
|
68
|
+
def start_rule #:nodoc:
|
69
|
+
:a
|
70
|
+
end
|
71
|
+
|
72
|
+
# @private
|
73
|
+
def match_a #:nodoc:
|
74
|
+
apply :match_a!
|
75
|
+
end
|
76
|
+
|
77
|
+
# @private
|
78
|
+
def match_a! #:nodoc:
|
79
|
+
@scanner.scan("a") ||
|
80
|
+
match(:b)
|
81
|
+
end
|
82
|
+
|
83
|
+
# @private
|
84
|
+
def match_b #:nodoc:
|
85
|
+
apply :match_b!
|
86
|
+
end
|
87
|
+
|
88
|
+
# @private
|
89
|
+
def match_b! #:nodoc:
|
90
|
+
@scanner.scan("b")
|
91
|
+
end
|
92
|
+
CODE
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
end
|
@@ -1,15 +1,16 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/../../../spec_helper')
|
2
2
|
|
3
|
+
include Rattler::BackEnd::ParserGenerator
|
3
4
|
include Rattler::Parsers
|
4
5
|
|
5
|
-
describe
|
6
|
-
|
6
|
+
describe SequenceGenerator do
|
7
|
+
|
7
8
|
include ParserGeneratorSpecHelper
|
8
|
-
|
9
|
+
|
9
10
|
let(:sequence) { Sequence[Match[/[[:alpha:]]+/], Match[/[[:digit:]]+/]] }
|
10
|
-
|
11
|
+
|
11
12
|
describe '#gen_basic' do
|
12
|
-
|
13
|
+
|
13
14
|
context 'when nested' do
|
14
15
|
it 'generates nested sequence matching code' do
|
15
16
|
nested_code(:sequence_level => 2) {|g| g.gen_basic sequence }.
|
@@ -28,7 +29,7 @@ end
|
|
28
29
|
CODE
|
29
30
|
end
|
30
31
|
end
|
31
|
-
|
32
|
+
|
32
33
|
context 'when top-level' do
|
33
34
|
it 'generates top-level sequence matching code' do
|
34
35
|
top_level_code(:sequence_level => 0) {|g| g.gen_basic sequence }.
|
@@ -46,9 +47,9 @@ end
|
|
46
47
|
end
|
47
48
|
end
|
48
49
|
end
|
49
|
-
|
50
|
+
|
50
51
|
describe '#gen_assert' do
|
51
|
-
|
52
|
+
|
52
53
|
context 'when nested' do
|
53
54
|
it 'generates nested sequence positive lookahead code' do
|
54
55
|
nested_code(:sequence_level => 2) {|g| g.gen_assert sequence }.
|
@@ -66,7 +67,7 @@ end
|
|
66
67
|
CODE
|
67
68
|
end
|
68
69
|
end
|
69
|
-
|
70
|
+
|
70
71
|
context 'when top-level' do
|
71
72
|
it 'generates top-level sequence positive lookahead code' do
|
72
73
|
top_level_code(:sequence_level => 0) {|g| g.gen_assert sequence }.
|
@@ -83,9 +84,9 @@ r
|
|
83
84
|
end
|
84
85
|
end
|
85
86
|
end
|
86
|
-
|
87
|
+
|
87
88
|
describe '#gen_disallow' do
|
88
|
-
|
89
|
+
|
89
90
|
context 'when nested' do
|
90
91
|
it 'generates nested sequence negative lookahead code' do
|
91
92
|
nested_code(:sequence_level => 2) {|g| g.gen_disallow sequence }.
|
@@ -102,7 +103,7 @@ end
|
|
102
103
|
CODE
|
103
104
|
end
|
104
105
|
end
|
105
|
-
|
106
|
+
|
106
107
|
context 'when top-level' do
|
107
108
|
it 'generates top-level sequence negative lookahead code' do
|
108
109
|
top_level_code(:sequence_level => 0) {|g| g.gen_disallow sequence }.
|
@@ -118,12 +119,14 @@ r
|
|
118
119
|
end
|
119
120
|
end
|
120
121
|
end
|
121
|
-
|
122
|
+
|
122
123
|
describe '#gen_dispatch_action' do
|
123
|
-
|
124
|
+
|
125
|
+
let(:code) { NodeCode.new('Atom', 'parsed') }
|
126
|
+
|
124
127
|
context 'when nested' do
|
125
128
|
it 'generates nested sequence matching code with a dispatch action' do
|
126
|
-
nested_code(:sequence_level => 2) {|g| g.gen_dispatch_action sequence,
|
129
|
+
nested_code(:sequence_level => 2) {|g| g.gen_dispatch_action sequence, code }.
|
127
130
|
should == (<<-CODE).strip
|
128
131
|
begin
|
129
132
|
p2 = @scanner.pos
|
@@ -139,10 +142,10 @@ end
|
|
139
142
|
CODE
|
140
143
|
end
|
141
144
|
end
|
142
|
-
|
145
|
+
|
143
146
|
context 'when top-level' do
|
144
147
|
it 'generates top-level sequence matching code with a dispatch action' do
|
145
|
-
top_level_code(:sequence_level => 0) {|g| g.gen_dispatch_action sequence,
|
148
|
+
top_level_code(:sequence_level => 0) {|g| g.gen_dispatch_action sequence, code }.
|
146
149
|
should == (<<-CODE).strip
|
147
150
|
p0 = @scanner.pos
|
148
151
|
begin
|
@@ -157,12 +160,14 @@ end
|
|
157
160
|
end
|
158
161
|
end
|
159
162
|
end
|
160
|
-
|
163
|
+
|
161
164
|
describe '#gen_direct_action' do
|
162
|
-
|
165
|
+
|
166
|
+
let(:code) { ActionCode.new('|a,b| a + b') }
|
167
|
+
|
163
168
|
context 'when nested' do
|
164
169
|
it 'generates nested sequence matching code with a direct action' do
|
165
|
-
nested_code(:sequence_level => 2) {|g| g.gen_direct_action sequence,
|
170
|
+
nested_code(:sequence_level => 2) {|g| g.gen_direct_action sequence, code }.
|
166
171
|
should == (<<-CODE).strip
|
167
172
|
begin
|
168
173
|
p2 = @scanner.pos
|
@@ -178,10 +183,10 @@ end
|
|
178
183
|
CODE
|
179
184
|
end
|
180
185
|
end
|
181
|
-
|
186
|
+
|
182
187
|
context 'when top-level' do
|
183
188
|
it 'generates nested sequence matching code with a direct action' do
|
184
|
-
top_level_code(:sequence_level => 0) {|g| g.gen_direct_action sequence,
|
189
|
+
top_level_code(:sequence_level => 0) {|g| g.gen_direct_action sequence, code }.
|
185
190
|
should == (<<-CODE).strip
|
186
191
|
p0 = @scanner.pos
|
187
192
|
begin
|
@@ -196,9 +201,9 @@ end
|
|
196
201
|
end
|
197
202
|
end
|
198
203
|
end
|
199
|
-
|
204
|
+
|
200
205
|
describe '#gen_skip' do
|
201
|
-
|
206
|
+
|
202
207
|
context 'when nested' do
|
203
208
|
it 'generates nested token sequence matching code' do
|
204
209
|
nested_code(:sequence_level => 2) {|g| g.gen_skip sequence }.
|
@@ -217,7 +222,7 @@ end
|
|
217
222
|
CODE
|
218
223
|
end
|
219
224
|
end
|
220
|
-
|
225
|
+
|
221
226
|
context 'when top-level' do
|
222
227
|
it 'generates top-level token sequence matching code' do
|
223
228
|
top_level_code(:sequence_level => 0) {|g| g.gen_skip sequence }.
|
@@ -235,9 +240,9 @@ end
|
|
235
240
|
end
|
236
241
|
end
|
237
242
|
end
|
238
|
-
|
243
|
+
|
239
244
|
describe '#gen_token' do
|
240
|
-
|
245
|
+
|
241
246
|
context 'when nested' do
|
242
247
|
it 'generates nested token sequence matching code' do
|
243
248
|
nested_code(:sequence_level => 2) {|g| g.gen_token sequence }.
|
@@ -256,7 +261,7 @@ end
|
|
256
261
|
CODE
|
257
262
|
end
|
258
263
|
end
|
259
|
-
|
264
|
+
|
260
265
|
context 'when top-level' do
|
261
266
|
it 'generates top-level token sequence matching code' do
|
262
267
|
top_level_code(:sequence_level => 0) {|g| g.gen_token sequence }.
|
@@ -274,7 +279,7 @@ end
|
|
274
279
|
end
|
275
280
|
end
|
276
281
|
end
|
277
|
-
|
282
|
+
|
278
283
|
describe '#gen_intermediate' do
|
279
284
|
it 'generates nested sequence matching code' do
|
280
285
|
nested_code(:sequence_level => 2) {|g| g.gen_intermediate sequence }.
|
@@ -293,7 +298,7 @@ end
|
|
293
298
|
CODE
|
294
299
|
end
|
295
300
|
end
|
296
|
-
|
301
|
+
|
297
302
|
describe '#gen_intermediate_assert' do
|
298
303
|
it 'generates nested sequence positive lookahead code' do
|
299
304
|
nested_code(:sequence_level => 2) {|g| g.gen_intermediate_assert sequence }.
|
@@ -311,7 +316,7 @@ end
|
|
311
316
|
CODE
|
312
317
|
end
|
313
318
|
end
|
314
|
-
|
319
|
+
|
315
320
|
describe '#gen_intermediate_disallow' do
|
316
321
|
it 'generates nested sequence negative lookahead code' do
|
317
322
|
nested_code(:sequence_level => 2) {|g| g.gen_intermediate_disallow sequence }.
|
@@ -328,7 +333,7 @@ end
|
|
328
333
|
CODE
|
329
334
|
end
|
330
335
|
end
|
331
|
-
|
336
|
+
|
332
337
|
describe '#gen_intermediate_skip' do
|
333
338
|
it 'generates nested sequence skipping code' do
|
334
339
|
nested_code(:sequence_level => 2) {|g| g.gen_intermediate_skip sequence }.
|
@@ -347,5 +352,5 @@ end
|
|
347
352
|
CODE
|
348
353
|
end
|
349
354
|
end
|
350
|
-
|
355
|
+
|
351
356
|
end
|
@@ -1,22 +1,23 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/../../../spec_helper')
|
2
2
|
|
3
|
+
include Rattler::BackEnd::ParserGenerator
|
3
4
|
include Rattler::Parsers
|
4
5
|
|
5
|
-
describe
|
6
|
-
|
6
|
+
describe SkipGenerator do
|
7
|
+
|
7
8
|
include ParserGeneratorSpecHelper
|
8
|
-
|
9
|
+
|
9
10
|
let(:skip) { Skip[Match[/\w+/]] }
|
10
|
-
|
11
|
+
|
11
12
|
describe '#gen_basic' do
|
12
|
-
|
13
|
+
|
13
14
|
context 'when nested' do
|
14
15
|
it 'generates nested skipping code' do
|
15
16
|
nested_code {|g| g.gen_basic skip }.
|
16
17
|
should == '(@scanner.skip(/\w+/) && true)'
|
17
18
|
end
|
18
19
|
end
|
19
|
-
|
20
|
+
|
20
21
|
context 'when top-level' do
|
21
22
|
it 'generates top level skipping code' do
|
22
23
|
top_level_code {|g| g.gen_basic skip }.
|
@@ -24,16 +25,16 @@ describe Rattler::BackEnd::ParserGenerator::SkipGenerator do
|
|
24
25
|
end
|
25
26
|
end
|
26
27
|
end
|
27
|
-
|
28
|
+
|
28
29
|
describe '#gen_assert' do
|
29
|
-
|
30
|
+
|
30
31
|
context 'when nested' do
|
31
32
|
it 'generates nested positive lookahead code' do
|
32
33
|
nested_code {|g| g.gen_assert skip }.
|
33
34
|
should == '(@scanner.skip(/(?=\w+)/) && true)'
|
34
35
|
end
|
35
36
|
end
|
36
|
-
|
37
|
+
|
37
38
|
context 'when top-level' do
|
38
39
|
it 'generates top level positive lookahead code' do
|
39
40
|
top_level_code {|g| g.gen_assert skip }.
|
@@ -41,16 +42,16 @@ describe Rattler::BackEnd::ParserGenerator::SkipGenerator do
|
|
41
42
|
end
|
42
43
|
end
|
43
44
|
end
|
44
|
-
|
45
|
+
|
45
46
|
describe '#gen_disallow' do
|
46
|
-
|
47
|
+
|
47
48
|
context 'when nested' do
|
48
49
|
it 'generates nested negative lookahead code' do
|
49
50
|
nested_code {|g| g.gen_disallow skip }.
|
50
51
|
should == '(@scanner.skip(/(?!\w+)/) && true)'
|
51
52
|
end
|
52
53
|
end
|
53
|
-
|
54
|
+
|
54
55
|
context 'when top-level' do
|
55
56
|
it 'generates top level negative lookahead code' do
|
56
57
|
top_level_code {|g| g.gen_disallow skip }.
|
@@ -58,12 +59,14 @@ describe Rattler::BackEnd::ParserGenerator::SkipGenerator do
|
|
58
59
|
end
|
59
60
|
end
|
60
61
|
end
|
61
|
-
|
62
|
+
|
62
63
|
describe '#gen_dispatch_action' do
|
63
|
-
|
64
|
+
|
65
|
+
let(:code) { NodeCode.new('Word', 'parsed') }
|
66
|
+
|
64
67
|
context 'when nested' do
|
65
68
|
it 'generates nested matching code with a dispatch action' do
|
66
|
-
nested_code {|g| g.gen_dispatch_action skip,
|
69
|
+
nested_code {|g| g.gen_dispatch_action skip, code }.
|
67
70
|
should == (<<-CODE).strip
|
68
71
|
begin
|
69
72
|
@scanner.skip(/\\w+/) &&
|
@@ -72,10 +75,10 @@ end
|
|
72
75
|
CODE
|
73
76
|
end
|
74
77
|
end
|
75
|
-
|
78
|
+
|
76
79
|
context 'when top-level' do
|
77
80
|
it 'generates top level matching code with a dispatch action' do
|
78
|
-
top_level_code {|g| g.gen_dispatch_action skip,
|
81
|
+
top_level_code {|g| g.gen_dispatch_action skip, code }.
|
79
82
|
should == (<<-CODE).strip
|
80
83
|
@scanner.skip(/\\w+/) &&
|
81
84
|
Word.parsed([])
|
@@ -83,12 +86,14 @@ Word.parsed([])
|
|
83
86
|
end
|
84
87
|
end
|
85
88
|
end
|
86
|
-
|
89
|
+
|
87
90
|
describe '#gen_direct_action' do
|
88
|
-
|
91
|
+
|
92
|
+
let(:code) { ActionCode.new('[]') }
|
93
|
+
|
89
94
|
context 'when nested' do
|
90
95
|
it 'generates nested matching code with a direct action' do
|
91
|
-
nested_code {|g| g.gen_direct_action skip,
|
96
|
+
nested_code {|g| g.gen_direct_action skip, code }.
|
92
97
|
should == (<<-CODE).strip
|
93
98
|
begin
|
94
99
|
@scanner.skip(/\\w+/) &&
|
@@ -97,10 +102,10 @@ end
|
|
97
102
|
CODE
|
98
103
|
end
|
99
104
|
end
|
100
|
-
|
105
|
+
|
101
106
|
context 'when top-level' do
|
102
107
|
it 'generates top level matching code with a direct action' do
|
103
|
-
top_level_code {|g| g.gen_direct_action skip,
|
108
|
+
top_level_code {|g| g.gen_direct_action skip, code }.
|
104
109
|
should == (<<-CODE).strip
|
105
110
|
@scanner.skip(/\\w+/) &&
|
106
111
|
([])
|
@@ -108,16 +113,16 @@ end
|
|
108
113
|
end
|
109
114
|
end
|
110
115
|
end
|
111
|
-
|
116
|
+
|
112
117
|
describe '#gen_token' do
|
113
|
-
|
118
|
+
|
114
119
|
context 'when nested' do
|
115
120
|
it 'generates nested token matching code' do
|
116
121
|
nested_code {|g| g.gen_token skip }.
|
117
122
|
should == '@scanner.scan(/\w+/)'
|
118
123
|
end
|
119
124
|
end
|
120
|
-
|
125
|
+
|
121
126
|
context 'when top-level' do
|
122
127
|
it 'generates top level token matching code' do
|
123
128
|
top_level_code {|g| g.gen_token skip }.
|
@@ -125,16 +130,16 @@ end
|
|
125
130
|
end
|
126
131
|
end
|
127
132
|
end
|
128
|
-
|
133
|
+
|
129
134
|
describe '#gen_skip' do
|
130
|
-
|
135
|
+
|
131
136
|
context 'when nested' do
|
132
137
|
it 'generates nested skipping code' do
|
133
138
|
nested_code {|g| g.gen_skip skip }.
|
134
139
|
should == '(@scanner.skip(/\w+/) && true)'
|
135
140
|
end
|
136
141
|
end
|
137
|
-
|
142
|
+
|
138
143
|
context 'when top-level' do
|
139
144
|
it 'generates top level skipping code' do
|
140
145
|
top_level_code {|g| g.gen_skip skip }.
|
@@ -142,33 +147,33 @@ end
|
|
142
147
|
end
|
143
148
|
end
|
144
149
|
end
|
145
|
-
|
150
|
+
|
146
151
|
describe '#gen_intermediate' do
|
147
152
|
it 'generates intermediate skipping code' do
|
148
153
|
nested_code {|g| g.gen_intermediate skip }.
|
149
154
|
should == '@scanner.skip(/\w+/)'
|
150
155
|
end
|
151
156
|
end
|
152
|
-
|
157
|
+
|
153
158
|
describe '#gen_intermediate_assert' do
|
154
159
|
it 'generates intermediate positive lookahead code' do
|
155
160
|
nested_code {|g| g.gen_intermediate_assert skip }.
|
156
161
|
should == '@scanner.skip(/(?=\w+)/)'
|
157
162
|
end
|
158
163
|
end
|
159
|
-
|
164
|
+
|
160
165
|
describe '#gen_intermediate_disallow' do
|
161
166
|
it 'generates intermediate negative lookahead code' do
|
162
167
|
nested_code {|g| g.gen_intermediate_disallow skip }.
|
163
168
|
should == '@scanner.skip(/(?!\w+)/)'
|
164
169
|
end
|
165
170
|
end
|
166
|
-
|
171
|
+
|
167
172
|
describe '#gen_intermediate_skip' do
|
168
173
|
it 'generates intermediate skipping code' do
|
169
174
|
nested_code {|g| g.gen_intermediate_skip skip }.
|
170
175
|
should == '@scanner.skip(/\w+/)'
|
171
176
|
end
|
172
177
|
end
|
173
|
-
|
178
|
+
|
174
179
|
end
|