rattler 0.4.2 → 0.5.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 +9 -3
 - data/features/command_line/dest_option.feature +1 -1
 - data/features/command_line/lib_option.feature +2 -2
 - data/features/command_line/output_option.feature +2 -2
 - data/features/command_line/parser_generator.feature +3 -3
 - data/features/grammar/any_character.feature +0 -4
 - data/features/grammar/back_reference.feature +0 -4
 - data/features/grammar/character_class.feature +0 -4
 - data/features/grammar/comments.feature +0 -4
 - data/features/grammar/e_symbol.feature +18 -0
 - data/features/grammar/eof.feature +0 -4
 - data/features/grammar/fail.feature +0 -4
 - data/features/grammar/list_matching.feature +52 -3
 - data/features/grammar/literal.feature +0 -4
 - data/features/grammar/negative_lookahead.feature +0 -4
 - data/features/grammar/negative_semantic_predicate.feature +99 -0
 - data/features/grammar/node_action.feature +17 -4
 - data/features/grammar/nonterminal.feature +3 -7
 - data/features/grammar/one_or_more.feature +0 -4
 - data/features/grammar/optional.feature +0 -4
 - data/features/grammar/ordered_choice.feature +0 -4
 - data/features/grammar/positive_lookahead.feature +0 -4
 - data/features/grammar/positive_semantic_predicate.feature +99 -0
 - data/features/grammar/posix_class.feature +3 -6
 - data/features/grammar/repeat.feature +50 -0
 - data/features/grammar/sequence.feature +0 -4
 - data/features/grammar/side_effect.feature +81 -0
 - data/features/grammar/skip_operator.feature +2 -5
 - data/features/grammar/start_rule.feature +1 -5
 - data/features/grammar/symantic_action.feature +9 -4
 - data/features/grammar/token.feature +0 -4
 - data/features/grammar/whitespace.feature +0 -4
 - data/features/grammar/word_literal.feature +0 -4
 - data/features/grammar/zero_or_more.feature +0 -4
 - data/features/step_definitions/grammar_steps.rb +5 -1
 - data/lib/rattler/back_end/optimizer.rb +1 -0
 - data/lib/rattler/back_end/optimizer/reduce_repeat_match.rb +20 -8
 - data/lib/rattler/back_end/optimizer/simplify_redundant_repeat.rb +10 -7
 - data/lib/rattler/back_end/optimizer/specialize_repeat.rb +40 -0
 - data/lib/rattler/back_end/parser_generator.rb +11 -6
 - data/lib/rattler/back_end/parser_generator/delegating_generator.rb +20 -0
 - data/lib/rattler/back_end/parser_generator/e_symbol_generator.rb +52 -0
 - data/lib/rattler/back_end/parser_generator/eof_generator.rb +58 -0
 - data/lib/rattler/back_end/parser_generator/expr_generator.rb +6 -2
 - data/lib/rattler/back_end/parser_generator/gen_method_names.rb +15 -5
 - data/lib/rattler/back_end/parser_generator/general_list_generator.rb +194 -0
 - data/lib/rattler/back_end/parser_generator/general_repeat_generator.rb +177 -0
 - data/lib/rattler/back_end/parser_generator/label_generator.rb +4 -1
 - data/lib/rattler/back_end/parser_generator/list0_generating.rb +36 -0
 - data/lib/rattler/back_end/parser_generator/list1_generating.rb +30 -0
 - data/lib/rattler/back_end/parser_generator/list_generator.rb +16 -20
 - data/lib/rattler/back_end/parser_generator/one_or_more_generating.rb +25 -0
 - data/lib/rattler/back_end/parser_generator/{optional_generator.rb → optional_generating.rb} +66 -81
 - data/lib/rattler/back_end/parser_generator/predicate_propogating.rb +4 -4
 - data/lib/rattler/back_end/parser_generator/repeat_generator.rb +53 -0
 - data/lib/rattler/back_end/parser_generator/skip_propogating.rb +2 -2
 - data/lib/rattler/back_end/parser_generator/sub_generating.rb +16 -18
 - data/lib/rattler/back_end/parser_generator/token_propogating.rb +1 -1
 - data/lib/rattler/back_end/parser_generator/zero_or_more_generating.rb +31 -0
 - data/lib/rattler/grammar/grammar_parser.rb +20 -0
 - data/lib/rattler/grammar/metagrammar.rb +131 -13
 - data/lib/rattler/grammar/rattler.rtlr +25 -12
 - data/lib/rattler/parsers.rb +9 -5
 - data/lib/rattler/parsers/assert_code.rb +31 -0
 - data/lib/rattler/parsers/atomic.rb +19 -0
 - data/lib/rattler/parsers/direct_action.rb +12 -4
 - data/lib/rattler/parsers/disallow_code.rb +31 -0
 - data/lib/rattler/parsers/dispatch_action.rb +3 -2
 - data/lib/rattler/parsers/e_symbol.rb +47 -0
 - data/lib/rattler/parsers/effect_code.rb +31 -0
 - data/lib/rattler/parsers/eof.rb +6 -13
 - data/lib/rattler/parsers/list_parser.rb +33 -14
 - data/lib/rattler/parsers/match.rb +1 -6
 - data/lib/rattler/parsers/parser_dsl.rb +78 -35
 - data/lib/rattler/parsers/predicate.rb +1 -4
 - data/lib/rattler/parsers/repeat.rb +76 -0
 - data/lib/rattler/parsers/semantic_assert.rb +19 -0
 - data/lib/rattler/parsers/semantic_disallow.rb +19 -0
 - data/lib/rattler/parsers/side_effect.rb +19 -0
 - data/lib/rattler/parsers/skip.rb +1 -9
 - data/lib/rattler/parsers/token.rb +1 -6
 - data/lib/rattler/util/graphviz/node_builder.rb +6 -3
 - data/spec/rattler/back_end/assert_compiler_examples.rb +187 -0
 - data/spec/rattler/back_end/direct_action_compiler_examples.rb +227 -0
 - data/spec/rattler/back_end/disallow_compiler_examples.rb +187 -0
 - data/spec/rattler/back_end/dispatch_action_compiler_examples.rb +225 -0
 - data/spec/rattler/back_end/optimizer/reduce_repeat_match_spec.rb +45 -33
 - data/spec/rattler/back_end/optimizer/simplify_redundant_repeat_spec.rb +32 -172
 - data/spec/rattler/back_end/parser_generator/e_symbol_generator_spec.rb +149 -0
 - data/spec/rattler/back_end/parser_generator/eof_generator_spec.rb +152 -0
 - data/spec/rattler/back_end/parser_generator/label_generator_spec.rb +4 -4
 - data/spec/rattler/back_end/parser_generator/list0_generator_examples.rb +322 -0
 - data/spec/rattler/back_end/parser_generator/list1_generator_examples.rb +343 -0
 - data/spec/rattler/back_end/parser_generator/list_generator_spec.rb +597 -140
 - data/spec/rattler/back_end/parser_generator/one_or_more_generator_examples.rb +292 -0
 - data/spec/rattler/back_end/parser_generator/optional_generator_examples.rb +233 -0
 - data/spec/rattler/back_end/parser_generator/repeat_generator_spec.rb +281 -0
 - data/spec/rattler/back_end/parser_generator/zero_or_more_generator_examples.rb +277 -0
 - data/spec/rattler/back_end/semantic_assert_compiler_examples.rb +152 -0
 - data/spec/rattler/back_end/semantic_disallow_compiler_examples.rb +152 -0
 - data/spec/rattler/back_end/shared_compiler_examples.rb +106 -651
 - data/spec/rattler/back_end/side_effect_compiler_examples.rb +227 -0
 - data/spec/rattler/back_end/skip_compiler_examples.rb +161 -0
 - data/spec/rattler/back_end/token_compiler_examples.rb +262 -0
 - data/spec/rattler/grammar/grammar_parser_spec.rb +302 -23
 - data/spec/rattler/parsers/apply_spec.rb +6 -0
 - data/spec/rattler/parsers/assert_spec.rb +18 -7
 - data/spec/rattler/parsers/back_reference_spec.rb +9 -0
 - data/spec/rattler/parsers/choice_spec.rb +36 -21
 - data/spec/rattler/parsers/direct_action_spec.rb +76 -36
 - data/spec/rattler/parsers/disallow_spec.rb +18 -7
 - data/spec/rattler/parsers/dispatch_action_spec.rb +128 -22
 - data/spec/rattler/parsers/e_symbol_spec.rb +30 -0
 - data/spec/rattler/parsers/eof_spec.rb +15 -6
 - data/spec/rattler/parsers/label_spec.rb +15 -2
 - data/spec/rattler/parsers/list_parser_spec.rb +187 -0
 - data/spec/rattler/parsers/match_spec.rb +16 -7
 - data/spec/rattler/parsers/parser_dsl_spec.rb +82 -23
 - data/spec/rattler/parsers/repeat_spec.rb +233 -0
 - data/spec/rattler/parsers/semantic_assert_spec.rb +83 -0
 - data/spec/rattler/parsers/semantic_disallow_spec.rb +83 -0
 - data/spec/rattler/parsers/sequence_spec.rb +34 -20
 - data/spec/rattler/parsers/side_effect_spec.rb +214 -0
 - data/spec/rattler/parsers/skip_spec.rb +17 -6
 - data/spec/rattler_spec.rb +2 -0
 - data/spec/support/compiler_spec_helper.rb +8 -0
 - metadata +156 -447
 - data/bin/rtlr.compiled.rbc +0 -201
 - data/features/step_definitions/cli_steps.rbc +0 -149
 - data/features/step_definitions/grammar_steps.rbc +0 -1211
 - data/features/support/env.rbc +0 -389
 - data/lib/rattler.rbc +0 -1231
 - data/lib/rattler/back_end.rbc +0 -286
 - data/lib/rattler/back_end/compiler.rbc +0 -1394
 - data/lib/rattler/back_end/optimizer.rbc +0 -2000
 - data/lib/rattler/back_end/optimizer/composite_reducing.rbc +0 -337
 - data/lib/rattler/back_end/optimizer/flatten_choice.rbc +0 -443
 - data/lib/rattler/back_end/optimizer/flatten_sequence.rbc +0 -827
 - data/lib/rattler/back_end/optimizer/flattening.rbc +0 -570
 - data/lib/rattler/back_end/optimizer/inline_regular_rules.rbc +0 -691
 - data/lib/rattler/back_end/optimizer/join_match_capturing_sequence.rbc +0 -1299
 - data/lib/rattler/back_end/optimizer/join_match_choice.rbc +0 -523
 - data/lib/rattler/back_end/optimizer/join_match_matching_sequence.rbc +0 -619
 - data/lib/rattler/back_end/optimizer/join_match_sequence.rbc +0 -174
 - data/lib/rattler/back_end/optimizer/join_predicate_bare_match.rbc +0 -1505
 - data/lib/rattler/back_end/optimizer/join_predicate_match.rbc +0 -174
 - data/lib/rattler/back_end/optimizer/join_predicate_nested_match.rbc +0 -620
 - data/lib/rattler/back_end/optimizer/join_predicate_or_bare_match.rbc +0 -1502
 - data/lib/rattler/back_end/optimizer/join_predicate_or_match.rbc +0 -174
 - data/lib/rattler/back_end/optimizer/join_predicate_or_nested_match.rbc +0 -616
 - data/lib/rattler/back_end/optimizer/match_joining.rbc +0 -1454
 - data/lib/rattler/back_end/optimizer/optimization.rbc +0 -1366
 - data/lib/rattler/back_end/optimizer/optimization_context.rbc +0 -1386
 - data/lib/rattler/back_end/optimizer/optimization_sequence.rbc +0 -520
 - data/lib/rattler/back_end/optimizer/optimize_children.rbc +0 -793
 - data/lib/rattler/back_end/optimizer/reduce_repeat_match.rbc +0 -788
 - data/lib/rattler/back_end/optimizer/remove_meaningless_wrapper.rbc +0 -508
 - data/lib/rattler/back_end/optimizer/simplify_redundant_repeat.rbc +0 -807
 - data/lib/rattler/back_end/optimizer/simplify_token_match.rbc +0 -561
 - data/lib/rattler/back_end/parser_generator.rbc +0 -1326
 - data/lib/rattler/back_end/parser_generator/apply_generator.rbc +0 -2148
 - data/lib/rattler/back_end/parser_generator/assert_generator.rbc +0 -1967
 - data/lib/rattler/back_end/parser_generator/back_reference_generator.rbc +0 -1665
 - data/lib/rattler/back_end/parser_generator/choice_generator.rbc +0 -2793
 - data/lib/rattler/back_end/parser_generator/direct_action_generator.rbc +0 -1071
 - data/lib/rattler/back_end/parser_generator/disallow_generator.rbc +0 -1967
 - data/lib/rattler/back_end/parser_generator/dispatch_action_generator.rbc +0 -1071
 - data/lib/rattler/back_end/parser_generator/expr_generator.rbc +0 -2295
 - data/lib/rattler/back_end/parser_generator/fail_generator.rbc +0 -1216
 - data/lib/rattler/back_end/parser_generator/gen_method_names.rbc +0 -296
 - data/lib/rattler/back_end/parser_generator/group_match.rbc +0 -612
 - data/lib/rattler/back_end/parser_generator/group_match_generator.rbc +0 -1647
 - data/lib/rattler/back_end/parser_generator/label_generator.rbc +0 -1401
 - data/lib/rattler/back_end/parser_generator/list1_generator.rb +0 -54
 - data/lib/rattler/back_end/parser_generator/list1_generator.rbc +0 -1237
 - data/lib/rattler/back_end/parser_generator/list_generating.rb +0 -71
 - data/lib/rattler/back_end/parser_generator/list_generating.rbc +0 -1900
 - data/lib/rattler/back_end/parser_generator/list_generator.rbc +0 -1068
 - data/lib/rattler/back_end/parser_generator/match_generator.rbc +0 -1743
 - data/lib/rattler/back_end/parser_generator/nested.rbc +0 -496
 - data/lib/rattler/back_end/parser_generator/one_or_more_generator.rb +0 -56
 - data/lib/rattler/back_end/parser_generator/one_or_more_generator.rbc +0 -1277
 - data/lib/rattler/back_end/parser_generator/optional_generator.rbc +0 -2025
 - data/lib/rattler/back_end/parser_generator/predicate_propogating.rbc +0 -648
 - data/lib/rattler/back_end/parser_generator/repeat_generating.rb +0 -57
 - data/lib/rattler/back_end/parser_generator/repeat_generating.rbc +0 -1549
 - data/lib/rattler/back_end/parser_generator/rule_generator.rbc +0 -1239
 - data/lib/rattler/back_end/parser_generator/rule_set_generator.rbc +0 -2641
 - data/lib/rattler/back_end/parser_generator/sequence_generator.rbc +0 -4867
 - data/lib/rattler/back_end/parser_generator/skip_generator.rbc +0 -1278
 - data/lib/rattler/back_end/parser_generator/skip_propogating.rbc +0 -432
 - data/lib/rattler/back_end/parser_generator/sub_generating.rbc +0 -2785
 - data/lib/rattler/back_end/parser_generator/token_generator.rbc +0 -755
 - data/lib/rattler/back_end/parser_generator/token_propogating.rbc +0 -324
 - data/lib/rattler/back_end/parser_generator/top_level.rbc +0 -352
 - data/lib/rattler/back_end/parser_generator/zero_or_more_generator.rb +0 -53
 - data/lib/rattler/back_end/parser_generator/zero_or_more_generator.rbc +0 -1111
 - data/lib/rattler/back_end/ruby_generator.rbc +0 -1841
 - data/lib/rattler/grammar.rbc +0 -557
 - data/lib/rattler/grammar/analysis.rbc +0 -1944
 - data/lib/rattler/grammar/grammar.rbc +0 -1090
 - data/lib/rattler/grammar/grammar_dsl.rbc +0 -1401
 - data/lib/rattler/grammar/grammar_parser.rbc +0 -2096
 - data/lib/rattler/grammar/metagrammar.rbc +0 -11014
 - data/lib/rattler/parsers.rbc +0 -1006
 - data/lib/rattler/parsers/action_code.rbc +0 -1577
 - data/lib/rattler/parsers/apply.rbc +0 -562
 - data/lib/rattler/parsers/assert.rbc +0 -378
 - data/lib/rattler/parsers/back_reference.rbc +0 -871
 - data/lib/rattler/parsers/choice.rbc +0 -607
 - data/lib/rattler/parsers/combinator_parser.rbc +0 -612
 - data/lib/rattler/parsers/combining.rbc +0 -570
 - data/lib/rattler/parsers/direct_action.rbc +0 -1472
 - data/lib/rattler/parsers/disallow.rbc +0 -379
 - data/lib/rattler/parsers/dispatch_action.rbc +0 -2078
 - data/lib/rattler/parsers/eof.rbc +0 -567
 - data/lib/rattler/parsers/fail.rbc +0 -745
 - data/lib/rattler/parsers/label.rbc +0 -749
 - data/lib/rattler/parsers/list.rbc +0 -292
 - data/lib/rattler/parsers/list0.rb +0 -26
 - data/lib/rattler/parsers/list0.rbc +0 -292
 - data/lib/rattler/parsers/list1.rb +0 -26
 - data/lib/rattler/parsers/list1.rbc +0 -305
 - data/lib/rattler/parsers/list_parser.rbc +0 -886
 - data/lib/rattler/parsers/match.rbc +0 -621
 - data/lib/rattler/parsers/node_code.rbc +0 -1064
 - data/lib/rattler/parsers/one_or_more.rb +0 -47
 - data/lib/rattler/parsers/one_or_more.rbc +0 -475
 - data/lib/rattler/parsers/optional.rb +0 -42
 - data/lib/rattler/parsers/optional.rbc +0 -450
 - data/lib/rattler/parsers/parser.rbc +0 -994
 - data/lib/rattler/parsers/parser_dsl.rbc +0 -4765
 - data/lib/rattler/parsers/predicate.rbc +0 -490
 - data/lib/rattler/parsers/rule.rbc +0 -777
 - data/lib/rattler/parsers/rule_set.rbc +0 -1438
 - data/lib/rattler/parsers/sequence.rbc +0 -1040
 - data/lib/rattler/parsers/skip.rbc +0 -613
 - data/lib/rattler/parsers/token.rbc +0 -457
 - data/lib/rattler/parsers/zero_or_more.rb +0 -40
 - data/lib/rattler/parsers/zero_or_more.rbc +0 -462
 - data/lib/rattler/runner.rbc +0 -3813
 - data/lib/rattler/runtime.rbc +0 -370
 - data/lib/rattler/runtime/extended_packrat_parser.rbc +0 -2351
 - data/lib/rattler/runtime/packrat_parser.rbc +0 -1390
 - data/lib/rattler/runtime/parse_failure.rbc +0 -909
 - data/lib/rattler/runtime/parse_node.rbc +0 -1007
 - data/lib/rattler/runtime/parser.rbc +0 -2267
 - data/lib/rattler/runtime/parser_helper.rbc +0 -337
 - data/lib/rattler/runtime/recursive_descent_parser.rbc +0 -942
 - data/lib/rattler/util.rbc +0 -286
 - data/lib/rattler/util/graphviz.rbc +0 -327
 - data/lib/rattler/util/graphviz/node_builder.rbc +0 -2207
 - data/lib/rattler/util/line_counter.rbc +0 -988
 - data/lib/rattler/util/node.rbc +0 -2393
 - data/lib/rattler/util/parser_spec_helper.rbc +0 -2533
 - data/spec/rattler/back_end/compiler_spec.rbc +0 -1187
 - data/spec/rattler/back_end/optimizer/flatten_choice_spec.rbc +0 -2093
 - data/spec/rattler/back_end/optimizer/flatten_sequence_spec.rbc +0 -4055
 - data/spec/rattler/back_end/optimizer/inline_regular_rules_spec.rbc +0 -2345
 - data/spec/rattler/back_end/optimizer/join_match_capturing_sequence_spec.rbc +0 -7006
 - data/spec/rattler/back_end/optimizer/join_match_choice_spec.rbc +0 -3252
 - data/spec/rattler/back_end/optimizer/join_match_matching_sequence_spec.rbc +0 -3681
 - data/spec/rattler/back_end/optimizer/join_predicate_bare_match_spec.rbc +0 -5603
 - data/spec/rattler/back_end/optimizer/join_predicate_nested_match_spec.rbc +0 -5232
 - data/spec/rattler/back_end/optimizer/join_predicate_or_bare_match_spec.rbc +0 -4272
 - data/spec/rattler/back_end/optimizer/join_predicate_or_nested_match_spec.rbc +0 -4342
 - data/spec/rattler/back_end/optimizer/reduce_repeat_match_spec.rbc +0 -2960
 - data/spec/rattler/back_end/optimizer/simplify_redundant_repeat_spec.rbc +0 -6929
 - data/spec/rattler/back_end/optimizer/simplify_token_match_spec.rbc +0 -2327
 - data/spec/rattler/back_end/optimizer_spec.rbc +0 -372
 - data/spec/rattler/back_end/parser_generator/apply_generator_spec.rbc +0 -4710
 - data/spec/rattler/back_end/parser_generator/assert_generator_spec.rbc +0 -4697
 - data/spec/rattler/back_end/parser_generator/back_reference_generator_spec.rbc +0 -4855
 - data/spec/rattler/back_end/parser_generator/choice_generator_spec.rbc +0 -5350
 - data/spec/rattler/back_end/parser_generator/direct_action_generator_spec.rbc +0 -4737
 - data/spec/rattler/back_end/parser_generator/disallow_generator_spec.rbc +0 -4697
 - data/spec/rattler/back_end/parser_generator/dispatch_action_generator_spec.rbc +0 -4731
 - data/spec/rattler/back_end/parser_generator/fail_generator_spec.rbc +0 -2115
 - data/spec/rattler/back_end/parser_generator/group_match_generator_spec.rbc +0 -4195
 - data/spec/rattler/back_end/parser_generator/group_match_spec.rbc +0 -1414
 - data/spec/rattler/back_end/parser_generator/label_generator_spec.rbc +0 -4696
 - data/spec/rattler/back_end/parser_generator/list1_generator_spec.rb +0 -309
 - data/spec/rattler/back_end/parser_generator/list1_generator_spec.rbc +0 -5213
 - data/spec/rattler/back_end/parser_generator/list_generator_spec.rbc +0 -5179
 - data/spec/rattler/back_end/parser_generator/match_generator_spec.rbc +0 -4681
 - data/spec/rattler/back_end/parser_generator/one_or_more_generator_spec.rb +0 -259
 - data/spec/rattler/back_end/parser_generator/one_or_more_generator_spec.rbc +0 -4957
 - data/spec/rattler/back_end/parser_generator/optional_generator_spec.rb +0 -190
 - data/spec/rattler/back_end/parser_generator/optional_generator_spec.rbc +0 -4704
 - data/spec/rattler/back_end/parser_generator/rule_generator_spec.rbc +0 -545
 - data/spec/rattler/back_end/parser_generator/rule_set_generator_spec.rbc +0 -1110
 - data/spec/rattler/back_end/parser_generator/sequence_generator_spec.rbc +0 -5453
 - data/spec/rattler/back_end/parser_generator/skip_generator_spec.rbc +0 -4691
 - data/spec/rattler/back_end/parser_generator/token_generator_spec.rbc +0 -4691
 - data/spec/rattler/back_end/parser_generator/zero_or_more_generator_spec.rb +0 -244
 - data/spec/rattler/back_end/parser_generator/zero_or_more_generator_spec.rbc +0 -4924
 - data/spec/rattler/back_end/ruby_generator_spec.rbc +0 -2460
 - data/spec/rattler/back_end/shared_compiler_examples.rbc +0 -41886
 - data/spec/rattler/grammar/analysis_spec.rbc +0 -4365
 - data/spec/rattler/grammar/grammar_parser_spec.rbc +0 -10344
 - data/spec/rattler/grammar/grammar_spec.rbc +0 -1701
 - data/spec/rattler/parsers/action_code_spec.rbc +0 -4674
 - data/spec/rattler/parsers/apply_spec.rbc +0 -851
 - data/spec/rattler/parsers/assert_spec.rbc +0 -752
 - data/spec/rattler/parsers/back_reference_spec.rbc +0 -1002
 - data/spec/rattler/parsers/choice_spec.rbc +0 -1696
 - data/spec/rattler/parsers/combinator_parser_spec.rbc +0 -361
 - data/spec/rattler/parsers/direct_action_spec.rbc +0 -5222
 - data/spec/rattler/parsers/disallow_spec.rbc +0 -752
 - data/spec/rattler/parsers/dispatch_action_spec.rbc +0 -3033
 - data/spec/rattler/parsers/eof_spec.rbc +0 -728
 - data/spec/rattler/parsers/fail_spec.rbc +0 -548
 - data/spec/rattler/parsers/label_spec.rbc +0 -1091
 - data/spec/rattler/parsers/list0_spec.rb +0 -82
 - data/spec/rattler/parsers/list0_spec.rbc +0 -2308
 - data/spec/rattler/parsers/list1_spec.rb +0 -82
 - data/spec/rattler/parsers/list1_spec.rbc +0 -2287
 - data/spec/rattler/parsers/list_spec.rbc +0 -2308
 - data/spec/rattler/parsers/match_spec.rbc +0 -780
 - data/spec/rattler/parsers/node_code_spec.rbc +0 -1754
 - data/spec/rattler/parsers/one_or_more_spec.rb +0 -64
 - data/spec/rattler/parsers/one_or_more_spec.rbc +0 -1698
 - data/spec/rattler/parsers/optional_spec.rb +0 -64
 - data/spec/rattler/parsers/optional_spec.rbc +0 -1717
 - data/spec/rattler/parsers/parser_dsl_spec.rbc +0 -10150
 - data/spec/rattler/parsers/rule_set_spec.rbc +0 -1060
 - data/spec/rattler/parsers/sequence_spec.rbc +0 -2899
 - data/spec/rattler/parsers/skip_spec.rbc +0 -753
 - data/spec/rattler/parsers/token_spec.rbc +0 -1511
 - data/spec/rattler/parsers/zero_or_more_spec.rb +0 -64
 - data/spec/rattler/parsers/zero_or_more_spec.rbc +0 -1719
 - data/spec/rattler/runtime/extended_packrat_parser_spec.rbc +0 -1341
 - data/spec/rattler/runtime/packrat_parser_spec.rbc +0 -210
 - data/spec/rattler/runtime/parse_failure_spec.rbc +0 -2244
 - data/spec/rattler/runtime/parse_node_spec.rbc +0 -2008
 - data/spec/rattler/runtime/parser_spec.rbc +0 -2757
 - data/spec/rattler/runtime/recursive_descent_parser_spec.rbc +0 -210
 - data/spec/rattler/runtime/shared_parser_examples.rbc +0 -2567
 - data/spec/rattler/util/graphviz/node_builder_spec.rbc +0 -3439
 - data/spec/rattler/util/line_counter_spec.rbc +0 -2272
 - data/spec/rattler/util/node_spec.rbc +0 -15023
 - data/spec/rattler_spec.rbc +0 -1591
 - data/spec/spec_helper.rbc +0 -336
 - data/spec/support/combinator_parser_spec_helper.rbc +0 -1284
 - data/spec/support/compiler_spec_helper.rbc +0 -1941
 - data/spec/support/parser_generator_spec_helper.rbc +0 -718
 - data/spec/support/runtime_parser_spec_helper.rbc +0 -313
 
