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
@@ -0,0 +1,98 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../../spec_helper')
|
2
|
+
|
3
|
+
include Rattler::Parsers
|
4
|
+
|
5
|
+
describe Rattler::Compiler::ParserGenerator::GrammarGenerator do
|
6
|
+
|
7
|
+
include ParserGeneratorSpecHelper
|
8
|
+
|
9
|
+
describe '#generate' do
|
10
|
+
|
11
|
+
context 'given a grammar with a :grammar_name option' do
|
12
|
+
|
13
|
+
let(:grammar) { Grammar.new(rules, :grammar_name => 'ExprGrammar') }
|
14
|
+
|
15
|
+
let(:rules) { RuleSet[Rule[:a, Match['a']]] }
|
16
|
+
|
17
|
+
it 'generates a grammar module with a CLI' do
|
18
|
+
trim_lines(generated_code {|g| g.generate grammar }).strip.
|
19
|
+
should == (<<-CODE).strip
|
20
|
+
# encoding: utf-8
|
21
|
+
|
22
|
+
# @private
|
23
|
+
module ExprGrammar #:nodoc:
|
24
|
+
|
25
|
+
# @private
|
26
|
+
def start_rule #:nodoc:
|
27
|
+
:a
|
28
|
+
end
|
29
|
+
|
30
|
+
# @private
|
31
|
+
def match_a #:nodoc:
|
32
|
+
apply :match_a!
|
33
|
+
end
|
34
|
+
|
35
|
+
# @private
|
36
|
+
def match_a! #:nodoc:
|
37
|
+
@scanner.scan("a") ||
|
38
|
+
fail { :a }
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
if __FILE__ == $0
|
44
|
+
require 'rubygems'
|
45
|
+
require 'rattler'
|
46
|
+
Rattler::Util::GrammarCLI.run(ExprGrammar)
|
47
|
+
end
|
48
|
+
CODE
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
context 'given a grammar with a :parser_name option' do
|
53
|
+
|
54
|
+
let(:grammar) { Grammar.new(rules, :parser_name => 'ExprParser') }
|
55
|
+
|
56
|
+
let(:rules) { RuleSet[Rule[:a, Match['a']]] }
|
57
|
+
|
58
|
+
it 'generates a parser module with a CLI' do
|
59
|
+
trim_lines(generated_code {|g| g.generate grammar }).strip.
|
60
|
+
should == (<<-CODE).strip
|
61
|
+
# encoding: utf-8
|
62
|
+
|
63
|
+
# @private
|
64
|
+
class ExprParser < Rattler::Runtime::PackratParser #:nodoc:
|
65
|
+
|
66
|
+
# @private
|
67
|
+
def start_rule #:nodoc:
|
68
|
+
:a
|
69
|
+
end
|
70
|
+
|
71
|
+
# @private
|
72
|
+
def match_a #:nodoc:
|
73
|
+
apply :match_a!
|
74
|
+
end
|
75
|
+
|
76
|
+
# @private
|
77
|
+
def match_a! #:nodoc:
|
78
|
+
@scanner.scan("a") ||
|
79
|
+
fail { :a }
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|
83
|
+
|
84
|
+
if __FILE__ == $0
|
85
|
+
require 'rubygems'
|
86
|
+
require 'rattler'
|
87
|
+
Rattler::Util::ParserCLI.run(ExprParser)
|
88
|
+
end
|
89
|
+
CODE
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def trim_lines(s)
|
95
|
+
s.each_line.map {|_| "#{_.rstrip}\n" }.join
|
96
|
+
end
|
97
|
+
|
98
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../../spec_helper')
|
2
|
+
|
3
|
+
include Rattler::Compiler::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
|
+
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/../../../spec_helper')
|
2
2
|
|
3
|
-
include Rattler::
|
3
|
+
include Rattler::Compiler::ParserGenerator
|
4
4
|
include Rattler::Parsers
|
5
5
|
|
6
6
|
describe LabelGenerator do
|
@@ -60,60 +60,6 @@ describe LabelGenerator do
|
|
60
60
|
end
|
61
61
|
end
|
62
62
|
|
63
|
-
describe '#gen_dispatch_action' do
|
64
|
-
|
65
|
-
let(:code) { NodeCode.new('Word', 'parsed') }
|
66
|
-
|
67
|
-
context 'when nested' do
|
68
|
-
it 'generates nested matching code with a dispatch action' do
|
69
|
-
nested_code {|g| g.gen_dispatch_action label, code }.
|
70
|
-
should == (<<-CODE).strip
|
71
|
-
begin
|
72
|
-
(r = @scanner.scan(/\\w+/)) &&
|
73
|
-
Word.parsed([r], :labeled => {:word => r})
|
74
|
-
end
|
75
|
-
CODE
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
context 'when top-level' do
|
80
|
-
it 'generates top level matching code with a dispatch action' do
|
81
|
-
top_level_code {|g| g.gen_dispatch_action label, code }.
|
82
|
-
should == (<<-CODE).strip
|
83
|
-
(r = @scanner.scan(/\\w+/)) &&
|
84
|
-
Word.parsed([r], :labeled => {:word => r})
|
85
|
-
CODE
|
86
|
-
end
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
describe '#gen_direct_action' do
|
91
|
-
|
92
|
-
let(:code) { ActionCode.new('word.to_sym') }
|
93
|
-
|
94
|
-
context 'when nested' do
|
95
|
-
it 'generates nested matching code with a direct action using the label' do
|
96
|
-
nested_code {|g| g.gen_direct_action label, code }.
|
97
|
-
should == (<<-CODE).strip
|
98
|
-
begin
|
99
|
-
(r = @scanner.scan(/\\w+/)) &&
|
100
|
-
(r.to_sym)
|
101
|
-
end
|
102
|
-
CODE
|
103
|
-
end
|
104
|
-
end
|
105
|
-
|
106
|
-
context 'when top-level' do
|
107
|
-
it 'generates top level matching code with a direct action' do
|
108
|
-
top_level_code {|g| g.gen_direct_action label, code }.
|
109
|
-
should == (<<-CODE).strip
|
110
|
-
(r = @scanner.scan(/\\w+/)) &&
|
111
|
-
(r.to_sym)
|
112
|
-
CODE
|
113
|
-
end
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
63
|
describe '#gen_token' do
|
118
64
|
|
119
65
|
context 'when nested' do
|
@@ -133,94 +133,6 @@ true
|
|
133
133
|
end
|
134
134
|
end
|
135
135
|
|
136
|
-
describe '#gen_dispatch_action' do
|
137
|
-
|
138
|
-
let(:code) { NodeCode.new('Word', 'parsed') }
|
139
|
-
|
140
|
-
context 'given a list with zero-or-more bounds' do
|
141
|
-
|
142
|
-
context 'when nested' do
|
143
|
-
it 'generates nested list matching code with a dispatch action' do
|
144
|
-
nested_code {|g| g.gen_dispatch_action list, code }.
|
145
|
-
should == (<<-CODE).strip
|
146
|
-
begin
|
147
|
-
a = []
|
148
|
-
ep = nil
|
149
|
-
while r = @scanner.scan(/w+/)
|
150
|
-
ep = @scanner.pos
|
151
|
-
a << r
|
152
|
-
break unless @scanner.skip(/[,;]/)
|
153
|
-
end
|
154
|
-
@scanner.pos = ep unless ep.nil?
|
155
|
-
Word.parsed(select_captures(a))
|
156
|
-
end
|
157
|
-
CODE
|
158
|
-
end
|
159
|
-
end
|
160
|
-
|
161
|
-
context 'when top-level' do
|
162
|
-
it 'generates top level list matching code with a dispatch action' do
|
163
|
-
top_level_code {|g| g.gen_dispatch_action list, code }.
|
164
|
-
should == (<<-CODE).strip
|
165
|
-
a = []
|
166
|
-
ep = nil
|
167
|
-
while r = @scanner.scan(/w+/)
|
168
|
-
ep = @scanner.pos
|
169
|
-
a << r
|
170
|
-
break unless @scanner.skip(/[,;]/)
|
171
|
-
end
|
172
|
-
@scanner.pos = ep unless ep.nil?
|
173
|
-
Word.parsed(select_captures(a))
|
174
|
-
CODE
|
175
|
-
end
|
176
|
-
end
|
177
|
-
end
|
178
|
-
end
|
179
|
-
|
180
|
-
describe '#gen_direct_action' do
|
181
|
-
|
182
|
-
let(:code) { ActionCode.new('|_| _.size') }
|
183
|
-
|
184
|
-
context 'given a list with zero-or-more bounds' do
|
185
|
-
|
186
|
-
context 'when nested' do
|
187
|
-
it 'generates nested list matching code with a dispatch action' do
|
188
|
-
nested_code {|g| g.gen_direct_action list, code }.
|
189
|
-
should == (<<-CODE).strip
|
190
|
-
begin
|
191
|
-
a = []
|
192
|
-
ep = nil
|
193
|
-
while r = @scanner.scan(/w+/)
|
194
|
-
ep = @scanner.pos
|
195
|
-
a << r
|
196
|
-
break unless @scanner.skip(/[,;]/)
|
197
|
-
end
|
198
|
-
@scanner.pos = ep unless ep.nil?
|
199
|
-
(select_captures(a).size)
|
200
|
-
end
|
201
|
-
CODE
|
202
|
-
end
|
203
|
-
end
|
204
|
-
|
205
|
-
context 'when top-level' do
|
206
|
-
it 'generates top level list matching code with a dispatch action' do
|
207
|
-
top_level_code {|g| g.gen_direct_action list, code }.
|
208
|
-
should == (<<-CODE).strip
|
209
|
-
a = []
|
210
|
-
ep = nil
|
211
|
-
while r = @scanner.scan(/w+/)
|
212
|
-
ep = @scanner.pos
|
213
|
-
a << r
|
214
|
-
break unless @scanner.skip(/[,;]/)
|
215
|
-
end
|
216
|
-
@scanner.pos = ep unless ep.nil?
|
217
|
-
(select_captures(a).size)
|
218
|
-
CODE
|
219
|
-
end
|
220
|
-
end
|
221
|
-
end
|
222
|
-
end
|
223
|
-
|
224
136
|
describe '#gen_skip' do
|
225
137
|
|
226
138
|
context 'given a list with zero-or-more bounds' do
|
@@ -142,94 +142,6 @@ r
|
|
142
142
|
end
|
143
143
|
end
|
144
144
|
|
145
|
-
describe '#gen_dispatch_action' do
|
146
|
-
|
147
|
-
let(:code) { NodeCode.new('Word', 'parsed') }
|
148
|
-
|
149
|
-
context 'given a list with one-or-more bounds' do
|
150
|
-
|
151
|
-
context 'when nested' do
|
152
|
-
it 'generates nested list matching code with a dispatch action' do
|
153
|
-
nested_code {|g| g.gen_dispatch_action list, code }.
|
154
|
-
should == (<<-CODE).strip
|
155
|
-
begin
|
156
|
-
a = []
|
157
|
-
ep = nil
|
158
|
-
while r = @scanner.scan(/w+/)
|
159
|
-
ep = @scanner.pos
|
160
|
-
a << r
|
161
|
-
break unless @scanner.skip(/[,;]/)
|
162
|
-
end
|
163
|
-
@scanner.pos = ep unless ep.nil?
|
164
|
-
Word.parsed(select_captures(a)) unless a.empty?
|
165
|
-
end
|
166
|
-
CODE
|
167
|
-
end
|
168
|
-
end
|
169
|
-
|
170
|
-
context 'when top-level' do
|
171
|
-
it 'generates top level list matching code with a dispatch action' do
|
172
|
-
top_level_code {|g| g.gen_dispatch_action list, code }.
|
173
|
-
should == (<<-CODE).strip
|
174
|
-
a = []
|
175
|
-
ep = nil
|
176
|
-
while r = @scanner.scan(/w+/)
|
177
|
-
ep = @scanner.pos
|
178
|
-
a << r
|
179
|
-
break unless @scanner.skip(/[,;]/)
|
180
|
-
end
|
181
|
-
@scanner.pos = ep unless ep.nil?
|
182
|
-
Word.parsed(select_captures(a)) unless a.empty?
|
183
|
-
CODE
|
184
|
-
end
|
185
|
-
end
|
186
|
-
end
|
187
|
-
end
|
188
|
-
|
189
|
-
describe '#gen_direct_action' do
|
190
|
-
|
191
|
-
let(:code) { ActionCode.new('|_| _.size') }
|
192
|
-
|
193
|
-
context 'given a list with one-or-more bounds' do
|
194
|
-
|
195
|
-
context 'when nested' do
|
196
|
-
it 'generates nested list matching code with a dispatch action' do
|
197
|
-
nested_code {|g| g.gen_direct_action list, code }.
|
198
|
-
should == (<<-CODE).strip
|
199
|
-
begin
|
200
|
-
a = []
|
201
|
-
ep = nil
|
202
|
-
while r = @scanner.scan(/w+/)
|
203
|
-
ep = @scanner.pos
|
204
|
-
a << r
|
205
|
-
break unless @scanner.skip(/[,;]/)
|
206
|
-
end
|
207
|
-
@scanner.pos = ep unless ep.nil?
|
208
|
-
(select_captures(a).size) unless a.empty?
|
209
|
-
end
|
210
|
-
CODE
|
211
|
-
end
|
212
|
-
end
|
213
|
-
|
214
|
-
context 'when top-level' do
|
215
|
-
it 'generates top level list matching code with a dispatch action' do
|
216
|
-
top_level_code {|g| g.gen_direct_action list, code }.
|
217
|
-
should == (<<-CODE).strip
|
218
|
-
a = []
|
219
|
-
ep = nil
|
220
|
-
while r = @scanner.scan(/w+/)
|
221
|
-
ep = @scanner.pos
|
222
|
-
a << r
|
223
|
-
break unless @scanner.skip(/[,;]/)
|
224
|
-
end
|
225
|
-
@scanner.pos = ep unless ep.nil?
|
226
|
-
(select_captures(a).size) unless a.empty?
|
227
|
-
CODE
|
228
|
-
end
|
229
|
-
end
|
230
|
-
end
|
231
|
-
end
|
232
|
-
|
233
145
|
describe '#gen_skip' do
|
234
146
|
|
235
147
|
context 'given a list with one-or-more bounds' do
|
@@ -4,7 +4,7 @@ require File.expand_path(File.dirname(__FILE__) + '/list1_generator_examples')
|
|
4
4
|
|
5
5
|
include Rattler::Parsers
|
6
6
|
|
7
|
-
describe Rattler::
|
7
|
+
describe Rattler::Compiler::ParserGenerator::ListGenerator do
|
8
8
|
|
9
9
|
include ParserGeneratorSpecHelper
|
10
10
|
|
@@ -412,232 +412,6 @@ c < 2
|
|
412
412
|
end
|
413
413
|
end
|
414
414
|
|
415
|
-
describe '#gen_dispatch_action' do
|
416
|
-
|
417
|
-
let(:code) { NodeCode.new('Word', 'parsed') }
|
418
|
-
|
419
|
-
context 'given a list with an upper bound' do
|
420
|
-
|
421
|
-
let(:bounds) { [2, 4] }
|
422
|
-
|
423
|
-
context 'when nested' do
|
424
|
-
it 'generates nested list matching code with a dispatch action' do
|
425
|
-
nested_code {|g| g.gen_dispatch_action list, code }.
|
426
|
-
should == (<<-CODE).strip
|
427
|
-
begin
|
428
|
-
a = []
|
429
|
-
sp = @scanner.pos
|
430
|
-
ep = nil
|
431
|
-
while r = @scanner.scan(/w+/)
|
432
|
-
ep = @scanner.pos
|
433
|
-
a << r
|
434
|
-
break unless a.size < 4
|
435
|
-
break unless @scanner.skip(/[,;]/)
|
436
|
-
end
|
437
|
-
if a.size >= 2
|
438
|
-
@scanner.pos = ep unless ep.nil?
|
439
|
-
Word.parsed(select_captures(a))
|
440
|
-
else
|
441
|
-
@scanner.pos = sp
|
442
|
-
false
|
443
|
-
end
|
444
|
-
end
|
445
|
-
CODE
|
446
|
-
end
|
447
|
-
end
|
448
|
-
|
449
|
-
context 'when top-level' do
|
450
|
-
it 'generates top level list matching code with a dispatch action' do
|
451
|
-
top_level_code {|g| g.gen_dispatch_action list, code }.
|
452
|
-
should == (<<-CODE).strip
|
453
|
-
a = []
|
454
|
-
sp = @scanner.pos
|
455
|
-
ep = nil
|
456
|
-
while r = @scanner.scan(/w+/)
|
457
|
-
ep = @scanner.pos
|
458
|
-
a << r
|
459
|
-
break unless a.size < 4
|
460
|
-
break unless @scanner.skip(/[,;]/)
|
461
|
-
end
|
462
|
-
if a.size >= 2
|
463
|
-
@scanner.pos = ep unless ep.nil?
|
464
|
-
Word.parsed(select_captures(a))
|
465
|
-
else
|
466
|
-
@scanner.pos = sp
|
467
|
-
false
|
468
|
-
end
|
469
|
-
CODE
|
470
|
-
end
|
471
|
-
end
|
472
|
-
end
|
473
|
-
|
474
|
-
context 'given a list with no upper bound' do
|
475
|
-
|
476
|
-
let(:bounds) { [2, nil] }
|
477
|
-
|
478
|
-
context 'when nested' do
|
479
|
-
it 'generates nested list matching code with a dispatch action' do
|
480
|
-
nested_code {|g| g.gen_dispatch_action list, code }.
|
481
|
-
should == (<<-CODE).strip
|
482
|
-
begin
|
483
|
-
a = []
|
484
|
-
sp = @scanner.pos
|
485
|
-
ep = nil
|
486
|
-
while r = @scanner.scan(/w+/)
|
487
|
-
ep = @scanner.pos
|
488
|
-
a << r
|
489
|
-
break unless @scanner.skip(/[,;]/)
|
490
|
-
end
|
491
|
-
if a.size >= 2
|
492
|
-
@scanner.pos = ep unless ep.nil?
|
493
|
-
Word.parsed(select_captures(a))
|
494
|
-
else
|
495
|
-
@scanner.pos = sp
|
496
|
-
false
|
497
|
-
end
|
498
|
-
end
|
499
|
-
CODE
|
500
|
-
end
|
501
|
-
end
|
502
|
-
|
503
|
-
context 'when top-level' do
|
504
|
-
it 'generates top level list matching code with a dispatch action' do
|
505
|
-
top_level_code {|g| g.gen_dispatch_action list, code }.
|
506
|
-
should == (<<-CODE).strip
|
507
|
-
a = []
|
508
|
-
sp = @scanner.pos
|
509
|
-
ep = nil
|
510
|
-
while r = @scanner.scan(/w+/)
|
511
|
-
ep = @scanner.pos
|
512
|
-
a << r
|
513
|
-
break unless @scanner.skip(/[,;]/)
|
514
|
-
end
|
515
|
-
if a.size >= 2
|
516
|
-
@scanner.pos = ep unless ep.nil?
|
517
|
-
Word.parsed(select_captures(a))
|
518
|
-
else
|
519
|
-
@scanner.pos = sp
|
520
|
-
false
|
521
|
-
end
|
522
|
-
CODE
|
523
|
-
end
|
524
|
-
end
|
525
|
-
end
|
526
|
-
end
|
527
|
-
|
528
|
-
describe '#gen_direct_action' do
|
529
|
-
|
530
|
-
let(:code) { ActionCode.new('|_| _.size') }
|
531
|
-
|
532
|
-
context 'given a list with an upper bound' do
|
533
|
-
|
534
|
-
let(:bounds) { [2, 4] }
|
535
|
-
|
536
|
-
context 'when nested' do
|
537
|
-
it 'generates nested list matching code with a dispatch action' do
|
538
|
-
nested_code {|g| g.gen_direct_action list, code }.
|
539
|
-
should == (<<-CODE).strip
|
540
|
-
begin
|
541
|
-
a = []
|
542
|
-
sp = @scanner.pos
|
543
|
-
ep = nil
|
544
|
-
while r = @scanner.scan(/w+/)
|
545
|
-
ep = @scanner.pos
|
546
|
-
a << r
|
547
|
-
break unless a.size < 4
|
548
|
-
break unless @scanner.skip(/[,;]/)
|
549
|
-
end
|
550
|
-
if a.size >= 2
|
551
|
-
@scanner.pos = ep unless ep.nil?
|
552
|
-
(select_captures(a).size)
|
553
|
-
else
|
554
|
-
@scanner.pos = sp
|
555
|
-
false
|
556
|
-
end
|
557
|
-
end
|
558
|
-
CODE
|
559
|
-
end
|
560
|
-
end
|
561
|
-
|
562
|
-
context 'when top-level' do
|
563
|
-
it 'generates top level list matching code with a dispatch action' do
|
564
|
-
top_level_code {|g| g.gen_direct_action list, code }.
|
565
|
-
should == (<<-CODE).strip
|
566
|
-
a = []
|
567
|
-
sp = @scanner.pos
|
568
|
-
ep = nil
|
569
|
-
while r = @scanner.scan(/w+/)
|
570
|
-
ep = @scanner.pos
|
571
|
-
a << r
|
572
|
-
break unless a.size < 4
|
573
|
-
break unless @scanner.skip(/[,;]/)
|
574
|
-
end
|
575
|
-
if a.size >= 2
|
576
|
-
@scanner.pos = ep unless ep.nil?
|
577
|
-
(select_captures(a).size)
|
578
|
-
else
|
579
|
-
@scanner.pos = sp
|
580
|
-
false
|
581
|
-
end
|
582
|
-
CODE
|
583
|
-
end
|
584
|
-
end
|
585
|
-
end
|
586
|
-
|
587
|
-
context 'given a list with no upper bound' do
|
588
|
-
|
589
|
-
let(:bounds) { [2, nil] }
|
590
|
-
|
591
|
-
context 'when nested' do
|
592
|
-
it 'generates nested list matching code with a dispatch action' do
|
593
|
-
nested_code {|g| g.gen_direct_action list, code }.
|
594
|
-
should == (<<-CODE).strip
|
595
|
-
begin
|
596
|
-
a = []
|
597
|
-
sp = @scanner.pos
|
598
|
-
ep = nil
|
599
|
-
while r = @scanner.scan(/w+/)
|
600
|
-
ep = @scanner.pos
|
601
|
-
a << r
|
602
|
-
break unless @scanner.skip(/[,;]/)
|
603
|
-
end
|
604
|
-
if a.size >= 2
|
605
|
-
@scanner.pos = ep unless ep.nil?
|
606
|
-
(select_captures(a).size)
|
607
|
-
else
|
608
|
-
@scanner.pos = sp
|
609
|
-
false
|
610
|
-
end
|
611
|
-
end
|
612
|
-
CODE
|
613
|
-
end
|
614
|
-
end
|
615
|
-
|
616
|
-
context 'when top-level' do
|
617
|
-
it 'generates top level list matching code with a dispatch action' do
|
618
|
-
top_level_code {|g| g.gen_direct_action list, code }.
|
619
|
-
should == (<<-CODE).strip
|
620
|
-
a = []
|
621
|
-
sp = @scanner.pos
|
622
|
-
ep = nil
|
623
|
-
while r = @scanner.scan(/w+/)
|
624
|
-
ep = @scanner.pos
|
625
|
-
a << r
|
626
|
-
break unless @scanner.skip(/[,;]/)
|
627
|
-
end
|
628
|
-
if a.size >= 2
|
629
|
-
@scanner.pos = ep unless ep.nil?
|
630
|
-
(select_captures(a).size)
|
631
|
-
else
|
632
|
-
@scanner.pos = sp
|
633
|
-
false
|
634
|
-
end
|
635
|
-
CODE
|
636
|
-
end
|
637
|
-
end
|
638
|
-
end
|
639
|
-
end
|
640
|
-
|
641
415
|
describe '#gen_skip' do
|
642
416
|
|
643
417
|
context 'given a list with no upper bound' do
|