rattler 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. data/README.rdoc +57 -37
  2. data/features/command_line/dest_option.feature +8 -21
  3. data/features/command_line/lib_option.feature +37 -0
  4. data/features/command_line/parser_generator.feature +7 -4
  5. data/features/grammar/back_reference.feature +37 -0
  6. data/features/grammar/fail.feature +3 -3
  7. data/features/grammar/labels.feature +11 -3
  8. data/features/grammar/list_matching.feature +14 -5
  9. data/features/grammar/literal.feature +30 -4
  10. data/features/grammar/nonterminal.feature +1 -1
  11. data/features/grammar/ordered_choice.feature +2 -2
  12. data/features/grammar/skip_operator.feature +1 -1
  13. data/features/grammar/symantic_action.feature +7 -7
  14. data/features/grammar/whitespace.feature +2 -2
  15. data/features/step_definitions/grammar_steps.rb +2 -2
  16. data/lib/rattler/back_end.rb +1 -0
  17. data/lib/rattler/back_end/compiler.rb +19 -20
  18. data/lib/rattler/back_end/optimizer.rb +100 -0
  19. data/lib/rattler/back_end/optimizer/composite_reducing.rb +18 -0
  20. data/lib/rattler/back_end/optimizer/flatten_choice.rb +31 -0
  21. data/lib/rattler/back_end/optimizer/flatten_sequence.rb +59 -0
  22. data/lib/rattler/back_end/optimizer/flattening.rb +17 -0
  23. data/lib/rattler/back_end/optimizer/inline_regular_rules.rb +46 -0
  24. data/lib/rattler/back_end/optimizer/join_match_capturing_sequence.rb +71 -0
  25. data/lib/rattler/back_end/optimizer/join_match_choice.rb +37 -0
  26. data/lib/rattler/back_end/optimizer/join_match_matching_sequence.rb +38 -0
  27. data/lib/rattler/back_end/optimizer/join_match_sequence.rb +17 -0
  28. data/lib/rattler/back_end/optimizer/join_predicate_bare_match.rb +68 -0
  29. data/lib/rattler/back_end/optimizer/join_predicate_match.rb +17 -0
  30. data/lib/rattler/back_end/optimizer/join_predicate_nested_match.rb +37 -0
  31. data/lib/rattler/back_end/optimizer/join_predicate_or_bare_match.rb +68 -0
  32. data/lib/rattler/back_end/optimizer/join_predicate_or_match.rb +17 -0
  33. data/lib/rattler/back_end/optimizer/join_predicate_or_nested_match.rb +36 -0
  34. data/lib/rattler/back_end/optimizer/match_joining.rb +60 -0
  35. data/lib/rattler/back_end/optimizer/optimization.rb +94 -0
  36. data/lib/rattler/back_end/optimizer/optimization_context.rb +72 -0
  37. data/lib/rattler/back_end/optimizer/optimization_sequence.rb +37 -0
  38. data/lib/rattler/back_end/optimizer/optimize_children.rb +46 -0
  39. data/lib/rattler/back_end/optimizer/reduce_repeat_match.rb +44 -0
  40. data/lib/rattler/back_end/optimizer/remove_meaningless_wrapper.rb +32 -0
  41. data/lib/rattler/back_end/optimizer/simplify_redundant_repeat.rb +43 -0
  42. data/lib/rattler/back_end/optimizer/simplify_token_match.rb +38 -0
  43. data/lib/rattler/back_end/parser_generator.rb +21 -14
  44. data/lib/rattler/back_end/parser_generator/apply_generator.rb +35 -35
  45. data/lib/rattler/back_end/parser_generator/assert_generator.rb +29 -30
  46. data/lib/rattler/back_end/parser_generator/back_reference_generator.rb +93 -0
  47. data/lib/rattler/back_end/parser_generator/choice_generator.rb +33 -49
  48. data/lib/rattler/back_end/parser_generator/direct_action_generator.rb +14 -14
  49. data/lib/rattler/back_end/parser_generator/disallow_generator.rb +29 -30
  50. data/lib/rattler/back_end/parser_generator/dispatch_action_generator.rb +11 -13
  51. data/lib/rattler/back_end/parser_generator/expr_generator.rb +36 -56
  52. data/lib/rattler/back_end/parser_generator/fail_generator.rb +18 -18
  53. data/lib/rattler/back_end/parser_generator/group_match.rb +18 -0
  54. data/lib/rattler/back_end/parser_generator/group_match_generator.rb +76 -0
  55. data/lib/rattler/back_end/parser_generator/label_generator.rb +25 -6
  56. data/lib/rattler/back_end/parser_generator/list1_generator.rb +7 -7
  57. data/lib/rattler/back_end/parser_generator/list_generating.rb +19 -20
  58. data/lib/rattler/back_end/parser_generator/list_generator.rb +5 -5
  59. data/lib/rattler/back_end/parser_generator/match_generator.rb +52 -52
  60. data/lib/rattler/back_end/parser_generator/one_or_more_generator.rb +6 -6
  61. data/lib/rattler/back_end/parser_generator/optional_generator.rb +30 -29
  62. data/lib/rattler/back_end/parser_generator/predicate_propogating.rb +8 -8
  63. data/lib/rattler/back_end/parser_generator/repeat_generating.rb +23 -25
  64. data/lib/rattler/back_end/parser_generator/rule_generator.rb +27 -79
  65. data/lib/rattler/back_end/parser_generator/rule_set_generator.rb +102 -0
  66. data/lib/rattler/back_end/parser_generator/sequence_generator.rb +49 -41
  67. data/lib/rattler/back_end/parser_generator/skip_generator.rb +14 -20
  68. data/lib/rattler/back_end/parser_generator/skip_propogating.rb +4 -4
  69. data/lib/rattler/back_end/parser_generator/sub_generating.rb +6 -0
  70. data/lib/rattler/back_end/parser_generator/token_generator.rb +12 -12
  71. data/lib/rattler/back_end/parser_generator/token_propogating.rb +2 -2
  72. data/lib/rattler/back_end/parser_generator/zero_or_more_generator.rb +4 -4
  73. data/lib/rattler/grammar.rb +4 -3
  74. data/lib/rattler/grammar/analysis.rb +91 -0
  75. data/lib/rattler/grammar/grammar.rb +37 -25
  76. data/lib/rattler/grammar/grammar_parser.rb +19 -11
  77. data/lib/rattler/grammar/metagrammar.rb +569 -800
  78. data/lib/rattler/grammar/rattler.rtlr +162 -144
  79. data/lib/rattler/parsers.rb +5 -1
  80. data/lib/rattler/parsers/action_code.rb +29 -15
  81. data/lib/rattler/parsers/apply.rb +5 -5
  82. data/lib/rattler/parsers/assert.rb +4 -18
  83. data/lib/rattler/parsers/back_reference.rb +46 -0
  84. data/lib/rattler/parsers/choice.rb +6 -39
  85. data/lib/rattler/parsers/combinator_parser.rb +32 -0
  86. data/lib/rattler/parsers/combining.rb +3 -29
  87. data/lib/rattler/parsers/direct_action.rb +27 -30
  88. data/lib/rattler/parsers/disallow.rb +4 -18
  89. data/lib/rattler/parsers/dispatch_action.rb +30 -25
  90. data/lib/rattler/parsers/label.rb +9 -18
  91. data/lib/rattler/parsers/list.rb +3 -34
  92. data/lib/rattler/parsers/list1.rb +4 -36
  93. data/lib/rattler/parsers/list_parser.rb +64 -0
  94. data/lib/rattler/parsers/match.rb +7 -42
  95. data/lib/rattler/parsers/node_code.rb +44 -0
  96. data/lib/rattler/parsers/one_or_more.rb +7 -27
  97. data/lib/rattler/parsers/optional.rb +5 -25
  98. data/lib/rattler/parsers/parser.rb +16 -44
  99. data/lib/rattler/parsers/parser_dsl.rb +13 -3
  100. data/lib/rattler/parsers/predicate.rb +4 -12
  101. data/lib/rattler/parsers/rule.rb +18 -19
  102. data/lib/rattler/parsers/rule_set.rb +63 -0
  103. data/lib/rattler/parsers/sequence.rb +12 -46
  104. data/lib/rattler/parsers/skip.rb +12 -26
  105. data/lib/rattler/parsers/token.rb +6 -21
  106. data/lib/rattler/parsers/zero_or_more.rb +6 -26
  107. data/lib/rattler/runner.rb +66 -28
  108. data/lib/rattler/runtime/extended_packrat_parser.rb +26 -20
  109. data/lib/rattler/runtime/packrat_parser.rb +17 -21
  110. data/lib/rattler/runtime/parser.rb +12 -2
  111. data/lib/rattler/runtime/recursive_descent_parser.rb +3 -11
  112. data/lib/rattler/util.rb +2 -1
  113. data/lib/rattler/util/graphviz.rb +29 -0
  114. data/lib/rattler/util/graphviz/digraph_builder.rb +71 -0
  115. data/lib/rattler/util/graphviz/node_builder.rb +84 -0
  116. data/lib/rattler/util/node.rb +37 -19
  117. data/lib/rattler/util/parser_spec_helper.rb +61 -35
  118. data/spec/rattler/back_end/compiler_spec.rb +6 -860
  119. data/spec/rattler/back_end/optimizer/flatten_choice_spec.rb +70 -0
  120. data/spec/rattler/back_end/optimizer/flatten_sequence_spec.rb +130 -0
  121. data/spec/rattler/back_end/optimizer/inline_regular_rules_spec.rb +80 -0
  122. data/spec/rattler/back_end/optimizer/join_match_capturing_sequence_spec.rb +241 -0
  123. data/spec/rattler/back_end/optimizer/join_match_choice_spec.rb +100 -0
  124. data/spec/rattler/back_end/optimizer/join_match_matching_sequence_spec.rb +112 -0
  125. data/spec/rattler/back_end/optimizer/join_predicate_bare_match_spec.rb +194 -0
  126. data/spec/rattler/back_end/optimizer/join_predicate_nested_match_spec.rb +180 -0
  127. data/spec/rattler/back_end/optimizer/join_predicate_or_bare_match_spec.rb +153 -0
  128. data/spec/rattler/back_end/optimizer/join_predicate_or_nested_match_spec.rb +153 -0
  129. data/spec/rattler/back_end/optimizer/reduce_repeat_match_spec.rb +98 -0
  130. data/spec/rattler/back_end/optimizer/simplify_redundant_repeat_spec.rb +226 -0
  131. data/spec/rattler/back_end/optimizer/simplify_token_match_spec.rb +85 -0
  132. data/spec/rattler/back_end/parser_generator/apply_generator_spec.rb +38 -33
  133. data/spec/rattler/back_end/parser_generator/assert_generator_spec.rb +38 -33
  134. data/spec/rattler/back_end/parser_generator/back_reference_generator_spec.rb +181 -0
  135. data/spec/rattler/back_end/parser_generator/choice_generator_spec.rb +38 -33
  136. data/spec/rattler/back_end/parser_generator/direct_action_generator_spec.rb +38 -33
  137. data/spec/rattler/back_end/parser_generator/disallow_generator_spec.rb +38 -33
  138. data/spec/rattler/back_end/parser_generator/dispatch_action_generator_spec.rb +38 -33
  139. data/spec/rattler/back_end/parser_generator/group_match_generator_spec.rb +185 -0
  140. data/spec/rattler/back_end/parser_generator/label_generator_spec.rb +38 -33
  141. data/spec/rattler/back_end/parser_generator/list1_generator_spec.rb +10 -5
  142. data/spec/rattler/back_end/parser_generator/list_generator_spec.rb +10 -5
  143. data/spec/rattler/back_end/parser_generator/match_generator_spec.rb +38 -33
  144. data/spec/rattler/back_end/parser_generator/one_or_more_generator_spec.rb +38 -33
  145. data/spec/rattler/back_end/parser_generator/optional_generator_spec.rb +38 -33
  146. data/spec/rattler/back_end/parser_generator/rule_generator_spec.rb +13 -46
  147. data/spec/rattler/back_end/parser_generator/rule_set_generator_spec.rb +97 -0
  148. data/spec/rattler/back_end/parser_generator/sequence_generator_spec.rb +38 -33
  149. data/spec/rattler/back_end/parser_generator/skip_generator_spec.rb +38 -33
  150. data/spec/rattler/back_end/parser_generator/token_generator_spec.rb +38 -33
  151. data/spec/rattler/back_end/parser_generator/zero_or_more_generator_spec.rb +39 -34
  152. data/spec/rattler/back_end/shared_compiler_examples.rb +885 -0
  153. data/spec/rattler/grammar/analysis_spec.rb +167 -0
  154. data/spec/rattler/grammar/grammar_parser_spec.rb +169 -179
  155. data/spec/rattler/grammar/grammar_spec.rb +24 -21
  156. data/spec/rattler/parsers/action_code_spec.rb +64 -19
  157. data/spec/rattler/parsers/apply_spec.rb +9 -9
  158. data/spec/rattler/parsers/back_reference_spec.rb +38 -0
  159. data/spec/rattler/parsers/combinator_parser_spec.rb +14 -0
  160. data/spec/rattler/parsers/direct_action_spec.rb +16 -2
  161. data/spec/rattler/parsers/dispatch_action_spec.rb +15 -32
  162. data/spec/rattler/parsers/fail_spec.rb +6 -4
  163. data/spec/rattler/parsers/label_spec.rb +10 -28
  164. data/spec/rattler/parsers/node_code_spec.rb +48 -0
  165. data/spec/rattler/parsers/parser_dsl_spec.rb +1 -1
  166. data/spec/rattler/parsers/rule_set_spec.rb +35 -0
  167. data/spec/rattler/parsers/sequence_spec.rb +15 -24
  168. data/spec/rattler/runtime/extended_packrat_parser_spec.rb +22 -17
  169. data/spec/rattler/runtime/packrat_parser_spec.rb +1 -1
  170. data/spec/rattler/runtime/parse_node_spec.rb +15 -19
  171. data/spec/rattler/runtime/recursive_descent_parser_spec.rb +1 -1
  172. data/spec/rattler/runtime/shared_parser_examples.rb +61 -28
  173. data/spec/rattler/util/graphviz/node_builder_spec.rb +84 -0
  174. data/spec/rattler/util/node_spec.rb +92 -65
  175. data/spec/rattler_spec.rb +16 -16
  176. data/spec/support/combinator_parser_spec_helper.rb +19 -18
  177. data/spec/support/compiler_spec_helper.rb +56 -87
  178. data/spec/support/runtime_parser_spec_helper.rb +6 -14
  179. metadata +117 -22
  180. data/features/grammar/regex.feature +0 -24
  181. data/lib/rattler/parsers/match_joining.rb +0 -67
  182. data/lib/rattler/parsers/rules.rb +0 -43
@@ -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, target, method_name)
20
- atomic_block { gen_dispatch_action_top_level inner, target, method_name }
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, target, method_name)
24
- @g.surround("(#{result_name} = ", ')') { gen_basic_nested inner }
25
- (@g << ' &&').newline << dispatch_action_result(target, method_name)
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 << direct_action_result(code)
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, target, method_name)
29
- atomic_block { gen_dispatch_action_top_level disallow, target, method_name }
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, target, method_name)
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, direct_action_result(code)
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, target, method_name)
22
- atomic_block { gen_dispatch_action_top_level inner, target, method_name }
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, target, method_name)
23
+ def gen_dispatch_action_top_level(inner, code, scope={})
26
24
  @g.surround("(#{result_name} = ", ')') { gen_basic_nested inner }
27
- (@g << ' &&').newline << dispatch_action_result(target, method_name)
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 << direct_action_result(code)
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, target, method_name)
43
- gen_dispatch_action parser, target, method_name
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, target, method_name)
47
- gen_dispatch_action parser, target, method_name
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, action)
51
- gen_direct_action parser, action
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, action)
55
- gen_direct_action parser, action
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