| 
         @@ -5,19 +5,19 @@ module Rattler::BackEnd::ParserGenerator 
     | 
|
| 
       5 
5 
     | 
    
         
             
              module PredicatePropogating #:nodoc:
         
     | 
| 
       6 
6 
     | 
    
         | 
| 
       7 
7 
     | 
    
         
             
                def gen_assert(parser, scope={})
         
     | 
| 
       8 
     | 
    
         
            -
                   
     | 
| 
      
 8 
     | 
    
         
            +
                  propogate_gen parser.child, :assert, scope
         
     | 
| 
       9 
9 
     | 
    
         
             
                end
         
     | 
| 
       10 
10 
     | 
    
         | 
| 
       11 
11 
     | 
    
         
             
                def gen_disallow(parser, scope={})
         
     | 
| 
       12 
     | 
    
         
            -
                   
     | 
| 
      
 12 
     | 
    
         
            +
                  propogate_gen parser.child, :disallow, scope
         
     | 
| 
       13 
13 
     | 
    
         
             
                end
         
     | 
| 
       14 
14 
     | 
    
         | 
| 
       15 
15 
     | 
    
         
             
                def gen_intermediate_assert(parser, scope={})
         
     | 
| 
       16 
     | 
    
         
            -
                   
     | 
| 
      
 16 
     | 
    
         
            +
                  propogate_gen parser.child, :intermediate_assert, scope
         
     | 
