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
@@ -1,204 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/../../../spec_helper')
|
2
|
-
|
3
|
-
include Rattler::BackEnd::ParserGenerator
|
4
|
-
include Rattler::Parsers
|
5
|
-
|
6
|
-
describe DirectActionGenerator do
|
7
|
-
|
8
|
-
include ParserGeneratorSpecHelper
|
9
|
-
|
10
|
-
let(:action) { DirectAction[Match[/\w+/], '|_| _.to_sym'] }
|
11
|
-
|
12
|
-
describe '#gen_basic' do
|
13
|
-
|
14
|
-
context 'when nested' do
|
15
|
-
it 'generates nested matching code with a direct action' do
|
16
|
-
nested_code {|g| g.gen_basic action }.
|
17
|
-
should == (<<-CODE).strip
|
18
|
-
begin
|
19
|
-
(r = @scanner.scan(/\\w+/)) &&
|
20
|
-
(r.to_sym)
|
21
|
-
end
|
22
|
-
CODE
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
context 'when top-level' do
|
27
|
-
it 'generates top level matching code with a direct action' do
|
28
|
-
top_level_code {|g| g.gen_basic action }.
|
29
|
-
should == (<<-CODE).strip
|
30
|
-
(r = @scanner.scan(/\\w+/)) &&
|
31
|
-
(r.to_sym)
|
32
|
-
CODE
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
describe '#gen_assert' do
|
38
|
-
|
39
|
-
context 'when nested' do
|
40
|
-
it 'generates nested positive lookahead code' do
|
41
|
-
nested_code {|g| g.gen_assert action }.
|
42
|
-
should == '(@scanner.skip(/(?=\w+)/) && true)'
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
context 'when top-level' do
|
47
|
-
it 'generates top level positive lookahead code' do
|
48
|
-
top_level_code {|g| g.gen_assert action }.
|
49
|
-
should == '@scanner.skip(/(?=\w+)/) && true'
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
describe '#gen_disallow' do
|
55
|
-
|
56
|
-
context 'when nested' do
|
57
|
-
it 'generates nested negative lookahead code' do
|
58
|
-
nested_code {|g| g.gen_disallow action }.
|
59
|
-
should == '(@scanner.skip(/(?!\w+)/) && true)'
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
context 'when top-level' do
|
64
|
-
it 'generates top level negative lookahead code' do
|
65
|
-
top_level_code {|g| g.gen_disallow action }.
|
66
|
-
should == '@scanner.skip(/(?!\w+)/) && true'
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
describe '#gen_dispatch_action' do
|
72
|
-
|
73
|
-
let(:code) { NodeCode.new('Word', 'parsed') }
|
74
|
-
|
75
|
-
context 'when nested' do
|
76
|
-
it 'generates nested matching code with a direct action and a dispatch action' do
|
77
|
-
nested_code {|g| g.gen_dispatch_action action, code }.
|
78
|
-
should == (<<-CODE).strip
|
79
|
-
begin
|
80
|
-
(r = begin
|
81
|
-
(r = @scanner.scan(/\\w+/)) &&
|
82
|
-
(r.to_sym)
|
83
|
-
end) &&
|
84
|
-
Word.parsed([r])
|
85
|
-
end
|
86
|
-
CODE
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
context 'when top-level' do
|
91
|
-
it 'generates top level matching code with a direct action and a dispatch action' do
|
92
|
-
top_level_code {|g| g.gen_dispatch_action action, code }.
|
93
|
-
should == (<<-CODE).strip
|
94
|
-
(r = begin
|
95
|
-
(r = @scanner.scan(/\\w+/)) &&
|
96
|
-
(r.to_sym)
|
97
|
-
end) &&
|
98
|
-
Word.parsed([r])
|
99
|
-
CODE
|
100
|
-
end
|
101
|
-
end
|
102
|
-
end
|
103
|
-
|
104
|
-
describe '#gen_direct_action' do
|
105
|
-
|
106
|
-
let(:code) { ActionCode.new('|_| _.size') }
|
107
|
-
|
108
|
-
context 'when nested' do
|
109
|
-
it 'generates nested matching code with nested direct actions' do
|
110
|
-
nested_code {|g| g.gen_direct_action action, code }.
|
111
|
-
should == (<<-CODE).strip
|
112
|
-
begin
|
113
|
-
(r = begin
|
114
|
-
(r = @scanner.scan(/\\w+/)) &&
|
115
|
-
(r.to_sym)
|
116
|
-
end) &&
|
117
|
-
(r.size)
|
118
|
-
end
|
119
|
-
CODE
|
120
|
-
end
|
121
|
-
end
|
122
|
-
|
123
|
-
context 'when top-level' do
|
124
|
-
it 'generates top level matching code with nested direct actions' do
|
125
|
-
top_level_code {|g| g.gen_direct_action action, code }.
|
126
|
-
should == (<<-CODE).strip
|
127
|
-
(r = begin
|
128
|
-
(r = @scanner.scan(/\\w+/)) &&
|
129
|
-
(r.to_sym)
|
130
|
-
end) &&
|
131
|
-
(r.size)
|
132
|
-
CODE
|
133
|
-
end
|
134
|
-
end
|
135
|
-
end
|
136
|
-
|
137
|
-
describe '#gen_token' do
|
138
|
-
|
139
|
-
context 'when nested' do
|
140
|
-
it 'generates nested token matching code' do
|
141
|
-
nested_code {|g| g.gen_token action }.
|
142
|
-
should == '@scanner.scan(/\w+/)'
|
143
|
-
end
|
144
|
-
end
|
145
|
-
|
146
|
-
context 'when top-level' do
|
147
|
-
it 'generates top level token matching code' do
|
148
|
-
top_level_code {|g| g.gen_token action }.
|
149
|
-
should == '@scanner.scan(/\w+/)'
|
150
|
-
end
|
151
|
-
end
|
152
|
-
end
|
153
|
-
|
154
|
-
describe '#gen_skip' do
|
155
|
-
|
156
|
-
context 'when nested' do
|
157
|
-
it 'generates nested skipping code' do
|
158
|
-
nested_code {|g| g.gen_skip action }.
|
159
|
-
should == '(@scanner.skip(/\w+/) && true)'
|
160
|
-
end
|
161
|
-
end
|
162
|
-
|
163
|
-
context 'when top-level' do
|
164
|
-
it 'generates top level skipping code' do
|
165
|
-
top_level_code {|g| g.gen_skip action }.
|
166
|
-
should == '@scanner.skip(/\w+/) && true'
|
167
|
-
end
|
168
|
-
end
|
169
|
-
end
|
170
|
-
|
171
|
-
describe '#gen_intermediate' do
|
172
|
-
it 'generates nested matching code with a direct action' do
|
173
|
-
nested_code {|g| g.gen_intermediate action }.
|
174
|
-
should == (<<-CODE).strip
|
175
|
-
begin
|
176
|
-
(r = @scanner.scan(/\\w+/)) &&
|
177
|
-
(r.to_sym)
|
178
|
-
end
|
179
|
-
CODE
|
180
|
-
end
|
181
|
-
end
|
182
|
-
|
183
|
-
describe '#gen_intermediate_assert' do
|
184
|
-
it 'generates intermediate positive lookahead code' do
|
185
|
-
nested_code {|g| g.gen_intermediate_assert action }.
|
186
|
-
should == '@scanner.skip(/(?=\w+)/)'
|
187
|
-
end
|
188
|
-
end
|
189
|
-
|
190
|
-
describe '#gen_intermediate_disallow' do
|
191
|
-
it 'generates intermediate negative lookahead code' do
|
192
|
-
nested_code {|g| g.gen_intermediate_disallow action }.
|
193
|
-
should == '@scanner.skip(/(?!\w+)/)'
|
194
|
-
end
|
195
|
-
end
|
196
|
-
|
197
|
-
describe '#gen_intermediate_skip' do
|
198
|
-
it 'generates intermediate skipping code' do
|
199
|
-
nested_code {|g| g.gen_intermediate_skip action }.
|
200
|
-
should == '@scanner.skip(/\w+/)'
|
201
|
-
end
|
202
|
-
end
|
203
|
-
|
204
|
-
end
|
@@ -1,204 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/../../../spec_helper')
|
2
|
-
|
3
|
-
include Rattler::BackEnd::ParserGenerator
|
4
|
-
include Rattler::Parsers
|
5
|
-
|
6
|
-
describe DispatchActionGenerator do
|
7
|
-
|
8
|
-
include ParserGeneratorSpecHelper
|
9
|
-
|
10
|
-
let(:action) { DispatchAction[Match[/\w+/]] }
|
11
|
-
|
12
|
-
describe '#gen_basic' do
|
13
|
-
|
14
|
-
context 'when nested' do
|
15
|
-
it 'generates nested matching code with a dispatch action' do
|
16
|
-
nested_code {|g| g.gen_basic action }.
|
17
|
-
should == (<<-CODE).strip
|
18
|
-
begin
|
19
|
-
(r = @scanner.scan(/\\w+/)) &&
|
20
|
-
Rattler::Runtime::ParseNode.parsed([r])
|
21
|
-
end
|
22
|
-
CODE
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
context 'when top-level' do
|
27
|
-
it 'generates top level matching code with a dispatch action' do
|
28
|
-
top_level_code {|g| g.gen_basic action }.
|
29
|
-
should == (<<-CODE).strip
|
30
|
-
(r = @scanner.scan(/\\w+/)) &&
|
31
|
-
Rattler::Runtime::ParseNode.parsed([r])
|
32
|
-
CODE
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
describe '#gen_assert' do
|
38
|
-
|
39
|
-
context 'when nested' do
|
40
|
-
it 'generates nested positive lookahead code' do
|
41
|
-
nested_code {|g| g.gen_assert action }.
|
42
|
-
should == '(@scanner.skip(/(?=\w+)/) && true)'
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
context 'when top-level' do
|
47
|
-
it 'generates top level positive lookahead code' do
|
48
|
-
top_level_code {|g| g.gen_assert action }.
|
49
|
-
should == '@scanner.skip(/(?=\w+)/) && true'
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
describe '#gen_disallow' do
|
55
|
-
|
56
|
-
context 'when nested' do
|
57
|
-
it 'generates nested negative lookahead code' do
|
58
|
-
nested_code {|g| g.gen_disallow action }.
|
59
|
-
should == '(@scanner.skip(/(?!\w+)/) && true)'
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
context 'when top-level' do
|
64
|
-
it 'generates top level negative lookahead code' do
|
65
|
-
top_level_code {|g| g.gen_disallow action }.
|
66
|
-
should == '@scanner.skip(/(?!\w+)/) && true'
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
describe '#gen_dispatch_action' do
|
72
|
-
|
73
|
-
let(:code) { NodeCode.new('Word', 'parsed') }
|
74
|
-
|
75
|
-
context 'when nested' do
|
76
|
-
it 'generates nested matching code with nested dispatch actions' do
|
77
|
-
nested_code {|g| g.gen_dispatch_action action, code }.
|
78
|
-
should == (<<-CODE).strip
|
79
|
-
begin
|
80
|
-
(r = begin
|
81
|
-
(r = @scanner.scan(/\\w+/)) &&
|
82
|
-
Rattler::Runtime::ParseNode.parsed([r])
|
83
|
-
end) &&
|
84
|
-
Word.parsed([r])
|
85
|
-
end
|
86
|
-
CODE
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
context 'when top-level' do
|
91
|
-
it 'generates top level matching code with nested dispatch actions' do
|
92
|
-
top_level_code {|g| g.gen_dispatch_action action, code }.
|
93
|
-
should == (<<-CODE).strip
|
94
|
-
(r = begin
|
95
|
-
(r = @scanner.scan(/\\w+/)) &&
|
96
|
-
Rattler::Runtime::ParseNode.parsed([r])
|
97
|
-
end) &&
|
98
|
-
Word.parsed([r])
|
99
|
-
CODE
|
100
|
-
end
|
101
|
-
end
|
102
|
-
end
|
103
|
-
|
104
|
-
describe '#gen_direct_action' do
|
105
|
-
|
106
|
-
let(:code) { ActionCode.new('|_| _.children') }
|
107
|
-
|
108
|
-
context 'when nested' do
|
109
|
-
it 'generates nested matching code with a dispatch action and a direct action' do
|
110
|
-
nested_code {|g| g.gen_direct_action action, code }.
|
111
|
-
should == (<<-CODE).strip
|
112
|
-
begin
|
113
|
-
(r = begin
|
114
|
-
(r = @scanner.scan(/\\w+/)) &&
|
115
|
-
Rattler::Runtime::ParseNode.parsed([r])
|
116
|
-
end) &&
|
117
|
-
(r.children)
|
118
|
-
end
|
119
|
-
CODE
|
120
|
-
end
|
121
|
-
end
|
122
|
-
|
123
|
-
context 'when top-level' do
|
124
|
-
it 'generates top level matching code with a dispatch action and a direct action' do
|
125
|
-
top_level_code {|g| g.gen_direct_action action, code }.
|
126
|
-
should == (<<-CODE).strip
|
127
|
-
(r = begin
|
128
|
-
(r = @scanner.scan(/\\w+/)) &&
|
129
|
-
Rattler::Runtime::ParseNode.parsed([r])
|
130
|
-
end) &&
|
131
|
-
(r.children)
|
132
|
-
CODE
|
133
|
-
end
|
134
|
-
end
|
135
|
-
end
|
136
|
-
|
137
|
-
describe '#gen_token' do
|
138
|
-
|
139
|
-
context 'when nested' do
|
140
|
-
it 'generates nested token matching code' do
|
141
|
-
nested_code {|g| g.gen_token action }.
|
142
|
-
should == '@scanner.scan(/\w+/)'
|
143
|
-
end
|
144
|
-
end
|
145
|
-
|
146
|
-
context 'when top-level' do
|
147
|
-
it 'generates top level token matching code' do
|
148
|
-
top_level_code {|g| g.gen_token action }.
|
149
|
-
should == '@scanner.scan(/\w+/)'
|
150
|
-
end
|
151
|
-
end
|
152
|
-
end
|
153
|
-
|
154
|
-
describe '#gen_skip' do
|
155
|
-
|
156
|
-
context 'when nested' do
|
157
|
-
it 'generates nested skipping code' do
|
158
|
-
nested_code {|g| g.gen_skip action }.
|
159
|
-
should == '(@scanner.skip(/\w+/) && true)'
|
160
|
-
end
|
161
|
-
end
|
162
|
-
|
163
|
-
context 'when top-level' do
|
164
|
-
it 'generates top level skipping code' do
|
165
|
-
top_level_code {|g| g.gen_skip action }.
|
166
|
-
should == '@scanner.skip(/\w+/) && true'
|
167
|
-
end
|
168
|
-
end
|
169
|
-
end
|
170
|
-
|
171
|
-
describe '#gen_intermediate' do
|
172
|
-
it 'generates nested matching code with a dispatch action' do
|
173
|
-
nested_code {|g| g.gen_intermediate action }.
|
174
|
-
should == (<<-CODE).strip
|
175
|
-
begin
|
176
|
-
(r = @scanner.scan(/\\w+/)) &&
|
177
|
-
Rattler::Runtime::ParseNode.parsed([r])
|
178
|
-
end
|
179
|
-
CODE
|
180
|
-
end
|
181
|
-
end
|
182
|
-
|
183
|
-
describe '#gen_intermediate_assert' do
|
184
|
-
it 'generates intermediate positive lookahead code' do
|
185
|
-
nested_code {|g| g.gen_intermediate_assert action }.
|
186
|
-
should == '@scanner.skip(/(?=\w+)/)'
|
187
|
-
end
|
188
|
-
end
|
189
|
-
|
190
|
-
describe '#gen_intermediate_disallow' do
|
191
|
-
it 'generates intermediate negative lookahead code' do
|
192
|
-
nested_code {|g| g.gen_intermediate_disallow action }.
|
193
|
-
should == '@scanner.skip(/(?!\w+)/)'
|
194
|
-
end
|
195
|
-
end
|
196
|
-
|
197
|
-
describe '#gen_intermediate_skip' do
|
198
|
-
it 'generates intermediate skipping code' do
|
199
|
-
nested_code {|g| g.gen_intermediate_skip action }.
|
200
|
-
should == '@scanner.skip(/\w+/)'
|
201
|
-
end
|
202
|
-
end
|
203
|
-
|
204
|
-
end
|
@@ -1,185 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/../../../spec_helper')
|
2
|
-
|
3
|
-
include Rattler::BackEnd::ParserGenerator
|
4
|
-
include Rattler::Parsers
|
5
|
-
|
6
|
-
describe GroupMatchGenerator do
|
7
|
-
|
8
|
-
include ParserGeneratorSpecHelper
|
9
|
-
|
10
|
-
let(:single_group) { GroupMatch[Match[/\s*(\w+)/], {:num_groups => 1}] }
|
11
|
-
|
12
|
-
let(:multi_group) { GroupMatch[Match[/\s*(\w+)\s+(\w+)/], {:num_groups => 2}] }
|
13
|
-
|
14
|
-
describe '#gen_basic' do
|
15
|
-
|
16
|
-
context 'given a single-group match' do
|
17
|
-
|
18
|
-
context 'when nested' do
|
19
|
-
it 'generates nested regex group matching code returning the group' do
|
20
|
-
nested_code {|g| g.gen_basic single_group }.
|
21
|
-
should == (<<-CODE).strip
|
22
|
-
begin
|
23
|
-
@scanner.skip(/\\s*(\\w+)/) &&
|
24
|
-
@scanner[1]
|
25
|
-
end
|
26
|
-
CODE
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
context 'when top-level' do
|
31
|
-
it 'generates top-level regex group matching code returning the group' do
|
32
|
-
top_level_code {|g| g.gen_basic single_group }.
|
33
|
-
should == (<<-CODE).strip
|
34
|
-
@scanner.skip(/\\s*(\\w+)/) &&
|
35
|
-
@scanner[1]
|
36
|
-
CODE
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
context 'given a multi-group match' do
|
42
|
-
|
43
|
-
context 'when nested' do
|
44
|
-
it 'generates nested regex matching code returning an array of groups' do
|
45
|
-
nested_code {|g| g.gen_basic multi_group }.
|
46
|
-
should == (<<-CODE).strip
|
47
|
-
begin
|
48
|
-
@scanner.skip(/\\s*(\\w+)\\s+(\\w+)/) &&
|
49
|
-
[@scanner[1], @scanner[2]]
|
50
|
-
end
|
51
|
-
CODE
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
context 'when top-level' do
|
56
|
-
it 'generates top-level regex matching code returning an array of groups' do
|
57
|
-
top_level_code {|g| g.gen_basic multi_group }.
|
58
|
-
should == (<<-CODE).strip
|
59
|
-
@scanner.skip(/\\s*(\\w+)\\s+(\\w+)/) &&
|
60
|
-
[@scanner[1], @scanner[2]]
|
61
|
-
CODE
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
describe '#gen_dispatch_action' do
|
68
|
-
|
69
|
-
let(:code) { NodeCode.new('Word', 'parsed') }
|
70
|
-
|
71
|
-
context 'given a single-group match' do
|
72
|
-
|
73
|
-
let(:match) { single_group }
|
74
|
-
|
75
|
-
context 'when nested' do
|
76
|
-
it 'generates nested regex group matching code with a dispatch action' do
|
77
|
-
nested_code {|g| g.gen_dispatch_action match, code }.
|
78
|
-
should == (<<-CODE).strip
|
79
|
-
begin
|
80
|
-
@scanner.skip(/\\s*(\\w+)/) &&
|
81
|
-
Word.parsed([@scanner[1]])
|
82
|
-
end
|
83
|
-
CODE
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
context 'when top-level' do
|
88
|
-
it 'generates top-level regex group matching code with a dispatch action' do
|
89
|
-
top_level_code {|g| g.gen_dispatch_action match, code }.
|
90
|
-
should == (<<-CODE).strip
|
91
|
-
@scanner.skip(/\\s*(\\w+)/) &&
|
92
|
-
Word.parsed([@scanner[1]])
|
93
|
-
CODE
|
94
|
-
end
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
context 'given a multi-group match' do
|
99
|
-
|
100
|
-
let(:match) { multi_group }
|
101
|
-
|
102
|
-
context 'when nested' do
|
103
|
-
it 'generates nested regex group matching code with a dispatch action' do
|
104
|
-
nested_code {|g| g.gen_dispatch_action match, code }.
|
105
|
-
should == (<<-CODE).strip
|
106
|
-
begin
|
107
|
-
@scanner.skip(/\\s*(\\w+)\\s+(\\w+)/) &&
|
108
|
-
Word.parsed([@scanner[1], @scanner[2]])
|
109
|
-
end
|
110
|
-
CODE
|
111
|
-
end
|
112
|
-
end
|
113
|
-
|
114
|
-
context 'when top-level' do
|
115
|
-
it 'generates top-level regex group matching code with a dispatch action' do
|
116
|
-
top_level_code {|g| g.gen_dispatch_action match, code }.
|
117
|
-
should == (<<-CODE).strip
|
118
|
-
@scanner.skip(/\\s*(\\w+)\\s+(\\w+)/) &&
|
119
|
-
Word.parsed([@scanner[1], @scanner[2]])
|
120
|
-
CODE
|
121
|
-
end
|
122
|
-
end
|
123
|
-
end
|
124
|
-
end
|
125
|
-
|
126
|
-
describe '#gen_direct_action' do
|
127
|
-
|
128
|
-
context 'given a single-group match' do
|
129
|
-
|
130
|
-
let(:match) { single_group }
|
131
|
-
let(:code) { ActionCode.new('_.to_sym') }
|
132
|
-
|
133
|
-
context 'when nested' do
|
134
|
-
it 'generates nested regex matching code with a direct action' do
|
135
|
-
nested_code {|g| g.gen_direct_action match, code }.
|
136
|
-
should == (<<-CODE).strip
|
137
|
-
begin
|
138
|
-
@scanner.skip(/\\s*(\\w+)/) &&
|
139
|
-
(@scanner[1].to_sym)
|
140
|
-
end
|
141
|
-
CODE
|
142
|
-
end
|
143
|
-
end
|
144
|
-
|
145
|
-
context 'when top-level' do
|
146
|
-
it 'generates top level regex matching code with a direct action' do
|
147
|
-
top_level_code {|g| g.gen_direct_action match, code }.
|
148
|
-
should == (<<-CODE).strip
|
149
|
-
@scanner.skip(/\\s*(\\w+)/) &&
|
150
|
-
(@scanner[1].to_sym)
|
151
|
-
CODE
|
152
|
-
end
|
153
|
-
end
|
154
|
-
end
|
155
|
-
|
156
|
-
context 'given a multi-group match' do
|
157
|
-
|
158
|
-
let(:match) { multi_group }
|
159
|
-
let(:code) { ActionCode.new('_.size') }
|
160
|
-
|
161
|
-
context 'when nested' do
|
162
|
-
it 'generates nested regex matching code with a direct action' do
|
163
|
-
nested_code {|g| g.gen_direct_action match, code }.
|
164
|
-
should == (<<-CODE).strip
|
165
|
-
begin
|
166
|
-
@scanner.skip(/\\s*(\\w+)\\s+(\\w+)/) &&
|
167
|
-
([@scanner[1], @scanner[2]].size)
|
168
|
-
end
|
169
|
-
CODE
|
170
|
-
end
|
171
|
-
end
|
172
|
-
|
173
|
-
context 'when top-level' do
|
174
|
-
it 'generates top level regex matching code with a direct action' do
|
175
|
-
top_level_code {|g| g.gen_direct_action match, code }.
|
176
|
-
should == (<<-CODE).strip
|
177
|
-
@scanner.skip(/\\s*(\\w+)\\s+(\\w+)/) &&
|
178
|
-
([@scanner[1], @scanner[2]].size)
|
179
|
-
CODE
|
180
|
-
end
|
181
|
-
end
|
182
|
-
|
183
|
-
end
|
184
|
-
end
|
185
|
-
end
|