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,28 +1,17 @@
|
|
1
|
-
#
|
2
|
-
# = rattler/util/graphviz.rb
|
3
|
-
#
|
4
|
-
# Author:: Jason Arhart
|
5
|
-
# Documentation:: Author
|
6
|
-
#
|
7
1
|
require 'rattler/util'
|
8
2
|
|
9
3
|
module Rattler::Util
|
10
|
-
|
11
|
-
#
|
12
|
-
#
|
13
|
-
#
|
14
|
-
# @author Jason Arhart
|
15
|
-
#
|
4
|
+
|
5
|
+
# +GraphViz+ provides utilities to build GraphViz objects representing trees
|
6
|
+
# of nodes.
|
16
7
|
module GraphViz
|
17
8
|
|
18
9
|
autoload :DigraphBuilder, 'rattler/util/graphviz/digraph_builder'
|
19
10
|
autoload :NodeBuilder, 'rattler/util/graphviz/node_builder'
|
20
11
|
|
21
|
-
#
|
22
|
-
|
23
|
-
|
24
|
-
def self.digraph(root)
|
25
|
-
DigraphBuilder.digraph(root)
|
12
|
+
# (see DigraphBuilder.digraph)
|
13
|
+
def self.digraph(root, name='G')
|
14
|
+
DigraphBuilder.digraph(root, name)
|
26
15
|
end
|
27
16
|
|
28
17
|
end
|
@@ -1,10 +1,3 @@
|
|
1
|
-
#
|
2
|
-
# = rattler/util/graphviz/digraph_builder.rb
|
3
|
-
#
|
4
|
-
# Author:: Jason Arhart
|
5
|
-
# Documentation:: Author
|
6
|
-
#
|
7
|
-
|
8
1
|
begin
|
9
2
|
require 'graphviz'
|
10
3
|
rescue LoadError => e
|
@@ -14,28 +7,27 @@ end
|
|
14
7
|
require 'rattler/util/graphviz'
|
15
8
|
|
16
9
|
module Rattler::Util::GraphViz
|
17
|
-
|
10
|
+
|
18
11
|
# +DigraphBuilder+ is used to build GraphViz objects representing trees of
|
19
12
|
# nodes.
|
20
|
-
#
|
21
|
-
# @author Jason Arhart
|
22
|
-
#
|
23
13
|
class DigraphBuilder
|
14
|
+
include NodeBuilder
|
24
15
|
|
25
|
-
#
|
26
|
-
#
|
16
|
+
# @param (see #initialize)
|
27
17
|
# @return a new +GraphViz+ digraph object representing +root+
|
28
18
|
def self.digraph(root, name='G')
|
29
19
|
self.new(root, name).digraph
|
30
20
|
end
|
31
21
|
|
32
22
|
# Create a new digraph builder for +root+.
|
23
|
+
#
|
24
|
+
# @param root the root node
|
25
|
+
# @param [String] name the name of the graph
|
33
26
|
def initialize(root, name='G')
|
34
27
|
@root = root
|
35
28
|
@g = ::GraphViz.digraph(name)
|
36
29
|
@nodes = {}
|
37
30
|
@node_serial = 0
|
38
|
-
@node_builder = NodeBuilder.new
|
39
31
|
end
|
40
32
|
|
41
33
|
# @return a new +GraphViz+ digraph object representing the root object
|
@@ -49,12 +41,13 @@ module Rattler::Util::GraphViz
|
|
49
41
|
# Return a <tt>GraphViz::Node</tt> object for +o+. Multiple requests with
|
50
42
|
# the same object return the same node object.
|
51
43
|
#
|
52
|
-
# @
|
44
|
+
# @param o an object
|
45
|
+
# @return [GraphViz::Node] a node object for +o+
|
53
46
|
def node(o)
|
54
47
|
@nodes.fetch(o.object_id) do
|
55
|
-
new_node = @g.
|
48
|
+
new_node = @g.add_nodes new_node_name, node_options(o)
|
56
49
|
@nodes[o.object_id] = new_node
|
57
|
-
|
50
|
+
each_child_node_of(o) {|_| new_node << node(_) }
|
58
51
|
new_node
|
59
52
|
end
|
60
53
|
end
|
@@ -1,23 +1,18 @@
|
|
1
|
-
#
|
2
|
-
# = rattler/util/graphviz/node_builder.rb
|
3
|
-
#
|
4
|
-
# Author:: Jason Arhart
|
5
|
-
# Documentation:: Author
|
6
|
-
#
|
7
1
|
require 'rattler/util/graphviz'
|
8
2
|
|
9
3
|
module Rattler::Util::GraphViz
|
10
|
-
|
11
|
-
# +NodeBuilder+ is used by
|
4
|
+
|
5
|
+
# +NodeBuilder+ is used by {DigraphBuilder} to build nodes for a GraphViz
|
12
6
|
# digraph object representing a tree of nodes.
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
#
|
19
|
-
#
|
20
|
-
|
7
|
+
module NodeBuilder
|
8
|
+
|
9
|
+
# Run the block with any children of +o+ that should be represented as
|
10
|
+
# separate nodes in the graph.
|
11
|
+
#
|
12
|
+
# @param o an object
|
13
|
+
# @yield [child] each child of +o+ that should be represented as a separate
|
14
|
+
# node in the graph
|
15
|
+
def each_child_node_of(o)
|
21
16
|
if array_like? o and not record_like? o
|
22
17
|
if o.respond_to? :to_hash
|
23
18
|
o.each {|k, v| yield Mapping.new(k, v) }
|
@@ -27,13 +22,13 @@ module Rattler::Util::GraphViz
|
|
27
22
|
end
|
28
23
|
end
|
29
24
|
|
30
|
-
#
|
25
|
+
# @param o an object
|
31
26
|
# @return the options for a node representing +o+.
|
32
27
|
def node_options(o)
|
33
28
|
{ :shape => node_shape(o), :label => node_label(o) }
|
34
29
|
end
|
35
30
|
|
36
|
-
#
|
31
|
+
# @param o an object
|
37
32
|
# @return the shape option for a node representing +o+.
|
38
33
|
def node_shape(o)
|
39
34
|
case o
|
@@ -46,7 +41,7 @@ module Rattler::Util::GraphViz
|
|
46
41
|
end
|
47
42
|
end
|
48
43
|
|
49
|
-
#
|
44
|
+
# @param o an object
|
50
45
|
# @return the label option for a node representing +o+.
|
51
46
|
def node_label(o)
|
52
47
|
if o.is_a? ::Rattler::Util::Node
|
@@ -56,29 +51,30 @@ module Rattler::Util::GraphViz
|
|
56
51
|
elsif array_like? o
|
57
52
|
type_label(o)
|
58
53
|
elsif o.respond_to? :to_str
|
59
|
-
|
54
|
+
string_label(o)
|
60
55
|
else
|
61
56
|
o.inspect
|
62
57
|
end
|
63
58
|
end
|
64
59
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
else o.respond_to?(:name) ? o.name : o.class.name
|
71
|
-
end
|
60
|
+
# @param o an object
|
61
|
+
# @return whether +o+ should be represented as a record
|
62
|
+
def record_like?(o)
|
63
|
+
o.respond_to? :each_pair and
|
64
|
+
o.none? {|k, v| array_like? v or record_like? v }
|
72
65
|
end
|
73
66
|
|
67
|
+
# @param o an object
|
68
|
+
# @return whether +o+ should be represented as an array
|
74
69
|
def array_like?(o)
|
75
70
|
o.respond_to? :each and
|
76
71
|
not o.respond_to? :to_str
|
77
72
|
end
|
78
73
|
|
79
|
-
|
80
|
-
|
81
|
-
|
74
|
+
private
|
75
|
+
|
76
|
+
def string_label(s)
|
77
|
+
"\"#{s}\""
|
82
78
|
end
|
83
79
|
|
84
80
|
def record_label(o, fields)
|
@@ -86,7 +82,24 @@ module Rattler::Util::GraphViz
|
|
86
82
|
end
|
87
83
|
|
88
84
|
def hash_content_labels(h)
|
89
|
-
h.map {|
|
85
|
+
h.map {|k, v| "{#{k.inspect}|#{record_value v}}" }
|
86
|
+
end
|
87
|
+
|
88
|
+
def record_value(v)
|
89
|
+
if v.respond_to? :to_str
|
90
|
+
string_label(v)
|
91
|
+
else
|
92
|
+
v.inspect
|
93
|
+
end.gsub(/([|<>\\])/) { "\\#{$1}" }
|
94
|
+
end
|
95
|
+
|
96
|
+
def type_label(o)
|
97
|
+
case o
|
98
|
+
when Hash then '\\{\\}'
|
99
|
+
when Array then '\\[\\]'
|
100
|
+
when Mapping then '->'
|
101
|
+
else o.respond_to?(:name) ? o.name : o.class.name
|
102
|
+
end
|
90
103
|
end
|
91
104
|
|
92
105
|
def parse_node_fields(attrs)
|
@@ -106,5 +119,6 @@ module Rattler::Util::GraphViz
|
|
106
119
|
end
|
107
120
|
end
|
108
121
|
|
122
|
+
extend self
|
109
123
|
end
|
110
124
|
end
|
@@ -1,27 +1,18 @@
|
|
1
|
-
#
|
2
|
-
# = rattler/util/line_counter.rb
|
3
|
-
#
|
4
|
-
# Author:: Jason Arhart
|
5
|
-
# Documentation:: Author
|
6
|
-
#
|
7
1
|
require 'rattler/util'
|
8
2
|
|
9
3
|
module Rattler::Util
|
10
|
-
|
4
|
+
|
11
5
|
# A +LineCounter+ takes a linear index into text and calculates line and
|
12
6
|
# column numbers.
|
13
|
-
#
|
14
|
-
# @author Jason Arhart
|
15
|
-
#
|
16
7
|
class LineCounter
|
17
|
-
|
8
|
+
|
18
9
|
# @private
|
19
10
|
@@newline = "\n" #:nodoc:
|
20
|
-
|
11
|
+
|
21
12
|
# @private
|
22
13
|
@@tab = "\t" #:nodoc:
|
23
|
-
|
24
|
-
# Create a
|
14
|
+
|
15
|
+
# Create a +LineCounter+ object for +source+.
|
25
16
|
#
|
26
17
|
# @param [String] source the text in which to count lines
|
27
18
|
# @param [Hash] options any optional options for the line counter
|
@@ -31,7 +22,7 @@ module Rattler::Util
|
|
31
22
|
@source = source
|
32
23
|
@tab_size = options[:tab_size] || 8
|
33
24
|
end
|
34
|
-
|
25
|
+
|
35
26
|
# Return the line number of the character at +index+.
|
36
27
|
#
|
37
28
|
# @param [Integer] index the (0-based) index into the text
|
@@ -40,7 +31,7 @@ module Rattler::Util
|
|
40
31
|
count(index)
|
41
32
|
return @line
|
42
33
|
end
|
43
|
-
|
34
|
+
|
44
35
|
# Return the column number of the character at +index+. When a _tab_
|
45
36
|
# character is encountered the next tab stop is used for the column
|
46
37
|
# number of the character following the _tab_ character.
|
@@ -51,9 +42,9 @@ module Rattler::Util
|
|
51
42
|
count(index)
|
52
43
|
return @column
|
53
44
|
end
|
54
|
-
|
45
|
+
|
55
46
|
private
|
56
|
-
|
47
|
+
|
57
48
|
def count(index)
|
58
49
|
unless @index == index
|
59
50
|
@index = index
|
@@ -69,10 +60,10 @@ module Rattler::Util
|
|
69
60
|
end
|
70
61
|
end
|
71
62
|
end
|
72
|
-
|
63
|
+
|
73
64
|
def next_tab_stop
|
74
65
|
((@column - 1) / @tab_size + 1) * @tab_size + 1
|
75
66
|
end
|
76
|
-
|
67
|
+
|
77
68
|
end
|
78
69
|
end
|
data/lib/rattler/util/node.rb
CHANGED
@@ -1,48 +1,33 @@
|
|
1
|
-
#
|
2
|
-
# = rattler/util/node.rb
|
3
|
-
#
|
4
|
-
# Author:: Jason Arhart
|
5
|
-
# Documentation:: Author
|
6
|
-
#
|
7
1
|
require 'rattler/util'
|
8
2
|
|
9
3
|
module Rattler::Util
|
10
|
-
|
4
|
+
|
11
5
|
# A +Node+ is a node that can be used as-is to compose tree structures or
|
12
|
-
# as a base class for
|
13
|
-
# structures in the +Rattler+ framework.
|
14
|
-
#
|
15
|
-
# @author Jason Arhart
|
16
|
-
#
|
6
|
+
# as a base class for user-defined node types. It is the base class used for
|
7
|
+
# all tree structures in the +Rattler+ framework.
|
17
8
|
class Node
|
18
9
|
include Enumerable
|
19
10
|
|
20
|
-
# Create a +Node+ object.
|
21
|
-
#
|
22
|
-
# @return [Node]
|
23
|
-
#
|
24
11
|
# @overload Node.[]()
|
25
|
-
# @return [Node]
|
12
|
+
# @return [Node] a +Node+ object with no children or attributes
|
26
13
|
# @overload Node.[](child...)
|
27
|
-
# @return [Node]
|
14
|
+
# @return [Node] a +Node+ object with children and no attributes
|
28
15
|
# @overload Node.[](attribute...)
|
29
|
-
# @return [Node]
|
16
|
+
# @return [Node] a +Node+ object with attributes and no children
|
30
17
|
# @overload Node.[](child..., attribute...)
|
31
|
-
# @return [Node]
|
18
|
+
# @return [Node] a +Node+ object with children and attributes
|
32
19
|
def self.[](*args)
|
33
20
|
self.new(*args)
|
34
21
|
end
|
35
22
|
|
36
|
-
# Create a +Node+ object.
|
37
|
-
#
|
38
23
|
# @overload initialize()
|
39
|
-
#
|
24
|
+
# Create a +Node+ object with no children or attributes.
|
40
25
|
# @overload initialize(child...)
|
41
|
-
#
|
26
|
+
# Create a +Node+ object with children and no attributes.
|
42
27
|
# @overload initialize(attribute...)
|
43
|
-
#
|
28
|
+
# Create a +Node+ object with attributes and no children.
|
44
29
|
# @overload initialize(child..., attribute...)
|
45
|
-
#
|
30
|
+
# Create a +Node+ object with children and attributes.
|
46
31
|
def initialize(*args)
|
47
32
|
@attrs = args.last.respond_to?(:to_hash) ? args.pop : {}
|
48
33
|
@__children__ = args
|
@@ -95,16 +80,25 @@ module Rattler::Util
|
|
95
80
|
block_given? ? children.each { |_| yield _ } : children.each
|
96
81
|
end
|
97
82
|
|
83
|
+
# @param [Array] new_children a new array of children
|
84
|
+
# @return [Node] a new code with the new children replacing the node's
|
85
|
+
# children
|
98
86
|
def with_children(new_children)
|
99
87
|
self.class.new(new_children, attrs)
|
100
88
|
end
|
101
89
|
|
102
90
|
alias_method :with_child, :with_children
|
103
91
|
|
92
|
+
# @param (see #new_attrs!)
|
93
|
+
# @return [Node] a new node with the new attributes added to the node's
|
94
|
+
# attributes
|
104
95
|
def with_attrs(new_attrs)
|
105
96
|
self.with_attrs!(attrs.merge new_attrs)
|
106
97
|
end
|
107
98
|
|
99
|
+
# @param [Hash] new_attrs a new set of attributes
|
100
|
+
# @return [Node] a new node with the new attributes replacing the node's
|
101
|
+
# attributes
|
108
102
|
def with_attrs!(new_attrs)
|
109
103
|
self.class.new(children, new_attrs)
|
110
104
|
end
|
@@ -119,18 +113,14 @@ module Rattler::Util
|
|
119
113
|
# Access the node's children as if the node were an array of its children.
|
120
114
|
#
|
121
115
|
# @overload [](index)
|
122
|
-
# Return the node's child at +index+.
|
123
116
|
# @param [Integer] index index of the child
|
124
117
|
# @return the child at +index+
|
125
118
|
# @overload [](start, length)
|
126
|
-
# Return an array of the node's children starting at +start+ and
|
127
|
-
# continuing for +length+ children.
|
128
119
|
# @param [Integer] start the index of the first child
|
129
120
|
# @param [Integer] length the number of children to return
|
130
121
|
# @return [Array] the node's children starting at +start+ and
|
131
122
|
# continuing for +length+ children
|
132
123
|
# @overload [](range)
|
133
|
-
# Return an array of the node's children specified by +range+.
|
134
124
|
# @param [Range] range the range of children
|
135
125
|
# @return [Array] the node's children specified by +range+
|
136
126
|
def [](*args)
|
@@ -186,9 +176,41 @@ module Rattler::Util
|
|
186
176
|
']'
|
187
177
|
end
|
188
178
|
|
179
|
+
# @private
|
180
|
+
def pretty_print(q) #:nodoc:
|
181
|
+
pretty_print_name(q)
|
182
|
+
q.group(1, '[', ']') do
|
183
|
+
q.breakable('')
|
184
|
+
q.seplist(children) {|_| q.pp _ }
|
185
|
+
q.comma_breakable unless children.empty? or pretty_keys.empty?
|
186
|
+
q.seplist(pretty_keys) do |k|
|
187
|
+
q.pp k
|
188
|
+
q.text '=>'
|
189
|
+
q.pp attrs[k]
|
190
|
+
end
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
194
|
+
# @private
|
195
|
+
def pretty_print_cycle(q) #:nodoc:
|
196
|
+
pretty_print_name(q)
|
197
|
+
end
|
198
|
+
|
199
|
+
# @return a new +GraphViz+ digraph object representing the node
|
189
200
|
def to_graphviz
|
190
201
|
Rattler::Util::GraphViz.digraph(self)
|
191
202
|
end
|
192
203
|
|
204
|
+
private
|
205
|
+
|
206
|
+
def pretty_print_name(q)
|
207
|
+
q.text(self.class.name)
|
208
|
+
q.text("<#{self.name.inspect}>") if attrs.has_key?(:name)
|
209
|
+
end
|
210
|
+
|
211
|
+
def pretty_keys
|
212
|
+
@pretty_keys ||= attrs.keys.reject {|_| _ == :name }.sort_by {|_| _.to_s }
|
213
|
+
end
|
214
|
+
|
193
215
|
end
|
194
216
|
end
|