| 
       17 
17 
     | 
    
         
             
                end
         
     | 
| 
       18 
18 
     | 
    
         | 
| 
       19 
19 
     | 
    
         
             
                def gen_intermediate_disallow(parser, scope={})
         
     | 
| 
       20 
     | 
    
         
            -
                   
     | 
| 
      
 20 
     | 
    
         
            +
                  propogate_gen parser.child, :intermediate_disallow, scope
         
     | 
| 
       21 
21 
     | 
    
         
             
                end
         
     | 
| 
       22 
22 
     | 
    
         | 
| 
       23 
23 
     | 
    
         
             
              end
         
     | 
| 
         @@ -0,0 +1,53 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'rattler/back_end/parser_generator'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            module Rattler::BackEnd::ParserGenerator
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
              # @private
         
     | 
| 
      
 6 
     | 
    
         
            +
              class RepeatGenerator < DelegatingGenerator #:nodoc:
         
     | 
| 
      
 7 
     | 
    
         
            +
                include NestedSubGenerating
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
                protected
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
                def impl(repeat, init_args)
         
     | 
| 
      
 12 
     | 
    
         
            +
                  generator = default_impl(repeat, init_args)
         
     | 
| 
      
 13 
     | 
    
         
            +
                  specialize_for repeat, generator
         
     | 
