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,21 +1,11 @@
|
|
1
|
-
#
|
2
|
-
# = rattler/parsers/sequence.rb
|
3
|
-
#
|
4
|
-
# Author:: Jason Arhart
|
5
|
-
# Documentation:: Author
|
6
|
-
#
|
7
|
-
|
8
1
|
require 'rattler/parsers'
|
9
2
|
|
10
3
|
module Rattler::Parsers
|
11
|
-
|
4
|
+
|
12
5
|
# +Sequence+ combines two or more parsers and matches by trying each one in
|
13
6
|
# sequence and failing unless they all succeed.
|
14
|
-
#
|
15
|
-
# @author Jason Arhart
|
16
|
-
#
|
17
7
|
class Sequence < Parser
|
18
|
-
include
|
8
|
+
include Sequencing
|
19
9
|
|
20
10
|
# @private
|
21
11
|
def self.parsed(results, *_) #:nodoc:
|
@@ -25,48 +15,43 @@ module Rattler::Parsers
|
|
25
15
|
# Try each parser in sequence, and if they all succeed return an array of
|
26
16
|
# captured results, or return +false+ if any parser fails.
|
27
17
|
#
|
28
|
-
# @param (see
|
18
|
+
# @param (see Match#parse)
|
29
19
|
#
|
30
20
|
# @return an array of captured results of each parser in sequence, or
|
31
21
|
# +false+
|
32
|
-
def parse(scanner, rules, scope =
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
pos = scanner.pos
|
38
|
-
results = []
|
39
|
-
for child in children
|
40
|
-
if r = child.parse(scanner, rules, scope) {|_| scope = _ }
|
41
|
-
results << r unless r == true
|
42
|
-
else
|
43
|
-
scanner.pos = pos
|
44
|
-
return false
|
22
|
+
def parse(scanner, rules, scope = ParserScope.empty)
|
23
|
+
backtracking(scanner) do
|
24
|
+
if scope = parse_children(scanner, rules, scope.nest)
|
25
|
+
yield scope if block_given?
|
26
|
+
parse_result(scope)
|
45
27
|
end
|
46
28
|
end
|
47
|
-
yield scope if block_given?
|
48
|
-
case capture_count
|
49
|
-
when 0 then true
|
50
|
-
when 1 then results[0]
|
51
|
-
else results
|
52
|
-
end
|
53
29
|
end
|
54
30
|
|
55
|
-
#
|
56
|
-
# unless both parse in sequence.
|
57
|
-
#
|
58
|
-
# @param other (see Parser#&)
|
59
|
-
# @return (see Parser#&)
|
31
|
+
# (see Parser#&)
|
60
32
|
def &(other)
|
61
33
|
Sequence[(children + [other])]
|
62
34
|
end
|
63
35
|
|
64
|
-
#
|
65
|
-
|
66
|
-
|
36
|
+
# (see Parser#>>)
|
37
|
+
def >>(semantic)
|
38
|
+
AttributedSequence[(children + [semantic])]
|
39
|
+
end
|
40
|
+
|
41
|
+
# @return [Fixnum] the number of child parsers that are capturing
|
67
42
|
def capture_count
|
68
43
|
@capture_count ||= count {|_| _.capturing? }
|
69
44
|
end
|
70
45
|
|
46
|
+
private
|
47
|
+
|
48
|
+
def parse_result(scope)
|
49
|
+
case capture_count
|
50
|
+
when 0 then true
|
51
|
+
when 1 then scope.captures[0]
|
52
|
+
else scope.captures
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
71
56
|
end
|
72
57
|
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'rattler/parsers'
|
2
|
+
|
3
|
+
module Rattler::Parsers
|
4
|
+
|
5
|
+
# +Sequencing+ describes a parser that combines two or more parsers and
|
6
|
+
# matches in sequence.
|
7
|
+
module Sequencing
|
8
|
+
include Combining
|
9
|
+
|
10
|
+
# @return +true+
|
11
|
+
def sequence?
|
12
|
+
true
|
13
|
+
end
|
14
|
+
|
15
|
+
protected
|
16
|
+
|
17
|
+
# @private
|
18
|
+
def backtracking(scanner) #:nodoc:
|
19
|
+
pos = scanner.pos
|
20
|
+
yield or begin
|
21
|
+
scanner.pos = pos
|
22
|
+
false
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
# @private
|
27
|
+
def parse_children(scanner, rules, scope) #:nodoc:
|
28
|
+
for child in children
|
29
|
+
if r = child.parse(scanner, rules, scope) {|_| scope = scope.merge _ }
|
30
|
+
scope = scope.capture(r) unless r == true
|
31
|
+
yield r if block_given?
|
32
|
+
else
|
33
|
+
return false
|
34
|
+
end
|
35
|
+
end
|
36
|
+
scope
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
data/lib/rattler/parsers/skip.rb
CHANGED
@@ -1,14 +1,7 @@
|
|
1
|
-
#
|
2
|
-
# = rattler/parsers/skip.rb
|
3
|
-
#
|
4
|
-
# Author:: Jason Arhart
|
5
|
-
# Documentation:: Author
|
6
|
-
#
|
7
|
-
|
8
1
|
require 'rattler/parsers'
|
9
2
|
|
10
3
|
module Rattler::Parsers
|
11
|
-
|
4
|
+
|
12
5
|
# +Skip+ decorates a parser to skip over what it matches without capturing
|
13
6
|
# the results
|
14
7
|
#
|
@@ -23,20 +16,26 @@ module Rattler::Parsers
|
|
23
16
|
# If the decorated parser matches return +true+, otherwise return a false
|
24
17
|
# value.
|
25
18
|
#
|
26
|
-
# @param (see
|
19
|
+
# @param (see Match#parse)
|
27
20
|
#
|
28
21
|
# @return [Boolean] +true+ if the decorated parser matches at the parse
|
29
22
|
# position
|
30
|
-
def parse(
|
31
|
-
child.parse(
|
23
|
+
def parse(*args)
|
24
|
+
child.parse(*args) && true
|
32
25
|
end
|
33
26
|
|
34
|
-
# Always +false+
|
35
27
|
# @return false
|
28
|
+
# @see Parser#capturing?
|
36
29
|
def capturing?
|
37
30
|
false
|
38
31
|
end
|
39
32
|
|
33
|
+
# @return true
|
34
|
+
# @see Parser#capturing_decidable?
|
35
|
+
def capturing_decidable?
|
36
|
+
true
|
37
|
+
end
|
38
|
+
|
40
39
|
# @return (see Parser#skip)
|
41
40
|
def skip
|
42
41
|
self
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'rattler/parsers'
|
2
|
+
|
3
|
+
module Rattler::Parsers
|
4
|
+
|
5
|
+
# +Super+ parses by applying the rule of the same name inherited from a
|
6
|
+
# super-grammar.
|
7
|
+
class Super < Parser
|
8
|
+
|
9
|
+
# @param [Symbol] rule_name the name of the referenced rule
|
10
|
+
#
|
11
|
+
# @return [Apply] a new parser that parses by applying the rule
|
12
|
+
# referenced by +rule_name+ in a super-grammar
|
13
|
+
def self.[](rule_name)
|
14
|
+
self.new(:rule_name => rule_name.to_sym)
|
15
|
+
end
|
16
|
+
|
17
|
+
# Apply the parse rule of the same name inherited from a super-grammar.
|
18
|
+
#
|
19
|
+
# @param (see Match#parse)
|
20
|
+
#
|
21
|
+
# @return the result of applying parse rule of the same name inherited from
|
22
|
+
# a super-grammar
|
23
|
+
def parse(scanner, rules, scope = ParserScope.empty)
|
24
|
+
rules.inherited_rule(rule_name).parse(scanner, rules, scope)
|
25
|
+
end
|
26
|
+
|
27
|
+
# (see Parser#capturing_decidable?)
|
28
|
+
def capturing_decidable?
|
29
|
+
false
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
@@ -1,28 +1,18 @@
|
|
1
|
-
#
|
2
|
-
# = rattler/parsers/token.rb
|
3
|
-
#
|
4
|
-
# Author:: Jason Arhart
|
5
|
-
# Documentation:: Author
|
6
|
-
#
|
7
|
-
|
8
1
|
require 'rattler/parsers'
|
9
2
|
|
10
3
|
module Rattler::Parsers
|
11
|
-
|
4
|
+
|
12
5
|
# +Token+ decorates a parser to return the entire matched string
|
13
|
-
#
|
14
|
-
# @author Jason Arhart
|
15
|
-
#
|
16
6
|
class Token < Parser
|
17
7
|
include Atomic
|
18
8
|
|
19
9
|
# If the decorated parser matches return the entire matched string,
|
20
10
|
# otherwise return a false value.
|
21
11
|
#
|
22
|
-
# @param (see
|
12
|
+
# @param (see Match#parse)
|
23
13
|
#
|
24
14
|
# @return (see Match#parse)
|
25
|
-
def parse(scanner, rules, scope =
|
15
|
+
def parse(scanner, rules, scope = ParserScope.empty)
|
26
16
|
p = scanner.pos
|
27
17
|
child.parse(scanner, rules, scope) && scanner.string[p...(scanner.pos)]
|
28
18
|
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'rattler/runner'
|
2
|
+
require 'rake'
|
3
|
+
require 'rake/tasklib'
|
4
|
+
|
5
|
+
module Rattler
|
6
|
+
|
7
|
+
# The rake task to generate parser code from a grammar
|
8
|
+
#
|
9
|
+
class RakeTask < ::Rake::TaskLib
|
10
|
+
include ::Rake::DSL if defined?(::Rake::DSL)
|
11
|
+
|
12
|
+
attr_accessor :name
|
13
|
+
attr_accessor :grammar
|
14
|
+
attr_accessor :rtlr_opts
|
15
|
+
attr_accessor :verbose
|
16
|
+
|
17
|
+
def initialize(name = :rattler)
|
18
|
+
@name = name
|
19
|
+
@grammar = nil
|
20
|
+
@rtlr_opts = []
|
21
|
+
@verbose = true
|
22
|
+
|
23
|
+
yield self if block_given?
|
24
|
+
|
25
|
+
define_task
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def define_task
|
31
|
+
task name do
|
32
|
+
RakeFileUtils.send(:verbose, verbose) do
|
33
|
+
::Rattler::Runner.run(run_args) if valid?
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def run_args
|
39
|
+
[grammar] + rtlr_opts
|
40
|
+
end
|
41
|
+
|
42
|
+
def valid?
|
43
|
+
unless grammar
|
44
|
+
puts "No grammar specified"
|
45
|
+
return false
|
46
|
+
end
|
47
|
+
true
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
data/lib/rattler/runner.rb
CHANGED
@@ -1,23 +1,26 @@
|
|
1
|
-
#
|
2
|
-
# = rattler/runner.rb
|
3
|
-
#
|
4
|
-
# Author:: Jason Arhart
|
5
|
-
# Documentation:: Author
|
6
|
-
#
|
7
1
|
require 'rattler'
|
8
2
|
|
9
3
|
require 'optparse'
|
10
4
|
require 'pathname'
|
11
5
|
|
12
6
|
module Rattler
|
13
|
-
#
|
7
|
+
# +Runner+ defines the command-line parser generator.
|
14
8
|
class Runner
|
15
9
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
10
|
+
# Invalid command line arguments
|
11
|
+
ERRNO_USAGE = 1
|
12
|
+
|
13
|
+
# Error reading grammar file
|
14
|
+
ERRNO_READ_ERROR = 2
|
15
|
+
|
16
|
+
# Error writing parser file
|
17
|
+
ERRNO_WRITE_ERROR = 3
|
18
|
+
|
19
|
+
# Error parsing grammar
|
20
|
+
ERRNO_PARSE_ERROR = 4
|
21
|
+
|
22
|
+
# Error generaing ruby code
|
23
|
+
ERRNO_GEN_ERROR = 5
|
21
24
|
|
22
25
|
# Run the command-line parser
|
23
26
|
#
|
@@ -28,9 +31,8 @@ module Rattler
|
|
28
31
|
|
29
32
|
# Create a new command-line parser.
|
30
33
|
#
|
31
|
-
# @param [Array] args the command-line arguments
|
34
|
+
# @param [Array<String>] args the command-line arguments
|
32
35
|
def initialize(args)
|
33
|
-
@standalone = false
|
34
36
|
@optimize = true
|
35
37
|
options.parse!(args)
|
36
38
|
if args.size == 1
|
@@ -80,11 +82,6 @@ module Rattler
|
|
80
82
|
@force = f
|
81
83
|
end
|
82
84
|
|
83
|
-
opts.on '-s', '--standalone',
|
84
|
-
'Optimize for use as a standalone parser' do |s|
|
85
|
-
@standalone = s
|
86
|
-
end
|
87
|
-
|
88
85
|
opts.on '-n', '--no-optimize',
|
89
86
|
'Disable optimization' do |n|
|
90
87
|
@optimize = n
|
@@ -99,7 +96,7 @@ module Rattler
|
|
99
96
|
end
|
100
97
|
|
101
98
|
def parser
|
102
|
-
@parser ||= Rattler::
|
99
|
+
@parser ||= Rattler::Compiler::GrammarParser.new(@srcfname.read)
|
103
100
|
end
|
104
101
|
|
105
102
|
def analyze
|
@@ -124,11 +121,11 @@ module Rattler
|
|
124
121
|
end
|
125
122
|
|
126
123
|
def code_for(g)
|
127
|
-
Rattler::
|
124
|
+
Rattler::Compiler::ParserGenerator.code_for g, generator_options
|
128
125
|
end
|
129
126
|
|
130
127
|
def generator_options
|
131
|
-
{ :
|
128
|
+
{ :no_optimize => !@optimize }
|
132
129
|
end
|
133
130
|
|
134
131
|
def open_output(g)
|
data/lib/rattler/runtime.rb
CHANGED
@@ -1,17 +1,7 @@
|
|
1
|
-
#
|
2
|
-
# = rattler/runtime.rb
|
3
|
-
#
|
4
|
-
# Author:: Jason Arhart
|
5
|
-
# Documentation:: Author
|
6
|
-
#
|
7
1
|
require 'rattler'
|
8
2
|
|
9
3
|
module Rattler
|
10
|
-
#
|
11
4
|
# The +Runtime+ module defines the classes used by concrete parsers.
|
12
|
-
#
|
13
|
-
# @author Jason Arhart
|
14
|
-
#
|
15
5
|
module Runtime
|
16
6
|
autoload :Parser, 'rattler/runtime/parser'
|
17
7
|
autoload :RecursiveDescentParser, 'rattler/runtime/recursive_descent_parser'
|
@@ -1,20 +1,10 @@
|
|
1
|
-
#
|
2
|
-
# = rattler/runtime/extended_packrat_parser.rb
|
3
|
-
#
|
4
|
-
# Author:: Jason Arhart
|
5
|
-
# Documentation:: Author
|
6
|
-
#
|
7
|
-
|
8
1
|
require 'rattler/runtime'
|
9
2
|
|
10
3
|
module Rattler::Runtime
|
11
|
-
|
4
|
+
|
12
5
|
# +ExtendedPackratParser+ implements the algorithm described by Alessandro
|
13
6
|
# Warth, James R. Douglass, and Todd Millstein for extending packrat parsing
|
14
7
|
# to support left-recursive grammars.
|
15
|
-
#
|
16
|
-
# @author Jason Arhart
|
17
|
-
#
|
18
8
|
class ExtendedPackratParser < PackratParser
|
19
9
|
|
20
10
|
# Create a new extended packrat parser to parse +source+.
|
@@ -28,47 +18,52 @@ module Rattler::Runtime
|
|
28
18
|
@lr_stack = []
|
29
19
|
end
|
30
20
|
|
31
|
-
|
21
|
+
# Apply a rule by dispatching to the given match method. The result of
|
22
|
+
# applying the rule is memoized so that the match method is invoked at most
|
23
|
+
# once at a given parse position.
|
24
|
+
#
|
25
|
+
# @param (see PackratParser#apply)
|
26
|
+
# @return (see PackratParser#apply)
|
27
|
+
#
|
28
|
+
def apply(match_method_name)
|
32
29
|
start_pos = @scanner.pos
|
33
|
-
if m = memo_lr(
|
34
|
-
recall m,
|
30
|
+
if m = memo_lr(match_method_name, start_pos)
|
31
|
+
recall m, match_method_name
|
35
32
|
else
|
36
|
-
lr = LR.new(false,
|
33
|
+
lr = LR.new(false, match_method_name, nil)
|
37
34
|
@lr_stack.push lr
|
38
|
-
m = inject_memo
|
39
|
-
result = eval_rule
|
35
|
+
m = inject_memo match_method_name, start_pos, lr, start_pos
|
36
|
+
result = eval_rule match_method_name
|
40
37
|
@lr_stack.pop
|
41
38
|
if lr.head
|
42
39
|
m.end_pos = @scanner.pos
|
43
40
|
lr.seed = result
|
44
|
-
lr_answer
|
41
|
+
lr_answer match_method_name, start_pos, m
|
45
42
|
else
|
46
43
|
save m, result
|
47
44
|
end
|
48
45
|
end
|
49
46
|
end
|
50
47
|
|
51
|
-
alias_method :memoize_lr, :apply
|
52
|
-
|
53
48
|
private
|
54
49
|
|
55
50
|
# @private
|
56
|
-
def memo_lr(
|
57
|
-
m = memo(
|
51
|
+
def memo_lr(match_method_name, start_pos) #:nodoc:
|
52
|
+
m = memo(match_method_name, start_pos)
|
58
53
|
head = @heads[start_pos] or return m
|
59
|
-
if !m && !head.involves?(
|
60
|
-
return inject_fail
|
54
|
+
if !m && !head.involves?(match_method_name)
|
55
|
+
return inject_fail match_method_name, start_pos
|
61
56
|
end
|
62
|
-
if head.eval_set.delete(
|
63
|
-
save m, eval_rule(
|
57
|
+
if head.eval_set.delete(match_method_name)
|
58
|
+
save m, eval_rule(match_method_name)
|
64
59
|
end
|
65
60
|
return m
|
66
61
|
end
|
67
62
|
|
68
63
|
# @private
|
69
|
-
def recall(m,
|
64
|
+
def recall(m, match_method_name) #:nodoc:
|
70
65
|
if (result = m.result).is_a? LR
|
71
|
-
setup_lr
|
66
|
+
setup_lr match_method_name, result
|
72
67
|
result.seed
|
73
68
|
else
|
74
69
|
super
|
@@ -76,34 +71,34 @@ module Rattler::Runtime
|
|
76
71
|
end
|
77
72
|
|
78
73
|
# @private
|
79
|
-
def setup_lr(
|
80
|
-
lr.head ||= Head.new(
|
74
|
+
def setup_lr(match_method_name, lr) #:nodoc:
|
75
|
+
lr.head ||= Head.new(match_method_name)
|
81
76
|
@lr_stack.reverse_each do |_|
|
82
77
|
return if _.head == lr.head
|
83
|
-
lr.head.involved_set[_.
|
78
|
+
lr.head.involved_set[_.match_method_name] = _.match_method_name
|
84
79
|
end
|
85
80
|
end
|
86
81
|
|
87
82
|
# @private
|
88
|
-
def lr_answer(
|
83
|
+
def lr_answer(match_method_name, start_pos, m) #:nodoc:
|
89
84
|
head = m.result.head
|
90
|
-
if head.
|
91
|
-
grow_lr(
|
85
|
+
if head.match_method_name == match_method_name
|
86
|
+
grow_lr(match_method_name, start_pos, m, head) if m.result = m.result.seed
|
92
87
|
else
|
93
88
|
save m, m.result.seed
|
94
89
|
end
|
95
90
|
end
|
96
91
|
|
97
92
|
# @private
|
98
|
-
def grow_lr(
|
93
|
+
def grow_lr(match_method_name, start_pos, m, head) #:nodoc:
|
99
94
|
@heads[start_pos] = head
|
100
95
|
loop do
|
101
96
|
@scanner.pos = start_pos
|
102
97
|
head.eval_set.replace(head.involved_set)
|
103
|
-
result = eval_rule(
|
98
|
+
result = eval_rule(match_method_name)
|
104
99
|
if !result or @scanner.pos <= m.end_pos
|
105
100
|
@heads.delete(start_pos)
|
106
|
-
return recall m,
|
101
|
+
return recall m, match_method_name
|
107
102
|
end
|
108
103
|
save m, result
|
109
104
|
end
|
@@ -111,24 +106,24 @@ module Rattler::Runtime
|
|
111
106
|
|
112
107
|
# @private
|
113
108
|
class LR #:nodoc:
|
114
|
-
def initialize(seed,
|
109
|
+
def initialize(seed, match_method_name, head)
|
115
110
|
@seed = seed
|
116
|
-
@
|
111
|
+
@match_method_name = match_method_name
|
117
112
|
@head = head
|
118
113
|
end
|
119
|
-
attr_accessor :seed, :
|
114
|
+
attr_accessor :seed, :match_method_name, :head
|
120
115
|
end
|
121
116
|
|
122
117
|
# @private
|
123
118
|
class Head #:nodoc:
|
124
|
-
def initialize(
|
125
|
-
@
|
119
|
+
def initialize(match_method_name)
|
120
|
+
@match_method_name = match_method_name
|
126
121
|
@involved_set = {}
|
127
122
|
@eval_set = {}
|
128
123
|
end
|
129
|
-
attr_accessor :
|
130
|
-
def involves?(
|
131
|
-
|
124
|
+
attr_accessor :match_method_name, :involved_set, :eval_set
|
125
|
+
def involves?(match_method_name)
|
126
|
+
match_method_name == self.match_method_name or involved_set.has_key? match_method_name
|
132
127
|
end
|
133
128
|
end
|
134
129
|
|