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,20 +0,0 @@
|
|
1
|
-
Feature: Character Classes
|
2
|
-
|
3
|
-
Character classes are sets of characters between "[" and "]" and mean match
|
4
|
-
any single character in the set. They are identical to character classes in
|
5
|
-
Ruby's regular expressions.
|
6
|
-
|
7
|
-
Scenario Outline: Parsing
|
8
|
-
Given a grammar with:
|
9
|
-
"""
|
10
|
-
word_char <- [A-Za-z_]
|
11
|
-
"""
|
12
|
-
When I parse <input>
|
13
|
-
Then the parse result should be <result>
|
14
|
-
|
15
|
-
Examples:
|
16
|
-
| input | result |
|
17
|
-
| "foo" | "f" |
|
18
|
-
| "BAR" | "B" |
|
19
|
-
| "_ba" | "_" |
|
20
|
-
| "42" | FAIL |
|
@@ -1,24 +0,0 @@
|
|
1
|
-
Feature: Nonterminals
|
2
|
-
|
3
|
-
A nonterminal is an identifier that refers to a parse rule and means to parse
|
4
|
-
according to the rule. Nonterminals can be used to define recursive rules.
|
5
|
-
|
6
|
-
Scenario: Simple example
|
7
|
-
Given a grammar with:
|
8
|
-
"""
|
9
|
-
expr <- a* "b"
|
10
|
-
a <- "a"
|
11
|
-
"""
|
12
|
-
When I parse "aaab"
|
13
|
-
Then the parse result should be [["a", "a", "a"], "b"]
|
14
|
-
|
15
|
-
Scenario: Recursive definition
|
16
|
-
Given a grammar with:
|
17
|
-
"""
|
18
|
-
expr <- as "b"
|
19
|
-
as <- "a" as
|
20
|
-
/ "a"
|
21
|
-
"""
|
22
|
-
When I parse "aaab"
|
23
|
-
Then the parse result should be [["a", ["a", "a"]], "b"]
|
24
|
-
|
@@ -1,34 +0,0 @@
|
|
1
|
-
Feature: One-Or-More
|
2
|
-
|
3
|
-
The "+" operator following an expression means to match one or more times,
|
4
|
-
i.e. match repeatedly and succeed if input was matched at least once.
|
5
|
-
|
6
|
-
Scenario Outline: Capturing Expression
|
7
|
-
Given a grammar with:
|
8
|
-
"""
|
9
|
-
digits <- DIGIT+
|
10
|
-
"""
|
11
|
-
When I parse <input>
|
12
|
-
Then the parse result should be <result>
|
13
|
-
And the parse position should be <pos>
|
14
|
-
|
15
|
-
Examples:
|
16
|
-
| input | result | pos |
|
17
|
-
| "5" | ["5"] | 1 |
|
18
|
-
| "234" | ["2", "3", "4"] | 3 |
|
19
|
-
| "foo" | FAIL | 0 |
|
20
|
-
|
21
|
-
Scenario Outline: Non-Capturing Expression
|
22
|
-
Given a grammar with:
|
23
|
-
"""
|
24
|
-
dashes <- ~"-"+
|
25
|
-
"""
|
26
|
-
When I parse <input>
|
27
|
-
Then the parse result should be <result>
|
28
|
-
And the parse position should be <pos>
|
29
|
-
|
30
|
-
Examples:
|
31
|
-
| input | result | pos |
|
32
|
-
| "-" | true | 1 |
|
33
|
-
| "---" | true | 3 |
|
34
|
-
| "foo" | false | 0 |
|
@@ -1,21 +0,0 @@
|
|
1
|
-
Feature: Ordered Choice Expressions
|
2
|
-
|
3
|
-
An ordered choice expression is a series of sub-expressions separated by "/"
|
4
|
-
and it means to try each sub-expression in order until one matches, and fail
|
5
|
-
if none of the sub-expressions match.
|
6
|
-
|
7
|
-
Scenario Outline: Parsing
|
8
|
-
Given a grammar with:
|
9
|
-
"""
|
10
|
-
expr <- "A" / "B"
|
11
|
-
"""
|
12
|
-
When I parse <input>
|
13
|
-
Then the parse result should be <result>
|
14
|
-
|
15
|
-
Examples:
|
16
|
-
| input | result |
|
17
|
-
| "A" | "A" |
|
18
|
-
| "AB" | "A" |
|
19
|
-
| "B" | "B" |
|
20
|
-
| "BA" | "B" |
|
21
|
-
| "C" | FAIL |
|
@@ -1,70 +0,0 @@
|
|
1
|
-
Feature: POSIX Character Classes
|
2
|
-
|
3
|
-
The uppercase names of POSIX character classes can be used as a shortcut to
|
4
|
-
using them in character class expressions, e.g. "DIGIT" and "[[:digit:]]" are
|
5
|
-
equivalent.
|
6
|
-
|
7
|
-
The POSIX character classes are:
|
8
|
-
ALNUM - Alphanumeric characters
|
9
|
-
ALPHA - Alphabetic characters
|
10
|
-
ASCII - ASCII characters
|
11
|
-
BLANK - Space and tab
|
12
|
-
CNTRL - Control characters
|
13
|
-
DIGIT - Digits
|
14
|
-
GRAPH - Visible characters
|
15
|
-
LOWER - Lowercase characters
|
16
|
-
PRINT - Visible characters and spaces
|
17
|
-
PUNCT - Punctuation characters
|
18
|
-
SPACE - Whitespace characters
|
19
|
-
UPPER - Uppercase characters
|
20
|
-
XDIGIT - Hexadecimal digits
|
21
|
-
WORD - Alphanumeric characters plus "_"
|
22
|
-
|
23
|
-
Scenario: ALNUM
|
24
|
-
Given a grammar with:
|
25
|
-
"""
|
26
|
-
expr <- ALNUM+
|
27
|
-
"""
|
28
|
-
When I parse "abc123"
|
29
|
-
Then the parse result should be ["a", "b", "c", "1", "2", "3"]
|
30
|
-
|
31
|
-
Scenario: ALPHA
|
32
|
-
Given a grammar with:
|
33
|
-
"""
|
34
|
-
expr <- ALPHA+
|
35
|
-
"""
|
36
|
-
When I parse "abc123"
|
37
|
-
Then the parse result should be ["a", "b", "c"]
|
38
|
-
|
39
|
-
Scenario: BLANK
|
40
|
-
Given a grammar with:
|
41
|
-
"""
|
42
|
-
expr <- BLANK+
|
43
|
-
"""
|
44
|
-
When I parse " abc"
|
45
|
-
Then the parse result should be [" ", " ", " "]
|
46
|
-
|
47
|
-
Scenario: DIGIT
|
48
|
-
Given a grammar with:
|
49
|
-
"""
|
50
|
-
expr <- DIGIT+
|
51
|
-
"""
|
52
|
-
When I parse "123abc"
|
53
|
-
Then the parse result should be ["1", "2", "3"]
|
54
|
-
|
55
|
-
Scenario: LOWER
|
56
|
-
Given a grammar with:
|
57
|
-
"""
|
58
|
-
expr <- LOWER+
|
59
|
-
"""
|
60
|
-
When I parse "abcDEF"
|
61
|
-
Then the parse result should be ["a", "b", "c"]
|
62
|
-
|
63
|
-
Scenario: UPPER
|
64
|
-
Given a grammar with:
|
65
|
-
"""
|
66
|
-
expr <- UPPER+
|
67
|
-
"""
|
68
|
-
When I parse "ABCdef"
|
69
|
-
Then the parse result should be ["A", "B", "C"]
|
70
|
-
|
@@ -1,20 +0,0 @@
|
|
1
|
-
Feature: Sequence Expressions
|
2
|
-
|
3
|
-
A sequence expression is a series of sub-expressions and it means to match
|
4
|
-
all of the sub-expressions in sequence, otherwise fail and consume no input.
|
5
|
-
|
6
|
-
Scenario Outline: Parsing
|
7
|
-
Given a grammar with:
|
8
|
-
"""
|
9
|
-
expr <- "A" "B"
|
10
|
-
"""
|
11
|
-
When I parse <input>
|
12
|
-
Then the parse result should be <result>
|
13
|
-
|
14
|
-
Examples:
|
15
|
-
| input | result |
|
16
|
-
| "AB" | ["A", "B"] |
|
17
|
-
| "ABC" | ["A", "B"] |
|
18
|
-
| "ACB" | FAIL |
|
19
|
-
| "A" | FAIL |
|
20
|
-
| "C" | FAIL |
|
@@ -1,34 +0,0 @@
|
|
1
|
-
Feature: Zero-Or-More
|
2
|
-
|
3
|
-
The "*" operator following an expression means to match zero or more times,
|
4
|
-
i.e. match repeatedly and succeed even if no input was matched.
|
5
|
-
|
6
|
-
Scenario Outline: Capturing Expression
|
7
|
-
Given a grammar with:
|
8
|
-
"""
|
9
|
-
letters <- ALPHA*
|
10
|
-
"""
|
11
|
-
When I parse <input>
|
12
|
-
Then the parse result should be <result>
|
13
|
-
And the parse position should be <pos>
|
14
|
-
|
15
|
-
Examples:
|
16
|
-
| input | result | pos |
|
17
|
-
| "A" | ["A"] | 1 |
|
18
|
-
| "foo" | ["f", "o", "o"] | 3 |
|
19
|
-
| "234" | [] | 0 |
|
20
|
-
|
21
|
-
Scenario Outline: Non-Capturing Expression
|
22
|
-
Given a grammar with:
|
23
|
-
"""
|
24
|
-
dashes <- ~"-"*
|
25
|
-
"""
|
26
|
-
When I parse <input>
|
27
|
-
Then the parse result should be <result>
|
28
|
-
And the parse position should be <pos>
|
29
|
-
|
30
|
-
Examples:
|
31
|
-
| input | result | pos |
|
32
|
-
| "-" | true | 1 |
|
33
|
-
| "---" | true | 3 |
|
34
|
-
| "foo" | true | 0 |
|
data/lib/rattler/back_end.rb
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# = rattler/back_end.rb
|
3
|
-
#
|
4
|
-
# Author:: Jason Arhart
|
5
|
-
# Documentation:: Author
|
6
|
-
#
|
7
|
-
require 'rattler'
|
8
|
-
|
9
|
-
module Rattler
|
10
|
-
#
|
11
|
-
# The +BackEnd+ module contains the classes used to turn abstract parser
|
12
|
-
# models into concrete ruby code.
|
13
|
-
#
|
14
|
-
# @author Jason Arhart
|
15
|
-
#
|
16
|
-
module BackEnd
|
17
|
-
autoload :Compiler, 'rattler/back_end/compiler'
|
18
|
-
autoload :ParserGenerator, 'rattler/back_end/parser_generator'
|
19
|
-
autoload :RubyGenerator, 'rattler/back_end/ruby_generator'
|
20
|
-
autoload :Optimizer, 'rattler/back_end/optimizer'
|
21
|
-
end
|
22
|
-
end
|
@@ -1,128 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# = rattler/back_end/compiler.rb
|
3
|
-
#
|
4
|
-
# Author:: Jason Arhart
|
5
|
-
# Documentation:: Author
|
6
|
-
#
|
7
|
-
require 'rattler/back_end'
|
8
|
-
|
9
|
-
module Rattler::BackEnd
|
10
|
-
#
|
11
|
-
# The +Compiler+ compiles parser models into parser classes and methods.
|
12
|
-
#
|
13
|
-
# @author Jason Arhart
|
14
|
-
#
|
15
|
-
class Compiler
|
16
|
-
|
17
|
-
include Rattler::Grammar
|
18
|
-
include Rattler::Parsers
|
19
|
-
|
20
|
-
# Compile rules or grammar source into a new parser subclass of +base+.
|
21
|
-
#
|
22
|
-
# @overload compile_parser(base, rules)
|
23
|
-
# Compile +rules+ into a new parser subclass of +base+.
|
24
|
-
# @param [Class] base the base class for the new parser class
|
25
|
-
# @param [Rattler::Parser::RuleSet] rules the rules to compile
|
26
|
-
# @return [Class] a new parser class
|
27
|
-
#
|
28
|
-
# @overload compile_parser(base, rule)
|
29
|
-
# Compile +rule+ into a new parser subclass of +base+.
|
30
|
-
# @param [Class] base the base class for the new parser class
|
31
|
-
# @param [Rattler::Parser::Rule] rule the rule to compile
|
32
|
-
# @return [Class] a new parser class
|
33
|
-
#
|
34
|
-
# @overload compile_parser(base, grammar)
|
35
|
-
# Compile +grammar+ into a new parser subclass of +base+.
|
36
|
-
# @param [Class] base the base class for the new parser class
|
37
|
-
# @param [String] grammar the grammar source to compile
|
38
|
-
# @return [Class] a new parser class
|
39
|
-
#
|
40
|
-
def self.compile_parser(base, rules_or_grammar)
|
41
|
-
parser_class = Class.new(base)
|
42
|
-
compile(parser_class, rules_or_grammar)
|
43
|
-
end
|
44
|
-
|
45
|
-
# Compile rules or grammar source into match methods in the module +mod+.
|
46
|
-
def self.compile(mod, rules_or_grammar)
|
47
|
-
self.new(mod).compile(rules_or_grammar)
|
48
|
-
end
|
49
|
-
|
50
|
-
# Compile +rules+ into match methods in the module +mod+.
|
51
|
-
def self.compile_rules(mod, rules)
|
52
|
-
self.new(mod).compile_rules(rules)
|
53
|
-
end
|
54
|
-
|
55
|
-
# Compile grammar +source+ into a match method in the module +mod+.
|
56
|
-
def compile_grammar(mod, source)
|
57
|
-
self.new(mod).compiler_grammar(source)
|
58
|
-
end
|
59
|
-
|
60
|
-
# Create a new compiler that compiles rules into match methods in the
|
61
|
-
# given module.
|
62
|
-
def initialize(mod)
|
63
|
-
@mod = mod
|
64
|
-
end
|
65
|
-
|
66
|
-
# Compile the rules or grammar source into match methods in the module.
|
67
|
-
#
|
68
|
-
# @overload compile(rules)
|
69
|
-
# Compile +rules+ into match methods in the module.
|
70
|
-
# @param [Rattler::Parser::RuleSet] rules the rules to compile
|
71
|
-
# @return [Module] the module
|
72
|
-
#
|
73
|
-
# @overload compile(rule)
|
74
|
-
# Compile +rule+ into match methods in the module.
|
75
|
-
# @param [Rattler::Parser::Rule] rule the rule to compile
|
76
|
-
# @return [Module] the module
|
77
|
-
#
|
78
|
-
# @overload compile(grammar)
|
79
|
-
# Compile +grammar+ into match methods in the module.
|
80
|
-
# @param [String] grammar the grammar source to compile
|
81
|
-
# @return [Module] the module
|
82
|
-
#
|
83
|
-
def compile(_)
|
84
|
-
case _
|
85
|
-
when Grammar, RuleSet, Rule then compile_rules(_)
|
86
|
-
else compile_grammar(_.to_s)
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
# Compile +rules+ into match methods in the module.
|
91
|
-
#
|
92
|
-
# @overload compile_rules(rules)
|
93
|
-
# Compile +rules+ into match methods in the module.
|
94
|
-
# @param [Rattler::Parser::RuleSet] rules the rules to compile
|
95
|
-
# @return [Module] the module
|
96
|
-
#
|
97
|
-
# @overload compile_rules(rule)
|
98
|
-
# Compile +rule+ into match methods in the module.
|
99
|
-
# @param [Rattler::Parser::Rule] rule the rule to compile
|
100
|
-
# @return [Module] the module
|
101
|
-
#
|
102
|
-
def compile_rules(rules)
|
103
|
-
compile_model(rules)
|
104
|
-
end
|
105
|
-
|
106
|
-
# Compile +grammar+ into match methods in the module.
|
107
|
-
# @param [String] grammar the grammar source to compile
|
108
|
-
# @return [Module] the module
|
109
|
-
def compile_grammar(source)
|
110
|
-
result = Rattler::Grammar.parse!(source)
|
111
|
-
compile_model(result.rules)
|
112
|
-
end
|
113
|
-
|
114
|
-
private
|
115
|
-
|
116
|
-
def assert_kind_of(kinds, model) #:nodoc:
|
117
|
-
unless kinds.any? {|kind| model.kind_of?(kind) }
|
118
|
-
raise TypeError, "Expected #{model.inspect} to be a kind of #{klass}", caller
|
119
|
-
end
|
120
|
-
end
|
121
|
-
|
122
|
-
def compile_model(model) #:nodoc:
|
123
|
-
@mod.module_eval ParserGenerator.code_for(model)
|
124
|
-
@mod
|
125
|
-
end
|
126
|
-
|
127
|
-
end
|
128
|
-
end
|
@@ -1,101 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# = rattler/back_end/optimizer.rb
|
3
|
-
#
|
4
|
-
# Author:: Jason Arhart
|
5
|
-
# Documentation:: Author
|
6
|
-
#
|
7
|
-
require 'rattler'
|
8
|
-
|
9
|
-
module Rattler::BackEnd
|
10
|
-
#
|
11
|
-
# The +Optimizer+ transforms parser models into equivalent models that can
|
12
|
-
# result in more efficient parsing code. This is primarily achieved by
|
13
|
-
# converting regular expressions into equivalent Regexp patterns, thus
|
14
|
-
# reducing object instantiation and method dispatch and having StringScanner
|
15
|
-
# do as much of the parsing work as possible.
|
16
|
-
#
|
17
|
-
# @author Jason Arhart
|
18
|
-
#
|
19
|
-
module Optimizer
|
20
|
-
|
21
|
-
class << self
|
22
|
-
def optimizations
|
23
|
-
@optimizations ||=
|
24
|
-
OptimizeChildren >>
|
25
|
-
InlineRegularRules >>
|
26
|
-
SimplifyRedundantRepeat >>
|
27
|
-
RemoveMeaninglessWrapper >>
|
28
|
-
SimplifyTokenMatch >>
|
29
|
-
FlattenSequence >>
|
30
|
-
FlattenChoice >>
|
31
|
-
ReduceRepeatMatch >>
|
32
|
-
JoinPredicateMatch >>
|
33
|
-
JoinPredicateOrMatch >>
|
34
|
-
JoinMatchSequence >>
|
35
|
-
JoinMatchChoice
|
36
|
-
end
|
37
|
-
|
38
|
-
def optimize(model, opts={})
|
39
|
-
case model
|
40
|
-
when ::Rattler::Grammar::Grammar then optimize_grammar model, opts
|
41
|
-
when ::Rattler::Parsers::RuleSet then optimize_rule_set model, opts
|
42
|
-
when ::Rattler::Parsers::Rule then optimize_rule model, default_context(opts)
|
43
|
-
else optimize_expr model, default_context(opts)
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
private
|
48
|
-
|
49
|
-
def default_context(opts)
|
50
|
-
OptimizationContext[opts.merge :type => :capturing]
|
51
|
-
end
|
52
|
-
|
53
|
-
def optimize_grammar(grammar, opts)
|
54
|
-
grammar.with_rules optimize_rule_set(grammar.rules, opts)
|
55
|
-
end
|
56
|
-
|
57
|
-
def optimize_rule_set(rule_set, opts)
|
58
|
-
context = default_context(opts).with(:rules => rule_set)
|
59
|
-
rule_set = rule_set.map_rules {|_| optimize_rule _, context }
|
60
|
-
context = context.with(:rules => rule_set)
|
61
|
-
rule_set.select_rules {|_| context.relavent? _ }
|
62
|
-
end
|
63
|
-
|
64
|
-
def optimize_rule(rule, context)
|
65
|
-
rule.with_expr optimizations.apply(rule.expr, context)
|
66
|
-
end
|
67
|
-
|
68
|
-
def optimize_expr(expr, context)
|
69
|
-
optimizations.apply rule.expr, context
|
70
|
-
end
|
71
|
-
|
72
|
-
end
|
73
|
-
|
74
|
-
autoload :OptimizationContext, 'rattler/back_end/optimizer/optimization_context'
|
75
|
-
autoload :Optimization, 'rattler/back_end/optimizer/optimization'
|
76
|
-
autoload :OptimizationSequence, 'rattler/back_end/optimizer/optimization_sequence'
|
77
|
-
autoload :OptimizeChildren, 'rattler/back_end/optimizer/optimize_children'
|
78
|
-
autoload :InlineRegularRules, 'rattler/back_end/optimizer/inline_regular_rules'
|
79
|
-
autoload :SpecializeRepeat, 'rattler/back_end/optimizer/specialize_repeat'
|
80
|
-
autoload :SimplifyRedundantRepeat, 'rattler/back_end/optimizer/simplify_redundant_repeat'
|
81
|
-
autoload :RemoveMeaninglessWrapper, 'rattler/back_end/optimizer/remove_meaningless_wrapper'
|
82
|
-
autoload :SimplifyTokenMatch, 'rattler/back_end/optimizer/simplify_token_match'
|
83
|
-
autoload :FlattenSequence, 'rattler/back_end/optimizer/flatten_sequence'
|
84
|
-
autoload :FlattenChoice, 'rattler/back_end/optimizer/flatten_choice'
|
85
|
-
autoload :ReduceRepeatMatch, 'rattler/back_end/optimizer/reduce_repeat_match'
|
86
|
-
autoload :JoinPredicateMatch, 'rattler/back_end/optimizer/join_predicate_match'
|
87
|
-
autoload :JoinPredicateBareMatch, 'rattler/back_end/optimizer/join_predicate_bare_match'
|
88
|
-
autoload :JoinPredicateNestedMatch, 'rattler/back_end/optimizer/join_predicate_nested_match'
|
89
|
-
autoload :JoinPredicateOrMatch, 'rattler/back_end/optimizer/join_predicate_or_match'
|
90
|
-
autoload :JoinPredicateOrBareMatch, 'rattler/back_end/optimizer/join_predicate_or_bare_match'
|
91
|
-
autoload :JoinPredicateOrNestedMatch, 'rattler/back_end/optimizer/join_predicate_or_nested_match'
|
92
|
-
autoload :JoinMatchSequence, 'rattler/back_end/optimizer/join_match_sequence'
|
93
|
-
autoload :JoinMatchCapturingSequence, 'rattler/back_end/optimizer/join_match_capturing_sequence'
|
94
|
-
autoload :JoinMatchMatchingSequence, 'rattler/back_end/optimizer/join_match_matching_sequence'
|
95
|
-
autoload :JoinMatchChoice, 'rattler/back_end/optimizer/join_match_choice'
|
96
|
-
autoload :MatchJoining, 'rattler/back_end/optimizer/match_joining'
|
97
|
-
autoload :Flattening, 'rattler/back_end/optimizer/flattening'
|
98
|
-
autoload :CompositeReducing, 'rattler/back_end/optimizer/composite_reducing'
|
99
|
-
|
100
|
-
end
|
101
|
-
end
|