| 
      
 14 
     | 
    
         
            +
                  generator
         
     | 
| 
      
 15 
     | 
    
         
            +
                end
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
                def specialize_for(repeat, generator)
         
     | 
| 
      
 18 
     | 
    
         
            +
                  return unless repeat.respond_to? :lower_bound
         
     | 
| 
      
 19 
     | 
    
         
            +
                  if repeat.lower_bound == 0
         
     | 
| 
      
 20 
     | 
    
         
            +
                    if repeat.upper_bound == 1
         
     | 
| 
      
 21 
     | 
    
         
            +
                      generator.extend OptionalGenerating
         
     | 
| 
      
 22 
     | 
    
         
            +
                    else
         
     | 
| 
      
 23 
     | 
    
         
            +
                      generator.extend ZeroOrMoreGenerating
         
     | 
| 
      
 24 
     | 
    
         
            +
                    end
         
     | 
| 
      
 25 
     | 
    
         
            +
                  elsif repeat.lower_bound == 1
         
     | 
| 
      
 26 
     | 
    
         
            +
                    generator.extend OneOrMoreGenerating
         
     | 
| 
      
 27 
     | 
    
         
            +
                  end
         
     | 
| 
      
 28 
     | 
    
         
            +
                end
         
     | 
| 
      
 29 
     | 
    
         
            +
              end
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
              # @private
         
     | 
| 
      
 32 
     | 
    
         
            +
              class NestedRepeatGenerator < RepeatGenerator #:nodoc:
         
     | 
| 
      
 33 
     | 
    
         
            +
                def default_impl(list, init_args)
         
     | 
| 
      
 34 
     | 
    
         
            +
                  GeneralRepeatGenerator.nested(*init_args)
         
     | 
| 
      
 35 
     | 
    
         
            +
                end
         
     | 
| 
      
 36 
     | 
    
         
            +
              end
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
              def RepeatGenerator.nested(*args)
         
     | 
| 
      
 39 
     | 
    
         
            +
                NestedRepeatGenerator.new(*args)
         
     | 
| 
      
 40 
     | 
    
         
            +
              end
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
              # @private
         
     | 
| 
      
 43 
     | 
    
         
            +
              class TopLevelRepeatGenerator < RepeatGenerator #:nodoc:
         
     | 
| 
      
 44 
     | 
    
         
            +
                def default_impl(list, init_args)
         
     | 
| 
      
 45 
     | 
    
         
            +
                  GeneralRepeatGenerator.top_level(*init_args)
         
     | 
| 
      
 46 
     | 
    
         
            +
                end
         
     | 
| 
      
 47 
     | 
    
         
            +
              end
         
     | 
| 
      
 48 
     | 
    
         
            +
             
     | 
| 
      
 49 
     | 
    
         
            +
              def RepeatGenerator.top_level(*args)
         
     | 
| 
      
 50 
     | 
    
         
            +
                TopLevelRepeatGenerator.new(*args)
         
     | 
| 
      
 51 
     | 
    
         
            +
              end
         
     | 
| 
      
 52 
     | 
    
         
            +
             
     | 
| 
      
 53 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -5,11 +5,11 @@ module Rattler::BackEnd::ParserGenerator 
     | 
|
| 
       5 
5 
     | 
    
         
             
              module SkipPropogating #:nodoc:
         
     | 
| 
       6 
6 
     | 
    
         | 
| 
       7 
7 
     | 
    
         
             
                def gen_skip(parser, scope={})
         
     | 
| 
       8 
     | 
    
         
            -
                   
     | 
| 
      
 8 
     | 
    
         
            +
                  propogate_gen parser.child, :skip, scope
         
     | 
| 
       9 
9 
     | 
    
         
             
                end
         
     | 
| 
       10 
10 
     | 
    
         | 
| 
       11 
11 
     | 
    
         
             
                def gen_intermediate_skip(parser, scope={})
         
     | 
| 
       12 
     | 
    
         
            -
                   
     | 
| 
      
 12 
     | 
    
         
            +
                  propogate_gen parser.child, :intermediate_skip, scope
         
     | 
| 
       13 
13 
     | 
    
         
             
                end
         
     | 
| 
       14 
14 
     | 
    
         | 
| 
       15 
15 
     | 
    
         
             
              end
         
     | 
| 
         @@ -21,17 +21,18 @@ module Rattler::BackEnd::ParserGenerator 
     | 
|
| 
       21 
21 
     | 
    
         
             
                  gen_with generator(parser, :top_level), parser, as, *args
         
     | 
| 
       22 
22 
     | 
    
         
             
                end
         
     | 
| 
       23 
23 
     | 
    
         | 
| 
       24 
     | 
    
         
            -
                def  
     | 
| 
       25 
     | 
    
         
            -
                   
     | 
| 
      
 24 
     | 
    
         
            +
                def propogate_gen(parser, type, scope)
         
     | 
| 
      
 25 
     | 
    
         
            +
                  if nested?
         
     | 
| 
      
 26 
     | 
    
         
            +
                    gen_nested parser, type, scope
         
     | 
| 
      
 27 
     | 
    
         
            +
                  else
         
     | 
| 
      
 28 
     | 
    
         
            +
                    gen_top_level parser, type, scope
         
     | 
| 
      
 29 
     | 
    
         
            +
                  end
         
     | 
| 
       26 
30 
     | 
    
         
             
                end
         
     | 
| 
       27 
31 
     | 
    
         | 
| 
       28 
32 
     | 
    
         
             
                private
         
     | 
| 
       29 
33 
     | 
    
         | 
| 
       30 
34 
     | 
    
         
             
                def gen_with(g, parser, as=:basic, *args)
         
     | 
| 
       31 
     | 
    
         
            -
                   
     | 
| 
       32 
     | 
    
         
            -
                  when Eof then gen_eof
         
     | 
| 
       33 
     | 
    
         
            -
                  else g.send(:"gen_#{as}", parser, *args)
         
     | 
| 
       34 
     | 
    
         
            -
                  end
         
     | 
| 
      
 35 
     | 
    
         
            +
                  g.send(:"gen_#{as}", parser, *args)
         
     | 
| 
       35 
36 
     | 
    
         
             
                end
         
     | 
| 
       36 
37 
     | 
    
         | 
| 
       37 
38 
     | 
    
         
             
                def generator(parser, context=nil)
         
     | 
| 
         @@ -48,21 +49,12 @@ module Rattler::BackEnd::ParserGenerator 
     | 
|
| 
       48 
49 
     | 
    
         
             
                  when Sequence
         
     | 
| 
       49 
50 
     | 
    
         
             
                    new_generator SequenceGenerator, context, :new_sequence_level => true
         
     | 
| 
       50 
51 
     | 
    
         | 
