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
| @@ -0,0 +1,30 @@ | |
| 1 | 
            +
            require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe ESymbol do
         | 
| 4 | 
            +
              include CombinatorParserSpecHelper
         | 
| 5 | 
            +
             | 
| 6 | 
            +
              subject { ESymbol[] }
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              describe '#parse' do
         | 
| 9 | 
            +
                it 'returns true without advancing' do
         | 
| 10 | 
            +
                  parsing('anything').at(4).should result_in(true).at(4)
         | 
| 11 | 
            +
                  parsing('        ').at(7).should result_in(true).at(7)
         | 
| 12 | 
            +
                end
         | 
| 13 | 
            +
              end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
              describe '#capturing?' do
         | 
| 16 | 
            +
                it 'is false' do
         | 
| 17 | 
            +
                  subject.should_not be_capturing
         | 
| 18 | 
            +
                end
         | 
| 19 | 
            +
              end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
              describe '#with_ws' do
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                let(:ws) { Match[/\s*/] }
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                it 'returns a parser that skips whitespace before matching' do
         | 
| 26 | 
            +
                  subject.with_ws(ws).should == Sequence[Skip[ws], subject]
         | 
| 27 | 
            +
                end
         | 
| 28 | 
            +
              end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
            end
         | 
| @@ -4,27 +4,36 @@ describe Eof do | |
| 4 4 | 
             
              include CombinatorParserSpecHelper
         | 
| 5 5 |  | 
| 6 6 | 
             
              subject { Eof[] }
         | 
| 7 | 
            -
             | 
| 7 | 
            +
             | 
| 8 8 | 
             
              describe '#parse' do
         | 
| 9 | 
            -
             | 
| 9 | 
            +
             | 
| 10 10 | 
             
                context 'at the end of the source' do
         | 
| 11 11 | 
             
                  it 'returns true' do
         | 
| 12 12 | 
             
                    parsing('abc123').at(6).should result_in(true).at(6)
         | 
| 13 13 | 
             
                  end
         | 
| 14 14 | 
             
                end
         | 
| 15 | 
            -
             | 
| 15 | 
            +
             | 
| 16 16 | 
             
                context 'before the end of the source' do
         | 
| 17 17 | 
             
                  it 'fails' do
         | 
| 18 18 | 
             
                    parsing('abc123').at(5).should fail
         | 
| 19 19 | 
             
                  end
         | 
| 20 20 | 
             
                end
         | 
| 21 | 
            -
             | 
| 21 | 
            +
             | 
| 22 22 | 
             
              end
         | 
| 23 | 
            -
             | 
| 23 | 
            +
             | 
| 24 24 | 
             
              describe '#capturing?' do
         | 
| 25 25 | 
             
                it 'is false' do
         | 
| 26 26 | 
             
                  subject.should_not be_capturing
         | 
| 27 27 | 
             
                end
         | 
| 28 28 | 
             
              end
         | 
| 29 | 
            -
             | 
| 29 | 
            +
             | 
| 30 | 
            +
              describe '#with_ws' do
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                let(:ws) { Match[/\s*/] }
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                it 'returns a parser that skips whitespace before matching' do
         | 
| 35 | 
            +
                  subject.with_ws(ws).should == Sequence[Skip[ws], subject]
         | 
| 36 | 
            +
                end
         | 
| 37 | 
            +
              end
         | 
| 38 | 
            +
             | 
| 30 39 | 
             
            end
         | 
| @@ -3,7 +3,9 @@ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper') | |
| 3 3 | 
             
            describe Label do
         | 
| 4 4 | 
             
              include CombinatorParserSpecHelper
         | 
