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,152 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
2
|
-
|
3
|
-
shared_examples_for 'a compiled parser with a positive semantic predicate' 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(:num) { semantic_assert(/\d+/, '_.to_i > 200') }
|
13
|
-
end }
|
14
|
-
it { should parse('451a').succeeding.like reference_parser }
|
15
|
-
it { should parse(' ').failing.like reference_parser }
|
16
|
-
it { should parse('123a').failing.like reference_parser }
|
17
|
-
|
18
|
-
context 'with a label' do
|
19
|
-
let(:grammar) { define_grammar do
|
20
|
-
rule(:digits) { semantic_assert(label(:num, /\d+/), 'num.to_i > 200') }
|
21
|
-
end }
|
22
|
-
it { should parse('451a').succeeding.like reference_parser }
|
23
|
-
it { should parse(' ').failing.like reference_parser }
|
24
|
-
it { should parse('123a').failing.like reference_parser }
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
context 'with a nested apply rule' do
|
29
|
-
let(:grammar) { define_grammar do
|
30
|
-
rule(:foo) { semantic_assert :digit, '_.to_i > 200' }
|
31
|
-
rule(:digit) { match(/\d+/) }
|
32
|
-
end }
|
33
|
-
it { should parse('451a').succeeding.like reference_parser }
|
34
|
-
it { should parse(' ').failing.like reference_parser }
|
35
|
-
it { should parse('123a').failing.like reference_parser }
|
36
|
-
|
37
|
-
context 'with a label' do
|
38
|
-
let(:grammar) { define_grammar do
|
39
|
-
rule(:num) { semantic_assert(label(:num, :digits), 'num.to_i > 200') }
|
40
|
-
rule(:digits) { match(/\d+/) }
|
41
|
-
end }
|
42
|
-
it { should parse('451a').succeeding.like reference_parser }
|
43
|
-
it { should parse(' ').failing.like reference_parser }
|
44
|
-
it { should parse('123a').failing.like reference_parser }
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
context 'with a nested choice rule' do
|
49
|
-
let(:grammar) { define_grammar do
|
50
|
-
rule :foo do
|
51
|
-
semantic_assert(
|
52
|
-
match(/[[:alpha:]]+/) | match(/[[:digit:]]+/),
|
53
|
-
'_.size > 2'
|
54
|
-
)
|
55
|
-
end
|
56
|
-
end }
|
57
|
-
|
58
|
-
it { should parse('abc123').succeeding.like reference_parser }
|
59
|
-
it { should parse('12abc').failing.like reference_parser }
|
60
|
-
it { should parse(' ').failing.like reference_parser }
|
61
|
-
end
|
62
|
-
|
63
|
-
context 'with a nested sequence rule' do
|
64
|
-
let(:grammar) { define_grammar do
|
65
|
-
rule :assignment do
|
66
|
-
semantic_assert(
|
67
|
-
match(/\w+/) & match('=') & match(/\w+/),
|
68
|
-
'|l,_,r| l == r'
|
69
|
-
)
|
70
|
-
end
|
71
|
-
end }
|
72
|
-
it { should parse('451a=451a ').succeeding.like reference_parser }
|
73
|
-
it { should parse('451a=123a ').failing.like reference_parser }
|
74
|
-
|
75
|
-
context 'with labels' do
|
76
|
-
let(:grammar) { define_grammar do
|
77
|
-
rule :assignment do
|
78
|
-
semantic_assert(
|
79
|
-
label(:lt, /\w+/) & match('=') & label(:rt, /\w+/),
|
80
|
-
'lt == rt'
|
81
|
-
)
|
82
|
-
end
|
83
|
-
end }
|
84
|
-
it { should parse('451a=451a ').succeeding.like reference_parser }
|
85
|
-
it { should parse('451a=123a ').failing.like reference_parser }
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
context 'with a nested optional rule' do
|
90
|
-
let(:grammar) { define_grammar do
|
91
|
-
rule :foo do
|
92
|
-
semantic_assert(optional(/\w+/), '|_| _.empty?')
|
93
|
-
end
|
94
|
-
end }
|
95
|
-
it { should parse('foo ').failing.like reference_parser }
|
96
|
-
it { should parse(' ').succeeding.like reference_parser }
|
97
|
-
end
|
98
|
-
|
99
|
-
context 'with a nested zero-or-more rule' do
|
100
|
-
let(:grammar) { define_grammar do
|
101
|
-
rule :foo do
|
102
|
-
semantic_assert(zero_or_more(/\w/), '|_| _.size < 4')
|
103
|
-
end
|
104
|
-
end }
|
105
|
-
it { should parse('foo ').succeeding.like reference_parser }
|
106
|
-
it { should parse('food').failing.like reference_parser }
|
107
|
-
it { should parse(' ').succeeding.like reference_parser }
|
108
|
-
end
|
109
|
-
|
110
|
-
context 'with a nested one-or-more rule' do
|
111
|
-
let(:grammar) { define_grammar do
|
112
|
-
rule :foo do
|
113
|
-
semantic_assert(one_or_more(/\w/), '|_| _.size < 4')
|
114
|
-
end
|
115
|
-
end }
|
116
|
-
it { should parse('foo ').succeeding.like reference_parser }
|
117
|
-
it { should parse('food').failing.like reference_parser }
|
118
|
-
it { should parse(' ').failing.like reference_parser }
|
119
|
-
end
|
120
|
-
|
121
|
-
context 'with a nested list rule' do
|
122
|
-
let(:grammar) { define_grammar do
|
123
|
-
rule :foo do
|
124
|
-
semantic_assert(list(/\w+/, /,/, 1, nil), '|_| _.size < 4')
|
125
|
-
end
|
126
|
-
end }
|
127
|
-
it { should parse('a,bc,d ').succeeding.like reference_parser }
|
128
|
-
it { should parse('a,b,c,d').failing.like reference_parser }
|
129
|
-
it { should parse(' ').failing.like reference_parser }
|
130
|
-
end
|
131
|
-
|
132
|
-
context 'with a nested apply rule' do
|
133
|
-
let(:grammar) { define_grammar do
|
134
|
-
rule(:foo) { semantic_assert :digit, '_.to_i > 200' }
|
135
|
-
rule(:digit) { match /\d+/ }
|
136
|
-
end }
|
137
|
-
it { should parse('451a').succeeding.like reference_parser }
|
138
|
-
it { should parse(' ').failing.like reference_parser }
|
139
|
-
it { should parse('123a').failing.like reference_parser }
|
140
|
-
end
|
141
|
-
|
142
|
-
context 'with a nested token rule' do
|
143
|
-
let(:grammar) { define_grammar do
|
144
|
-
rule :foo do
|
145
|
-
semantic_assert(token(/\w+/), '_.size > 5')
|
146
|
-
end
|
147
|
-
end }
|
148
|
-
it { should parse('abc123').succeeding.like reference_parser }
|
149
|
-
it { should parse(' ').failing.like reference_parser }
|
150
|
-
it { should parse('abc12 ').failing.like reference_parser }
|
151
|
-
end
|
152
|
-
end
|
@@ -1,152 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
2
|
-
|
3
|
-
shared_examples_for 'a compiled parser with a negative semantic predicate' 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(:num) { semantic_disallow(/\d+/, '_.to_i > 200') }
|
13
|
-
end }
|
14
|
-
it { should parse('123a').succeeding.like reference_parser }
|
15
|
-
it { should parse(' ').failing.like reference_parser }
|
16
|
-
it { should parse('451a').failing.like reference_parser }
|
17
|
-
|
18
|
-
context 'with a label' do
|
19
|
-
let(:grammar) { define_grammar do
|
20
|
-
rule(:digits) { semantic_disallow(label(:num, /\d+/), 'num.to_i > 200') }
|
21
|
-
end }
|
22
|
-
it { should parse('123a').succeeding.like reference_parser }
|
23
|
-
it { should parse(' ').failing.like reference_parser }
|
24
|
-
it { should parse('451a').failing.like reference_parser }
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
context 'with a nested apply rule' do
|
29
|
-
let(:grammar) { define_grammar do
|
30
|
-
rule(:foo) { semantic_disallow :digit, '_.to_i > 200' }
|
31
|
-
rule(:digit) { match(/\d+/) }
|
32
|
-
end }
|
33
|
-
it { should parse('123a').succeeding.like reference_parser }
|
34
|
-
it { should parse(' ').failing.like reference_parser }
|
35
|
-
it { should parse('451a').failing.like reference_parser }
|
36
|
-
|
37
|
-
context 'with a label' do
|
38
|
-
let(:grammar) { define_grammar do
|
39
|
-
rule(:num) { semantic_disallow(label(:num, :digits), 'num.to_i > 200') }
|
40
|
-
rule(:digits) { match(/\d+/) }
|
41
|
-
end }
|
42
|
-
it { should parse('123a').succeeding.like reference_parser }
|
43
|
-
it { should parse(' ').failing.like reference_parser }
|
44
|
-
it { should parse('451a').failing.like reference_parser }
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
context 'with a nested choice rule' do
|
49
|
-
let(:grammar) { define_grammar do
|
50
|
-
rule :foo do
|
51
|
-
semantic_disallow(
|
52
|
-
match(/[[:alpha:]]+/) | match(/[[:digit:]]+/),
|
53
|
-
'_.size > 2'
|
54
|
-
)
|
55
|
-
end
|
56
|
-
end }
|
57
|
-
|
58
|
-
it { should parse('12abc').succeeding.like reference_parser }
|
59
|
-
it { should parse('abc123').failing.like reference_parser }
|
60
|
-
it { should parse(' ').failing.like reference_parser }
|
61
|
-
end
|
62
|
-
|
63
|
-
context 'with a nested sequence rule' do
|
64
|
-
let(:grammar) { define_grammar do
|
65
|
-
rule :assignment do
|
66
|
-
semantic_disallow(
|
67
|
-
match(/\w+/) & match('=') & match(/\w+/),
|
68
|
-
'|l,_,r| l == r'
|
69
|
-
)
|
70
|
-
end
|
71
|
-
end }
|
72
|
-
it { should parse('451a=123a ').succeeding.like reference_parser }
|
73
|
-
it { should parse('451a=451a ').failing.like reference_parser }
|
74
|
-
|
75
|
-
context 'with labels' do
|
76
|
-
let(:grammar) { define_grammar do
|
77
|
-
rule :assignment do
|
78
|
-
semantic_disallow(
|
79
|
-
label(:lt, /\w+/) & match('=') & label(:rt, /\w+/),
|
80
|
-
'lt == rt'
|
81
|
-
)
|
82
|
-
end
|
83
|
-
end }
|
84
|
-
it { should parse('451a=123a ').succeeding.like reference_parser }
|
85
|
-
it { should parse('451a=451a ').failing.like reference_parser }
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
context 'with a nested optional rule' do
|
90
|
-
let(:grammar) { define_grammar do
|
91
|
-
rule :foo do
|
92
|
-
semantic_disallow(optional(/\w+/), '|_| _.empty?')
|
93
|
-
end
|
94
|
-
end }
|
95
|
-
it { should parse(' ').failing.like reference_parser }
|
96
|
-
it { should parse('foo ').succeeding.like reference_parser }
|
97
|
-
end
|
98
|
-
|
99
|
-
context 'with a nested zero-or-more rule' do
|
100
|
-
let(:grammar) { define_grammar do
|
101
|
-
rule :foo do
|
102
|
-
semantic_disallow(zero_or_more(/\w/), '|_| _.size > 3')
|
103
|
-
end
|
104
|
-
end }
|
105
|
-
it { should parse('foo ').succeeding.like reference_parser }
|
106
|
-
it { should parse('food').failing.like reference_parser }
|
107
|
-
it { should parse(' ').succeeding.like reference_parser }
|
108
|
-
end
|
109
|
-
|
110
|
-
context 'with a nested one-or-more rule' do
|
111
|
-
let(:grammar) { define_grammar do
|
112
|
-
rule :foo do
|
113
|
-
semantic_disallow(one_or_more(/\w/), '|_| _.size > 3')
|
114
|
-
end
|
115
|
-
end }
|
116
|
-
it { should parse('foo ').succeeding.like reference_parser }
|
117
|
-
it { should parse('food').failing.like reference_parser }
|
118
|
-
it { should parse(' ').failing.like reference_parser }
|
119
|
-
end
|
120
|
-
|
121
|
-
context 'with a nested list rule' do
|
122
|
-
let(:grammar) { define_grammar do
|
123
|
-
rule :foo do
|
124
|
-
semantic_disallow(list(/\w+/, /,/, 1, nil), '|_| _.size > 3')
|
125
|
-
end
|
126
|
-
end }
|
127
|
-
it { should parse('a,bc,d ').succeeding.like reference_parser }
|
128
|
-
it { should parse('a,b,c,d').failing.like reference_parser }
|
129
|
-
it { should parse(' ').failing.like reference_parser }
|
130
|
-
end
|
131
|
-
|
132
|
-
context 'with a nested apply rule' do
|
133
|
-
let(:grammar) { define_grammar do
|
134
|
-
rule(:foo) { semantic_disallow :digit, '_.to_i > 200' }
|
135
|
-
rule(:digit) { match /\d+/ }
|
136
|
-
end }
|
137
|
-
it { should parse('123a').succeeding.like reference_parser }
|
138
|
-
it { should parse(' ').failing.like reference_parser }
|
139
|
-
it { should parse('451a').failing.like reference_parser }
|
140
|
-
end
|
141
|
-
|
142
|
-
context 'with a nested token rule' do
|
143
|
-
let(:grammar) { define_grammar do
|
144
|
-
rule :foo do
|
145
|
-
semantic_disallow(token(/\w+/), '_.size > 5')
|
146
|
-
end
|
147
|
-
end }
|
148
|
-
it { should parse('abc12 ').succeeding.like reference_parser }
|
149
|
-
it { should parse(' ').failing.like reference_parser }
|
150
|
-
it { should parse('abc123').failing.like reference_parser }
|
151
|
-
end
|
152
|
-
end
|
@@ -1,227 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
2
|
-
|
3
|
-
shared_examples_for 'a compiled parser with a side effect' 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(:num) { side_effect(/\d+/, '|_| _.to_i') }
|
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) { side_effect(label(:num, /\d+/), 'num.to_i') }
|
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(:foo) { side_effect :digit, '|_| _.to_i' }
|
29
|
-
rule(:digit) { match(/\d/) }
|
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(:num) { side_effect(label(:num, :digits), 'num.to_i') }
|
37
|
-
rule(:digits) { match(/\d+/) }
|
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) { side_effect(assert(/\d/), ':digit') }
|
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) { side_effect(disallow(/\d/), ':nondigit') }
|
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) { side_effect(eof, ':eof') }
|
63
|
-
end }
|
64
|
-
it { should parse('foo').failing.like reference_parser }
|
65
|
-
it { should parse('').succeeding.like reference_parser }
|
66
|
-
it { should parse('foo').from(3).succeeding.like reference_parser }
|
67
|
-
end
|
68
|
-
|
69
|
-
context 'with a nested "E" symbol rule' do
|
70
|
-
let(:grammar) { define_grammar do
|
71
|
-
rule(:foo) { side_effect(e, ':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 :foo do
|
80
|
-
side_effect(
|
81
|
-
match(/[[:alpha:]]+/) | match(/[[:digit:]]+/),
|
82
|
-
'|_| _.size'
|
83
|
-
)
|
84
|
-
end
|
85
|
-
end }
|
86
|
-
|
87
|
-
it { should parse('abc123').succeeding.like reference_parser }
|
88
|
-
it { should parse('451a').succeeding.like reference_parser }
|
89
|
-
it { should parse(' ').failing.like reference_parser }
|
90
|
-
end
|
91
|
-
|
92
|
-
context 'with a nested sequence rule' do
|
93
|
-
let(:grammar) { define_grammar do
|
94
|
-
rule :assignment do
|
95
|
-
side_effect(
|
96
|
-
match(/[[:alpha:]]+/) & match('=') & match(/[[:digit:]]+/),
|
97
|
-
'|l,_,r| "#{r} -> #{l}"'
|
98
|
-
)
|
99
|
-
end
|
100
|
-
end }
|
101
|
-
|
102
|
-
it { should parse('val=42 ').succeeding.like reference_parser }
|
103
|
-
it { should parse('val=x').failing.like reference_parser }
|
104
|
-
|
105
|
-
context 'with labels' do
|
106
|
-
let(:grammar) { define_grammar do
|
107
|
-
rule :assignment do
|
108
|
-
side_effect(
|
109
|
-
label(:name, /[[:alpha:]]+/) & match('=') & label(:value, /[[:digit:]]+/),
|
110
|
-
'"#{value} -> #{name}"'
|
111
|
-
)
|
112
|
-
end
|
113
|
-
end }
|
114
|
-
it { should parse('val=42 ').succeeding.like reference_parser }
|
115
|
-
end
|
116
|
-
end
|
117
|
-
|
118
|
-
context 'with a nested optional rule' do
|
119
|
-
let(:grammar) { define_grammar do
|
120
|
-
rule :foo do
|
121
|
-
side_effect(optional(/\w+/), '|_| _.size')
|
122
|
-
end
|
123
|
-
end }
|
124
|
-
it { should parse('foo ').succeeding.like reference_parser }
|
125
|
-
it { should parse(' ').succeeding.like reference_parser }
|
126
|
-
end
|
127
|
-
|
128
|
-
context 'with a nested zero-or-more rule' do
|
129
|
-
let(:grammar) { define_grammar do
|
130
|
-
rule :foo do
|
131
|
-
side_effect(zero_or_more(/\w/), '|_| _.size')
|
132
|
-
end
|
133
|
-
end }
|
134
|
-
it { should parse('foo ').succeeding.like reference_parser }
|
135
|
-
it { should parse(' ').succeeding.like reference_parser }
|
136
|
-
end
|
137
|
-
|
138
|
-
context 'with a nested one-or-more rule' do
|
139
|
-
let(:grammar) { define_grammar do
|
140
|
-
rule :foo do
|
141
|
-
side_effect(one_or_more(/\w/), '|_| _.size')
|
142
|
-
end
|
143
|
-
end }
|
144
|
-
it { should parse('foo ').succeeding.like reference_parser }
|
145
|
-
it { should parse(' ').failing.like reference_parser }
|
146
|
-
end
|
147
|
-
|
148
|
-
context 'with a nested repeat rule' do
|
149
|
-
let(:grammar) { define_grammar do
|
150
|
-
rule :foo do
|
151
|
-
side_effect(repeat(/\w/, 2, 4), '|_| _.size')
|
152
|
-
end
|
153
|
-
end }
|
154
|
-
it { should parse('foo ').succeeding.like reference_parser }
|
155
|
-
it { should parse('abcde ').succeeding.like reference_parser }
|
156
|
-
it { should parse('a ').failing.like reference_parser }
|
157
|
-
|
158
|
-
context 'with optional bounds' do
|
159
|
-
let(:grammar) { define_grammar do
|
160
|
-
rule :foo do
|
161
|
-
side_effect(repeat(/\w+/, 0, 1), '|_| _.size')
|
162
|
-
end
|
163
|
-
end }
|
164
|
-
it { should parse('foo ').succeeding.like reference_parser }
|
165
|
-
it { should parse(' ').succeeding.like reference_parser }
|
166
|
-
end
|
167
|
-
|
168
|
-
context 'with zero-or-more bounds' do
|
169
|
-
let(:grammar) { define_grammar do
|
170
|
-
rule :foo do
|
171
|
-
side_effect(repeat(/\w/, 0, nil), '|_| _.size')
|
172
|
-
end
|
173
|
-
end }
|
174
|
-
it { should parse('foo ').succeeding.like reference_parser }
|
175
|
-
it { should parse(' ').succeeding.like reference_parser }
|
176
|
-
end
|
177
|
-
|
178
|
-
context 'with one-or-more bounds' do
|
179
|
-
let(:grammar) { define_grammar do
|
180
|
-
rule :foo do
|
181
|
-
side_effect(repeat(/\w/, 1, nil), '|_| _.size')
|
182
|
-
end
|
183
|
-
end }
|
184
|
-
it { should parse('foo ').succeeding.like reference_parser }
|
185
|
-
it { should parse(' ').failing.like reference_parser }
|
186
|
-
end
|
187
|
-
end
|
188
|
-
|
189
|
-
context 'with a nested list rule' do
|
190
|
-
let(:grammar) { define_grammar do
|
191
|
-
rule :foo do
|
192
|
-
side_effect(list(/\w+/, /,/, 1, nil), '|_| _.reduce(:+)')
|
193
|
-
end
|
194
|
-
end }
|
195
|
-
it { should parse('a,bc,d ').succeeding.like reference_parser }
|
196
|
-
it { should parse(' ').failing.like reference_parser }
|
197
|
-
end
|
198
|
-
|
199
|
-
context 'with a nested apply rule' do
|
200
|
-
let(:grammar) { define_grammar do
|
201
|
-
rule(:foo) { side_effect :digit, '|_| _.to_i' }
|
202
|
-
rule(:digit) { match /\d/ }
|
203
|
-
end }
|
204
|
-
it { should parse('451a').succeeding.twice.like reference_parser }
|
205
|
-
it { should parse(' ').failing.like reference_parser }
|
206
|
-
end
|
207
|
-
|
208
|
-
context 'with a nested token rule' do
|
209
|
-
let(:grammar) { define_grammar do
|
210
|
-
rule :foo do
|
211
|
-
side_effect(token(/\w+/), '|_| _.size')
|
212
|
-
end
|
213
|
-
end }
|
214
|
-
it { should parse('abc123').succeeding.like reference_parser }
|
215
|
-
it { should parse(' ').failing.like reference_parser }
|
216
|
-
end
|
217
|
-
|
218
|
-
context 'with a nested skip rule' do
|
219
|
-
let(:grammar) { define_grammar do
|
220
|
-
rule :foo do
|
221
|
-
side_effect(skip(/\w+/), '42' )
|
222
|
-
end
|
223
|
-
end }
|
224
|
-
it { should parse('abc123').succeeding.like reference_parser }
|
225
|
-
it { should parse(' ').failing.like reference_parser }
|
226
|
-
end
|
227
|
-
end
|