| 
       51 
     | 
    
         
            -
                  when  
     | 
| 
       52 
     | 
    
         
            -
                    cache_generator  
     | 
| 
       53 
     | 
    
         
            -
             
     | 
| 
       54 
     | 
    
         
            -
                  when ZeroOrMore
         
     | 
| 
       55 
     | 
    
         
            -
                    cache_generator ZeroOrMoreGenerator, context, :new_repeat_level => true
         
     | 
| 
      
 52 
     | 
    
         
            +
                  when Repeat
         
     | 
| 
      
 53 
     | 
    
         
            +
                    cache_generator RepeatGenerator, context, :new_repeat_level => true
         
     | 
| 
       56 
54 
     | 
    
         | 
| 
       57 
     | 
    
         
            -
                  when  
     | 
| 
       58 
     | 
    
         
            -
                    cache_generator OneOrMoreGenerator, context, :new_repeat_level => true
         
     | 
| 
       59 
     | 
    
         
            -
             
     | 
| 
       60 
     | 
    
         
            -
                  when List0
         
     | 
| 
      
 55 
     | 
    
         
            +
                  when ListParser
         
     | 
| 
       61 
56 
     | 
    
         
             
                    cache_generator ListGenerator, context, :new_repeat_level => true
         
     | 
| 
       62 
57 
     | 
    
         | 
| 
       63 
     | 
    
         
            -
                  when List1
         
     | 
| 
       64 
     | 
    
         
            -
                    cache_generator List1Generator, context, :new_repeat_level => true
         
     | 
| 
       65 
     | 
    
         
            -
             
     | 
| 
       66 
58 
     | 
    
         
             
                  when Apply
         
     | 
| 
       67 
59 
     | 
    
         
             
                    cache_generator ApplyGenerator, context
         
     | 
| 
       68 
60 
     | 
    
         | 
| 
         @@ -72,6 +64,12 @@ module Rattler::BackEnd::ParserGenerator 
     | 
|
| 
       72 
64 
     | 
    
         
             
                  when Disallow
         
     | 
| 
       73 
65 
     | 
    
         
             
                    cache_generator DisallowGenerator, context
         
     | 
| 
       74 
66 
     | 
    
         | 
| 
      
 67 
     | 
    
         
            +
                  when Eof
         
     | 
| 
      
 68 
     | 
    
         
            +
                    cache_generator EofGenerator, context
         
     | 
| 
      
 69 
     | 
    
         
            +
             
     | 
| 
      
 70 
     | 
    
         
            +
                  when ESymbol
         
     | 
| 
      
 71 
     | 
    
         
            +
                    cache_generator ESymbolGenerator, context
         
     | 
| 
      
 72 
     | 
    
         
            +
             
     | 
| 
       75 
73 
     | 
    
         
             
                  when DispatchAction
         
     | 
| 
       76 
74 
     | 
    
         
             
                    cache_generator DispatchActionGenerator, context
         
     | 
| 
       77 
75 
     | 
    
         | 
| 
         @@ -0,0 +1,31 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'rattler/back_end/parser_generator'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            module Rattler::BackEnd::ParserGenerator
         
     | 
| 
      
 4 
     | 
    
         
            +
              # @private
         
     | 
| 
      
 5 
     | 
    
         
            +
              module ZeroOrMoreGenerating #:nodoc:
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
                def gen_assert(zero_or_more, scope={})
         
     | 
| 
      
 8 
     | 
    
         
            +
                  @g << 'true'
         
     | 
| 
      
 9 
     | 
    
         
            +
                end
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
                def gen_disallow(zero_or_more, scope={})
         
     | 
| 
      
 12 
     | 
    
         
            +
                  @g << 'false'
         
     | 
| 
      
 13 
     | 
    
         
            +
                end
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                def gen_skip(zero_or_more, scope={})
         
     | 
| 
      
 16 
     | 
    
         
            +
                  expr :block do
         
     | 
| 
      
 17 
     | 
    
         
            +
                    @g << 'while '
         
     | 
| 
      
 18 
     | 
    
         
            +
                    generate zero_or_more.child, :intermediate_skip, scope
         
     | 
| 
      
 19 
     | 
    
         
            +
                    (@g << '; end').newline
         
     | 
| 
      
 20 
     | 
    
         
            +
                    @g << 'true'
         
     | 
| 
      
 21 
     | 
    
         
            +
                  end
         
     | 
| 
      
 22 
     | 
    
         
            +
                end
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
                protected
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
                def gen_result(zero_or_more, captures)
         
     | 
| 
      
 27 
     | 
    
         
            +
                  @g << captures
         
     | 
| 
      
 28 
     | 
    
         
            +
                end
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
              end
         
     | 
| 
      
 31 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -71,6 +71,26 @@ module Rattler::Grammar 
     | 
|
| 
       71 
71 
     | 
    
         
             
                  {:parser_name => name, :base_name => base.first}
         
     | 
| 
       72 
72 
     | 
    
         
             
                end
         
     | 
| 
       73 
73 
     | 
    
         | 
| 
      
 74 
     | 
    
         
            +
                def list0(term_parser, sep_parser)
         
     | 
| 
      
 75 
     | 
    
         
            +
                  ListParser[term_parser, sep_parser, 0, nil]
         
     | 
| 
      
 76 
     | 
    
         
            +
                end
         
     | 
| 
      
 77 
     | 
    
         
            +
             
     | 
| 
      
 78 
     | 
    
         
            +
                def list1(term_parser, sep_parser)
         
     | 
| 
      
 79 
     | 
    
         
            +
                  ListParser[term_parser, sep_parser, 1, nil]
         
     | 
| 
      
 80 
     | 
    
         
            +
                end
         
     | 
| 
      
 81 
     | 
    
         
            +
             
     | 
| 
      
 82 
     | 
    
         
            +
                def optional(parser)
         
     | 
| 
      
 83 
     | 
    
         
            +
                  Repeat[parser, 0, 1]
         
     | 
| 
      
 84 
     | 
    
         
            +
                end
         
     | 
| 
      
 85 
     | 
    
         
            +
             
     | 
| 
      
 86 
     | 
    
         
            +
                def zero_or_more(parser)
         
     | 
| 
      
 87 
     | 
    
         
            +
                  Repeat[parser, 0, nil]
         
     | 
| 
      
 88 
     | 
    
         
            +
                end
         
     | 
| 
      
 89 
     | 
    
         
            +
             
     | 
| 
      
 90 
     | 
    
         
            +
                def one_or_more(parser)
         
     | 
| 
      
 91 
     | 
    
         
            +
                  Repeat[parser, 1, nil]
         
     | 
| 
      
 92 
     | 
    
         
            +
                end
         
     | 
| 
      
 93 
     | 
    
         
            +
             
     | 
| 
       74 
94 
     | 
    
         
             
                def rule(name, parser)
         
     | 
| 
       75 
95 
     | 
    
         
             
                  Rule[name, (@ws ? parser.with_ws(@ws) : parser), {:inline => @inline}]
         
     | 
| 
       76 
96 
     | 
    
         
             
                end
         
     | 
| 
         @@ -131,7 +131,7 @@ module Rattler 
     | 
|
| 
       131 
131 
     | 
    
         
             
                            begin
         
     | 
| 
       132 
132 
     | 
    
         
             
                              @scanner.skip(/(?!(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>EOF)(?![[:alnum:]_])))/) &&
         
     | 
| 
       133 
133 
     | 
    
         
             
                              (r1_0 = begin
         
     | 
| 
       134 
     | 
    
         
            -
                                @scanner.skip(/(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>[[:alnum:]_]) 
     | 
| 
      
 134 
     | 
    
         
            +
                                @scanner.skip(/(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>[[:alpha:]])(?>(?>[[:alnum:]_])*)))(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?><\-))/) &&
         
     | 
| 
       135 
135 
     | 
    
         
             
                                @scanner[1]
         
     | 
| 
       136 
136 
     | 
    
         
             
                              end) &&
         
     | 
| 
       137 
137 
     | 
    
         
             
                              (r1_1 = match(:expression)) &&
         
     | 
| 
         @@ -212,7 +212,7 @@ module Rattler 
     | 
|
| 
       212 
212 
     | 
    
         
             
                    begin
         
     | 
| 
       213 
213 
     | 
    
         
             
                      p0 = @scanner.pos
         
     | 
| 
       214 
214 
     | 
    
         
             
                      begin
         
     | 
| 
       215 
     | 
    
         
            -
                        (r0_0 = match(:attributed)) &&
         
     | 
| 
      
 215 
     | 
    
         
            +
                        (r0_0 = ((r = match(:attributed)) ? [r] : [])) &&
         
     | 
| 
       216 
216 
     | 
    
         
             
                        @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?><)/) &&
         
     | 
| 
       217 
217 
     | 
    
         
             
                        (r0_1 = ((r = begin
         
     | 
| 
       218 
218 
     | 
    
         
             
                          @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>[[:lower:]])(?>(?>[[:alnum:]_])*))|(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>(?>(?>[[:upper:]])(?>(?>[[:alnum:]_])*)(?>::))*)(?>[[:upper:]])(?>(?>[[:alnum:]_])*)))(?>(?>(?>\.)(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>[[:lower:]])(?>(?>[[:alnum:]_])*))))?))/) &&
         
     | 
| 
         @@ -283,7 +283,7 @@ module Rattler 
     | 