| 5 5 |  | 
| 6 | 
            -
              subject { Label[:name,  | 
| 6 | 
            +
              subject { Label[:name, nested] }
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              let(:nested) { Match[/\w+/] }
         | 
| 7 9 |  | 
| 8 10 | 
             
              describe '#parse' do
         | 
| 9 11 |  | 
| @@ -28,7 +30,9 @@ describe Label do | |
| 28 30 | 
             
                end
         | 
| 29 31 |  | 
| 30 32 | 
             
                context 'with a non-capturing parser' do
         | 
| 31 | 
            -
             | 
| 33 | 
            +
             | 
| 34 | 
            +
                  let(:nested) { Skip[Match[/\s+/]] }
         | 
| 35 | 
            +
             | 
| 32 36 | 
             
                  it 'is false' do
         | 
| 33 37 | 
             
                    subject.should_not be_capturing
         | 
| 34 38 | 
             
                  end
         | 
| @@ -36,4 +40,13 @@ describe Label do | |
| 36 40 |  | 
| 37 41 | 
             
              end
         | 
| 38 42 |  | 
| 43 | 
            +
              describe '#with_ws' do
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                let(:ws) { Match[/\s*/] }
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                it 'applies #with_ws to the nested parser' do
         | 
| 48 | 
            +
                  subject.with_ws(ws).should == Label[:name, Sequence[Skip[ws], nested]]
         | 
| 49 | 
            +
                end
         | 
| 50 | 
            +
              end
         | 
| 51 | 
            +
             | 
| 39 52 | 
             
            end
         | 
| @@ -0,0 +1,187 @@ | |
| 1 | 
            +
            require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe ListParser do
         | 
| 4 | 
            +
              include CombinatorParserSpecHelper
         | 
| 5 | 
            +
             | 
| 6 | 
            +
              subject { ListParser[term_parser, sep_parser, *bounds] }
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              let(:sep_parser) { Match[/[,;]/] }
         | 
| 9 | 
            +
             | 
| 10 | 
            +
              describe '#parse' do
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                context 'with a capturing term parser' do
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                  let(:term_parser) { Match[/\w+/] }
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                  context 'with no upper bound' do
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                    let(:bounds) { [2, nil] }
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                    context 'when the parser matches enough terms' do
         | 
| 21 | 
            +
                      it 'returns an array with the results of matching the terms' do
         | 
| 22 | 
            +
                        parsing('foo,bar;baz ').should result_in(['foo', 'bar', 'baz']).at(11)
         | 
| 23 | 
            +
                      end
         | 
| 24 | 
            +
                    end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                    context 'when the parser matches too few terms' do
         | 
| 27 | 
            +
                      it 'fails' do
         | 
| 28 | 
            +
                        parsing('foo ').should fail
         | 
| 29 | 
            +
                      end
         | 
| 30 | 
            +
                    end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                    context 'with a separator not followed by a term' do
         | 
| 33 | 
            +
                      it 'matches without consuming the extra separator' do
         | 
| 34 | 
            +
                        parsing('foo,bar,').should result_in(['foo', 'bar']).at(7)
         | 
| 35 | 
            +
                      end
         | 
| 36 | 
            +
                    end
         | 
| 37 | 
            +
                  end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                  context 'with an upper bound' do
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                    let(:bounds) { [2, 4] }
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                    context 'when the parser would match too many terms' do
         | 
| 44 | 
            +
                      it 'stops matching at the upper bound' do
         | 
| 45 | 
            +
                        parsing('a,b,c,d,e').should result_in(['a', 'b', 'c', 'd']).at(7)
         | 
| 46 | 
            +
                      end
         | 
| 47 | 
            +
                    end
         | 
| 48 | 
            +
                  end
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                  context 'with zero-or-more bounds' do
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                    let(:bounds) { [0, nil] }
         | 
| 53 | 
            +
             | 
| 54 | 
            +
                    context 'when no terms match' do
         | 
| 55 | 
            +
                      it 'returns an empty array without advancing' do
         | 
| 56 | 
            +
                        parsing('   ').should result_in([]).at(0)
         | 
| 57 | 
            +
                      end
         | 
| 58 | 
            +
                    end
         | 
| 59 | 
            +
             | 
| 60 | 
            +
                    context 'when a single term matches' do
         | 
| 61 | 
            +
                      it 'returns an array with the result of matching the term' do
         | 
| 62 | 
            +
                        parsing('foo').should result_in(['foo']).at(3)
         | 
| 63 | 
            +
                      end
         | 
| 64 | 
            +
                    end
         | 
| 65 | 
            +
                  end
         | 
| 66 | 
            +
             | 
| 67 | 
            +
                  context 'with one-or-more bounds' do
         | 
| 68 | 
            +
             | 
| 69 | 
            +
                    let(:bounds) { [1, nil] }
         | 
| 70 | 
            +
             | 
| 71 | 
            +
                    context 'when no terms match' do
         | 
| 72 | 
            +
                      it 'fails' do
         | 
| 73 | 
            +
                        parsing('   ').should fail
         | 
| 74 | 
            +
                      end
         | 
| 75 | 
            +
                    end
         | 
| 76 | 
            +
             | 
| 77 | 
            +
                    context 'when a single term matches' do
         | 
| 78 | 
            +
                      it 'returns an array with the result of matching the term' do
         | 
| 79 | 
            +
                        parsing('foo').should result_in(['foo']).at(3)
         | 
| 80 | 
            +
                      end
         | 
| 81 | 
            +
                    end
         | 
| 82 | 
            +
                  end
         | 
| 83 | 
            +
                end
         | 
| 84 | 
            +
             | 
| 85 | 
            +
                context 'with a non-capturing term parser' do
         | 
| 86 | 
            +
             | 
| 87 | 
            +
                  let(:term_parser) { Skip[Match[/\w+/]] }
         | 
| 88 | 
            +
                  let(:bounds) { [2, nil] }
         | 
| 89 | 
            +
             | 
| 90 | 
            +
                  context 'when the parser matches enough terms' do
         | 
| 91 | 
            +
                    it 'returns true consuming the terms' do
         | 
| 92 | 
            +
                      parsing('foo,bar;baz ').should result_in(true).at(11)
         | 
| 93 | 
            +
                    end
         | 
| 94 | 
            +
                  end
         | 
| 95 | 
            +
             | 
| 96 | 
            +
                  context 'when the parser matches too few terms' do
         | 
| 97 | 
            +
                    it 'fails' do
         | 
| 98 | 
            +
                      parsing('foo ').should fail
         | 
| 99 | 
            +
                    end
         | 
| 100 | 
            +
                  end
         | 
| 101 | 
            +
             | 
| 102 | 
            +
                  context 'with zero-or-more bounds' do
         | 
| 103 | 
            +
             | 
| 104 | 
            +
                    let(:bounds) { [0, nil] }
         | 
| 105 | 
            +
             | 
| 106 | 
            +
                    context 'when no terms match' do
         | 
| 107 | 
            +
                      it 'returns true without advancing' do
         | 
| 108 | 
            +
                        parsing('   ').should result_in(true).at(0)
         | 
| 109 | 
            +
                      end
         | 
| 110 | 
            +
                    end
         | 
| 111 | 
            +
             | 
| 112 | 
            +
                    context 'when a single term matches' do
         | 
| 113 | 
            +
                      it 'returns true consuming the term' do
         | 
| 114 | 
            +
                        parsing('foo  ').should result_in(true).at(3)
         | 
| 115 | 
            +
                      end
         | 
| 116 | 
            +
                    end
         | 
| 117 | 
            +
             | 
| 118 | 
            +
                    context 'when multiple terms match' do
         | 
| 119 | 
            +
                      it 'returns true consuming the list' do
         | 
| 120 | 
            +
                        parsing('foo,bar;baz  ').should result_in(true).at(11)
         | 
| 121 | 
            +
                      end
         | 
| 122 | 
            +
                    end
         | 
| 123 | 
            +
                  end
         | 
| 124 | 
            +
             | 
| 125 | 
            +
                  context 'with one-or-more bounds' do
         | 
| 126 | 
            +
             | 
| 127 | 
            +
                    let(:bounds) { [1, nil] }
         | 
| 128 | 
            +
             | 
| 129 | 
            +
                    context 'when no terms match' do
         | 
| 130 | 
            +
                      it 'fails' do
         | 
| 131 | 
            +
                        parsing('   ').should fail
         | 
| 132 | 
            +
                      end
         | 
| 133 | 
            +
                    end
         | 
| 134 | 
            +
             | 
| 135 | 
            +
                    context 'when a single term matches' do
         | 
| 136 | 
            +
                      it 'returns true consuming the term' do
         | 
| 137 | 
            +
                        parsing('foo  ').should result_in(true).at(3)
         | 
| 138 | 
            +
                      end
         | 
| 139 | 
            +
                    end
         | 
| 140 | 
            +
             | 
| 141 | 
            +
                    context 'when multiple terms match' do
         | 
| 142 | 
            +
                      it 'returns true consuming the list' do
         | 
| 143 | 
            +
                        parsing('foo,bar;baz  ').should result_in(true).at(11)
         | 
| 144 | 
            +
                      end
         | 
| 145 | 
            +
                    end
         | 
| 146 | 
            +
                  end
         | 
| 147 | 
            +
                end
         | 
| 148 | 
            +
              end
         | 
| 149 | 
            +
             | 
| 150 | 
            +
              describe '#capturing?' do
         | 
| 151 | 
            +
             | 
| 152 | 
            +
                let(:bounds) { [2, 4] }
         | 
| 153 | 
            +
             | 
| 154 | 
            +
                context 'with a capturing term parser' do
         | 
| 155 | 
            +
             | 
| 156 | 
            +
                  let(:term_parser) { Match[/\w+/] }
         | 
| 157 | 
            +
             | 
| 158 | 
            +
                  it 'is true' do
         | 
| 159 | 
            +
                    subject.should be_capturing
         | 
| 160 | 
            +
                  end
         | 
| 161 | 
            +
                end
         | 
| 162 | 
            +
             | 
| 163 | 
            +
                context 'with a non-capturing term parser' do
         | 
| 164 | 
            +
             | 
| 165 | 
            +
                  let(:term_parser) { Skip[Match[/\w+/]] }
         | 
| 166 | 
            +
             | 
| 167 | 
            +
                  it 'is false' do
         | 
| 168 | 
            +
                    subject.should_not be_capturing
         | 
| 169 | 
            +
                  end
         | 
| 170 | 
            +
                end
         | 
| 171 | 
            +
              end
         | 
| 172 | 
            +
             | 
| 173 | 
            +
              describe '#with_ws' do
         | 
| 174 | 
            +
             | 
| 175 | 
            +
                let(:ws) { Match[/\s*/] }
         | 
| 176 | 
            +
                let(:term_parser) { Match[/\w+/] }
         | 
| 177 | 
            +
                let(:bounds) { [2, 4] }
         | 
| 178 | 
            +
             | 
| 179 | 
            +
                it 'applies #with_ws to the term and separator parsers' do
         | 
| 180 | 
            +
                  subject.with_ws(ws).should == ListParser[
         | 
| 181 | 
            +
                    Sequence[Skip[ws], term_parser],
         | 
| 182 | 
            +
                    Sequence[Skip[ws], sep_parser],
         | 
| 183 | 
            +
                    *bounds]
         | 
| 184 | 
            +
                end
         | 
| 185 | 
            +
              end
         | 
| 186 | 
            +
             | 
| 187 | 
            +
            end
         | 
| @@ -2,30 +2,39 @@ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper') | |
| 2 2 |  | 
| 3 3 | 
             
            describe Rattler::Parsers::Match do
         | 
| 4 4 | 
             
              include CombinatorParserSpecHelper
         | 
| 5 | 
            -
             | 
| 5 | 
            +
             | 
| 6 6 | 
             
              subject { Match[/\w+/] }
         | 
| 7 | 
            -
             | 
| 7 | 
            +
             | 
| 8 8 | 
             
              describe '#parse' do
         | 
| 9 | 
            -
             | 
| 9 | 
            +
             | 
| 10 10 | 
             
                context 'when the regexp matches' do
         | 
| 11 11 | 
             
                  it 'succeeds returning the matched string' do
         | 
| 12 12 | 
             
                    parsing('abc123  ').should result_in('abc123').at(6)
         | 
| 13 13 | 
             
                  end
         | 
| 14 14 | 
             
                end
         | 
| 15 | 
            -
             | 
| 15 | 
            +
             | 
| 16 16 | 
             
                context 'when the regexp does not match' do
         | 
| 17 17 | 
             
                  it 'fails' do
         | 
| 18 18 | 
             
                    parsing('  abc').should fail
         | 
| 19 19 | 
             
                    parsing('==').should fail
         | 
| 20 20 | 
             
                  end
         | 
| 21 21 | 
             
                end
         | 
| 22 | 
            -
             | 
| 22 | 
            +
             | 
| 23 23 | 
             
              end
         | 
| 24 | 
            -
             | 
| 24 | 
            +
             | 
| 25 25 | 
             
              describe '#capturing?' do
         | 
| 26 26 | 
             
                it 'is true' do
         | 
| 27 27 | 
             
                  subject.should be_capturing
         | 
| 28 28 | 
             
                end
         | 
| 29 29 | 
             
              end
         | 
| 30 | 
            -
             | 
| 30 | 
            +
             | 
| 31 | 
            +
              describe '#with_ws' do
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                let(:ws) { Match[/\s*/] }
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                it 'returns a parser that skips whitespace before matching' do
         | 
| 36 | 
            +
                  subject.with_ws(ws).should == Sequence[Skip[ws], subject]
         | 
| 37 | 
            +
                end
         | 
| 38 | 
            +
              end
         | 
| 39 | 
            +
             | 
| 31 40 | 
             
            end
         | 
| @@ -33,72 +33,80 @@ describe ParserDSL do | |
| 33 33 | 
             
                    subject.match(:EOF).should == Eof[]
         | 
| 34 34 | 
             
                  end
         | 
| 35 35 | 
             
                end
         | 
| 36 | 
            +
                context 'given :E' do
         | 
| 37 | 
            +
                  it 'creates the "E" symbol parser' do
         | 
| 38 | 
            +
                    subject.match(:E).should == ESymbol[]
         | 
| 39 | 
            +
                  end
         | 
| 40 | 
            +
                end
         | 
| 36 41 | 
             
              end
         | 
| 37 42 |  | 
| 38 43 | 
             
              describe '#optional' do
         | 
| 39 44 | 
             
                context 'given a parser' do
         | 
| 40 | 
            -
                  it 'creates  | 
| 41 | 
            -
                    subject.optional(subject.match(/\w+/)). | 
| 45 | 
            +
                  it 'creates a repeat parser with optional bounds' do
         | 
| 46 | 
            +
                    subject.optional(subject.match(/\w+/)).
         | 
| 47 | 
            +
                      should == Repeat[Match[/\w+/], 0, 1]
         | 
| 42 48 | 
             
                  end
         | 
| 43 49 | 
             
                end
         | 
| 44 50 | 
             
                context 'given a match argument' do
         | 
| 45 | 
            -
                  it 'creates  | 
| 46 | 
            -
                    subject.optional(/\w+/).should ==  | 
| 51 | 
            +
                  it 'creates a repeat parser with optional bounds' do
         | 
| 52 | 
            +
                    subject.optional(/\w+/).should == Repeat[Match[/\w+/], 0, 1]
         | 
| 47 53 | 
             
                  end
         | 
| 48 54 | 
             
                end
         | 
| 49 55 | 
             
              end
         | 
| 50 56 |  | 
| 51 57 | 
             
              describe '#zero_or_more' do
         | 
| 52 58 | 
             
                context 'given a parser' do
         | 
| 53 | 
            -
                  it 'creates a zero-or-more  | 
| 54 | 
            -
                    subject.zero_or_more(subject.match(/\w+/)). | 
| 59 | 
            +
                  it 'creates a repeat parser with zero-or-more bounds' do
         | 
| 60 | 
            +
                    subject.zero_or_more(subject.match(/\w+/)).
         | 
| 61 | 
            +
                      should == Repeat[Match[/\w+/], 0, nil]
         | 
| 55 62 | 
             
                  end
         | 
| 56 63 | 
             
                end
         | 
| 57 64 | 
             
                context 'given a match argument' do
         | 
| 58 | 
            -
                  it 'creates a zero-or-more  | 
| 59 | 
            -
                    subject.zero_or_more(/\w+/).should ==  | 
| 65 | 
            +
                  it 'creates a repeat parser with zero-or-more bounds' do
         | 
| 66 | 
            +
                    subject.zero_or_more(/\w+/).should == Repeat[Match[/\w+/], 0, nil]
         | 
| 60 67 | 
             
                  end
         | 
| 61 68 | 
             
                end
         | 
| 62 69 | 
             
              end
         | 
| 63 70 |  | 
| 64 71 | 
             
              describe '#one_or_more' do
         | 
| 65 72 | 
             
                context 'given a parser' do
         | 
| 66 | 
            -
                  it 'creates a one-or-more  | 
| 67 | 
            -
                    subject.one_or_more(subject.match(/\w+/)). | 
| 73 | 
            +
                  it 'creates a repeat parser with one-or-more bounds' do
         | 
| 74 | 
            +
                    subject.one_or_more(subject.match(/\w+/)).
         | 
| 75 | 
            +
                      should == Repeat[Match[/\w+/], 1, nil]
         | 
| 68 76 | 
             
                  end
         | 
| 69 77 | 
             
                end
         | 
| 70 78 | 
             
                context 'given a match argument' do
         | 
| 71 | 
            -
                  it 'creates a one-or-more  | 
| 72 | 
            -
                    subject.one_or_more(/\w+/).should ==  | 
| 79 | 
            +
                  it 'creates a repeat parser with one-or-more bounds' do
         | 
| 80 | 
            +
                    subject.one_or_more(/\w+/).should == Repeat[Match[/\w+/], 1, nil]
         | 
| 73 81 | 
             
                  end
         | 
| 74 82 | 
             
                end
         | 
| 75 83 | 
             
              end
         | 
| 76 84 |  | 
| 77 | 
            -
              describe '# | 
| 85 | 
            +
              describe '#repeat' do
         | 
| 78 86 | 
             
                context 'given parsers' do
         | 
| 79 | 
            -
                  it 'creates a  | 
| 80 | 
            -
                    subject. | 
| 81 | 
            -
             | 
| 87 | 
            +
                  it 'creates a repeat parser' do
         | 
| 88 | 
            +
                    subject.repeat(subject.match(/\w+/), 2, 4).
         | 
| 89 | 
            +
                      should == Repeat[Match[/\w+/], 2, 4]
         | 
| 82 90 | 
             
                  end
         | 
| 83 91 | 
             
                end
         | 
| 84 92 | 
             
                context 'given match arguments' do
         | 
| 85 | 
            -
                  it 'creates a  | 
| 86 | 
            -
                    subject. | 
| 93 | 
            +
                  it 'creates a repeat parser' do
         | 
| 94 | 
            +
                    subject.repeat(/\w+/, 2, 4).should == Repeat[Match[/\w+/], 2, 4]
         | 
| 87 95 | 
             
                  end
         | 
| 88 96 | 
             
                end
         | 
| 89 97 | 
             
              end
         | 
| 90 98 |  | 
| 91 | 
            -
              describe '# | 
| 99 | 
            +
              describe '#list' do
         | 
| 92 100 | 
             
                context 'given parsers' do
         | 
| 93 101 | 
             
                  it 'creates a list parser' do
         | 
| 94 | 
            -
                    subject. | 
| 95 | 
            -
                    should ==  | 
| 102 | 
            +
                    subject.list(subject.match(/\w+/), subject.match(/,/), 2, 4).
         | 
| 103 | 
            +
                    should == ListParser[Match[/\w+/], Match[/,/], 2, 4]
         | 
| 96 104 | 
             
                  end
         | 
| 97 105 | 
             
                end
         | 
| 98 106 | 
             
                context 'given match arguments' do
         | 
| 99 107 | 
             
                  it 'creates a list parser' do
         | 
| 100 | 
            -
                    subject. | 
| 101 | 
            -
                    should ==  | 
| 108 | 
            +
                    subject.list(/\w+/, ',', 2, 4).
         | 
| 109 | 
            +
                    should == ListParser[Match[/\w+/], Match[/,/], 2, 4]
         | 
| 102 110 | 
             
                  end
         | 
| 103 111 | 
             
                end
         | 
| 104 112 | 
             
              end
         | 
| @@ -135,6 +143,12 @@ describe ParserDSL do | |
| 135 143 | 
             
                end
         | 
| 136 144 | 
             
              end
         | 
| 137 145 |  | 
| 146 | 
            +
              describe '#e' do
         | 
| 147 | 
            +
                it 'creates the "E" symbol parser' do
         | 
| 148 | 
            +
                  subject.e.should == ESymbol[]
         | 
| 149 | 
            +
                end
         | 
| 150 | 
            +
              end
         | 
| 151 | 
            +
             | 
| 138 152 | 
             
              describe '#dispatch_action' do
         | 
| 139 153 | 
             
                context 'given a parser' do
         | 
| 140 154 | 
             
                  context 'given options' do
         | 
| @@ -179,6 +193,51 @@ describe ParserDSL do | |
| 179 193 | 
             
                end
         | 
| 180 194 | 
             
              end
         | 
| 181 195 |  | 
| 196 | 
            +
              describe '#side_effect' do
         | 
| 197 | 
            +
                context 'given a parser' do
         | 
| 198 | 
            +
                  it 'creates a side-effect parser' do
         | 
| 199 | 
            +
                    subject.side_effect(subject.match(/\d+/), '@i = _.to_i').
         | 
| 200 | 
            +
                    should == SideEffect[Match[/\d+/], '@i = _.to_i']
         | 
| 201 | 
            +
                  end
         | 
| 202 | 
            +
                end
         | 
| 203 | 
            +
                context 'given a match argument' do
         | 
| 204 | 
            +
                  it 'creates a side-effect match parser' do
         | 
| 205 | 
            +
                    subject.side_effect(/\d+/, '@i = _.to_i').
         | 
| 206 | 
            +
                    should == SideEffect[Match[/\d+/], '@i = _.to_i']
         | 
| 207 | 
            +
                  end
         | 
| 208 | 
            +
                end
         | 
| 209 | 
            +
              end
         | 
| 210 | 
            +
             | 
| 211 | 
            +
              describe '#semantic_assert' do
         | 
| 212 | 
            +
                context 'given a parser' do
         | 
| 213 | 
            +
                  it 'creates a positive Semantic predicate parser' do
         | 
| 214 | 
            +
                    subject.semantic_assert(subject.match(/\d+/), '_.to_i < 7').
         | 
| 215 | 
            +
                    should == SemanticAssert[Match[/\d+/], '_.to_i < 7']
         | 
| 216 | 
            +
                  end
         | 
| 217 | 
            +
                end
         | 
| 218 | 
            +
                context 'given a match argument' do
         | 
| 219 | 
            +
                  it 'creates a positive Semantic predicate match parser' do
         | 
| 220 | 
            +
                    subject.semantic_assert(/\d+/, '_.to_i < 7').
         | 
| 221 | 
            +
                    should == SemanticAssert[Match[/\d+/], '_.to_i < 7']
         | 
| 222 | 
            +
                  end
         | 
| 223 | 
            +
                end
         | 
| 224 | 
            +
              end
         | 
| 225 | 
            +
             | 
| 226 | 
            +
              describe '#semantic_disallow' do
         | 
| 227 | 
            +
                context 'given a parser' do
         | 
| 228 | 
            +
                  it 'creates a negative Semantic predicate parser' do
         | 
| 229 | 
            +
                    subject.semantic_disallow(subject.match(/\d+/), '_.to_i < 7').
         | 
| 230 | 
            +
                    should == SemanticDisallow[Match[/\d+/], '_.to_i < 7']
         | 
| 231 | 
            +
                  end
         | 
| 232 | 
            +
                end
         | 
| 233 | 
            +
                context 'given a match argument' do
         | 
| 234 | 
            +
                  it 'creates a negative Semantic match parser' do
         | 
| 235 | 
            +
                    subject.semantic_disallow(/\d+/, '_.to_i < 7').
         | 
| 236 | 
            +
                    should == SemanticDisallow[Match[/\d+/], '_.to_i < 7']
         | 
| 237 | 
            +
                  end
         | 
| 238 | 
            +
                end
         | 
| 239 | 
            +
              end
         | 
| 240 | 
            +
             | 
| 182 241 | 
             
              describe '#token' do
         | 
| 183 242 | 
             
                context 'given a parser' do
         | 
| 184 243 | 
             
                  it 'creates a token parser' do
         |