rattler 0.5.0 → 0.6.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 +3 -175
- data/features/README.markdown +27 -0
- data/features/Tutorial.md +224 -0
- data/features/command_line/output_option.feature +2 -1
- data/features/command_line/{parser_generator.feature → rtlr.feature} +43 -15
- data/features/error_reporting/automatic_error_messages.feature +40 -0
- data/features/error_reporting/custom_error_messages.feature +28 -0
- data/features/examples/json_parser.markdown +88 -0
- data/features/{grammar → extended_matching_syntax}/back_reference.feature +5 -3
- data/features/{grammar → extended_matching_syntax}/e_symbol.feature +2 -2
- data/features/{grammar → extended_matching_syntax}/eof.feature +4 -3
- data/features/{grammar → extended_matching_syntax}/fail.feature +8 -6
- data/features/extended_matching_syntax/fragments.feature +29 -0
- data/features/extended_matching_syntax/include.feature +42 -0
- data/features/{grammar → extended_matching_syntax}/list_matching.feature +7 -6
- data/features/extended_matching_syntax/posix_class.feature +127 -0
- data/features/{grammar → extended_matching_syntax}/repeat.feature +29 -3
- data/features/{grammar → extended_matching_syntax}/skip_operator.feature +2 -1
- data/features/extended_matching_syntax/super.feature +24 -0
- data/features/{grammar → extended_matching_syntax}/token.feature +6 -5
- data/features/{grammar → extended_matching_syntax}/whitespace.feature +7 -6
- data/features/{grammar → extended_matching_syntax}/word_literal.feature +10 -6
- data/features/grammar_heading/explicit_start_rule.feature +20 -0
- data/features/grammar_heading/grammar_declaration.feature +60 -0
- data/features/grammar_heading/include.feature +19 -0
- data/features/grammar_heading/require.feature +27 -0
- data/features/{grammar → peg_syntax}/any_character.feature +1 -1
- data/features/peg_syntax/character_class.feature +25 -0
- data/features/{grammar → peg_syntax}/comments.feature +1 -1
- data/features/{grammar → peg_syntax}/literal.feature +5 -3
- data/features/{grammar → peg_syntax}/negative_lookahead.feature +5 -3
- data/features/peg_syntax/nonterminal.feature +46 -0
- data/features/peg_syntax/one_or_more.feature +59 -0
- data/features/{grammar → peg_syntax}/optional.feature +2 -2
- data/features/peg_syntax/ordered_choice.feature +24 -0
- data/features/{grammar → peg_syntax}/positive_lookahead.feature +6 -4
- data/features/peg_syntax/sequence.feature +23 -0
- data/features/{grammar → peg_syntax}/start_rule.feature +1 -1
- data/features/peg_syntax/zero_or_more.feature +59 -0
- data/features/{grammar → semantics}/labels.feature +0 -0
- data/features/{grammar → semantics}/negative_semantic_predicate.feature +30 -9
- data/features/{grammar → semantics}/node_action.feature +0 -0
- data/features/{grammar → semantics}/positive_semantic_predicate.feature +29 -8
- data/features/{grammar/symantic_action.feature → semantics/semantic_action.feature} +2 -2
- data/features/semantics/semantic_result.feature +86 -0
- data/features/{grammar → semantics}/side_effect.feature +33 -21
- data/features/step_definitions/cli_steps.rb +1 -1
- data/features/step_definitions/grammar_steps.rb +19 -5
- data/features/support/env.rb +5 -0
- data/lib/rattler.rb +21 -44
- data/lib/rattler/compiler.rb +69 -0
- data/lib/rattler/{grammar → compiler}/grammar_parser.rb +58 -24
- data/lib/rattler/compiler/metagrammar.rb +1570 -0
- data/lib/rattler/compiler/optimizer.rb +77 -0
- data/lib/rattler/{back_end → compiler}/optimizer/composite_reducing.rb +2 -2
- data/lib/rattler/{back_end → compiler}/optimizer/flatten_choice.rb +3 -12
- data/lib/rattler/{back_end → compiler}/optimizer/flatten_sequence.rb +4 -16
- data/lib/rattler/{back_end → compiler}/optimizer/flattening.rb +2 -2
- data/lib/rattler/compiler/optimizer/inline_regular_rules.rb +24 -0
- data/lib/rattler/{back_end → compiler}/optimizer/join_match_capturing_sequence.rb +16 -14
- data/lib/rattler/{back_end → compiler}/optimizer/join_match_choice.rb +4 -13
- data/lib/rattler/{back_end → compiler}/optimizer/join_match_matching_sequence.rb +4 -13
- data/lib/rattler/compiler/optimizer/join_match_sequence.rb +7 -0
- data/lib/rattler/{back_end → compiler}/optimizer/join_predicate_bare_match.rb +3 -12
- data/lib/rattler/compiler/optimizer/join_predicate_match.rb +7 -0
- data/lib/rattler/{back_end → compiler}/optimizer/join_predicate_nested_match.rb +4 -13
- data/lib/rattler/{back_end → compiler}/optimizer/join_predicate_or_bare_match.rb +3 -12
- data/lib/rattler/compiler/optimizer/join_predicate_or_match.rb +7 -0
- data/lib/rattler/{back_end → compiler}/optimizer/join_predicate_or_nested_match.rb +4 -13
- data/lib/rattler/{back_end → compiler}/optimizer/match_joining.rb +2 -2
- data/lib/rattler/{back_end → compiler}/optimizer/optimization.rb +12 -34
- data/lib/rattler/compiler/optimizer/optimization_context.rb +83 -0
- data/lib/rattler/{back_end → compiler}/optimizer/optimization_sequence.rb +3 -11
- data/lib/rattler/compiler/optimizer/optimizations.rb +27 -0
- data/lib/rattler/{back_end → compiler}/optimizer/optimize_children.rb +6 -14
- data/lib/rattler/{back_end → compiler}/optimizer/reduce_repeat_match.rb +4 -13
- data/lib/rattler/compiler/optimizer/remove_meaningless_wrapper.rb +22 -0
- data/lib/rattler/{back_end → compiler}/optimizer/simplify_redundant_repeat.rb +4 -13
- data/lib/rattler/{back_end → compiler}/optimizer/simplify_token_match.rb +4 -13
- data/lib/rattler/compiler/parser_generator.rb +108 -0
- data/lib/rattler/{back_end → compiler}/parser_generator/apply_generator.rb +7 -21
- data/lib/rattler/{back_end → compiler}/parser_generator/assert_generator.rb +11 -19
- data/lib/rattler/compiler/parser_generator/attributed_sequence_generator.rb +37 -0
- data/lib/rattler/{back_end → compiler}/parser_generator/back_reference_generator.rb +10 -10
- data/lib/rattler/{back_end → compiler}/parser_generator/choice_generator.rb +10 -22
- data/lib/rattler/{back_end → compiler}/parser_generator/delegating_generator.rb +2 -2
- data/lib/rattler/{back_end → compiler}/parser_generator/disallow_generator.rb +11 -19
- data/lib/rattler/{back_end → compiler}/parser_generator/e_symbol_generator.rb +2 -10
- data/lib/rattler/{back_end → compiler}/parser_generator/eof_generator.rb +2 -10
- data/lib/rattler/{back_end → compiler}/parser_generator/expr_generator.rb +9 -35
- data/lib/rattler/{back_end → compiler}/parser_generator/fail_generator.rb +7 -3
- data/lib/rattler/{back_end → compiler}/parser_generator/gen_method_names.rb +3 -5
- data/lib/rattler/{back_end → compiler}/parser_generator/general_list_generator.rb +6 -18
- data/lib/rattler/{back_end → compiler}/parser_generator/general_repeat_generator.rb +16 -22
- data/lib/rattler/{back_end/parser_generator/rule_set_generator.rb → compiler/parser_generator/grammar_generator.rb} +24 -33
- data/lib/rattler/compiler/parser_generator/group_match.rb +33 -0
- data/lib/rattler/{back_end → compiler}/parser_generator/group_match_generator.rb +4 -17
- data/lib/rattler/compiler/parser_generator/label_generator.rb +37 -0
- data/lib/rattler/{back_end → compiler}/parser_generator/list0_generating.rb +5 -5
- data/lib/rattler/{back_end → compiler}/parser_generator/list1_generating.rb +3 -3
- data/lib/rattler/{back_end → compiler}/parser_generator/list_generator.rb +2 -2
- data/lib/rattler/{back_end → compiler}/parser_generator/match_generator.rb +10 -10
- data/lib/rattler/{back_end → compiler}/parser_generator/nested.rb +2 -2
- data/lib/rattler/compiler/parser_generator/node_action_generator.rb +49 -0
- data/lib/rattler/{back_end → compiler}/parser_generator/one_or_more_generating.rb +3 -3
- data/lib/rattler/{back_end → compiler}/parser_generator/optional_generating.rb +6 -22
- data/lib/rattler/compiler/parser_generator/predicate_propogating.rb +24 -0
- data/lib/rattler/{back_end → compiler}/parser_generator/repeat_generator.rb +2 -2
- data/lib/rattler/compiler/parser_generator/rule_generator.rb +66 -0
- data/lib/rattler/compiler/parser_generator/rule_set_generator.rb +33 -0
- data/lib/rattler/compiler/parser_generator/semantic_action_generator.rb +58 -0
- data/lib/rattler/compiler/parser_generator/sequence_generating.rb +138 -0
- data/lib/rattler/compiler/parser_generator/sequence_generator.rb +57 -0
- data/lib/rattler/{back_end → compiler}/parser_generator/skip_generator.rb +4 -18
- data/lib/rattler/compiler/parser_generator/skip_propogating.rb +16 -0
- data/lib/rattler/{back_end → compiler}/parser_generator/sub_generating.rb +19 -11
- data/lib/rattler/compiler/parser_generator/super_generator.rb +54 -0
- data/lib/rattler/{back_end → compiler}/parser_generator/token_generator.rb +3 -3
- data/lib/rattler/compiler/parser_generator/token_propogating.rb +10 -0
- data/lib/rattler/{back_end → compiler}/parser_generator/top_level.rb +2 -2
- data/lib/rattler/{back_end → compiler}/parser_generator/zero_or_more_generating.rb +5 -5
- data/lib/rattler/compiler/rattler.rtlr +201 -0
- data/lib/rattler/{back_end → compiler}/ruby_generator.rb +16 -25
- data/lib/rattler/parsers.rb +12 -33
- data/lib/rattler/parsers/action_code.rb +25 -16
- data/lib/rattler/{grammar → parsers}/analysis.rb +32 -11
- data/lib/rattler/parsers/apply.rb +10 -19
- data/lib/rattler/parsers/assert.rb +4 -14
- data/lib/rattler/parsers/atomic.rb +3 -10
- data/lib/rattler/parsers/attributed_sequence.rb +50 -0
- data/lib/rattler/parsers/back_reference.rb +19 -14
- data/lib/rattler/parsers/choice.rb +11 -12
- data/lib/rattler/parsers/combinator_parser.rb +15 -7
- data/lib/rattler/parsers/combining.rb +15 -9
- data/lib/rattler/parsers/disallow.rb +5 -12
- data/lib/rattler/parsers/e_symbol.rb +5 -14
- data/lib/rattler/parsers/eof.rb +10 -15
- data/lib/rattler/parsers/fail.rb +16 -26
- data/lib/rattler/{grammar → parsers}/grammar.rb +15 -20
- data/lib/rattler/parsers/label.rb +10 -16
- data/lib/rattler/parsers/list_parser.rb +14 -14
- data/lib/rattler/parsers/match.rb +5 -17
- data/lib/rattler/parsers/node_action.rb +72 -0
- data/lib/rattler/parsers/node_code.rb +47 -30
- data/lib/rattler/parsers/parser.rb +63 -32
- data/lib/rattler/parsers/parser_scope.rb +88 -0
- data/lib/rattler/parsers/predicate.rb +12 -10
- data/lib/rattler/parsers/repeat.rb +15 -8
- data/lib/rattler/parsers/rule.rb +8 -23
- data/lib/rattler/parsers/rule_set.rb +67 -12
- data/lib/rattler/parsers/semantic.rb +36 -0
- data/lib/rattler/parsers/semantic_action.rb +39 -0
- data/lib/rattler/parsers/sequence.rb +25 -40
- data/lib/rattler/parsers/sequencing.rb +40 -0
- data/lib/rattler/parsers/skip.rb +11 -12
- data/lib/rattler/parsers/super.rb +33 -0
- data/lib/rattler/parsers/token.rb +3 -13
- data/lib/rattler/rake_task.rb +50 -0
- data/lib/rattler/runner.rb +19 -22
- data/lib/rattler/runtime.rb +0 -10
- data/lib/rattler/runtime/extended_packrat_parser.rb +40 -45
- data/lib/rattler/runtime/packrat_parser.rb +17 -31
- data/lib/rattler/runtime/parse_failure.rb +16 -26
- data/lib/rattler/runtime/parse_node.rb +8 -18
- data/lib/rattler/runtime/parser.rb +6 -18
- data/lib/rattler/runtime/parser_helper.rb +3 -10
- data/lib/rattler/runtime/recursive_descent_parser.rb +26 -23
- data/lib/rattler/runtime/syntax_error.rb +0 -10
- data/lib/rattler/util.rb +2 -6
- data/lib/rattler/util/grammar_cli.rb +19 -0
- data/lib/rattler/util/graphviz.rb +6 -17
- data/lib/rattler/util/graphviz/digraph_builder.rb +10 -17
- data/lib/rattler/util/graphviz/node_builder.rb +45 -31
- data/lib/rattler/util/line_counter.rb +11 -20
- data/lib/rattler/util/node.rb +52 -30
- data/lib/rattler/util/parser_cli.rb +84 -0
- data/lib/rattler/util/parser_spec_helper.rb +8 -12
- data/spec/rattler/compiler/assert_compiler_examples.rb +284 -0
- data/spec/rattler/compiler/attributed_sequence_compiler_examples.rb +154 -0
- data/spec/rattler/compiler/disallow_compiler_examples.rb +293 -0
- data/spec/rattler/compiler/grammar_parser_spec.rb +700 -0
- data/spec/rattler/{back_end → compiler}/optimizer/flatten_choice_spec.rb +1 -1
- data/spec/rattler/{back_end → compiler}/optimizer/flatten_sequence_spec.rb +1 -1
- data/spec/rattler/compiler/optimizer/inline_regular_rules_spec.rb +50 -0
- data/spec/rattler/{back_end → compiler}/optimizer/join_match_capturing_sequence_spec.rb +106 -22
- data/spec/rattler/{back_end → compiler}/optimizer/join_match_choice_spec.rb +1 -1
- data/spec/rattler/{back_end → compiler}/optimizer/join_match_matching_sequence_spec.rb +1 -1
- data/spec/rattler/{back_end → compiler}/optimizer/join_predicate_bare_match_spec.rb +1 -1
- data/spec/rattler/{back_end → compiler}/optimizer/join_predicate_nested_match_spec.rb +1 -1
- data/spec/rattler/{back_end → compiler}/optimizer/join_predicate_or_bare_match_spec.rb +1 -1
- data/spec/rattler/{back_end → compiler}/optimizer/join_predicate_or_nested_match_spec.rb +1 -1
- data/spec/rattler/{back_end → compiler}/optimizer/reduce_repeat_match_spec.rb +1 -1
- data/spec/rattler/compiler/optimizer/remove_meaningless_wrapper_spec.rb +82 -0
- data/spec/rattler/{back_end → compiler}/optimizer/simplify_redundant_repeat_spec.rb +1 -1
- data/spec/rattler/{back_end → compiler}/optimizer/simplify_token_match_spec.rb +1 -1
- data/spec/rattler/{back_end → compiler}/optimizer_spec.rb +1 -1
- data/spec/rattler/{back_end → compiler}/parser_generator/apply_generator_spec.rb +1 -39
- data/spec/rattler/{back_end → compiler}/parser_generator/assert_generator_spec.rb +1 -55
- data/spec/rattler/compiler/parser_generator/attributed_sequence_generator_spec.rb +699 -0
- data/spec/rattler/{back_end → compiler}/parser_generator/back_reference_generator_spec.rb +3 -56
- data/spec/rattler/{back_end → compiler}/parser_generator/choice_generator_spec.rb +1 -63
- data/spec/rattler/{back_end → compiler}/parser_generator/disallow_generator_spec.rb +1 -55
- data/spec/rattler/{back_end → compiler}/parser_generator/e_symbol_generator_spec.rb +1 -39
- data/spec/rattler/{back_end → compiler}/parser_generator/eof_generator_spec.rb +1 -39
- data/spec/rattler/{back_end → compiler}/parser_generator/fail_generator_spec.rb +94 -23
- data/spec/rattler/compiler/parser_generator/grammar_generator_spec.rb +98 -0
- data/spec/rattler/compiler/parser_generator/group_match_generator_spec.rb +67 -0
- data/spec/rattler/{back_end → compiler}/parser_generator/group_match_spec.rb +1 -1
- data/spec/rattler/{back_end → compiler}/parser_generator/label_generator_spec.rb +1 -55
- data/spec/rattler/{back_end → compiler}/parser_generator/list0_generator_examples.rb +0 -88
- data/spec/rattler/{back_end → compiler}/parser_generator/list1_generator_examples.rb +0 -88
- data/spec/rattler/{back_end → compiler}/parser_generator/list_generator_spec.rb +1 -227
- data/spec/rattler/{back_end → compiler}/parser_generator/match_generator_spec.rb +1 -55
- data/spec/rattler/compiler/parser_generator/node_action_generator_spec.rb +135 -0
- data/spec/rattler/{back_end → compiler}/parser_generator/one_or_more_generator_examples.rb +0 -74
- data/spec/rattler/{back_end → compiler}/parser_generator/optional_generator_examples.rb +0 -62
- data/spec/rattler/{back_end → compiler}/parser_generator/repeat_generator_spec.rb +66 -1
- data/spec/rattler/{back_end → compiler}/parser_generator/rule_generator_spec.rb +3 -2
- data/spec/rattler/{back_end → compiler}/parser_generator/rule_set_generator_spec.rb +9 -27
- data/spec/rattler/compiler/parser_generator/semantic_action_generator_spec.rb +437 -0
- data/spec/rattler/{back_end → compiler}/parser_generator/sequence_generator_spec.rb +234 -68
- data/spec/rattler/{back_end → compiler}/parser_generator/skip_generator_spec.rb +1 -55
- data/spec/rattler/compiler/parser_generator/super_generator_spec.rb +93 -0
- data/spec/rattler/{back_end → compiler}/parser_generator/token_generator_spec.rb +1 -55
- data/spec/rattler/{back_end → compiler}/parser_generator/zero_or_more_generator_examples.rb +0 -74
- data/spec/rattler/{back_end → compiler}/ruby_generator_spec.rb +13 -13
- data/spec/rattler/compiler/semantic_action_compiler_examples.rb +57 -0
- data/spec/rattler/{back_end → compiler}/shared_compiler_examples.rb +111 -140
- data/spec/rattler/{back_end → compiler}/skip_compiler_examples.rb +60 -57
- data/spec/rattler/{back_end → compiler}/token_compiler_examples.rb +99 -104
- data/spec/rattler/compiler_spec.rb +67 -0
- data/spec/rattler/parsers/action_code_spec.rb +34 -18
- data/spec/rattler/{grammar → parsers}/analysis_spec.rb +13 -67
- data/spec/rattler/parsers/apply_spec.rb +6 -0
- data/spec/rattler/parsers/assert_spec.rb +38 -2
- data/spec/rattler/parsers/attributed_sequence_spec.rb +204 -0
- data/spec/rattler/parsers/back_reference_spec.rb +6 -0
- data/spec/rattler/parsers/choice_spec.rb +38 -1
- data/spec/rattler/parsers/combinator_parser_spec.rb +2 -1
- data/spec/rattler/parsers/disallow_spec.rb +38 -2
- data/spec/rattler/parsers/e_symbol_spec.rb +6 -0
- data/spec/rattler/parsers/eof_spec.rb +6 -0
- data/spec/rattler/parsers/fail_spec.rb +6 -0
- data/spec/rattler/{grammar → parsers}/grammar_spec.rb +10 -15
- data/spec/rattler/parsers/label_spec.rb +30 -0
- data/spec/rattler/parsers/list_parser_spec.rb +31 -2
- data/spec/rattler/parsers/match_spec.rb +6 -0
- data/spec/rattler/parsers/node_action_spec.rb +121 -0
- data/spec/rattler/parsers/parser_scope_spec.rb +105 -0
- data/spec/rattler/parsers/repeat_spec.rb +56 -0
- data/spec/rattler/parsers/rule_set_spec.rb +42 -0
- data/spec/rattler/parsers/semantic_action_spec.rb +89 -0
- data/spec/rattler/parsers/sequence_spec.rb +156 -12
- data/spec/rattler/parsers/skip_spec.rb +21 -0
- data/spec/rattler/parsers/super_spec.rb +45 -0
- data/spec/rattler/parsers/token_spec.rb +33 -14
- data/spec/rattler/runtime/extended_packrat_parser_spec.rb +10 -8
- data/spec/rattler/runtime/recursive_descent_parser_spec.rb +26 -0
- data/spec/rattler/runtime/shared_parser_examples.rb +22 -16
- data/spec/rattler/util/graphviz/node_builder_spec.rb +33 -17
- data/spec/rattler/util/line_counter_spec.rb +21 -21
- data/spec/rattler/util/node_spec.rb +62 -0
- data/spec/rattler_spec.rb +7 -41
- data/spec/spec_helper.rb +1 -2
- data/spec/support/combinator_parser_spec_helper.rb +1 -1
- data/spec/support/compiler_spec_helper.rb +0 -4
- data/spec/support/parser_generator_spec_helper.rb +7 -7
- data/spec/support/runtime_parser_spec_helper.rb +57 -3
- metadata +447 -303
- data/features/grammar/character_class.feature +0 -20
- data/features/grammar/nonterminal.feature +0 -24
- data/features/grammar/one_or_more.feature +0 -34
- data/features/grammar/ordered_choice.feature +0 -21
- data/features/grammar/posix_class.feature +0 -70
- data/features/grammar/sequence.feature +0 -20
- data/features/grammar/zero_or_more.feature +0 -34
- data/lib/rattler/back_end.rb +0 -22
- data/lib/rattler/back_end/compiler.rb +0 -128
- data/lib/rattler/back_end/optimizer.rb +0 -101
- data/lib/rattler/back_end/optimizer/inline_regular_rules.rb +0 -46
- data/lib/rattler/back_end/optimizer/join_match_sequence.rb +0 -17
- data/lib/rattler/back_end/optimizer/join_predicate_match.rb +0 -17
- data/lib/rattler/back_end/optimizer/join_predicate_or_match.rb +0 -17
- data/lib/rattler/back_end/optimizer/optimization_context.rb +0 -72
- data/lib/rattler/back_end/optimizer/remove_meaningless_wrapper.rb +0 -32
- data/lib/rattler/back_end/optimizer/specialize_repeat.rb +0 -40
- data/lib/rattler/back_end/parser_generator.rb +0 -113
- data/lib/rattler/back_end/parser_generator/direct_action_generator.rb +0 -45
- data/lib/rattler/back_end/parser_generator/dispatch_action_generator.rb +0 -45
- data/lib/rattler/back_end/parser_generator/group_match.rb +0 -26
- data/lib/rattler/back_end/parser_generator/label_generator.rb +0 -64
- data/lib/rattler/back_end/parser_generator/predicate_propogating.rb +0 -24
- data/lib/rattler/back_end/parser_generator/rule_generator.rb +0 -53
- data/lib/rattler/back_end/parser_generator/sequence_generator.rb +0 -190
- data/lib/rattler/back_end/parser_generator/skip_propogating.rb +0 -16
- data/lib/rattler/back_end/parser_generator/token_propogating.rb +0 -10
- data/lib/rattler/grammar.rb +0 -43
- data/lib/rattler/grammar/grammar_dsl.rb +0 -51
- data/lib/rattler/grammar/metagrammar.rb +0 -990
- data/lib/rattler/grammar/rattler.rtlr +0 -183
- data/lib/rattler/parsers/assert_code.rb +0 -31
- data/lib/rattler/parsers/direct_action.rb +0 -85
- data/lib/rattler/parsers/disallow_code.rb +0 -31
- data/lib/rattler/parsers/dispatch_action.rb +0 -121
- data/lib/rattler/parsers/effect_code.rb +0 -31
- data/lib/rattler/parsers/parser_dsl.rb +0 -414
- data/lib/rattler/parsers/semantic_assert.rb +0 -19
- data/lib/rattler/parsers/semantic_disallow.rb +0 -19
- data/lib/rattler/parsers/side_effect.rb +0 -19
- data/spec/rattler/back_end/assert_compiler_examples.rb +0 -187
- data/spec/rattler/back_end/compiler_spec.rb +0 -43
- data/spec/rattler/back_end/direct_action_compiler_examples.rb +0 -227
- data/spec/rattler/back_end/disallow_compiler_examples.rb +0 -187
- data/spec/rattler/back_end/dispatch_action_compiler_examples.rb +0 -225
- data/spec/rattler/back_end/optimizer/inline_regular_rules_spec.rb +0 -80
- data/spec/rattler/back_end/parser_generator/direct_action_generator_spec.rb +0 -204
- data/spec/rattler/back_end/parser_generator/dispatch_action_generator_spec.rb +0 -204
- data/spec/rattler/back_end/parser_generator/group_match_generator_spec.rb +0 -185
- data/spec/rattler/back_end/semantic_assert_compiler_examples.rb +0 -152
- data/spec/rattler/back_end/semantic_disallow_compiler_examples.rb +0 -152
- data/spec/rattler/back_end/side_effect_compiler_examples.rb +0 -227
- data/spec/rattler/grammar/grammar_parser_spec.rb +0 -626
- data/spec/rattler/parsers/direct_action_spec.rb +0 -224
- data/spec/rattler/parsers/dispatch_action_spec.rb +0 -209
- data/spec/rattler/parsers/node_code_spec.rb +0 -59
- data/spec/rattler/parsers/parser_dsl_spec.rb +0 -334
- data/spec/rattler/parsers/semantic_assert_spec.rb +0 -83
- data/spec/rattler/parsers/semantic_disallow_spec.rb +0 -83
- data/spec/rattler/parsers/side_effect_spec.rb +0 -214
@@ -2,148 +2,151 @@ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
|
2
2
|
|
3
3
|
shared_examples_for 'a compiled parser with a skip' do
|
4
4
|
include CompilerSpecHelper
|
5
|
+
include RuntimeParserSpecHelper
|
5
6
|
|
6
7
|
subject { compiled_parser }
|
7
8
|
|
8
9
|
let(:reference_parser) { combinator_parser grammar }
|
9
10
|
|
11
|
+
let(:grammar) { Rattler::Parsers::Grammar[Rattler::Parsers::RuleSet[*rules]] }
|
12
|
+
|
10
13
|
context 'with a nested match rule' do
|
11
|
-
let(:
|
14
|
+
let(:rules) { [
|
12
15
|
rule(:ws) { skip(/\s+/) }
|
13
|
-
|
16
|
+
] }
|
14
17
|
it { should parse(' foo').succeeding.like reference_parser }
|
15
18
|
it { should parse('hi').failing.like reference_parser }
|
16
19
|
end
|
17
20
|
|
18
21
|
context 'with a nested apply rule' do
|
19
|
-
let(:
|
20
|
-
rule(:spaces) { match(/\s+/) }
|
22
|
+
let(:rules) { [
|
23
|
+
rule(:spaces) { match(/\s+/) },
|
21
24
|
rule(:ws) { skip(:spaces) }
|
22
|
-
|
25
|
+
] }
|
23
26
|
it { should parse(' foo').succeeding.like reference_parser }
|
24
27
|
it { should parse('hi').failing.like reference_parser }
|
25
28
|
end
|
26
29
|
|
27
30
|
context 'with a nested assert rule' do
|
28
|
-
let(:
|
31
|
+
let(:rules) { [
|
29
32
|
rule(:foo) { skip(assert(/\d/)) }
|
30
|
-
|
33
|
+
] }
|
31
34
|
it { should parse('451a').succeeding.like reference_parser }
|
32
35
|
it { should parse(' ').failing.like reference_parser }
|
33
36
|
end
|
34
37
|
|
35
38
|
context 'with a nested disallow rule' do
|
36
|
-
let(:
|
39
|
+
let(:rules) { [
|
37
40
|
rule(:foo) { skip(disallow(/\d/)) }
|
38
|
-
|
41
|
+
] }
|
39
42
|
it { should parse(' ').succeeding.like reference_parser }
|
40
43
|
it { should parse('451a').failing.like reference_parser }
|
41
44
|
end
|
42
45
|
|
43
46
|
context 'with a nested EOF rule' do
|
44
|
-
let(:
|
47
|
+
let(:rules) { [
|
45
48
|
rule(:foo) { skip(eof) }
|
46
|
-
|
49
|
+
] }
|
47
50
|
it { should parse('foo').failing.like reference_parser }
|
48
51
|
it { should parse('').succeeding.like reference_parser }
|
49
52
|
it { should parse('foo').from(3).succeeding.like reference_parser }
|
50
53
|
end
|
51
54
|
|
52
55
|
context 'with a nested "E" symbol rule' do
|
53
|
-
let(:
|
56
|
+
let(:rules) { [
|
54
57
|
rule(:foo) { skip(e) }
|
55
|
-
|
58
|
+
] }
|
56
59
|
it { should parse('').succeeding.like reference_parser }
|
57
60
|
it { should parse('foo').succeeding.like reference_parser }
|
58
61
|
end
|
59
62
|
|
60
63
|
context 'with a nested choice rule' do
|
61
|
-
let(:
|
64
|
+
let(:rules) { [
|
62
65
|
rule(:ws) do
|
63
66
|
skip(match(/\s+/) | match(/\#[^\n]*/))
|
64
67
|
end
|
65
|
-
|
68
|
+
] }
|
66
69
|
it { should parse(' # hi there ').succeeding.twice.like reference_parser }
|
67
70
|
it { should parse('hi').failing.like reference_parser }
|
68
71
|
end
|
69
72
|
|
70
73
|
context 'with a nested sequence rule' do
|
71
|
-
let(:
|
72
|
-
rule
|
74
|
+
let(:rules) { [
|
75
|
+
rule(:foo) {
|
73
76
|
skip(match(/[[:alpha:]]+/) & match(/[[:digit:]]+/))
|
74
|
-
|
75
|
-
|
77
|
+
}
|
78
|
+
] }
|
76
79
|
it { should parse('foo42!').succeeding.like reference_parser }
|
77
80
|
it { should parse('val=x').failing.like reference_parser }
|
78
81
|
end
|
79
82
|
|
80
83
|
context 'with a nested optional rule' do
|
81
|
-
let(:
|
82
|
-
rule
|
83
|
-
skip(
|
84
|
-
|
85
|
-
|
84
|
+
let(:rules) { [
|
85
|
+
rule(:foo) {
|
86
|
+
skip(match(/\w+/).optional)
|
87
|
+
}
|
88
|
+
] }
|
86
89
|
it { should parse('foo ').succeeding.like reference_parser }
|
87
90
|
it { should parse(' ').succeeding.like reference_parser }
|
88
91
|
end
|
89
92
|
|
90
93
|
context 'with a nested zero-or-more rule' do
|
91
|
-
let(:
|
92
|
-
rule
|
93
|
-
skip(
|
94
|
-
|
95
|
-
|
94
|
+
let(:rules) { [
|
95
|
+
rule(:foo) {
|
96
|
+
skip(match(/\w/).zero_or_more)
|
97
|
+
}
|
98
|
+
] }
|
96
99
|
it { should parse('foo ').succeeding.like reference_parser }
|
97
100
|
it { should parse(' ').succeeding.like reference_parser }
|
98
101
|
end
|
99
102
|
|
100
103
|
context 'with a nested one-or-more rule' do
|
101
|
-
let(:
|
102
|
-
rule
|
103
|
-
skip(
|
104
|
-
|
105
|
-
|
104
|
+
let(:rules) { [
|
105
|
+
rule(:foo) {
|
106
|
+
skip(match(/\w/).one_or_more)
|
107
|
+
}
|
108
|
+
] }
|
106
109
|
it { should parse('foo ').succeeding.like reference_parser }
|
107
110
|
it { should parse(' ').failing.like reference_parser }
|
108
111
|
end
|
109
112
|
|
110
113
|
context 'with a nested repeat rule' do
|
111
|
-
let(:
|
112
|
-
rule
|
113
|
-
skip(
|
114
|
-
|
115
|
-
|
114
|
+
let(:rules) { [
|
115
|
+
rule(:foo) {
|
116
|
+
skip(match(/\w/).repeat(2, 4))
|
117
|
+
}
|
118
|
+
] }
|
116
119
|
it { should parse('foo ').succeeding.like reference_parser }
|
117
120
|
it { should parse('abcde ').succeeding.like reference_parser }
|
118
121
|
it { should parse('a ').failing.like reference_parser }
|
119
122
|
|
120
123
|
context 'with optional bounds' do
|
121
|
-
let(:
|
122
|
-
rule
|
123
|
-
skip(
|
124
|
-
|
125
|
-
|
124
|
+
let(:rules) { [
|
125
|
+
rule(:foo) {
|
126
|
+
skip(match(/\w+/).repeat(0, 1))
|
127
|
+
}
|
128
|
+
] }
|
126
129
|
it { should parse('foo ').succeeding.like reference_parser }
|
127
130
|
it { should parse(' ').succeeding.like reference_parser }
|
128
131
|
end
|
129
132
|
|
130
133
|
context 'with zero-or-more bounds' do
|
131
|
-
let(:
|
132
|
-
rule
|
133
|
-
skip(
|
134
|
-
|
135
|
-
|
134
|
+
let(:rules) { [
|
135
|
+
rule(:foo) {
|
136
|
+
skip(match(/\w/).repeat(0, 4))
|
137
|
+
}
|
138
|
+
] }
|
136
139
|
it { should parse('foo ').succeeding.like reference_parser }
|
137
140
|
it { should parse('abcde ').succeeding.like reference_parser }
|
138
141
|
it { should parse(' ').succeeding.like reference_parser }
|
139
142
|
end
|
140
143
|
|
141
144
|
context 'with one-or-more bounds' do
|
142
|
-
let(:
|
143
|
-
rule
|
144
|
-
skip(
|
145
|
-
|
146
|
-
|
145
|
+
let(:rules) { [
|
146
|
+
rule(:foo) {
|
147
|
+
skip(match(/\w/).repeat(1, 4))
|
148
|
+
}
|
149
|
+
] }
|
147
150
|
it { should parse('foo ').succeeding.like reference_parser }
|
148
151
|
it { should parse('abcde ').succeeding.like reference_parser }
|
149
152
|
it { should parse(' ').failing.like reference_parser }
|
@@ -151,10 +154,10 @@ shared_examples_for 'a compiled parser with a skip' do
|
|
151
154
|
end
|
152
155
|
|
153
156
|
context 'with a nested apply rule' do
|
154
|
-
let(:
|
155
|
-
rule(:digits) { match(/\d+/) }
|
157
|
+
let(:rules) { [
|
158
|
+
rule(:digits) { match(/\d+/) },
|
156
159
|
rule(:foo) { skip(:digits) }
|
157
|
-
|
160
|
+
] }
|
158
161
|
it { should parse('451a').succeeding.like reference_parser }
|
159
162
|
it { should parse('hi').failing.like reference_parser }
|
160
163
|
end
|
@@ -2,223 +2,226 @@ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
|
2
2
|
|
3
3
|
shared_examples_for 'a compiled parser with a token' do
|
4
4
|
include CompilerSpecHelper
|
5
|
+
include RuntimeParserSpecHelper
|
5
6
|
|
6
7
|
subject { compiled_parser }
|
7
8
|
|
8
9
|
let(:reference_parser) { combinator_parser grammar }
|
9
10
|
|
11
|
+
let(:grammar) { Rattler::Parsers::Grammar[Rattler::Parsers::RuleSet[*rules]] }
|
12
|
+
|
10
13
|
context 'with a nested match rule' do
|
11
|
-
let(:
|
14
|
+
let(:rules) { [
|
12
15
|
rule(:digits) { token(match(/\d+/)) }
|
13
|
-
|
16
|
+
] }
|
14
17
|
it { should parse('451a').succeeding.like reference_parser }
|
15
18
|
it { should parse('hi').failing.like reference_parser }
|
16
19
|
end
|
17
20
|
|
18
21
|
context 'with a nested apply rule' do
|
19
|
-
let(:
|
20
|
-
rule(:digit) { match(/\d/) }
|
21
|
-
rule(:foo) { token
|
22
|
-
|
22
|
+
let(:rules) { [
|
23
|
+
rule(:digit) { match(/\d/) },
|
24
|
+
rule(:foo) { token(:digit) }
|
25
|
+
] }
|
23
26
|
it { should parse('451 ').twice.succeeding.like reference_parser }
|
24
27
|
it { should parse('hi').failing.like reference_parser }
|
25
28
|
|
26
29
|
context 'with a label' do
|
27
|
-
let(:
|
28
|
-
rule(:digits) { match(/\d+/) }
|
30
|
+
let(:rules) { [
|
31
|
+
rule(:digits) { match(/\d+/) },
|
29
32
|
rule(:num) { token(label(:num, :digits)) }
|
30
|
-
|
33
|
+
] }
|
31
34
|
it { should parse('451a').succeeding.like reference_parser }
|
32
35
|
it { should parse(' ').failing.like reference_parser }
|
33
36
|
end
|
34
37
|
end
|
35
38
|
|
36
39
|
context 'with a nested assert rule' do
|
37
|
-
let(:
|
40
|
+
let(:rules) { [
|
38
41
|
rule(:foo) { token(assert(/\d/)) }
|
39
|
-
|
42
|
+
] }
|
40
43
|
it { should parse('451a').succeeding.like reference_parser }
|
41
44
|
it { should parse(' ').failing.like reference_parser }
|
42
45
|
end
|
43
46
|
|
44
47
|
context 'with a nested disallow rule' do
|
45
|
-
let(:
|
48
|
+
let(:rules) { [
|
46
49
|
rule(:foo) { token(disallow(/\d/)) }
|
47
|
-
|
50
|
+
] }
|
48
51
|
it { should parse(' ').succeeding.like reference_parser }
|
49
52
|
it { should parse('451a').failing.like reference_parser }
|
50
53
|
end
|
51
54
|
|
52
55
|
context 'with a nested EOF rule' do
|
53
|
-
let(:
|
56
|
+
let(:rules) { [
|
54
57
|
rule(:foo) { token(eof) }
|
55
|
-
|
58
|
+
] }
|
56
59
|
it { should parse('foo').failing.like reference_parser }
|
57
60
|
it { should parse('').succeeding.like reference_parser }
|
58
61
|
it { should parse('foo').from(3).succeeding.like reference_parser }
|
59
62
|
end
|
60
63
|
|
61
64
|
context 'with a nested "E" symbol rule' do
|
62
|
-
let(:
|
65
|
+
let(:rules) { [
|
63
66
|
rule(:foo) { token(e) }
|
64
|
-
|
67
|
+
] }
|
65
68
|
it { should parse('').succeeding.like reference_parser }
|
66
69
|
it { should parse('foo').succeeding.like reference_parser }
|
67
70
|
end
|
68
71
|
|
69
72
|
context 'with a nested choice rule' do
|
70
|
-
let(:
|
71
|
-
rule(:atom)
|
73
|
+
let(:rules) { [
|
74
|
+
rule(:atom) {
|
72
75
|
token(match(/[[:alpha:]]+/) | match(/[[:digit:]]+/))
|
73
|
-
|
74
|
-
|
76
|
+
}
|
77
|
+
] }
|
75
78
|
|
76
79
|
it { should parse('abc123 ').succeeding.like reference_parser }
|
77
80
|
it { should parse('==').failing.like reference_parser }
|
78
81
|
|
79
82
|
context 'with non-capturing choices' do
|
80
|
-
let(:
|
81
|
-
rule(:atom)
|
83
|
+
let(:rules) { [
|
84
|
+
rule(:atom) {
|
82
85
|
token(skip(/[[:alpha:]]+/) | match(/[[:digit:]]+/))
|
83
|
-
|
84
|
-
|
86
|
+
}
|
87
|
+
] }
|
85
88
|
it { should parse('abc123 ').succeeding.like reference_parser }
|
86
89
|
it { should parse('==').failing.like reference_parser }
|
87
90
|
end
|
88
91
|
end
|
89
92
|
|
90
93
|
context 'with a nested sequence rule' do
|
91
|
-
let(:
|
92
|
-
rule(:atom)
|
94
|
+
let(:rules) { [
|
95
|
+
rule(:atom) {
|
93
96
|
token(match(/[[:alpha:]]+/) & match(/[[:digit:]]+/))
|
94
|
-
|
95
|
-
|
97
|
+
}
|
98
|
+
] }
|
96
99
|
|
97
100
|
it { should parse('foo42!').succeeding.like reference_parser }
|
98
101
|
it { should parse('val=x').failing.like reference_parser }
|
99
102
|
|
100
103
|
context 'with non-capturing parsers' do
|
101
|
-
let(:
|
102
|
-
rule
|
104
|
+
let(:rules) { [
|
105
|
+
rule(:foo) {
|
103
106
|
token(match(/[[:alpha:]]+/) & skip(/\s+/) & match(/[[:digit:]]+/))
|
104
|
-
|
105
|
-
|
107
|
+
}
|
108
|
+
] }
|
106
109
|
it { should parse('foo 42').succeeding.like reference_parser }
|
107
110
|
it { should parse('foo bar').failing.like reference_parser }
|
108
111
|
end
|
109
112
|
end
|
110
113
|
|
111
114
|
context 'with a nested optional rule' do
|
112
|
-
let(:
|
113
|
-
rule
|
114
|
-
token(
|
115
|
-
|
116
|
-
|
115
|
+
let(:rules) { [
|
116
|
+
rule(:foo) {
|
117
|
+
token(match(/\w+/).optional)
|
118
|
+
}
|
119
|
+
] }
|
117
120
|
|
118
121
|
it { should parse('foo ').succeeding.like reference_parser }
|
119
122
|
it { should parse(' ').succeeding.like reference_parser }
|
120
123
|
|
121
124
|
context 'with a non-capturing rule' do
|
122
|
-
let(:
|
123
|
-
rule
|
124
|
-
token(
|
125
|
-
|
126
|
-
|
125
|
+
let(:rules) { [
|
126
|
+
rule(:foo) {
|
127
|
+
token(skip(/\w+/).optional)
|
128
|
+
}
|
129
|
+
] }
|
127
130
|
it { should parse('foo ').succeeding.like reference_parser }
|
128
131
|
it { should parse(' ').succeeding.like reference_parser }
|
129
132
|
end
|
130
133
|
end
|
131
134
|
|
132
135
|
context 'with a nested zero-or-more rule' do
|
133
|
-
let(:
|
134
|
-
rule
|
135
|
-
token(
|
136
|
-
|
137
|
-
|
136
|
+
let(:rules) { [
|
137
|
+
rule(:foo) {
|
138
|
+
token(match(/\w/).zero_or_more)
|
139
|
+
}
|
140
|
+
] }
|
138
141
|
|
139
142
|
it { should parse('foo ').succeeding.like reference_parser }
|
140
143
|
it { should parse(' ').succeeding.like reference_parser }
|
141
144
|
|
142
145
|
context 'with a non-capturing rule' do
|
143
|
-
let(:
|
144
|
-
rule
|
145
|
-
token(
|
146
|
-
|
147
|
-
|
146
|
+
let(:rules) { [
|
147
|
+
rule(:foo) {
|
148
|
+
token(skip(/\w/).zero_or_more)
|
149
|
+
}
|
150
|
+
] }
|
148
151
|
it { should parse('foo ').succeeding.like reference_parser }
|
149
152
|
it { should parse(' ').succeeding.like reference_parser }
|
150
153
|
end
|
151
154
|
end
|
152
155
|
|
153
156
|
context 'with a nested one-or-more rule' do
|
154
|
-
let(:
|
155
|
-
rule
|
156
|
-
token(
|
157
|
-
|
158
|
-
|
157
|
+
let(:rules) { [
|
158
|
+
rule(:foo) {
|
159
|
+
token(match(/\w/).one_or_more)
|
160
|
+
}
|
161
|
+
] }
|
159
162
|
|
160
163
|
it { should parse('foo ').succeeding.like reference_parser }
|
161
164
|
it { should parse(' ').failing.like reference_parser }
|
162
165
|
|
163
166
|
context 'with a non-capturing rule' do
|
164
|
-
let(:
|
165
|
-
rule
|
166
|
-
token(
|
167
|
-
|
168
|
-
|
167
|
+
let(:rules) { [
|
168
|
+
rule(:foo) {
|
169
|
+
token(skip(/\w/).one_or_more)
|
170
|
+
}
|
171
|
+
] }
|
169
172
|
it { should parse('foo ').succeeding.like reference_parser }
|
170
173
|
it { should parse(' ').failing.like reference_parser }
|
171
174
|
end
|
172
175
|
end
|
173
176
|
|
174
177
|
context 'with a nested repeat' do
|
175
|
-
let(:
|
176
|
-
rule
|
177
|
-
token(
|
178
|
-
|
179
|
-
|
178
|
+
let(:rules) { [
|
179
|
+
rule(:foo) {
|
180
|
+
token(match(/\w/).repeat(2, 4))
|
181
|
+
}
|
182
|
+
] }
|
180
183
|
|
181
184
|
it { should parse('foo ').succeeding.like reference_parser }
|
182
185
|
it { should parse('abcde').succeeding.like reference_parser }
|
183
186
|
it { should parse('a ').failing.like reference_parser }
|
184
187
|
|
185
188
|
context 'with a non-capturing rule' do
|
186
|
-
let(:
|
187
|
-
rule
|
188
|
-
token(
|
189
|
-
|
190
|
-
|
189
|
+
let(:rules) { [
|
190
|
+
rule(:foo) {
|
191
|
+
token(skip(/\w/).repeat(2, 4))
|
192
|
+
}
|
193
|
+
] }
|
191
194
|
it { should parse('foo ').succeeding.like reference_parser }
|
192
195
|
it { should parse('abcde').succeeding.like reference_parser }
|
193
196
|
it { should parse('a ').failing.like reference_parser }
|
194
197
|
end
|
195
198
|
|
196
199
|
context 'with optional bounds' do
|
197
|
-
let(:
|
198
|
-
rule
|
199
|
-
token(
|
200
|
-
|
201
|
-
|
200
|
+
let(:rules) { [
|
201
|
+
rule(:foo) {
|
202
|
+
token(match(/\w+/).repeat(0, 1))
|
203
|
+
}
|
204
|
+
] }
|
202
205
|
it { should parse('foo ').succeeding.like reference_parser }
|
203
206
|
it { should parse(' ').succeeding.like reference_parser }
|
204
207
|
end
|
205
208
|
|
206
209
|
context 'with zero-or-more bounds' do
|
207
|
-
let(:
|
208
|
-
rule
|
209
|
-
token(
|
210
|
-
|
211
|
-
|
210
|
+
let(:rules) { [
|
211
|
+
rule(:foo) {
|
212
|
+
token(skip(/\w/).repeat(0, nil))
|
213
|
+
}
|
214
|
+
] }
|
212
215
|
it { should parse('foo ').succeeding.like reference_parser }
|
213
216
|
it { should parse(' ').succeeding.like reference_parser }
|
214
217
|
end
|
215
218
|
|
216
219
|
context 'with one-or-more bounds' do
|
217
|
-
let(:
|
218
|
-
rule
|
219
|
-
token(
|
220
|
-
|
221
|
-
|
220
|
+
let(:rules) { [
|
221
|
+
rule(:foo) {
|
222
|
+
token(skip(/\w/).repeat(1, nil))
|
223
|
+
}
|
224
|
+
] }
|
222
225
|
it { should parse('foo ').succeeding.like reference_parser }
|
223
226
|
it { should parse('a ').succeeding.like reference_parser }
|
224
227
|
it { should parse(' ').failing.like reference_parser }
|
@@ -226,36 +229,28 @@ shared_examples_for 'a compiled parser with a token' do
|
|
226
229
|
end
|
227
230
|
|
228
231
|
context 'with a nested apply rule' do
|
229
|
-
let(:
|
230
|
-
rule(:foo) { token(
|
232
|
+
let(:rules) { [
|
233
|
+
rule(:foo) { token(:digits) },
|
231
234
|
rule(:digits) { match(/\d+/) }
|
232
|
-
|
235
|
+
] }
|
233
236
|
|
234
237
|
it { should parse('451a').succeeding.like reference_parser }
|
235
238
|
it { should parse('hi').failing.like reference_parser }
|
236
239
|
|
237
240
|
context 'applying a non-capturing rule' do
|
238
|
-
let(:
|
239
|
-
rule(:foo) { token(
|
241
|
+
let(:rules) { [
|
242
|
+
rule(:foo) { token(:digits) },
|
240
243
|
rule(:digits) { skip(/\d+/) }
|
241
|
-
|
244
|
+
] }
|
242
245
|
it { should parse('451a').succeeding.like reference_parser }
|
243
246
|
it { should parse('hi').failing.like reference_parser }
|
244
247
|
end
|
245
248
|
end
|
246
249
|
|
247
|
-
context 'with a nested dispatch-action rule' do
|
248
|
-
let(:grammar) { define_grammar do
|
249
|
-
rule(:foo) { token(dispatch_action(/\w+/)) }
|
250
|
-
end }
|
251
|
-
it { should parse('abc123').succeeding.like reference_parser }
|
252
|
-
it { should parse(' ').failing.like reference_parser }
|
253
|
-
end
|
254
|
-
|
255
250
|
context 'with a nested skip rule' do
|
256
|
-
let(:
|
251
|
+
let(:rules) { [
|
257
252
|
rule(:foo) { token(skip(/\w+/)) }
|
258
|
-
|
253
|
+
] }
|
259
254
|
it { should parse('abc123').succeeding.like reference_parser }
|
260
255
|
it { should parse(' ').failing.like reference_parser }
|
261
256
|
end
|