|
| 
       283 
283 
     | 
    
         
             
                          end
         
     | 
| 
       284 
284 
     | 
    
         
             
                        end) ? [r] : [])) &&
         
     | 
| 
       285 
285 
     | 
    
         
             
                        @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>>)/) &&
         
     | 
| 
       286 
     | 
    
         
            -
                        DispatchAction.parsed( 
     | 
| 
      
 286 
     | 
    
         
            +
                        DispatchAction.parsed([r0_0, r0_1, r0_2])
         
     | 
| 
       287 
287 
     | 
    
         
             
                      end || begin
         
     | 
| 
       288 
288 
     | 
    
         
             
                        @scanner.pos = p0
         
     | 
| 
       289 
289 
     | 
    
         
             
                        false
         
     | 
| 
         @@ -292,12 +292,75 @@ module Rattler 
     | 
|
| 
       292 
292 
     | 
    
         
             
                    begin
         
     | 
| 
       293 
293 
     | 
    
         
             
                      p0 = @scanner.pos
         
     | 
| 
       294 
294 
     | 
    
         
             
                      begin
         
     | 
| 
       295 
     | 
    
         
            -
                        (r0_0 = match(:attributed)) &&
         
     | 
| 
      
 295 
     | 
    
         
            +
                        (r0_0 = ((r = match(:attributed)) ? [r] : [])) &&
         
     | 
| 
       296 
296 
     | 
    
         
             
                        (r0_1 = begin
         
     | 
| 
       297 
297 
     | 
    
         
             
                          @scanner.skip(/(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\{))(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>(?>\{)(?>(?>[^}])*)(?>\})|[^{}])*))(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\}))/) &&
         
     | 
| 
       298 
298 
     | 
    
         
             
                          @scanner[1]
         
     | 
| 
       299 
299 
     | 
    
         
             
                        end) &&
         
     | 
| 
       300 
     | 
    
         
            -
                        DirectAction.parsed( 
     | 
| 
      
 300 
     | 
    
         
            +
                        DirectAction.parsed([r0_0, r0_1])
         
     | 
| 
      
 301 
     | 
    
         
            +
                      end || begin
         
     | 
| 
      
 302 
     | 
    
         
            +
                        @scanner.pos = p0
         
     | 
| 
      
 303 
     | 
    
         
            +
                        false
         
     | 
| 
      
 304 
     | 
    
         
            +
                      end
         
     | 
| 
      
 305 
     | 
    
         
            +
                    end ||
         
     | 
| 
      
 306 
     | 
    
         
            +
                    begin
         
     | 
| 
      
 307 
     | 
    
         
            +
                      p0 = @scanner.pos
         
     | 
| 
      
 308 
     | 
    
         
            +
                      begin
         
     | 
| 
      
 309 
     | 
    
         
            +
                        (r0_0 = ((r = match(:attributed)) ? [r] : [])) &&
         
     | 
| 
      
 310 
     | 
    
         
            +
                        (r0_1 = begin
         
     | 
| 
      
 311 
     | 
    
         
            +
                          @scanner.skip(/(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>~))(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\{))(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>(?>\{)(?>(?>[^}])*)(?>\})|[^{}])*))(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\}))/) &&
         
     | 
| 
      
 312 
     | 
    
         
            +
                          @scanner[1]
         
     | 
| 
      
 313 
     | 
    
         
            +
                        end) &&
         
     | 
| 
      
 314 
     | 
    
         
            +
                        SideEffect.parsed([r0_0, r0_1])
         
     | 
| 
      
 315 
     | 
    
         
            +
                      end || begin
         
     | 
| 
      
 316 
     | 
    
         
            +
                        @scanner.pos = p0
         
     | 
| 
      
 317 
     | 
    
         
            +
                        false
         
     | 
| 
      
 318 
     | 
    
         
            +
                      end
         
     | 
| 
      
 319 
     | 
    
         
            +
                    end ||
         
     | 
| 
      
 320 
     | 
    
         
            +
                    begin
         
     | 
| 
      
 321 
     | 
    
         
            +
                      p0 = @scanner.pos
         
     | 
| 
      
 322 
     | 
    
         
            +
                      begin
         
     | 
| 
      
 323 
     | 
    
         
            +
                        (r0_0 = ((r = match(:attributed)) ? [r] : [])) &&
         
     | 
| 
      
 324 
     | 
    
         
            +
                        (r0_1 = begin
         
     | 
| 
      
 325 
     | 
    
         
            +
                          @scanner.skip(/(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>&))(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\{))(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>(?>\{)(?>(?>[^}])*)(?>\})|[^{}])*))(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\}))/) &&
         
     | 
| 
      
 326 
     | 
    
         
            +
                          @scanner[1]
         
     | 
| 
      
 327 
     | 
    
         
            +
                        end) &&
         
     | 
| 
      
 328 
     | 
    
         
            +
                        SemanticAssert.parsed([r0_0, r0_1])
         
     | 
| 
      
 329 
     | 
    
         
            +
                      end || begin
         
     | 
| 
      
 330 
     | 
    
         
            +
                        @scanner.pos = p0
         
     | 
| 
      
 331 
     | 
    
         
            +
                        false
         
     | 
| 
      
 332 
     | 
    
         
            +
                      end
         
     | 
| 
      
 333 
     | 
    
         
            +
                    end ||
         
     | 
| 
      
 334 
     | 
    
         
            +
                    begin
         
     | 
| 
      
 335 
     | 
    
         
            +
                      p0 = @scanner.pos
         
     | 
| 
      
 336 
     | 
    
         
            +
                      begin
         
     | 
| 
      
 337 
     | 
    
         
            +
                        (r0_0 = ((r = match(:attributed)) ? [r] : [])) &&
         
     | 
| 
      
 338 
     | 
    
         
            +
                        (r0_1 = begin
         
     | 
| 
      
 339 
     | 
    
         
            +
                          @scanner.skip(/(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>!))(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\{))(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>(?>\{)(?>(?>[^}])*)(?>\})|[^{}])*))(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\}))/) &&
         
     | 
| 
      
 340 
     | 
    
         
            +
                          @scanner[1]
         
     | 
| 
      
 341 
     | 
    
         
            +
                        end) &&
         
     | 
| 
      
 342 
     | 
    
         
            +
                        SemanticDisallow.parsed([r0_0, r0_1])
         
     | 
| 
      
 343 
     | 
    
         
            +
                      end || begin
         
     | 
| 
      
 344 
     | 
    
         
            +
                        @scanner.pos = p0
         
     | 
| 
      
 345 
     | 
    
         
            +
                        false
         
     | 
| 
      
 346 
     | 
    
         
            +
                      end
         
     | 
| 
      
 347 
     | 
    
         
            +
                    end ||
         
     | 
| 
      
 348 
     | 
    
         
            +
                    match(:attributed_terms)
         
     | 
| 
      
 349 
     | 
    
         
            +
                  end
         
     | 
| 
      
 350 
     | 
    
         
            +
                  
         
     | 
| 
      
 351 
     | 
    
         
            +
                  # @private
         
     | 
| 
      
 352 
     | 
    
         
            +
                  def match_attributed_terms #:nodoc:
         
     | 
| 
      
 353 
     | 
    
         
            +
                    memoize_lr :match_attributed_terms!
         
     | 
| 
      
 354 
     | 
    
         
            +
                  end
         
     | 
| 
      
 355 
     | 
    
         
            +
                  
         
     | 
| 
      
 356 
     | 
    
         
            +
                  # @private
         
     | 
| 
      
 357 
     | 
    
         
            +
                  def match_attributed_terms! #:nodoc:
         
     | 
| 
      
 358 
     | 
    
         
            +
                    begin
         
     | 
| 
      
 359 
     | 
    
         
            +
                      p0 = @scanner.pos
         
     | 
| 
      
 360 
     | 
    
         
            +
                      begin
         
     | 
| 
      
 361 
     | 
    
         
            +
                        (r0_0 = match(:attributed)) &&
         
     | 
| 
      
 362 
     | 
    
         
            +
                        (r0_1 = match(:term)) &&
         
     | 
| 
      
 363 
     | 
    
         
            +
                        Sequence.parsed(select_captures([r0_0, r0_1]))
         
     | 
| 
       301 
364 
     | 
    
         
             
                      end || begin
         
     | 
| 
       302 
365 
     | 
    
         
             
                        @scanner.pos = p0
         
     | 
| 
       303 
366 
     | 
    
         
             
                        false
         
     | 
| 
         @@ -543,9 +606,9 @@ module Rattler 
     | 
|
| 
       543 
606 
     | 
    
         
             
                      p0 = @scanner.pos
         
     | 
| 
       544 
607 
     | 
    
         
             
                      begin
         
     | 
| 
       545 
608 
     | 
    
         
             
                        (r0_0 = match(:list_term)) &&
         
     | 
| 
       546 
     | 
    
         
            -
                        @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)( 
     | 
| 
      
 609 
     | 
    
         
            +
                        @scanner.skip(/(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\*))(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>,))/) &&
         
     | 
| 
       547 
610 
     | 
    
         
             
                        (r0_1 = match(:list_term)) &&
         
     | 
| 
       548 
     | 
    
         
            -
                         
     | 
| 
      
 611 
     | 
    
         
            +
                        (list0 r0_0, r0_1)
         
     | 
