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