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,6 +1,6 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/../../../spec_helper')
|
2
2
|
|
3
|
-
include Rattler::
|
3
|
+
include Rattler::Compiler::ParserGenerator
|
4
4
|
include Rattler::Parsers
|
5
5
|
|
6
6
|
describe MatchGenerator do
|
@@ -60,60 +60,6 @@ describe MatchGenerator do
|
|
60
60
|
end
|
61
61
|
end
|
62
62
|
|
63
|
-
describe '#gen_dispatch_action' do
|
64
|
-
|
65
|
-
let(:code) { NodeCode.new('Word', 'parsed') }
|
66
|
-
|
67
|
-
context 'when nested' do
|
68
|
-
it 'generates nested regex matching code with a dispatch action' do
|
69
|
-
nested_code {|g| g.gen_dispatch_action match, code }.
|
70
|
-
should == (<<-CODE).strip
|
71
|
-
begin
|
72
|
-
(r = @scanner.scan(/\\w+/)) &&
|
73
|
-
Word.parsed([r])
|
74
|
-
end
|
75
|
-
CODE
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
context 'when top-level' do
|
80
|
-
it 'generates top level regex matching code with a dispatch action' do
|
81
|
-
top_level_code {|g| g.gen_dispatch_action match, code }.
|
82
|
-
should == (<<-CODE).strip
|
83
|
-
(r = @scanner.scan(/\\w+/)) &&
|
84
|
-
Word.parsed([r])
|
85
|
-
CODE
|
86
|
-
end
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
describe '#gen_direct_action' do
|
91
|
-
|
92
|
-
let(:code) { ActionCode.new('|_| _.to_sym') }
|
93
|
-
|
94
|
-
context 'when nested' do
|
95
|
-
it 'generates nested regex matching code with a direct action' do
|
96
|
-
nested_code {|g| g.gen_direct_action match, code }.
|
97
|
-
should == (<<-CODE).strip
|
98
|
-
begin
|
99
|
-
(r = @scanner.scan(/\\w+/)) &&
|
100
|
-
(r.to_sym)
|
101
|
-
end
|
102
|
-
CODE
|
103
|
-
end
|
104
|
-
end
|
105
|
-
|
106
|
-
context 'when top-level' do
|
107
|
-
it 'generates top level regex matching code with a direct action' do
|
108
|
-
top_level_code {|g| g.gen_direct_action match, code }.
|
109
|
-
should == (<<-CODE).strip
|
110
|
-
(r = @scanner.scan(/\\w+/)) &&
|
111
|
-
(r.to_sym)
|
112
|
-
CODE
|
113
|
-
end
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
63
|
describe '#gen_token' do
|
118
64
|
|
119
65
|
context 'when nested' do
|
@@ -0,0 +1,135 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../../spec_helper')
|
2
|
+
|
3
|
+
include Rattler::Compiler::ParserGenerator
|
4
|
+
include Rattler::Parsers
|
5
|
+
|
6
|
+
describe NodeActionGenerator do
|
7
|
+
|
8
|
+
include ParserGeneratorSpecHelper
|
9
|
+
include Rattler::Runtime
|
10
|
+
|
11
|
+
let(:action) { NodeAction['Expr'] }
|
12
|
+
|
13
|
+
let(:scope) { ParserScope.new(bindings, captures) }
|
14
|
+
let(:bindings) { {} }
|
15
|
+
let(:captures) { [] }
|
16
|
+
|
17
|
+
describe '#gen_basic' do
|
18
|
+
|
19
|
+
context 'with no bindings or captures' do
|
20
|
+
it 'generates node action code' do
|
21
|
+
top_level_code {|g| g.gen_basic action, scope }.
|
22
|
+
should == 'Expr.parsed([])'
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
context 'with a single capture' do
|
27
|
+
|
28
|
+
let(:captures) { ['r0_0'] }
|
29
|
+
|
30
|
+
it 'generates node action code with the capture in an array' do
|
31
|
+
top_level_code {|g| g.gen_basic action, scope }.
|
32
|
+
should == 'Expr.parsed([r0_0])'
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
context 'with multiple captures' do
|
37
|
+
|
38
|
+
let(:captures) { ['r0_0', 'r0_1'] }
|
39
|
+
|
40
|
+
it 'generates node action code with the capture in an array' do
|
41
|
+
top_level_code {|g| g.gen_basic action, scope }.
|
42
|
+
should == 'Expr.parsed([r0_0, r0_1])'
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
context 'with bindings' do
|
47
|
+
|
48
|
+
let(:bindings) { {:a => 'r0_1'} }
|
49
|
+
|
50
|
+
it 'generates node action code with the bindings as a :labeled attribute' do
|
51
|
+
top_level_code {|g| g.gen_basic action, scope }.
|
52
|
+
should == 'Expr.parsed([], :labeled => {:a => r0_1})'
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
context 'with undecidable captures' do
|
57
|
+
|
58
|
+
let(:captures) { ['r0_0', 'r0_1'] }
|
59
|
+
|
60
|
+
it 'generates node action code that uses select_captures' do
|
61
|
+
top_level_code {|g| g.gen_basic action, scope.with_undecidable_captures }.
|
62
|
+
should == 'Expr.parsed(select_captures([r0_0, r0_1]))'
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
context 'when the action has an alternate factory method' do
|
67
|
+
|
68
|
+
let(:action) { NodeAction['Expr', {:method => 'create'}] }
|
69
|
+
|
70
|
+
it 'generates node action code with the factory method' do
|
71
|
+
top_level_code {|g| g.gen_basic action, scope }.
|
72
|
+
should == 'Expr.create([])'
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
context 'when the action has node attributes' do
|
77
|
+
|
78
|
+
let(:action) { NodeAction['Expr', {:node_attrs => {:name => "FOO"}}] }
|
79
|
+
|
80
|
+
it 'generates node action code with the node attributes' do
|
81
|
+
top_level_code {|g| g.gen_basic action, scope }.
|
82
|
+
should == 'Expr.parsed([], :name => "FOO")'
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
describe '#gen_assert' do
|
88
|
+
|
89
|
+
context 'when nested' do
|
90
|
+
it 'generates nested node assert code' do
|
91
|
+
nested_code {|g| g.gen_assert action }.
|
92
|
+
should == '(Expr.parsed([]) && true)'
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
context 'when top-level' do
|
97
|
+
it 'generates top level node assert code' do
|
98
|
+
top_level_code {|g| g.gen_assert action }.
|
99
|
+
should == 'Expr.parsed([]) && true'
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
describe '#gen_disallow' do
|
105
|
+
it 'generates node disallow code' do
|
106
|
+
top_level_code {|g| g.gen_disallow action }.
|
107
|
+
should == '!Expr.parsed([])'
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
describe '#gen_token' do
|
112
|
+
it 'generates node token code' do
|
113
|
+
top_level_code {|g| g.gen_token action }.
|
114
|
+
should == 'Expr.parsed([]).to_s'
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
describe '#gen_skip' do
|
119
|
+
|
120
|
+
context 'when nested' do
|
121
|
+
it 'generates nested node skipping code' do
|
122
|
+
nested_code {|g| g.gen_skip action }.
|
123
|
+
should == '(Expr.parsed([]); true)'
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
context 'when top-level' do
|
128
|
+
it 'generates top level node skipping code' do
|
129
|
+
top_level_code {|g| g.gen_skip action }.
|
130
|
+
should == 'Expr.parsed([]); true'
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
end
|
@@ -87,80 +87,6 @@ a unless a.empty?
|
|
87
87
|
end
|
88
88
|
end
|
89
89
|
|
90
|
-
describe '#gen_dispatch_action' do
|
91
|
-
|
92
|
-
let(:nested) { Match[/w+/] }
|
93
|
-
let(:code) { NodeCode.new('Word', 'parsed') }
|
94
|
-
|
95
|
-
context 'given a repeat with one-or-more bounds' do
|
96
|
-
|
97
|
-
context 'when nested' do
|
98
|
-
it 'generates nested one-or-more matching code with a dispatch action' do
|
99
|
-
nested_code {|g| g.gen_dispatch_action repeat, code }.
|
100
|
-
should == (<<-CODE).strip
|
101
|
-
begin
|
102
|
-
a = []
|
103
|
-
while r = @scanner.scan(/w+/)
|
104
|
-
a << r
|
105
|
-
end
|
106
|
-
Word.parsed(select_captures(a)) unless a.empty?
|
107
|
-
end
|
108
|
-
CODE
|
109
|
-
end
|
110
|
-
end
|
111
|
-
|
112
|
-
context 'when top-level' do
|
113
|
-
it 'generates top level one-or-more matching code with a dispatch action' do
|
114
|
-
top_level_code {|g| g.gen_dispatch_action repeat, code }.
|
115
|
-
should == (<<-CODE).strip
|
116
|
-
a = []
|
117
|
-
while r = @scanner.scan(/w+/)
|
118
|
-
a << r
|
119
|
-
end
|
120
|
-
Word.parsed(select_captures(a)) unless a.empty?
|
121
|
-
CODE
|
122
|
-
end
|
123
|
-
end
|
124
|
-
end
|
125
|
-
end
|
126
|
-
|
127
|
-
describe '#gen_direct_action' do
|
128
|
-
|
129
|
-
let(:nested) { Match[/w+/] }
|
130
|
-
let(:code) { ActionCode.new('|_| _.size') }
|
131
|
-
|
132
|
-
context 'given a repeat with one-or-more bounds' do
|
133
|
-
|
134
|
-
context 'when nested' do
|
135
|
-
it 'generates nested one-or-more matching code with a direct action' do
|
136
|
-
nested_code {|g| g.gen_direct_action repeat, code }.
|
137
|
-
should == (<<-CODE).strip
|
138
|
-
begin
|
139
|
-
a = []
|
140
|
-
while r = @scanner.scan(/w+/)
|
141
|
-
a << r
|
142
|
-
end
|
143
|
-
(select_captures(a).size) unless a.empty?
|
144
|
-
end
|
145
|
-
CODE
|
146
|
-
end
|
147
|
-
end
|
148
|
-
|
149
|
-
context 'when top-level' do
|
150
|
-
it 'generates top level one-or-more matching code with a direct action' do
|
151
|
-
top_level_code {|g| g.gen_direct_action repeat, code }.
|
152
|
-
should == (<<-CODE).strip
|
153
|
-
a = []
|
154
|
-
while r = @scanner.scan(/w+/)
|
155
|
-
a << r
|
156
|
-
end
|
157
|
-
(select_captures(a).size) unless a.empty?
|
158
|
-
CODE
|
159
|
-
end
|
160
|
-
end
|
161
|
-
end
|
162
|
-
end
|
163
|
-
|
164
90
|
describe '#gen_token' do
|
165
91
|
|
166
92
|
let(:nested) { Match[/w+/] }
|
@@ -61,68 +61,6 @@ shared_examples_for 'an optional generator' do
|
|
61
61
|
end
|
62
62
|
end
|
63
63
|
|
64
|
-
describe '#gen_dispatch_action' do
|
65
|
-
|
66
|
-
let(:nested) { Match[/w+/] }
|
67
|
-
let(:code) { NodeCode.new('Word', 'parsed') }
|
68
|
-
|
69
|
-
context 'given a repeat with optional bounds' do
|
70
|
-
|
71
|
-
context 'when nested' do
|
72
|
-
it 'generates nested optional matching code with a dispatch action' do
|
73
|
-
nested_code {|g| g.gen_dispatch_action repeat, code }.
|
74
|
-
should == (<<-CODE).strip
|
75
|
-
begin
|
76
|
-
r = @scanner.scan(/w+/)
|
77
|
-
Word.parsed(r ? [r] : [])
|
78
|
-
end
|
79
|
-
CODE
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
context 'when top-level' do
|
84
|
-
it 'generates top level optional matching code with a dispatch action' do
|
85
|
-
top_level_code {|g| g.gen_dispatch_action repeat, code }.
|
86
|
-
should == (<<-CODE).strip
|
87
|
-
r = @scanner.scan(/w+/)
|
88
|
-
Word.parsed(r ? [r] : [])
|
89
|
-
CODE
|
90
|
-
end
|
91
|
-
end
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
describe '#gen_direct_action' do
|
96
|
-
|
97
|
-
let(:nested) { Match[/w+/] }
|
98
|
-
let(:code) { ActionCode.new('|_| _.size') }
|
99
|
-
|
100
|
-
context 'given a repeat with optional bounds' do
|
101
|
-
|
102
|
-
context 'when nested' do
|
103
|
-
it 'generates nested optional matching code with a direct action' do
|
104
|
-
nested_code {|g| g.gen_direct_action repeat, code }.
|
105
|
-
should == (<<-CODE).strip
|
106
|
-
begin
|
107
|
-
r = @scanner.scan(/w+/)
|
108
|
-
((r ? [r] : []).size)
|
109
|
-
end
|
110
|
-
CODE
|
111
|
-
end
|
112
|
-
end
|
113
|
-
|
114
|
-
context 'when top-level' do
|
115
|
-
it 'generates top level optional matching code with a direct action' do
|
116
|
-
top_level_code {|g| g.gen_direct_action repeat, code }.
|
117
|
-
should == (<<-CODE).strip
|
118
|
-
r = @scanner.scan(/w+/)
|
119
|
-
((r ? [r] : []).size)
|
120
|
-
CODE
|
121
|
-
end
|
122
|
-
end
|
123
|
-
end
|
124
|
-
end
|
125
|
-
|
126
64
|
describe '#gen_token' do
|
127
65
|
|
128
66
|
let(:nested) { Match[/w+/] }
|
@@ -3,7 +3,7 @@ require File.expand_path(File.dirname(__FILE__) + '/zero_or_more_generator_examp
|
|
3
3
|
require File.expand_path(File.dirname(__FILE__) + '/one_or_more_generator_examples')
|
4
4
|
require File.expand_path(File.dirname(__FILE__) + '/optional_generator_examples')
|
5
5
|
|
6
|
-
include Rattler::
|
6
|
+
include Rattler::Compiler::ParserGenerator
|
7
7
|
include Rattler::Parsers
|
8
8
|
|
9
9
|
describe RepeatGenerator do
|
@@ -107,6 +107,71 @@ end
|
|
107
107
|
end
|
108
108
|
end
|
109
109
|
end
|
110
|
+
|
111
|
+
context 'with an Apply parser' do
|
112
|
+
|
113
|
+
let(:bounds) { [0, nil] }
|
114
|
+
let(:nested) { Apply[:a] }
|
115
|
+
|
116
|
+
it 'generates repeat code that selects only the captures for the result' do
|
117
|
+
top_level_code {|g| g.gen_basic repeat }.should == <<-CODE.strip
|
118
|
+
a = []
|
119
|
+
while r = match(:a)
|
120
|
+
a << r
|
121
|
+
end
|
122
|
+
select_captures(a)
|
123
|
+
CODE
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
context 'with a choice of capturing or non-capturing parsers' do
|
128
|
+
|
129
|
+
let(:bounds) { [0, nil] }
|
130
|
+
let(:nested) { Choice[
|
131
|
+
Match[/a/],
|
132
|
+
Skip[Match[/b/]]
|
133
|
+
] }
|
134
|
+
|
135
|
+
it 'generates repeat code that selects only the captures for the result' do
|
136
|
+
top_level_code {|g| g.gen_basic repeat }.should == <<-CODE.strip
|
137
|
+
a = []
|
138
|
+
while r = begin
|
139
|
+
@scanner.scan(/a/) ||
|
140
|
+
(@scanner.skip(/b/) && true)
|
141
|
+
end
|
142
|
+
a << r
|
143
|
+
end
|
144
|
+
select_captures(a)
|
145
|
+
CODE
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
context 'with an attributed sequence with a semantic action' do
|
150
|
+
|
151
|
+
let(:bounds) { [0, nil] }
|
152
|
+
let(:nested) do
|
153
|
+
AttributedSequence[Match[/\w/], SemanticAction['_']]
|
154
|
+
end
|
155
|
+
|
156
|
+
it 'generates repeat code that selects only the captures for the result' do
|
157
|
+
top_level_code {|g| g.gen_basic repeat }.should == <<-'CODE'.strip
|
158
|
+
a = []
|
159
|
+
while r = begin
|
160
|
+
p0 = @scanner.pos
|
161
|
+
begin
|
162
|
+
(r0_0 = @scanner.scan(/\w/)) &&
|
163
|
+
(r0_0)
|
164
|
+
end || begin
|
165
|
+
@scanner.pos = p0
|
166
|
+
false
|
167
|
+
end
|
168
|
+
end
|
169
|
+
a << r
|
170
|
+
end
|
171
|
+
select_captures(a)
|
172
|
+
CODE
|
173
|
+
end
|
174
|
+
end
|
110
175
|
end
|
111
176
|
|
112
177
|
describe '#gen_assert' do
|
@@ -2,7 +2,7 @@ require File.expand_path(File.dirname(__FILE__) + '/../../../spec_helper')
|
|
2
2
|
|
3
3
|
include Rattler::Parsers
|
4
4
|
|
5
|
-
describe Rattler::
|
5
|
+
describe Rattler::Compiler::ParserGenerator::RuleGenerator do
|
6
6
|
|
7
7
|
include ParserGeneratorSpecHelper
|
8
8
|
|
@@ -21,7 +21,8 @@ end
|
|
21
21
|
# @private
|
22
22
|
def match_a! #:nodoc:
|
23
23
|
@scanner.scan("a") ||
|
24
|
-
match(:b)
|
24
|
+
match(:b) ||
|
25
|
+
fail! { :a }
|
25
26
|
end
|
26
27
|
CODE
|
27
28
|
end
|