| 
       549 
612 
     | 
    
         
             
                      end || begin
         
     | 
| 
       550 
613 
     | 
    
         
             
                        @scanner.pos = p0
         
     | 
| 
       551 
614 
     | 
    
         
             
                        false
         
     | 
| 
         @@ -555,9 +618,35 @@ module Rattler 
     | 
|
| 
       555 
618 
     | 
    
         
             
                      p0 = @scanner.pos
         
     | 
| 
       556 
619 
     | 
    
         
             
                      begin
         
     | 
| 
       557 
620 
     | 
    
         
             
                        (r0_0 = match(:list_term)) &&
         
     | 
| 
       558 
     | 
    
         
            -
                        @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)( 
     | 
| 
      
 621 
     | 
    
         
            +
                        @scanner.skip(/(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\+))(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>,))/) &&
         
     | 
| 
       559 
622 
     | 
    
         
             
                        (r0_1 = match(:list_term)) &&
         
     | 
| 
       560 
     | 
    
         
            -
                         
     | 
| 
      
 623 
     | 
    
         
            +
                        (list1 r0_0, r0_1)
         
     | 
| 
      
 624 
     | 
    
         
            +
                      end || begin
         
     | 
| 
      
 625 
     | 
    
         
            +
                        @scanner.pos = p0
         
     | 
| 
      
 626 
     | 
    
         
            +
                        false
         
     | 
| 
      
 627 
     | 
    
         
            +
                      end
         
     | 
| 
      
 628 
     | 
    
         
            +
                    end ||
         
     | 
| 
      
 629 
     | 
    
         
            +
                    begin
         
     | 
| 
      
 630 
     | 
    
         
            +
                      p0 = @scanner.pos
         
     | 
| 
      
 631 
     | 
    
         
            +
                      begin
         
     | 
| 
      
 632 
     | 
    
         
            +
                        (r0_0 = match(:list_term)) &&
         
     | 
| 
      
 633 
     | 
    
         
            +
                        (r0_1 = begin
         
     | 
| 
      
 634 
     | 
    
         
            +
                          begin
         
     | 
| 
      
 635 
     | 
    
         
            +
                            @scanner.skip(/(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>[[:digit:]])+))(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\.\.))(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>[[:digit:]])+))/) &&
         
     | 
| 
      
 636 
     | 
    
         
            +
                            ([@scanner[1], @scanner[2]].map {|s| s.to_i })
         
     | 
| 
      
 637 
     | 
    
         
            +
                          end ||
         
     | 
| 
      
 638 
     | 
    
         
            +
                          begin
         
     | 
| 
      
 639 
     | 
    
         
            +
                            @scanner.skip(/(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>[[:digit:]])+))(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\.\.))/) &&
         
     | 
| 
      
 640 
     | 
    
         
            +
                            ([@scanner[1].to_i, nil])
         
     | 
| 
      
 641 
     | 
    
         
            +
                          end ||
         
     | 
| 
      
 642 
     | 
    
         
            +
                          begin
         
     | 
| 
      
 643 
     | 
    
         
            +
                            @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>[[:digit:]])+)/) &&
         
     | 
| 
      
 644 
     | 
    
         
            +
                            ([@scanner[1].to_i] * 2)
         
     | 
| 
      
 645 
     | 
    
         
            +
                          end
         
     | 
| 
      
 646 
     | 
    
         
            +
                        end) &&
         
     | 
| 
      
 647 
     | 
    
         
            +
                        @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>,)/) &&
         
     | 
| 
      
 648 
     | 
    
         
            +
                        (r0_2 = match(:list_term)) &&
         
     | 
| 
      
 649 
     | 
    
         
            +
                        ListParser.parsed(select_captures([r0_0, r0_1, r0_2]))
         
     | 
| 
       561 
650 
     | 
    
         
             
                      end || begin
         
     | 
| 
       562 
651 
     | 
    
         
             
                        @scanner.pos = p0
         
     | 
| 
       563 
652 
     | 
    
         
             
                        false
         
     | 
| 
         @@ -653,7 +742,7 @@ module Rattler 
     | 
|
| 
       653 
742 
     | 
    
         
             
                      begin
         
     | 
| 
       654 
743 
     | 
    
         
             
                        (r0_0 = match(:primary)) &&
         
     | 
| 
       655 
744 
     | 
    
         
             
                        @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\?)/) &&
         
     | 
| 
       656 
     | 
    
         
            -
                         
     | 
| 
      
 745 
     | 
    
         
            +
                        (optional r0_0)
         
     | 
| 
       657 
746 
     | 
    
         
             
                      end || begin
         
     | 
| 
       658 
747 
     | 
    
         
             
                        @scanner.pos = p0
         
     | 
| 
       659 
748 
     | 
    
         
             
                        false
         
     | 
| 
         @@ -664,7 +753,7 @@ module Rattler 
     | 
|
| 
       664 
753 
     | 
    
         
             
                      begin
         
     | 
| 
       665 
754 
     | 
    
         
             
                        (r0_0 = match(:primary)) &&
         
     | 
| 
       666 
755 
     | 
    
         
             
                        @scanner.skip(/(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\*))(?!(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>,))/) &&
         
     | 
| 
       667 
     | 
    
         
            -
                         
     | 
| 
      
 756 
     | 
    
         
            +
                        (zero_or_more r0_0)
         
     | 
| 
       668 
757 
     | 
    
         
             
                      end || begin
         
     | 
| 
       669 
758 
     | 
    
         
             
                        @scanner.pos = p0
         
     | 
| 
       670 
759 
     | 
    
         
             
                        false
         
     | 
| 
         @@ -675,7 +764,32 @@ module Rattler 
     | 
|
| 
       675 
764 
     | 
    
         
             
                      begin
         
     | 
| 
       676 
765 
     | 
    
         
             
                        (r0_0 = match(:primary)) &&
         
     | 
| 
       677 
766 
     | 
    
         
             
                        @scanner.skip(/(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\+))(?!(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>,))/) &&
         
     | 
| 
       678 
     | 
    
         
            -
                         
     | 
| 
      
 767 
     | 
    
         
            +
                        (one_or_more r0_0)
         
     | 
| 
      
 768 
     | 
    
         
            +
                      end || begin
         
     | 
| 
      
 769 
     | 
    
         
            +
                        @scanner.pos = p0
         
     | 
| 
      
 770 
     | 
    
         
            +
                        false
         
     | 
| 
      
 771 
     | 
    
         
            +
                      end
         
     | 
| 
      
 772 
     | 
    
         
            +
                    end ||
         
     | 
| 
      
 773 
     | 
    
         
            +
                    begin
         
     | 
| 
      
 774 
     | 
    
         
            +
                      p0 = @scanner.pos
         
     | 
| 
      
 775 
     | 
    
         
            +
                      begin
         
     | 
| 
      
 776 
     | 
    
         
            +
                        (r0_0 = match(:primary)) &&
         
     | 
| 
      
 777 
     | 
    
         
            +
                        (r0_1 = begin
         
     | 
| 
      
 778 
     | 
    
         
            +
                          begin
         
     | 
| 
      
 779 
     | 
    
         
            +
                            @scanner.skip(/(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>[[:digit:]])+))(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\.\.))(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>[[:digit:]])+))/) &&
         
     | 
| 
      
 780 
     | 
    
         
            +
                            ([@scanner[1], @scanner[2]].map {|s| s.to_i })
         
     | 
| 
      
 781 
     | 
    
         
            +
                          end ||
         
     | 
| 
      
 782 
     | 
    
         
            +
                          begin
         
     | 
| 
      
 783 
     | 
    
         
            +
                            @scanner.skip(/(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>[[:digit:]])+))(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\.\.))/) &&
         
     | 
| 
      
 784 
     | 
    
         
            +
                            ([@scanner[1].to_i, nil])
         
     | 
| 
      
 785 
     | 
    
         
            +
                          end ||
         
     | 
| 
      
 786 
     | 
    
         
            +
                          begin
         
     | 
| 
      
 787 
     | 
    
         
            +
                            @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>[[:digit:]])+)/) &&
         
     | 
| 
      
 788 
     | 
    
         
            +
                            ([@scanner[1].to_i] * 2)
         
     | 
| 
      
 789 
     | 
    
         
            +
                          end
         
     | 
| 
      
 790 
     | 
    
         
            +
                        end) &&
         
     | 
| 
      
 791 
     | 
    
         
            +
                        @scanner.skip(/(?!(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>,))/) &&
         
     | 
| 
      
 792 
     | 
    
         
            +
                        Repeat.parsed(select_captures([r0_0, r0_1]))
         
     | 
| 
       679 
793 
     | 
    
         
             
                      end || begin
         
     | 
| 
       680 
794 
     | 
    
         
             
                        @scanner.pos = p0
         
     | 
| 
       681 
795 
     | 
    
         
             
                        false
         
     | 
| 
         @@ -706,6 +820,10 @@ module Rattler 
     | 
|
| 
       706 
820 
     | 
    
         
             
                      @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>EOF)(?![[:alnum:]_]))/) &&
         
     | 
| 
       707 
821 
     | 
    
         
             
                      Eof.parsed([])
         
     | 
| 
       708 
822 
     | 
    
         
             
                    end ||
         
     | 
| 
      
 823 
     | 
    
         
            +
                    begin
         
     | 
