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,224 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
2
|
-
|
3
|
-
describe DirectAction do
|
4
|
-
include CombinatorParserSpecHelper
|
5
|
-
|
6
|
-
subject { DirectAction[nested, code] }
|
7
|
-
|
8
|
-
describe '#parse' do
|
9
|
-
|
10
|
-
context 'with a capturing parser' do
|
11
|
-
|
12
|
-
let(:nested) { Match[/[[:digit:]]+/] }
|
13
|
-
let(:code) { '|s| s * 2' }
|
14
|
-
|
15
|
-
context 'when the parser matches' do
|
16
|
-
it 'applies the action binding the captured results as arguments' do
|
17
|
-
parsing('451a').should result_in('451451').at(3)
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
context 'when the parser fails' do
|
22
|
-
it 'fails' do
|
23
|
-
parsing('foo').should fail
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
context 'using the "_" character' do
|
28
|
-
|
29
|
-
let(:code) { '_ * 2' }
|
30
|
-
|
31
|
-
it 'applies the action binding the captured result as "_"' do
|
32
|
-
parsing('451a').should result_in('451451').at(3)
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
context 'with a sequence parser' do
|
38
|
-
|
39
|
-
let :nested do
|
40
|
-
Sequence[Match[/[[:alpha:]]+/], Skip[Match[/\=/]], Match[/[[:digit:]]+/]]
|
41
|
-
end
|
42
|
-
|
43
|
-
let(:code) { '|l, r| "#{r} -> #{l}"' }
|
44
|
-
|
45
|
-
context 'when the parser matches' do
|
46
|
-
it 'applies the action binding the captured results as arguments' do
|
47
|
-
parsing('val=42 ').should result_in('42 -> val').at(6)
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
context 'using the "_" character' do
|
52
|
-
|
53
|
-
let(:code) { '_.join " <- "' }
|
54
|
-
|
55
|
-
it 'applies the action binding the captured result array as "_"' do
|
56
|
-
parsing('val=42 ').should result_in('val <- 42').at(6)
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
context 'with an optional parser' do
|
62
|
-
|
63
|
-
let(:nested) { Repeat[Match[/\d/], 0, 1] }
|
64
|
-
let(:code) { '|s| s' }
|
65
|
-
|
66
|
-
context 'when the nested parser matches' do
|
67
|
-
it 'applies the action to an array containing the match' do
|
68
|
-
parsing('451a').should result_in(['4']).at(1)
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
|
-
context 'when the nested parser fails' do
|
73
|
-
it 'applies the action to an empty array' do
|
74
|
-
parsing('foo').should result_in([]).at(0)
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
context 'with a zero-or-more parser' do
|
80
|
-
|
81
|
-
let(:nested) { Repeat[Match[/\d/], 0, nil] }
|
82
|
-
let(:code) { '|s| s * 2' }
|
83
|
-
|
84
|
-
context 'when the nested parser matches' do
|
85
|
-
it 'applies the action to an array containing the matches' do
|
86
|
-
parsing('451a').should result_in(%w{4 5 1 4 5 1}).at(3)
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
context 'when the nested parser fails' do
|
91
|
-
it 'applies the action to an empty array' do
|
92
|
-
parsing('foo').should result_in([]).at(0)
|
93
|
-
end
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
context 'with a one-or-more parser' do
|
98
|
-
|
99
|
-
let(:nested) { Repeat[Match[/\d/], 1, nil] }
|
100
|
-
let(:code) { '|s| s * 2' }
|
101
|
-
|
102
|
-
context 'when the nested parser matches' do
|
103
|
-
it 'applies the action to an array containing the matches' do
|
104
|
-
parsing('451a').should result_in(%w{4 5 1 4 5 1}).at(3)
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
|
-
context 'when the nested parser fails' do
|
109
|
-
it 'fails' do
|
110
|
-
parsing('foo').should fail
|
111
|
-
end
|
112
|
-
end
|
113
|
-
end
|
114
|
-
|
115
|
-
context 'with a list parser' do
|
116
|
-
|
117
|
-
let(:nested) { ListParser[Match[/[[:digit:]]+/], Match[/,/], 2, 4] }
|
118
|
-
let(:code) { '_.map {|s| s.to_i }' }
|
119
|
-
|
120
|
-
context 'when the nested parser matches' do
|
121
|
-
it 'applies the action to an array containing the matches' do
|
122
|
-
parsing('1,2,42').should result_in([1, 2, 42]).at(6)
|
123
|
-
end
|
124
|
-
end
|
125
|
-
|
126
|
-
context 'when the nested parser fails' do
|
127
|
-
it 'fails' do
|
128
|
-
parsing('foo').should fail
|
129
|
-
end
|
130
|
-
end
|
131
|
-
end
|
132
|
-
|
133
|
-
context 'with a token parser' do
|
134
|
-
|
135
|
-
let(:nested) { Token[Match[/[[:digit:]]+/]] }
|
136
|
-
let(:code) { '|s| s.to_i' }
|
137
|
-
|
138
|
-
context 'when the parser matches' do
|
139
|
-
it 'applies the action to the matched string' do
|
140
|
-
parsing('42 ').should result_in(42).at(2)
|
141
|
-
end
|
142
|
-
end
|
143
|
-
end
|
144
|
-
|
145
|
-
context 'with a non-capturing parser' do
|
146
|
-
|
147
|
-
let(:nested) { Skip[Match[/\w+/]] }
|
148
|
-
let(:code) { '42' }
|
149
|
-
|
150
|
-
context 'when the parser matches' do
|
151
|
-
it 'applies the action with no arguments' do
|
152
|
-
parsing('abc123 ').should result_in(42).at(6)
|
153
|
-
end
|
154
|
-
end
|
155
|
-
end
|
156
|
-
|
157
|
-
context 'with a labeled parser' do
|
158
|
-
|
159
|
-
let(:nested) { Label[:word, Match[/[[:alpha:]]+/]] }
|
160
|
-
let(:code) { 'word * 2' }
|
161
|
-
|
162
|
-
context 'when the parser matches' do
|
163
|
-
it 'applies the action binding the label to the result' do
|
164
|
-
parsing('foo ').should result_in('foofoo').at(3)
|
165
|
-
end
|
166
|
-
end
|
167
|
-
end
|
168
|
-
|
169
|
-
context 'with a sequence of labeled parsers' do
|
170
|
-
|
171
|
-
let :nested do
|
172
|
-
Sequence[
|
173
|
-
Label[:left, Match[/[[:alpha:]]+/]],
|
174
|
-
Match[/\=/],
|
175
|
-
Label[:right, Match[/[[:digit:]]+/]]
|
176
|
-
]
|
177
|
-
end
|
178
|
-
|
179
|
-
let(:code) { '"#{right} -> #{left}"' }
|
180
|
-
|
181
|
-
context 'when the parser matches' do
|
182
|
-
it 'applies the action binding the labels to the results' do
|
183
|
-
parsing('val=42 ').should result_in('42 -> val').at(6)
|
184
|
-
end
|
185
|
-
end
|
186
|
-
end
|
187
|
-
end
|
188
|
-
|
189
|
-
describe '#capturing?' do
|
190
|
-
|
191
|
-
let(:code) { '' }
|
192
|
-
|
193
|
-
context 'with a capturing parser' do
|
194
|
-
|
195
|
-
let(:nested) { Match[/\w+/] }
|
196
|
-
|
197
|
-
it 'is true' do
|
198
|
-
subject.should be_capturing
|
199
|
-
end
|
200
|
-
end
|
201
|
-
|
202
|
-
context 'with a non-capturing parser' do
|
203
|
-
|
204
|
-
let(:nested) { Skip[Match[/\s*/]] }
|
205
|
-
|
206
|
-
it 'is false' do
|
207
|
-
subject.should_not be_capturing
|
208
|
-
end
|
209
|
-
end
|
210
|
-
end
|
211
|
-
|
212
|
-
describe '#with_ws' do
|
213
|
-
|
214
|
-
let(:ws) { Match[/\s*/] }
|
215
|
-
let(:nested) { Match[/\w+/] }
|
216
|
-
let(:code) { '' }
|
217
|
-
|
218
|
-
it 'applies #with_ws to the nested parser' do
|
219
|
-
subject.with_ws(ws).
|
220
|
-
should == DirectAction[Sequence[Skip[ws], nested], code]
|
221
|
-
end
|
222
|
-
end
|
223
|
-
|
224
|
-
end
|
@@ -1,209 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
2
|
-
|
3
|
-
describe DispatchAction do
|
4
|
-
include CombinatorParserSpecHelper
|
5
|
-
|
6
|
-
subject { DispatchAction[nested] }
|
7
|
-
|
8
|
-
describe '#parse' do
|
9
|
-
|
10
|
-
context 'with a capturing parser' do
|
11
|
-
|
12
|
-
let(:nested) { Match[/[[:digit:]]+/] }
|
13
|
-
|
14
|
-
context 'when the parser matches' do
|
15
|
-
it 'applies the action to the result' do
|
16
|
-
parsing('451a').
|
17
|
-
should result_in(Rattler::Runtime::ParseNode.parsed(['451'])).at(3)
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
context 'when the parser fails' do
|
22
|
-
it 'fails' do
|
23
|
-
parsing('foo').should fail
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
context 'with a sequence parser' do
|
29
|
-
|
30
|
-
let(:nested) { Sequence[
|
31
|
-
Match[/[[:alpha:]]+/], Match[/\=/], Match[/[[:digit:]]+/]
|
32
|
-
] }
|
33
|
-
|
34
|
-
context 'when the parser matches' do
|
35
|
-
it 'applies the action to the result' do
|
36
|
-
parsing('val=42').
|
37
|
-
should result_in(Rattler::Runtime::ParseNode.parsed(['val','=','42'])).at(6)
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
context 'when the parser fails' do
|
42
|
-
it 'fails' do
|
43
|
-
parsing('val=x').should fail
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
context 'with an optional parser' do
|
49
|
-
|
50
|
-
let(:nested) { Repeat[Match[/\d/], 0, 1] }
|
51
|
-
|
52
|
-
context 'when the nested parser matches' do
|
53
|
-
it 'applies the action to an array containing the match' do
|
54
|
-
parsing('451a').
|
55
|
-
should result_in(Rattler::Runtime::ParseNode.parsed(['4'])).at(1)
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
context 'when the nested parser fails' do
|
60
|
-
it 'applies the action to an empty array' do
|
61
|
-
parsing('foo').
|
62
|
-
should result_in(Rattler::Runtime::ParseNode.parsed([])).at(0)
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
context 'with a zero-or-more parser' do
|
68
|
-
|
69
|
-
let(:nested) { Repeat[Match[/\d/], 0, nil] }
|
70
|
-
|
71
|
-
context 'when the nested parser matches' do
|
72
|
-
it 'applies the action to an array containing the matches' do
|
73
|
-
parsing('451a').
|
74
|
-
should result_in(Rattler::Runtime::ParseNode.parsed(['4', '5', '1'])).at(3)
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
context 'when the nested parser fails' do
|
79
|
-
it 'applies the action to an empty array' do
|
80
|
-
parsing('foo').
|
81
|
-
should result_in(Rattler::Runtime::ParseNode.parsed([])).at(0)
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
context 'with a one-or-more parser' do
|
87
|
-
|
88
|
-
let(:nested) { Repeat[Match[/\d/], 1, nil] }
|
89
|
-
|
90
|
-
context 'when the nested parser matches' do
|
91
|
-
it 'applies the action to an array containing the matches' do
|
92
|
-
parsing('451a').
|
93
|
-
should result_in(Rattler::Runtime::ParseNode.parsed(['4', '5', '1'])).at(3)
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
context 'when the nested parser fails' do
|
98
|
-
it 'fails' do
|
99
|
-
parsing('foo').should fail
|
100
|
-
end
|
101
|
-
end
|
102
|
-
end
|
103
|
-
|
104
|
-
context 'with a list parser' do
|
105
|
-
|
106
|
-
let(:nested) { ListParser[Match[/[[:digit:]]+/], Match[/,/], 2, 4] }
|
107
|
-
|
108
|
-
context 'when the nested parser matches' do
|
109
|
-
it 'applies the action to an array containing the matches' do
|
110
|
-
parsing('1,2,42').
|
111
|
-
should result_in(Rattler::Runtime::ParseNode.parsed(['1', '2', '42'])).at(6)
|
112
|
-
end
|
113
|
-
end
|
114
|
-
|
115
|
-
context 'when the nested parser fails' do
|
116
|
-
it 'fails' do
|
117
|
-
parsing('foo').should fail
|
118
|
-
end
|
119
|
-
end
|
120
|
-
end
|
121
|
-
|
122
|
-
context 'with a token parser' do
|
123
|
-
|
124
|
-
let(:nested) { Token[Match[/\w+/]] }
|
125
|
-
|
126
|
-
context 'when the parser matches' do
|
127
|
-
it 'applies the action to the matched string' do
|
128
|
-
parsing('foo ').
|
129
|
-
should result_in(Rattler::Runtime::ParseNode.parsed(['foo'])).at(3)
|
130
|
-
end
|
131
|
-
end
|
132
|
-
end
|
133
|
-
|
134
|
-
context 'with a non-capturing parser' do
|
135
|
-
|
136
|
-
let(:nested) { Skip[Match[/,/]] }
|
137
|
-
|
138
|
-
context 'when the parser matches' do
|
139
|
-
it 'applies the action to an empty array' do
|
140
|
-
parsing(', ').
|
141
|
-
should result_in(Rattler::Runtime::ParseNode.parsed([])).at(1)
|
142
|
-
end
|
143
|
-
end
|
144
|
-
end
|
145
|
-
|
146
|
-
context 'with a labeled parser' do
|
147
|
-
|
148
|
-
let(:nested) { Label[:word, Match[/[[:alpha:]]+/]] }
|
149
|
-
|
150
|
-
context 'when the parser matches' do
|
151
|
-
it 'applies the action binding the label to the result' do
|
152
|
-
parsing('foo ').
|
153
|
-
should result_in(Rattler::Runtime::ParseNode.parsed(['foo'],
|
154
|
-
:labeled => {:word => 'foo'}))
|
155
|
-
end
|
156
|
-
end
|
157
|
-
end
|
158
|
-
|
159
|
-
context 'with a sequence of labeled parsers' do
|
160
|
-
|
161
|
-
let(:nested) { Sequence[
|
162
|
-
Label[:name, Match[/[[:alpha:]]+/]],
|
163
|
-
Match[/\=/],
|
164
|
-
Label[:value, Match[/[[:digit:]]+/]]
|
165
|
-
] }
|
166
|
-
|
167
|
-
context 'when the parser matches' do
|
168
|
-
it 'applies the action binding the labels to the results' do
|
169
|
-
parsing('val=42 ').
|
170
|
-
should result_in(Rattler::Runtime::ParseNode.parsed(['val','=','42'],
|
171
|
-
:labeled => {:name => 'val', :value => '42'}))
|
172
|
-
end
|
173
|
-
end
|
174
|
-
end
|
175
|
-
end
|
176
|
-
|
177
|
-
describe '#capturing?' do
|
178
|
-
|
179
|
-
context 'with a capturing parser' do
|
180
|
-
|
181
|
-
let(:nested) { Match[/\w+/] }
|
182
|
-
|
183
|
-
it 'is true' do
|
184
|
-
subject.should be_capturing
|
185
|
-
end
|
186
|
-
end
|
187
|
-
|
188
|
-
context 'with a non-capturing parser' do
|
189
|
-
|
190
|
-
let(:nested) { Skip[Match[/\s*/]] }
|
191
|
-
|
192
|
-
it 'is false' do
|
193
|
-
subject.should_not be_capturing
|
194
|
-
end
|
195
|
-
end
|
196
|
-
end
|
197
|
-
|
198
|
-
describe '#with_ws' do
|
199
|
-
|
200
|
-
let(:ws) { Match[/\s*/] }
|
201
|
-
let(:nested) { Match[/\w+/] }
|
202
|
-
|
203
|
-
it 'applies #with_ws to the nested parser' do
|
204
|
-
subject.with_ws(ws).
|
205
|
-
should == DispatchAction[Sequence[Skip[ws], nested]]
|
206
|
-
end
|
207
|
-
end
|
208
|
-
|
209
|
-
end
|
@@ -1,59 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
2
|
-
|
3
|
-
describe Rattler::Parsers::NodeCode do
|
4
|
-
|
5
|
-
subject { described_class.new(target_name, method_name, target_attrs) }
|
6
|
-
|
7
|
-
let(:target_name) { 'Expr' }
|
8
|
-
let(:method_name) { 'parsed' }
|
9
|
-
let(:target_attrs) { {} }
|
10
|
-
|
11
|
-
describe '#bind' do
|
12
|
-
|
13
|
-
let(:scope) { {} }
|
14
|
-
|
15
|
-
context 'given empty bind args' do
|
16
|
-
it 'binds "[]"' do
|
17
|
-
subject.bind(scope, []).should == 'Expr.parsed([])'
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
context 'given a single bind arg' do
|
22
|
-
it 'binds the an array with the arg' do
|
23
|
-
subject.bind(scope, ['a']).should == 'Expr.parsed([a])'
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
context 'given a multiple bind args' do
|
28
|
-
it 'binds the an array with the arg' do
|
29
|
-
subject.bind(scope, ['a', 'b', 'c']).should == 'Expr.parsed([a, b, c])'
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
context 'given a string as bind args' do
|
34
|
-
it 'binds the exact string' do
|
35
|
-
subject.bind(scope, 'a').should == 'Expr.parsed(a)'
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
context 'with scope' do
|
40
|
-
|
41
|
-
let(:scope) { {:word => 'w'} }
|
42
|
-
|
43
|
-
it 'binds the scope as labeled results' do
|
44
|
-
subject.bind(scope, ['a', 'b']).
|
45
|
-
should == 'Expr.parsed([a, b], :labeled => {:word => w})'
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
context 'with target_attrs' do
|
50
|
-
|
51
|
-
let(:target_attrs) { {:name => 'expression'} }
|
52
|
-
|
53
|
-
it '' do
|
54
|
-
subject.bind(scope, ['a', 'b']).
|
55
|
-
should == 'Expr.parsed([a, b], :name => "expression")'
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|