rattler 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
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