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
@@ -8,30 +8,30 @@ module Rattler::BackEnd::ParserGenerator
|
|
8
8
|
include TokenPropogating
|
9
9
|
include SkipPropogating
|
10
10
|
|
11
|
-
def gen_basic_nested(action)
|
12
|
-
generate action.child, :direct_action_nested, action.bindable_code
|
11
|
+
def gen_basic_nested(action, scope={})
|
12
|
+
generate action.child, :direct_action_nested, action.bindable_code, scope
|
13
13
|
end
|
14
14
|
|
15
|
-
def gen_basic_top_level(action)
|
16
|
-
generate action.child, :direct_action_top_level, action.bindable_code
|
15
|
+
def gen_basic_top_level(action, scope={})
|
16
|
+
generate action.child, :direct_action_top_level, action.bindable_code, scope
|
17
17
|
end
|
18
18
|
|
19
|
-
def gen_dispatch_action_nested(inner,
|
20
|
-
atomic_block { gen_dispatch_action_top_level inner,
|
19
|
+
def gen_dispatch_action_nested(inner, code, scope={})
|
20
|
+
atomic_block { gen_dispatch_action_top_level inner, code, scope }
|
21
21
|
end
|
22
22
|
|
23
|
-
def gen_dispatch_action_top_level(inner,
|
24
|
-
@g.surround("(#{result_name} = ", ')') { gen_basic_nested inner }
|
25
|
-
(@g << ' &&').newline <<
|
23
|
+
def gen_dispatch_action_top_level(inner, code, scope={})
|
24
|
+
@g.surround("(#{result_name} = ", ')') { gen_basic_nested inner, scope }
|
25
|
+
(@g << ' &&').newline << code.bind(scope, "[#{result_name}]")
|
26
26
|
end
|
27
27
|
|
28
|
-
def gen_direct_action_nested(inner, code)
|
29
|
-
atomic_block { gen_direct_action_top_level inner, code }
|
28
|
+
def gen_direct_action_nested(inner, code, scope={})
|
29
|
+
atomic_block { gen_direct_action_top_level inner, code, scope }
|
30
30
|
end
|
31
31
|
|
32
|
-
def gen_direct_action_top_level(inner, code)
|
33
|
-
@g.surround("(#{result_name} = ", ')') { gen_basic_nested inner }
|
34
|
-
(@g << ' &&').newline <<
|
32
|
+
def gen_direct_action_top_level(inner, code, scope={})
|
33
|
+
@g.surround("(#{result_name} = ", ')') { gen_basic_nested inner, scope }
|
34
|
+
(@g << ' &&').newline << '(' << code.bind(scope, [result_name]) << ')'
|
35
35
|
end
|
36
36
|
|
37
37
|
end
|
@@ -5,67 +5,66 @@ module Rattler::BackEnd::ParserGenerator
|
|
5
5
|
# @private
|
6
6
|
class DisallowGenerator < ExprGenerator #:nodoc:
|
7
7
|
|
8
|
-
def gen_basic(disallow)
|
9
|
-
generate disallow.child, :disallow
|
8
|
+
def gen_basic(disallow, scope={})
|
9
|
+
generate disallow.child, :disallow, scope
|
10
10
|
end
|
11
11
|
|
12
|
-
def gen_assert(disallow)
|
12
|
+
def gen_assert(disallow, scope={})
|
13
13
|
@g << 'false'
|
14
14
|
end
|
15
15
|
|
16
|
-
def gen_disallow(disallow)
|
17
|
-
gen_basic disallow
|
16
|
+
def gen_disallow(disallow, scope={})
|
17
|
+
gen_basic disallow, scope
|
18
18
|
end
|
19
19
|
|
20
|
-
def gen_skip_nested(disallow)
|
21
|
-
gen_basic_nested disallow
|
20
|
+
def gen_skip_nested(disallow, scope={})
|
21
|
+
gen_basic_nested disallow, scope
|
22
22
|
end
|
23
23
|
|
24
|
-
def gen_skip_top_level(disallow)
|
25
|
-
gen_basic_top_level disallow
|
24
|
+
def gen_skip_top_level(disallow, scope={})
|
25
|
+
gen_basic_top_level disallow, scope
|
26
26
|
end
|
27
27
|
|
28
|
-
def gen_dispatch_action_nested(disallow,
|
29
|
-
atomic_block { gen_dispatch_action_top_level disallow,
|
28
|
+
def gen_dispatch_action_nested(disallow, code, scope={})
|
29
|
+
atomic_block { gen_dispatch_action_top_level disallow, code, scope }
|
30
30
|
end
|
31
31
|
|
32
|
-
def gen_dispatch_action_top_level(disallow,
|
33
|
-
gen_action disallow,
|
34
|
-
dispatch_action_result(target, method_name, :array_expr => '[]')
|
32
|
+
def gen_dispatch_action_top_level(disallow, code, scope={})
|
33
|
+
gen_action disallow, code.bind(scope, '[]'), scope
|
35
34
|
end
|
36
35
|
|
37
|
-
def gen_direct_action_nested(disallow, code)
|
38
|
-
atomic_block { gen_direct_action_top_level disallow, code }
|
36
|
+
def gen_direct_action_nested(disallow, code, scope={})
|
37
|
+
atomic_block { gen_direct_action_top_level disallow, code, scope }
|
39
38
|
end
|
40
39
|
|
41
|
-
def gen_direct_action_top_level(disallow, code)
|
42
|
-
gen_action disallow,
|
40
|
+
def gen_direct_action_top_level(disallow, code, scope={})
|
41
|
+
gen_action disallow, "(#{code.bind scope, []})", scope
|
43
42
|
end
|
44
43
|
|
45
|
-
def gen_token_nested(disallow)
|
46
|
-
atomic_block { gen_token_top_level disallow }
|
44
|
+
def gen_token_nested(disallow, scope={})
|
45
|
+
atomic_block { gen_token_top_level disallow, scope }
|
47
46
|
end
|
48
47
|
|
49
|
-
def gen_token_top_level(disallow)
|
50
|
-
gen_action disallow, "''"
|
48
|
+
def gen_token_top_level(disallow, scope={})
|
49
|
+
gen_action disallow, "''", scope
|
51
50
|
end
|
52
51
|
|
53
|
-
def gen_intermediate(disallow)
|
54
|
-
generate disallow.child, :intermediate_disallow
|
52
|
+
def gen_intermediate(disallow, scope={})
|
53
|
+
generate disallow.child, :intermediate_disallow, scope
|
55
54
|
end
|
56
55
|
|
57
|
-
def gen_intermediate_disallow(disallow)
|
58
|
-
gen_intermediate disallow
|
56
|
+
def gen_intermediate_disallow(disallow, scope={})
|
57
|
+
gen_intermediate disallow, scope
|
59
58
|
end
|
60
59
|
|
61
|
-
def gen_intermediate_skip(disallow)
|
62
|
-
gen_intermediate disallow
|
60
|
+
def gen_intermediate_skip(disallow, scope={})
|
61
|
+
gen_intermediate disallow, scope
|
63
62
|
end
|
64
63
|
|
65
64
|
private
|
66
65
|
|
67
|
-
def gen_action(disallow, result_code)
|
68
|
-
gen_intermediate disallow
|
66
|
+
def gen_action(disallow, result_code, scope={})
|
67
|
+
gen_intermediate disallow, scope
|
69
68
|
(@g << ' &&').newline << result_code
|
70
69
|
end
|
71
70
|
|
@@ -8,32 +8,30 @@ module Rattler::BackEnd::ParserGenerator
|
|
8
8
|
include TokenPropogating
|
9
9
|
include SkipPropogating
|
10
10
|
|
11
|
-
def gen_basic_nested(action)
|
12
|
-
generate action.child, :dispatch_action_nested,
|
13
|
-
action.target, action.method_name
|
11
|
+
def gen_basic_nested(action, scope={})
|
12
|
+
generate action.child, :dispatch_action_nested, action.bindable_code, scope
|
14
13
|
end
|
15
14
|
|
16
|
-
def gen_basic_top_level(action)
|
17
|
-
generate action.child, :dispatch_action_top_level,
|
18
|
-
action.target, action.method_name
|
15
|
+
def gen_basic_top_level(action, scope={})
|
16
|
+
generate action.child, :dispatch_action_top_level, action.bindable_code, scope
|
19
17
|
end
|
20
18
|
|
21
|
-
def gen_dispatch_action_nested(inner,
|
22
|
-
atomic_block { gen_dispatch_action_top_level inner,
|
19
|
+
def gen_dispatch_action_nested(inner, code, scope={})
|
20
|
+
atomic_block { gen_dispatch_action_top_level inner, code }
|
23
21
|
end
|
24
22
|
|
25
|
-
def gen_dispatch_action_top_level(inner,
|
23
|
+
def gen_dispatch_action_top_level(inner, code, scope={})
|
26
24
|
@g.surround("(#{result_name} = ", ')') { gen_basic_nested inner }
|
27
|
-
(@g << ' &&').newline <<
|
25
|
+
(@g << ' &&').newline << code.bind(scope, "[#{result_name}]")
|
28
26
|
end
|
29
27
|
|
30
|
-
def gen_direct_action_nested(inner, code)
|
28
|
+
def gen_direct_action_nested(inner, code, scope={})
|
31
29
|
atomic_block { gen_direct_action_top_level inner, code }
|
32
30
|
end
|
33
31
|
|
34
|
-
def gen_direct_action_top_level(inner, code)
|
32
|
+
def gen_direct_action_top_level(inner, code, scope={})
|
35
33
|
@g.surround("(#{result_name} = ", ')') { gen_basic_nested inner }
|
36
|
-
(@g << ' &&').newline <<
|
34
|
+
(@g << ' &&').newline << '(' << code.bind(scope, [result_name]) << ')'
|
37
35
|
end
|
38
36
|
|
39
37
|
end
|
@@ -4,7 +4,6 @@ module Rattler::BackEnd::ParserGenerator
|
|
4
4
|
|
5
5
|
# @private
|
6
6
|
class ExprGenerator #:nodoc:
|
7
|
-
# include GeneratorHelper
|
8
7
|
|
9
8
|
include Rattler::Parsers
|
10
9
|
|
@@ -15,79 +14,79 @@ module Rattler::BackEnd::ParserGenerator
|
|
15
14
|
@repeat_level = repeat_level
|
16
15
|
end
|
17
16
|
|
18
|
-
def gen_basic_nested(parser)
|
19
|
-
gen_basic parser
|
17
|
+
def gen_basic_nested(parser, scope={})
|
18
|
+
gen_basic parser, scope
|
20
19
|
end
|
21
20
|
|
22
|
-
def gen_basic_top_level(parser)
|
23
|
-
gen_basic parser
|
21
|
+
def gen_basic_top_level(parser, scope={})
|
22
|
+
gen_basic parser, scope
|
24
23
|
end
|
25
24
|
|
26
|
-
def gen_assert_nested(parser)
|
27
|
-
gen_assert parser
|
25
|
+
def gen_assert_nested(parser, scope={})
|
26
|
+
gen_assert parser, scope
|
28
27
|
end
|
29
28
|
|
30
|
-
def gen_assert_top_level(parser)
|
31
|
-
gen_assert parser
|
29
|
+
def gen_assert_top_level(parser, scope={})
|
30
|
+
gen_assert parser, scope
|
32
31
|
end
|
33
32
|
|
34
|
-
def gen_disallow_nested(parser)
|
35
|
-
gen_disallow parser
|
33
|
+
def gen_disallow_nested(parser, scope={})
|
34
|
+
gen_disallow parser, scope
|
36
35
|
end
|
37
36
|
|
38
|
-
def gen_disallow_top_level(parser)
|
39
|
-
gen_disallow parser
|
37
|
+
def gen_disallow_top_level(parser, scope={})
|
38
|
+
gen_disallow parser, scope
|
40
39
|
end
|
41
40
|
|
42
|
-
def gen_dispatch_action_nested(parser,
|
43
|
-
gen_dispatch_action parser,
|
41
|
+
def gen_dispatch_action_nested(parser, code, scope={})
|
42
|
+
gen_dispatch_action parser, code, scope
|
44
43
|
end
|
45
44
|
|
46
|
-
def gen_dispatch_action_top_level(parser,
|
47
|
-
gen_dispatch_action parser,
|
45
|
+
def gen_dispatch_action_top_level(parser, code, scope={})
|
46
|
+
gen_dispatch_action parser, code, scope
|
48
47
|
end
|
49
48
|
|
50
|
-
def gen_direct_action_nested(parser,
|
51
|
-
gen_direct_action parser,
|
49
|
+
def gen_direct_action_nested(parser, code, scope={})
|
50
|
+
gen_direct_action parser, code, scope
|
52
51
|
end
|
53
52
|
|
54
|
-
def gen_direct_action_top_level(parser,
|
55
|
-
gen_direct_action parser,
|
53
|
+
def gen_direct_action_top_level(parser, code, scope={})
|
54
|
+
gen_direct_action parser, code, scope
|
56
55
|
end
|
57
56
|
|
58
|
-
def gen_token_nested(parser)
|
59
|
-
atomic_block { gen_token_top_level parser }
|
57
|
+
def gen_token_nested(parser, scope={})
|
58
|
+
atomic_block { gen_token_top_level parser, scope }
|
60
59
|
end
|
61
60
|
|
62
|
-
def gen_token_top_level(parser)
|
61
|
+
def gen_token_top_level(parser, scope={})
|
63
62
|
(@g << "tp = @scanner.pos").newline
|
64
|
-
gen_intermediate_skip parser
|
63
|
+
gen_intermediate_skip parser, scope
|
65
64
|
(@g << ' &&').newline
|
66
65
|
@g << "@scanner.string[tp...(@scanner.pos)]"
|
67
66
|
end
|
68
67
|
|
69
|
-
def gen_skip_nested(parser)
|
70
|
-
gen_skip parser
|
68
|
+
def gen_skip_nested(parser, scope={})
|
69
|
+
gen_skip parser, scope
|
71
70
|
end
|
72
71
|
|
73
|
-
def gen_skip_top_level(parser)
|
74
|
-
gen_skip parser
|
72
|
+
def gen_skip_top_level(parser, scope={})
|
73
|
+
gen_skip parser, scope
|
75
74
|
end
|
76
75
|
|
77
|
-
def gen_intermediate(parser)
|
78
|
-
gen_basic_nested parser
|
76
|
+
def gen_intermediate(parser, scope={})
|
77
|
+
gen_basic_nested parser, scope
|
79
78
|
end
|
80
79
|
|
81
|
-
def gen_intermediate_assert(parser)
|
82
|
-
gen_assert_nested parser
|
80
|
+
def gen_intermediate_assert(parser, scope={})
|
81
|
+
gen_assert_nested parser, scope
|
83
82
|
end
|
84
83
|
|
85
|
-
def gen_intermediate_disallow(parser)
|
86
|
-
gen_disallow_nested parser
|
84
|
+
def gen_intermediate_disallow(parser, scope={})
|
85
|
+
gen_disallow_nested parser, scope
|
87
86
|
end
|
88
87
|
|
89
|
-
def gen_intermediate_skip(parser)
|
90
|
-
gen_skip_nested parser
|
88
|
+
def gen_intermediate_skip(parser, scope={})
|
89
|
+
gen_skip_nested parser, scope
|
91
90
|
end
|
92
91
|
|
93
92
|
protected
|
@@ -110,25 +109,6 @@ module Rattler::BackEnd::ParserGenerator
|
|
110
109
|
"p#{sequence_level}"
|
111
110
|
end
|
112
111
|
|
113
|
-
def dispatch_action_result(target, method_name, options = {})
|
114
|
-
args = [options[:array_expr] || "[#{result_name}]"]
|
115
|
-
labeled = options[:labeled]
|
116
|
-
if labeled and not labeled.empty?
|
117
|
-
if labeled.respond_to?(:to_hash)
|
118
|
-
labeled = '{' + labeled.map {|k, v| ":#{k} => #{v}"}.join(', ') + '}'
|
119
|
-
end
|
120
|
-
args << ":labeled => #{labeled}"
|
121
|
-
end
|
122
|
-
t = target == 'self' ? '' : "#{target}."
|
123
|
-
"#{t}#{method_name}(#{args.join ', '})"
|
124
|
-
end
|
125
|
-
|
126
|
-
def direct_action_result(code, options = {})
|
127
|
-
args = options[:bind_args] || [result_name]
|
128
|
-
labeled = options[:labeled] || {}
|
129
|
-
"(#{code.bind args, labeled})"
|
130
|
-
end
|
131
|
-
|
132
112
|
def lookahead
|
133
113
|
(@g << "#{saved_pos_name} = @scanner.pos").newline
|
134
114
|
yield
|
@@ -1,71 +1,71 @@
|
|
1
1
|
require 'rattler/back_end/parser_generator'
|
2
2
|
|
3
3
|
module Rattler::BackEnd::ParserGenerator
|
4
|
-
|
4
|
+
|
5
5
|
# @private
|
6
6
|
class FailGenerator < ExprGenerator #:nodoc:
|
7
|
-
|
8
|
-
def gen_basic_nested(fail)
|
7
|
+
|
8
|
+
def gen_basic_nested(fail, scope={})
|
9
9
|
case fail.attrs[:type]
|
10
10
|
when :expr then gen_fail_expr_nested fail.message
|
11
11
|
when :rule then gen_fail_rule_nested fail.message
|
12
12
|
when :parse then gen_fail_parse_nested fail.message
|
13
13
|
end
|
14
14
|
end
|
15
|
-
|
16
|
-
def gen_basic_top_level(fail)
|
15
|
+
|
16
|
+
def gen_basic_top_level(fail, scope={})
|
17
17
|
case fail.attrs[:type]
|
18
18
|
when :expr then gen_fail_expr_top_level fail.message
|
19
19
|
when :rule then gen_fail_rule_top_level fail.message
|
20
20
|
when :parse then gen_fail_parse_top_level fail.message
|
21
21
|
end
|
22
22
|
end
|
23
|
-
|
23
|
+
|
24
24
|
private
|
25
|
-
|
25
|
+
|
26
26
|
def gen_fail_expr_nested(message)
|
27
27
|
atomic_expr { gen_fail_expr_top_level message }
|
28
28
|
end
|
29
|
-
|
29
|
+
|
30
30
|
def gen_fail_expr_top_level(message)
|
31
31
|
@g << "fail! { #{message.inspect} }"
|
32
32
|
end
|
33
|
-
|
33
|
+
|
34
34
|
def gen_fail_rule_nested(message)
|
35
35
|
gen_fail_rule_top_level message
|
36
36
|
@g.newline << 'false'
|
37
37
|
end
|
38
|
-
|
38
|
+
|
39
39
|
def gen_fail_rule_top_level(message)
|
40
40
|
@g << "return(fail! { #{message.inspect} })"
|
41
41
|
end
|
42
|
-
|
42
|
+
|
43
43
|
def gen_fail_parse_nested(message)
|
44
44
|
atomic_expr { gen_fail_parse_top_level message }
|
45
45
|
end
|
46
|
-
|
46
|
+
|
47
47
|
def gen_fail_parse_top_level(message)
|
48
48
|
@g << "fail_parse { #{message.inspect} }"
|
49
49
|
end
|
50
|
-
|
50
|
+
|
51
51
|
end
|
52
|
-
|
52
|
+
|
53
53
|
# @private
|
54
54
|
class NestedFailGenerator < FailGenerator #:nodoc:
|
55
55
|
include Nested
|
56
56
|
end
|
57
|
-
|
57
|
+
|
58
58
|
def FailGenerator.nested(*args)
|
59
59
|
NestedFailGenerator.new(*args)
|
60
60
|
end
|
61
|
-
|
61
|
+
|
62
62
|
# @private
|
63
63
|
class TopLevelFailGenerator < FailGenerator #:nodoc:
|
64
64
|
include TopLevel
|
65
65
|
end
|
66
|
-
|
66
|
+
|
67
67
|
def FailGenerator.top_level(*args)
|
68
68
|
TopLevelFailGenerator.new(*args)
|
69
69
|
end
|
70
|
-
|
70
|
+
|
71
71
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'rattler/back_end/parser_generator'
|
2
|
+
|
3
|
+
module Rattler::BackEnd::ParserGenerator
|
4
|
+
# @private
|
5
|
+
class GroupMatch < Rattler::Parsers::Parser #:nodoc:
|
6
|
+
|
7
|
+
alias_method :match, :child
|
8
|
+
|
9
|
+
def re
|
10
|
+
match.re
|
11
|
+
end
|
12
|
+
|
13
|
+
def capture_count
|
14
|
+
num_groups
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require 'rattler/back_end/parser_generator'
|
2
|
+
|
3
|
+
module Rattler::BackEnd::ParserGenerator
|
4
|
+
|
5
|
+
# @private
|
6
|
+
class GroupMatchGenerator < ExprGenerator #:nodoc:
|
7
|
+
include PredicatePropogating
|
8
|
+
include TokenPropogating
|
9
|
+
include SkipPropogating
|
10
|
+
|
11
|
+
def gen_basic_nested(group_match, scope={})
|
12
|
+
atomic_block { gen_basic_top_level group_match, scope }
|
13
|
+
end
|
14
|
+
|
15
|
+
def gen_basic_top_level(group_match, scope={})
|
16
|
+
gen_capture group_match, result_expr(group_match)
|
17
|
+
end
|
18
|
+
|
19
|
+
def gen_dispatch_action_nested(group_match, code, scope={})
|
20
|
+
atomic_block { gen_dispatch_action_top_level group_match, code, scope }
|
21
|
+
end
|
22
|
+
|
23
|
+
def gen_dispatch_action_top_level(group_match, code, scope={})
|
24
|
+
gen_capture group_match, code.bind(scope, "[#{group_exprs(group_match).join ', '}]")
|
25
|
+
end
|
26
|
+
|
27
|
+
def gen_direct_action_nested(group_match, code, scope={})
|
28
|
+
atomic_block { gen_direct_action_top_level group_match, code, scope }
|
29
|
+
end
|
30
|
+
|
31
|
+
def gen_direct_action_top_level(group_match, code, scope={})
|
32
|
+
gen_capture group_match, "(#{code.bind(scope, group_exprs(group_match))})"
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def gen_capture(group_match, expr)
|
38
|
+
generate group_match.match, :intermediate_skip
|
39
|
+
(@g << ' &&').newline << expr
|
40
|
+
end
|
41
|
+
|
42
|
+
def result_expr(group_match)
|
43
|
+
if group_match.num_groups == 1
|
44
|
+
group_exprs(group_match).first
|
45
|
+
else
|
46
|
+
"[#{group_exprs(group_match).join ', '}]"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def group_exprs(group_match)
|
51
|
+
(1..(group_match.num_groups)).map {|n| "@scanner[#{n}]" }
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
# @private
|
57
|
+
class NestedGroupMatchGenerator < GroupMatchGenerator #:nodoc:
|
58
|
+
include Nested
|
59
|
+
include NestedSubGenerating
|
60
|
+
end
|
61
|
+
|
62
|
+
def GroupMatchGenerator.nested(*args)
|
63
|
+
NestedGroupMatchGenerator.new(*args)
|
64
|
+
end
|
65
|
+
|
66
|
+
# @private
|
67
|
+
class TopLevelGroupMatchGenerator < GroupMatchGenerator #:nodoc:
|
68
|
+
include TopLevel
|
69
|
+
include NestedSubGenerating
|
70
|
+
end
|
71
|
+
|
72
|
+
def GroupMatchGenerator.top_level(*args)
|
73
|
+
TopLevelGroupMatchGenerator.new(*args)
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|