| 
      
 824 
     | 
    
         
            +
                      @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>E)(?![[:alnum:]_]))/) &&
         
     | 
| 
      
 825 
     | 
    
         
            +
                      ESymbol.parsed([])
         
     | 
| 
      
 826 
     | 
    
         
            +
                    end ||
         
     | 
| 
       709 
827 
     | 
    
         
             
                    begin
         
     | 
| 
       710 
828 
     | 
    
         
             
                      (r = begin
         
     | 
| 
       711 
829 
     | 
    
         
             
                        begin
         
     | 
| 
         @@ -772,7 +890,7 @@ module Rattler 
     | 
|
| 
       772 
890 
     | 
    
         
             
                      begin
         
     | 
| 
       773 
891 
     | 
    
         
             
                        @scanner.skip(/(?!(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>EOF)(?![[:alnum:]_])))/) &&
         
     | 
| 
       774 
892 
     | 
    
         
             
                        (r0_0 = begin
         
     | 
| 
       775 
     | 
    
         
            -
                          @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>[[:alnum:]_]) 
     | 
| 
      
 893 
     | 
    
         
            +
                          @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>[[:alpha:]])(?>(?>[[:alnum:]_])*))/) &&
         
     | 
| 
       776 
894 
     | 
    
         
             
                          @scanner[1]
         
     | 
| 
       777 
895 
     | 
    
         
             
                        end) &&
         
     | 
| 
       778 
896 
     | 
    
         
             
                        @scanner.skip(/(?!(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?><\-))/) &&
         
     | 
| 
         @@ -44,14 +44,20 @@ include Rattler::Parsers 
     | 
|
| 
       44 
44 
     | 
    
         
             
              expression        <-  expression ~'/' attributed                              <Choice>
         
     | 
| 
       45 
45 
     | 
    
         
             
                                  / attributed
         
     | 
| 
       46 
46 
     | 
    
         | 
| 
       47 
     | 
    
         
            -
              attributed        <-  attributed ~'<' node_action? literal? ~'>' 
     | 
| 
       48 
     | 
    
         
            -
                                  / attributed ~'{' action ~'}' 
     | 
| 
       49 
     | 
    
         
            -
                                  /  
     | 
| 
      
 47 
     | 
    
         
            +
              attributed        <-  attributed? ~'<' node_action? literal? ~'>'             <DispatchAction>
         
     | 
| 
      
 48 
     | 
    
         
            +
                                  / attributed? ~'{' action ~'}'                            <DirectAction>
         
     | 
| 
      
 49 
     | 
    
         
            +
                                  / attributed? ~'~' ~'{' action ~'}'                       <SideEffect>
         
     | 
| 
      
 50 
     | 
    
         
            +
                                  / attributed? ~'&' ~'{' action ~'}'                       <SemanticAssert>
         
     | 
| 
      
 51 
     | 
    
         
            +
                                  / attributed? ~'!' ~'{' action ~'}'                       <SemanticDisallow>
         
     | 
| 
      
 52 
     | 
    
         
            +
                                  / attributed_terms
         
     | 
| 
       50 
53 
     | 
    
         | 
| 
       51 
54 
     | 
    
         
             
              node_action       <-  @(name (~'.' var_name)?)
         
     | 
| 
       52 
55 
     | 
    
         | 
| 
       53 
     | 
    
         
            -
              action            <-  @( 
     | 
| 
       54 
     | 
    
         
            -
                                      / [^{}])* 
     | 
| 
      
 56 
     | 
    
         
            +
              action            <-  @(( '{' [^}]* '}'
         
     | 
| 
      
 57 
     | 
    
         
            +
                                      / [^{}]         )*)
         
     | 
| 
      
 58 
     | 
    
         
            +
             
     | 
| 
      
 59 
     | 
    
         
            +
              attributed_terms  <-  attributed term                                         <Sequence>
         
     | 
| 
      
 60 
     | 
    
         
            +
                                  / terms
         
     | 
| 
       55 
61 
     | 
    
         | 
| 
       56 
62 
     | 
    
         
             
              terms             <-  terms term                                              <Sequence>
         
     | 
| 
       57 
63 
     | 
    
         
             
                                  / term
         
     | 
| 
         @@ -68,8 +74,9 @@ include Rattler::Parsers 
     | 
|
| 
       68 
74 
     | 
    
         
             
              labelable         <-  list
         
     | 
| 
       69 
75 
     | 
    
         
             
                                  / list_term
         
     | 
| 
       70 
76 
     | 
    
         | 
| 
       71 
     | 
    
         
            -
              list              <-  list_term ~' 
     | 
| 
       72 
     | 
    
         
            -
                                  / list_term ~' 
     | 
| 
      
 77 
     | 
    
         
            +
              list              <-  list_term ~('*' ',') list_term                          { list0 *_ }
         
     | 
| 
      
 78 
     | 
    
         
            +
                                  / list_term ~('+' ',') list_term                          { list1 *_ }
         
     | 
| 
      
 79 
     | 
    
         
            +
                                  / list_term repeat_count ~',' list_term                   <ListParser>
         
     | 
| 
       73 
80 
     | 
    
         | 
| 
       74 
81 
     | 
    
         
             
              list_term         <-  prefixed
         
     | 
| 
       75 
82 
     | 
    
         
             
                                  / prefixable
         
     | 
| 
         @@ -82,14 +89,20 @@ include Rattler::Parsers 
     | 
|
| 
       82 
89 
     | 
    
         | 
| 
       83 
90 
     | 
    
         
             
              prefixable        <-  suffixed / primary
         
     | 
| 
       84 
91 
     | 
    
         | 
| 
       85 
     | 
    
         
            -
              suffixed          <-  primary ~'?'                                             
     | 
| 
       86 
     | 
    
         
            -
                                  / primary ~'*' !','                                        
     | 
| 
       87 
     | 
    
         
            -
                                  / primary ~'+' !','                                        
     | 
| 
      
 92 
     | 
    
         
            +
              suffixed          <-  primary ~'?'                                            { optional _ }
         
     | 
| 
      
 93 
     | 
    
         
            +
                                  / primary ~'*' !','                                       { zero_or_more _ }
         
     | 
| 
      
 94 
     | 
    
         
            +
                                  / primary ~'+' !','                                       { one_or_more _ }
         
     | 
| 
      
 95 
     | 
    
         
            +
                                  / primary repeat_count !','                               <Repeat>
         
     | 
| 
      
 96 
     | 
    
         
            +
             
     | 
| 
      
 97 
     | 
    
         
            +
              repeat_count      <-  @DIGIT+ ~'..' @DIGIT+                                   { _.map {|s| s.to_i } }
         
     | 
| 
      
 98 
     | 
    
         
            +
                                  / @DIGIT+ ~'..'                                           { [_.to_i, nil] }
         
     | 
| 
      
 99 
     | 
    
         
            +
                                  / @DIGIT+                                                 { [_.to_i] * 2 }
         
     | 
| 
       88 
100 
     | 
    
         | 
| 
       89 
101 
     | 
    
         
             
              primary           <-  ~'(' expression ~')'
         
     | 
| 
       90 
102 
     | 
    
         
             
                                  / atom
         
     | 
| 
       91 
103 
     | 
    
         | 
| 
       92 
104 
     | 
    
         
             
              atom              <-  ~`EOF`                                                  <Eof>
         
     | 
| 
      
 105 
     | 
    
         
            +
                                  / ~`E`                                                    <ESymbol>
         
     | 
| 
       93 
106 
     | 
    
         
             
                                  / posix_class                                             { posix_class _ }
         
     | 
| 
       94 
107 
     | 
    
         
             
                                  / identifier !'<-'                                        <Apply>
         
     | 
| 
       95 
108 
     | 
    
         
             
                                  / literal                                                 { literal _ }
         
     | 
| 
         @@ -132,7 +145,7 @@ include Rattler::Parsers 
     | 
|
| 
       132 
145 
     | 
    
         
             
              name              <-  var_name
         
     | 
| 
       133 
146 
     | 
    
         
             
                                  / constant
         
     | 
| 
       134 
147 
     | 
    
         | 
| 
       135 
     | 
    
         
            -
              identifier        <-  !`EOF` @WORD 
     | 
| 
      
 148 
     | 
    
         
            +
              identifier        <-  !`EOF` @(ALPHA WORD*)
         
     | 
| 
       136 
149 
     | 
    
         | 
| 
       137 
150 
     | 
    
         
             
              back_reference    <-  @('$' LOWER WORD*)
         
     | 
| 
       138 
151 
     | 
    
         | 
| 
         @@ -165,6 +178,6 @@ include Rattler::Parsers 
     | 
|
| 
       165 
178 
     | 
    
         
             
                                      / '\\' .
         
     | 
| 
       166 
179 
     | 
    
         
             
                                      / [^\\\]] )
         
     | 
| 
       167 
180 
     | 
    
         | 
| 
       168 
     | 
    
         
            -
              eol               <-  ~(BLANK* (EOF / ';' / ("\r"? "\n") /  
     | 
| 
      
 181 
     | 
    
         
            +
              eol               <-  ~(BLANK* (EOF / ';' / ("\r"? "\n") / comment))
         
     | 
| 
       169 
182 
     | 
    
         | 
| 
       170 
183 
     | 
    
         
             
              comment           <-  ~('#' [^\n]*)
         
     |