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,187 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
2
|
-
|
3
|
-
shared_examples_for 'a compiled parser with a disallow' do
|
4
|
-
include CompilerSpecHelper
|
5
|
-
|
6
|
-
subject { compiled_parser }
|
7
|
-
|
8
|
-
let(:reference_parser) { combinator_parser grammar }
|
9
|
-
|
10
|
-
context 'with a nested match rule' do
|
11
|
-
let(:grammar) { define_grammar do
|
12
|
-
rule(:word) { disallow /\w+/ }
|
13
|
-
end }
|
14
|
-
it { should parse(' ').succeeding.like reference_parser }
|
15
|
-
it { should parse('abc123 ').failing.like reference_parser }
|
16
|
-
end
|
17
|
-
|
18
|
-
context 'with a nested eof rule' do
|
19
|
-
let(:grammar) { define_grammar do
|
20
|
-
rule(:foo) { disallow(eof) }
|
21
|
-
end }
|
22
|
-
it { should parse('foo').succeeding.like reference_parser }
|
23
|
-
it { should parse('').failing.like reference_parser }
|
24
|
-
it { should parse('foo').from(3).failing.like reference_parser }
|
25
|
-
end
|
26
|
-
|
27
|
-
context 'with a nested "E" symbol rule' do
|
28
|
-
let(:grammar) { define_grammar do
|
29
|
-
rule(:foo) { disallow(e) }
|
30
|
-
end }
|
31
|
-
it { should parse('').failing.like reference_parser }
|
32
|
-
it { should parse('foo').failing.like reference_parser }
|
33
|
-
end
|
34
|
-
|
35
|
-
context 'with a nested choice rule' do
|
36
|
-
let(:grammar) { define_grammar do
|
37
|
-
rule(:word) { disallow(match(/[[:alpha:]]/) | match(/[[:digit:]]/)) }
|
38
|
-
end }
|
39
|
-
it { should parse(' ').succeeding.like reference_parser }
|
40
|
-
it { should parse('abc123 ').failing.like reference_parser }
|
41
|
-
end
|
42
|
-
|
43
|
-
context 'with a nested sequence rule' do
|
44
|
-
let(:grammar) { define_grammar do
|
45
|
-
rule(:word) { disallow(match(/[[:alpha:]]+/) & match(/[[:digit:]]+/)) }
|
46
|
-
end }
|
47
|
-
it { should parse(' ').succeeding.like reference_parser }
|
48
|
-
it { should parse('abc123 ').failing.like reference_parser }
|
49
|
-
end
|
50
|
-
|
51
|
-
context 'with a nested optional rule' do
|
52
|
-
let(:grammar) { define_grammar do
|
53
|
-
rule(:word) { disallow(optional(/\w+/)) }
|
54
|
-
end }
|
55
|
-
it { should parse(' ').failing.like reference_parser }
|
56
|
-
it { should parse('abc123 ').failing.like reference_parser }
|
57
|
-
end
|
58
|
-
|
59
|
-
context 'with a nested zero_or_more rule' do
|
60
|
-
let(:grammar) { define_grammar do
|
61
|
-
rule(:word) { disallow(zero_or_more(/\w/)) }
|
62
|
-
end }
|
63
|
-
it { should parse(' ').failing.like reference_parser }
|
64
|
-
it { should parse('abc123 ').failing.like reference_parser }
|
65
|
-
end
|
66
|
-
|
67
|
-
context 'with a nested one_or_more rule' do
|
68
|
-
let(:grammar) { define_grammar do
|
69
|
-
rule(:word) { disallow(one_or_more(/\w/)) }
|
70
|
-
end }
|
71
|
-
it { should parse(' ').succeeding.like reference_parser }
|
72
|
-
it { should parse('abc123 ').failing.like reference_parser }
|
73
|
-
end
|
74
|
-
|
75
|
-
context 'with a nested repeat rule' do
|
76
|
-
let(:grammar) { define_grammar do
|
77
|
-
rule(:word) { disallow(repeat(/\w/, 2, nil)) }
|
78
|
-
end }
|
79
|
-
it { should parse('a ').succeeding.like reference_parser }
|
80
|
-
it { should parse('abc123 ').failing.like reference_parser }
|
81
|
-
|
82
|
-
context 'with zero-or-more bounds' do
|
83
|
-
let(:grammar) { define_grammar do
|
84
|
-
rule(:word) { disallow(repeat(/\w/, 0, nil)) }
|
85
|
-
end }
|
86
|
-
it { should parse(' ').failing.like reference_parser }
|
87
|
-
it { should parse('abc123 ').failing.like reference_parser }
|
88
|
-
|
89
|
-
context 'with an upper bound' do
|
90
|
-
let(:grammar) { define_grammar do
|
91
|
-
rule(:word) { disallow(repeat(/\w/, 0, 2)) }
|
92
|
-
end }
|
93
|
-
it { should parse(' ').failing.like reference_parser }
|
94
|
-
it { should parse('abc123 ').failing.like reference_parser }
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
context 'with one-or-more bounds' do
|
99
|
-
let(:grammar) { define_grammar do
|
100
|
-
rule(:word) { disallow(repeat(/\w/, 1, nil)) }
|
101
|
-
end }
|
102
|
-
it { should parse(' ').succeeding.like reference_parser }
|
103
|
-
it { should parse('abc123 ').failing.like reference_parser }
|
104
|
-
|
105
|
-
context 'with an upper bound' do
|
106
|
-
let(:grammar) { define_grammar do
|
107
|
-
rule(:word) { disallow(repeat(/\w/, 1, 2)) }
|
108
|
-
end }
|
109
|
-
it { should parse(' ').succeeding.like reference_parser }
|
110
|
-
it { should parse('abc123 ').failing.like reference_parser }
|
111
|
-
end
|
112
|
-
end
|
113
|
-
end
|
114
|
-
|
115
|
-
context 'with a nested list rule' do
|
116
|
-
let(:grammar) { define_grammar do
|
117
|
-
rule :foo do
|
118
|
-
disallow list(/\w+/, /[,;]/, 2, nil)
|
119
|
-
end
|
120
|
-
end }
|
121
|
-
it { should parse('foo ').succeeding.like reference_parser }
|
122
|
-
it { should parse('foo,bar;baz ').failing.like reference_parser }
|
123
|
-
|
124
|
-
context 'with an upper bound' do
|
125
|
-
let(:grammar) { define_grammar do
|
126
|
-
rule :foo do
|
127
|
-
disallow list(/\w+/, /[,;]/, 2, 4)
|
128
|
-
end
|
129
|
-
end }
|
130
|
-
it { should parse('foo ').succeeding.like reference_parser }
|
131
|
-
it { should parse('foo,bar;baz ').failing.like reference_parser }
|
132
|
-
end
|
133
|
-
|
134
|
-
context 'with a non-capturing parser' do
|
135
|
-
let(:grammar) { define_grammar do
|
136
|
-
rule :foo do
|
137
|
-
disallow list(skip(/\w+/), /[,;]/, 2, nil)
|
138
|
-
end
|
139
|
-
end }
|
140
|
-
it { should parse('foo ').succeeding.like reference_parser }
|
141
|
-
it { should parse('foo,bar;baz ').failing.like reference_parser }
|
142
|
-
|
143
|
-
context 'with an upper bound' do
|
144
|
-
let(:grammar) { define_grammar do
|
145
|
-
rule :foo do
|
146
|
-
disallow list(skip(/\w+/), /[,;]/, 2, 4)
|
147
|
-
end
|
148
|
-
end }
|
149
|
-
it { should parse('foo ').succeeding.like reference_parser }
|
150
|
-
it { should parse('foo,bar;baz ').failing.like reference_parser }
|
151
|
-
end
|
152
|
-
end
|
153
|
-
end
|
154
|
-
|
155
|
-
context 'with a nested apply rule' do
|
156
|
-
let(:grammar) { define_grammar do
|
157
|
-
rule(:foo) { match :word }
|
158
|
-
rule(:word) { disallow /\w+/ }
|
159
|
-
end }
|
160
|
-
it { should parse(' ').succeeding.like reference_parser }
|
161
|
-
it { should parse('abc123 ').failing.like reference_parser }
|
162
|
-
end
|
163
|
-
|
164
|
-
context 'with a nested dispatch-action rule' do
|
165
|
-
let(:grammar) { define_grammar do
|
166
|
-
rule(:word) { disallow(dispatch_action(/\w+/)) }
|
167
|
-
end }
|
168
|
-
it { should parse(' ').succeeding.like reference_parser }
|
169
|
-
it { should parse('abc123 ').failing.like reference_parser }
|
170
|
-
end
|
171
|
-
|
172
|
-
context 'with a nested token rule' do
|
173
|
-
let(:grammar) { define_grammar do
|
174
|
-
rule(:word) { disallow(token(match(/\w+/))) }
|
175
|
-
end }
|
176
|
-
it { should parse(' ').succeeding.like reference_parser }
|
177
|
-
it { should parse('abc123 ').failing.like reference_parser }
|
178
|
-
end
|
179
|
-
|
180
|
-
context 'with a nested skip rule' do
|
181
|
-
let(:grammar) { define_grammar do
|
182
|
-
rule(:word) { disallow(skip(/\w+/)) }
|
183
|
-
end }
|
184
|
-
it { should parse(' ').succeeding.like reference_parser }
|
185
|
-
it { should parse('abc123 ').failing.like reference_parser }
|
186
|
-
end
|
187
|
-
end
|
@@ -1,225 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
2
|
-
|
3
|
-
shared_examples_for 'a compiled parser with a dispatch action' do
|
4
|
-
include CompilerSpecHelper
|
5
|
-
|
6
|
-
subject { compiled_parser }
|
7
|
-
|
8
|
-
let(:reference_parser) { combinator_parser grammar }
|
9
|
-
|
10
|
-
context 'with a nested match rule' do
|
11
|
-
let(:grammar) { define_grammar do
|
12
|
-
rule(:digits) { dispatch_action(/\d+/) }
|
13
|
-
end }
|
14
|
-
it { should parse('451a').succeeding.like reference_parser }
|
15
|
-
it { should parse(' ').failing.like reference_parser }
|
16
|
-
|
17
|
-
context 'with a label' do
|
18
|
-
let(:grammar) { define_grammar do
|
19
|
-
rule(:digits) { dispatch_action(label(:num, /\d+/)) }
|
20
|
-
end }
|
21
|
-
it { should parse('451a').succeeding.like reference_parser }
|
22
|
-
it { should parse(' ').failing.like reference_parser }
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
context 'with a nested apply rule' do
|
27
|
-
let(:grammar) { define_grammar do
|
28
|
-
rule(:digit) { match(/\d/) }
|
29
|
-
rule(:foo) { dispatch_action :digit }
|
30
|
-
end }
|
31
|
-
it { should parse('451 ').twice.succeeding.like reference_parser }
|
32
|
-
it { should parse('hi').failing.like reference_parser }
|
33
|
-
|
34
|
-
context 'with a label' do
|
35
|
-
let(:grammar) { define_grammar do
|
36
|
-
rule(:digits) { match(/\d+/) }
|
37
|
-
rule(:num) { dispatch_action(label(:num, :digits)) }
|
38
|
-
end }
|
39
|
-
it { should parse('451a').succeeding.like reference_parser }
|
40
|
-
it { should parse(' ').failing.like reference_parser }
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
context 'with a nested assert rule' do
|
45
|
-
let(:grammar) { define_grammar do
|
46
|
-
rule(:foo) { dispatch_action(assert(/\d/)) }
|
47
|
-
end }
|
48
|
-
it { should parse('451a').succeeding.like reference_parser }
|
49
|
-
it { should parse(' ').failing.like reference_parser }
|
50
|
-
end
|
51
|
-
|
52
|
-
context 'with a nested disallow rule' do
|
53
|
-
let(:grammar) { define_grammar do
|
54
|
-
rule(:foo) { dispatch_action(disallow(/\d/)) }
|
55
|
-
end }
|
56
|
-
it { should parse(' ').succeeding.like reference_parser }
|
57
|
-
it { should parse('451a').failing.like reference_parser }
|
58
|
-
end
|
59
|
-
|
60
|
-
context 'with a nested eof rule' do
|
61
|
-
let(:grammar) { define_grammar do
|
62
|
-
rule(:foo) { dispatch_action(eof) }
|
63
|
-
end }
|
64
|
-
it { should parse('').succeeding.like reference_parser }
|
65
|
-
it { should parse('foo').from(3).succeeding.like reference_parser }
|
66
|
-
it { should parse('foo').failing.like reference_parser }
|
67
|
-
end
|
68
|
-
|
69
|
-
context 'with a nested "E" symbol rule' do
|
70
|
-
let(:grammar) { define_grammar do
|
71
|
-
rule(:foo) { dispatch_action(e) }
|
72
|
-
end }
|
73
|
-
it { should parse('').succeeding.like reference_parser }
|
74
|
-
it { should parse('foo').succeeding.like reference_parser }
|
75
|
-
end
|
76
|
-
|
77
|
-
context 'with a nested choice rule' do
|
78
|
-
let(:grammar) { define_grammar do
|
79
|
-
rule :atom do
|
80
|
-
dispatch_action(match(/[[:alpha:]]+/) | match(/[[:digit:]]+/))
|
81
|
-
end
|
82
|
-
end }
|
83
|
-
|
84
|
-
it { should parse('451a').succeeding.like reference_parser }
|
85
|
-
it { should parse(' ').failing.like reference_parser }
|
86
|
-
end
|
87
|
-
|
88
|
-
context 'with a nested sequence rule' do
|
89
|
-
let(:grammar) { define_grammar do
|
90
|
-
rule :assignment do
|
91
|
-
dispatch_action(
|
92
|
-
match(/[[:alpha:]]+/) &
|
93
|
-
match('=') &
|
94
|
-
match(/[[:digit:]]+/)
|
95
|
-
)
|
96
|
-
end
|
97
|
-
end }
|
98
|
-
|
99
|
-
it { should parse('val=42 ').succeeding.like reference_parser }
|
100
|
-
it { should parse('val=x').failing.like reference_parser }
|
101
|
-
|
102
|
-
context 'with labels' do
|
103
|
-
let(:grammar) { define_grammar do
|
104
|
-
rule :assignment do
|
105
|
-
dispatch_action(
|
106
|
-
label(:name, /[[:alpha:]]+/) &
|
107
|
-
match('=') &
|
108
|
-
label(:value, /[[:digit:]]+/)
|
109
|
-
)
|
110
|
-
end
|
111
|
-
end }
|
112
|
-
it { should parse('val=42 ').succeeding.like reference_parser }
|
113
|
-
end
|
114
|
-
end
|
115
|
-
|
116
|
-
context 'with a nested optional rule' do
|
117
|
-
let(:grammar) { define_grammar do
|
118
|
-
rule :foo do
|
119
|
-
dispatch_action(optional(/\w+/))
|
120
|
-
end
|
121
|
-
end }
|
122
|
-
it { should parse('foo ').succeeding.like reference_parser }
|
123
|
-
it { should parse(' ').succeeding.like reference_parser }
|
124
|
-
end
|
125
|
-
|
126
|
-
context 'with a nested zero-or-more rule' do
|
127
|
-
let(:grammar) { define_grammar do
|
128
|
-
rule :foo do
|
129
|
-
dispatch_action(zero_or_more(/\w/))
|
130
|
-
end
|
131
|
-
end }
|
132
|
-
it { should parse('foo ').succeeding.like reference_parser }
|
133
|
-
it { should parse(' ').succeeding.like reference_parser }
|
134
|
-
end
|
135
|
-
|
136
|
-
context 'with a nested one-or-more rule' do
|
137
|
-
let(:grammar) { define_grammar do
|
138
|
-
rule :foo do
|
139
|
-
dispatch_action(one_or_more(/\w/))
|
140
|
-
end
|
141
|
-
end }
|
142
|
-
it { should parse('foo ').succeeding.like reference_parser }
|
143
|
-
it { should parse(' ').failing.like reference_parser }
|
144
|
-
end
|
145
|
-
|
146
|
-
context 'with a nested repeat rule' do
|
147
|
-
let(:grammar) { define_grammar do
|
148
|
-
rule :foo do
|
149
|
-
dispatch_action(repeat(/\w/, 2, 4))
|
150
|
-
end
|
151
|
-
end }
|
152
|
-
it { should parse('foo ').succeeding.like reference_parser }
|
153
|
-
it { should parse('abcde ').succeeding.like reference_parser }
|
154
|
-
it { should parse('a ').failing.like reference_parser }
|
155
|
-
|
156
|
-
context 'with optional bounds' do
|
157
|
-
let(:grammar) { define_grammar do
|
158
|
-
rule :foo do
|
159
|
-
dispatch_action(repeat(/\w+/, 0, 1))
|
160
|
-
end
|
161
|
-
end }
|
162
|
-
it { should parse('foo ').succeeding.like reference_parser }
|
163
|
-
it { should parse(' ').succeeding.like reference_parser }
|
164
|
-
end
|
165
|
-
|
166
|
-
context 'with zero-or-more bounds' do
|
167
|
-
let(:grammar) { define_grammar do
|
168
|
-
rule :foo do
|
169
|
-
dispatch_action(repeat(/\w/, 0, nil))
|
170
|
-
end
|
171
|
-
end }
|
172
|
-
it { should parse('foo ').succeeding.like reference_parser }
|
173
|
-
it { should parse(' ').succeeding.like reference_parser }
|
174
|
-
end
|
175
|
-
|
176
|
-
context 'with one-or-more bounds' do
|
177
|
-
let(:grammar) { define_grammar do
|
178
|
-
rule :foo do
|
179
|
-
dispatch_action(repeat(/\w/, 1, nil))
|
180
|
-
end
|
181
|
-
end }
|
182
|
-
it { should parse('foo ').succeeding.like reference_parser }
|
183
|
-
it { should parse(' ').failing.like reference_parser }
|
184
|
-
end
|
185
|
-
end
|
186
|
-
|
187
|
-
context 'with a nested list rule' do
|
188
|
-
let(:grammar) { define_grammar do
|
189
|
-
rule :foo do
|
190
|
-
dispatch_action(list(/\w+/, /,/, 1, nil))
|
191
|
-
end
|
192
|
-
end }
|
193
|
-
it { should parse('a,bc,d ').succeeding.like reference_parser }
|
194
|
-
it { should parse(' ').failing.like reference_parser }
|
195
|
-
end
|
196
|
-
|
197
|
-
context 'with a nested apply rule' do
|
198
|
-
let(:grammar) { define_grammar do
|
199
|
-
rule(:digit) { match /\d/ }
|
200
|
-
rule(:foo) { dispatch_action :digit }
|
201
|
-
end }
|
202
|
-
it { should parse('451a').succeeding.twice.like reference_parser }
|
203
|
-
it { should parse(' ').failing.like reference_parser }
|
204
|
-
end
|
205
|
-
|
206
|
-
context 'with a nested token rule' do
|
207
|
-
let(:grammar) { define_grammar do
|
208
|
-
rule :foo do
|
209
|
-
dispatch_action(token(match(/\w+/)))
|
210
|
-
end
|
211
|
-
end }
|
212
|
-
it { should parse('abc123').succeeding.like reference_parser }
|
213
|
-
it { should parse(' ').failing.like reference_parser }
|
214
|
-
end
|
215
|
-
|
216
|
-
context 'with a nested skip rule' do
|
217
|
-
let(:grammar) { define_grammar do
|
218
|
-
rule :foo do
|
219
|
-
dispatch_action(skip(/\w+/))
|
220
|
-
end
|
221
|
-
end }
|
222
|
-
it { should parse('abc123').succeeding.like reference_parser }
|
223
|
-
it { should parse(' ').failing.like reference_parser }
|
224
|
-
end
|
225
|
-
end
|
@@ -1,80 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/../../../spec_helper')
|
2
|
-
|
3
|
-
include Rattler::BackEnd::Optimizer
|
4
|
-
include Rattler::Parsers
|
5
|
-
|
6
|
-
describe InlineRegularRules do
|
7
|
-
|
8
|
-
let(:standalone) { OptimizationContext[
|
9
|
-
:type => :capturing,
|
10
|
-
:rules => rule_set,
|
11
|
-
:standalone => true
|
12
|
-
] }
|
13
|
-
|
14
|
-
let(:modular) { OptimizationContext[
|
15
|
-
:type => :capturing,
|
16
|
-
:rules => rule_set
|
17
|
-
] }
|
18
|
-
|
19
|
-
let(:rule_set) { RuleSet[rule_a, {:start_rule => :a}] }
|
20
|
-
|
21
|
-
describe '#apply' do
|
22
|
-
|
23
|
-
context 'given a reference to a regular rule' do
|
24
|
-
|
25
|
-
let(:rule_a) { Rule[:a, Match[/a/]] }
|
26
|
-
|
27
|
-
it 'inlines the regular rule' do
|
28
|
-
subject.apply(Apply[:a], standalone).should == Match[/a/]
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
describe '#_applies_to?' do
|
34
|
-
|
35
|
-
context 'with the :standalone option set' do
|
36
|
-
|
37
|
-
context 'given a reference to a regular rule' do
|
38
|
-
|
39
|
-
let(:rule_a) { Rule[:a, Match[/a/]] }
|
40
|
-
|
41
|
-
it 'returns true' do
|
42
|
-
subject.applies_to?(Apply[:a], standalone).should be_true
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
context 'given a reference to a recursive rule' do
|
47
|
-
|
48
|
-
let(:rule_a) { Rule[:a, Sequence[Match[/a/], Apply[:a]]] }
|
49
|
-
|
50
|
-
it 'returns false' do
|
51
|
-
subject.applies_to?(Apply[:a], standalone).should be_false
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
context 'without the :standalone option set' do
|
57
|
-
|
58
|
-
context 'given a reference to a regular rule' do
|
59
|
-
|
60
|
-
context 'tagged as :inline' do
|
61
|
-
|
62
|
-
let(:rule_a) { Rule[:a, Match[/a/], {:inline => true}] }
|
63
|
-
|
64
|
-
it 'returns true' do
|
65
|
-
subject.applies_to?(Apply[:a], modular).should be_true
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
context 'not tagged as :inline' do
|
70
|
-
|
71
|
-
let(:rule_a) { Rule[:a, Match[/a/]] }
|
72
|
-
|
73
|
-
it 'returns false' do
|
74
|
-
subject.applies_to?(Apply[:a], modular).should be_false
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|