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
@@ -2,7 +2,7 @@ require File.expand_path(File.dirname(__FILE__) + '/../../../spec_helper')
|
|
2
2
|
|
3
3
|
include Rattler::Parsers
|
4
4
|
|
5
|
-
describe Rattler::
|
5
|
+
describe Rattler::Compiler::ParserGenerator::RuleSetGenerator do
|
6
6
|
|
7
7
|
include ParserGeneratorSpecHelper
|
8
8
|
|
@@ -31,7 +31,8 @@ end
|
|
31
31
|
# @private
|
32
32
|
def match_a! #:nodoc:
|
33
33
|
@scanner.scan("a") ||
|
34
|
-
match(:b)
|
34
|
+
match(:b) ||
|
35
|
+
fail! { :a }
|
35
36
|
end
|
36
37
|
|
37
38
|
# @private
|
@@ -41,7 +42,8 @@ end
|
|
41
42
|
|
42
43
|
# @private
|
43
44
|
def match_b! #:nodoc:
|
44
|
-
@scanner.scan("b")
|
45
|
+
@scanner.scan("b") ||
|
46
|
+
fail { :b }
|
45
47
|
end
|
46
48
|
CODE
|
47
49
|
end
|
@@ -49,17 +51,7 @@ end
|
|
49
51
|
|
50
52
|
context 'given rules with a start rule defined' do
|
51
53
|
|
52
|
-
let(:rules) { RuleSet[
|
53
|
-
|
54
|
-
Rule[:a, Choice[
|
55
|
-
Match['a'],
|
56
|
-
Apply[:b]
|
57
|
-
]],
|
58
|
-
|
59
|
-
Rule[:b, Match['b']],
|
60
|
-
|
61
|
-
{ :start_rule => :a }
|
62
|
-
] }
|
54
|
+
let(:rules) { RuleSet[Rule[:a, Match['a']], { :start_rule => :a }] }
|
63
55
|
|
64
56
|
it 'generates #start_rule and #match_<rule> methods' do
|
65
57
|
generated_code {|g| g.generate rules }.
|
@@ -77,21 +69,11 @@ end
|
|
77
69
|
# @private
|
78
70
|
def match_a! #:nodoc:
|
79
71
|
@scanner.scan("a") ||
|
80
|
-
|
81
|
-
end
|
82
|
-
|
83
|
-
# @private
|
84
|
-
def match_b #:nodoc:
|
85
|
-
apply :match_b!
|
86
|
-
end
|
87
|
-
|
88
|
-
# @private
|
89
|
-
def match_b! #:nodoc:
|
90
|
-
@scanner.scan("b")
|
72
|
+
fail { :a }
|
91
73
|
end
|
92
74
|
CODE
|
93
75
|
end
|
94
76
|
end
|
95
|
-
end
|
96
77
|
|
97
|
-
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,437 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../../spec_helper')
|
2
|
+
|
3
|
+
include Rattler::Compiler::ParserGenerator
|
4
|
+
include Rattler::Parsers
|
5
|
+
|
6
|
+
describe SemanticActionGenerator do
|
7
|
+
|
8
|
+
include ParserGeneratorSpecHelper
|
9
|
+
|
10
|
+
let(:scope) { ParserScope.new(bindings, captures) }
|
11
|
+
let(:bindings) { {} }
|
12
|
+
let(:captures) { [] }
|
13
|
+
|
14
|
+
describe '#gen_basic' do
|
15
|
+
|
16
|
+
context 'given an action with no parameters' do
|
17
|
+
|
18
|
+
let(:action) { SemanticAction['@foo * 3'] }
|
19
|
+
|
20
|
+
context 'when nested' do
|
21
|
+
it 'generates nested semantic action code' do
|
22
|
+
nested_code {|g| g.gen_basic action }.
|
23
|
+
should == '(@foo * 3)'
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
context 'when top-level' do
|
28
|
+
it 'generates top level semantic action code' do
|
29
|
+
top_level_code {|g| g.gen_basic action }.
|
30
|
+
should == '@foo * 3'
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
context 'given an action with parameters' do
|
36
|
+
|
37
|
+
let(:action) { SemanticAction['|a,b| a * b'] }
|
38
|
+
let(:captures) { ['2', '5'] }
|
39
|
+
|
40
|
+
context 'when nested' do
|
41
|
+
it 'generates nested semantic action code using captures' do
|
42
|
+
nested_code {|g| g.gen_basic action, scope }.
|
43
|
+
should == '(2 * 5)'
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
context 'when top-level' do
|
48
|
+
it 'generates top level semantic action code using captures' do
|
49
|
+
top_level_code {|g| g.gen_basic action, scope }.
|
50
|
+
should == '2 * 5'
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
context 'given an action using "_"' do
|
56
|
+
|
57
|
+
context 'given a single capture' do
|
58
|
+
|
59
|
+
let (:action) { SemanticAction['_ * 2'] }
|
60
|
+
let (:captures) { ['3'] }
|
61
|
+
|
62
|
+
context 'when nested' do
|
63
|
+
it 'generates nested semantic action code using the capture' do
|
64
|
+
nested_code {|g| g.gen_basic action, scope }.
|
65
|
+
should == ('(3 * 2)')
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
context 'when top-level' do
|
70
|
+
it 'generates top level semantic action code using the capture' do
|
71
|
+
top_level_code {|g| g.gen_basic action, scope }.
|
72
|
+
should == ('3 * 2')
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
context 'given multiple captures' do
|
78
|
+
|
79
|
+
let (:action) { SemanticAction['_.join'] }
|
80
|
+
let (:captures) { ['3', '2'] }
|
81
|
+
|
82
|
+
context 'when nested' do
|
83
|
+
it 'generates nested semantic action code using the array of captures' do
|
84
|
+
nested_code {|g| g.gen_basic action, scope }.
|
85
|
+
should == ('([3, 2].join)')
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
context 'when top-level' do
|
90
|
+
it 'generates top level semantic action code using the array of captures' do
|
91
|
+
top_level_code {|g| g.gen_basic action, scope }.
|
92
|
+
should == ('[3, 2].join')
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
context 'given an action using labels' do
|
99
|
+
|
100
|
+
let(:action) { SemanticAction['left * right'] }
|
101
|
+
let(:bindings) { {:left => '3', :right => '2'} }
|
102
|
+
|
103
|
+
context 'when nested' do
|
104
|
+
it 'generates nested semantic action code using bindings' do
|
105
|
+
nested_code {|g| g.gen_basic action, scope }.
|
106
|
+
should == '(3 * 2)'
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
context 'when top-level' do
|
111
|
+
it 'generates top level semantic action code using bindings' do
|
112
|
+
top_level_code {|g| g.gen_basic action, scope }.
|
113
|
+
should == '3 * 2'
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
describe '#gen_assert' do
|
120
|
+
|
121
|
+
context 'given an action with no parameters' do
|
122
|
+
|
123
|
+
let(:action) { SemanticAction['@foo == 3'] }
|
124
|
+
|
125
|
+
context 'when nested' do
|
126
|
+
it 'generates nested semantic assert code' do
|
127
|
+
nested_code {|g| g.gen_assert action }.
|
128
|
+
should == '((@foo == 3) && true)'
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
context 'when top-level' do
|
133
|
+
it 'generates top level semantic assert code' do
|
134
|
+
top_level_code {|g| g.gen_assert action }.
|
135
|
+
should == '(@foo == 3) && true'
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
context 'given an action with parameters' do
|
141
|
+
|
142
|
+
let(:action) { SemanticAction['|a,b| a == b'] }
|
143
|
+
let(:captures) { ['2', '1'] }
|
144
|
+
|
145
|
+
context 'when nested' do
|
146
|
+
it 'generates nested semantic assert code using captures' do
|
147
|
+
nested_code {|g| g.gen_assert action, scope }.
|
148
|
+
should == '((2 == 1) && true)'
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
context 'when top-level' do
|
153
|
+
it 'generates top level semantic assert code using captures' do
|
154
|
+
top_level_code {|g| g.gen_assert action, scope }.
|
155
|
+
should == '(2 == 1) && true'
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
context 'given an action using labels' do
|
161
|
+
|
162
|
+
let(:action) { SemanticAction['left < right'] }
|
163
|
+
let(:bindings) { {:left => '2', :right => '3'} }
|
164
|
+
|
165
|
+
context 'when nested' do
|
166
|
+
it 'generates nested semantic assert code using bindings' do
|
167
|
+
nested_code {|g| g.gen_assert action, scope }.
|
168
|
+
should == '((2 < 3) && true)'
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
context 'when top-level' do
|
173
|
+
it 'generates top level semantic assert code using bindings' do
|
174
|
+
top_level_code {|g| g.gen_assert action, scope }.
|
175
|
+
should == '(2 < 3) && true'
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
describe '#gen_disallow' do
|
182
|
+
|
183
|
+
context 'given an action with no parameters' do
|
184
|
+
|
185
|
+
let(:action) { SemanticAction['@foo == 3'] }
|
186
|
+
|
187
|
+
context 'when nested' do
|
188
|
+
it 'generates semantic disallow code' do
|
189
|
+
nested_code {|g| g.gen_disallow action }.
|
190
|
+
should == '!(@foo == 3)'
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
194
|
+
context 'when top-level' do
|
195
|
+
it 'generates semantic disallow code' do
|
196
|
+
top_level_code {|g| g.gen_disallow action }.
|
197
|
+
should == '!(@foo == 3)'
|
198
|
+
end
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
202
|
+
context 'given an action with parameters' do
|
203
|
+
|
204
|
+
let(:action) { SemanticAction['|a,b| a == b'] }
|
205
|
+
let(:captures) { ['2', '1'] }
|
206
|
+
|
207
|
+
context 'when nested' do
|
208
|
+
it 'generates semantic disallow code using captures' do
|
209
|
+
nested_code {|g| g.gen_disallow action, scope }.
|
210
|
+
should == '!(2 == 1)'
|
211
|
+
end
|
212
|
+
end
|
213
|
+
|
214
|
+
context 'when top-level' do
|
215
|
+
it 'generates semantic disallow code using captures' do
|
216
|
+
top_level_code {|g| g.gen_disallow action, scope }.
|
217
|
+
should == '!(2 == 1)'
|
218
|
+
end
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
222
|
+
context 'given an action using labels' do
|
223
|
+
|
224
|
+
let(:action) { SemanticAction['left < right'] }
|
225
|
+
let(:bindings) { {:left => '2', :right => '3'} }
|
226
|
+
|
227
|
+
context 'when nested' do
|
228
|
+
it 'generates semantic disallow code using bindings' do
|
229
|
+
nested_code {|g| g.gen_disallow action, scope }.
|
230
|
+
should == '!(2 < 3)'
|
231
|
+
end
|
232
|
+
end
|
233
|
+
|
234
|
+
context 'when top-level' do
|
235
|
+
it 'generates semantic disallow code using bindings' do
|
236
|
+
top_level_code {|g| g.gen_disallow action, scope }.
|
237
|
+
should == '!(2 < 3)'
|
238
|
+
end
|
239
|
+
end
|
240
|
+
end
|
241
|
+
end
|
242
|
+
|
243
|
+
describe '#gen_token' do
|
244
|
+
|
245
|
+
context 'given an action with no parameters' do
|
246
|
+
|
247
|
+
let(:action) { SemanticAction['@foo * 2'] }
|
248
|
+
|
249
|
+
context 'when nested' do
|
250
|
+
it 'generates semantic token code' do
|
251
|
+
nested_code {|g| g.gen_token action }.
|
252
|
+
should == '(@foo * 2).to_s'
|
253
|
+
end
|
254
|
+
end
|
255
|
+
|
256
|
+
context 'when top-level' do
|
257
|
+
it 'generates semantic token code' do
|
258
|
+
top_level_code {|g| g.gen_token action }.
|
259
|
+
should == '(@foo * 2).to_s'
|
260
|
+
end
|
261
|
+
end
|
262
|
+
end
|
263
|
+
|
264
|
+
context 'given an action with parameters' do
|
265
|
+
|
266
|
+
let(:action) { SemanticAction['|a, b| a + b'] }
|
267
|
+
let(:captures) { ['1', '3'] }
|
268
|
+
|
269
|
+
context 'when nested' do
|
270
|
+
it 'generates semantic token code using captures' do
|
271
|
+
nested_code {|g| g.gen_token action, scope }.
|
272
|
+
should == '(1 + 3).to_s'
|
273
|
+
end
|
274
|
+
end
|
275
|
+
|
276
|
+
context 'when top-level' do
|
277
|
+
it 'generates semantic token code using captures' do
|
278
|
+
top_level_code {|g| g.gen_token action, scope }.
|
279
|
+
should == '(1 + 3).to_s'
|
280
|
+
end
|
281
|
+
end
|
282
|
+
end
|
283
|
+
|
284
|
+
context 'given an action using labels' do
|
285
|
+
|
286
|
+
let(:action) { SemanticAction['left * right'] }
|
287
|
+
let(:bindings) { {:left => '4', :right => '3'} }
|
288
|
+
|
289
|
+
context 'when nested' do
|
290
|
+
it 'generates semantic token code using bindings' do
|
291
|
+
nested_code {|g| g.gen_token action, scope }.
|
292
|
+
should == '(4 * 3).to_s'
|
293
|
+
end
|
294
|
+
end
|
295
|
+
|
296
|
+
context 'when top-level' do
|
297
|
+
it 'generates semantic token code using bindings' do
|
298
|
+
top_level_code {|g| g.gen_token action, scope }.
|
299
|
+
should == '(4 * 3).to_s'
|
300
|
+
end
|
301
|
+
end
|
302
|
+
end
|
303
|
+
end
|
304
|
+
|
305
|
+
describe '#gen_skip' do
|
306
|
+
|
307
|
+
context 'given an action with no parameters' do
|
308
|
+
|
309
|
+
let(:action) { SemanticAction['@foo = 2'] }
|
310
|
+
|
311
|
+
context 'when nested' do
|
312
|
+
it 'generates nested semantic side-effect code' do
|
313
|
+
nested_code {|g| g.gen_skip action }.
|
314
|
+
should == '(@foo = 2; true)'
|
315
|
+
end
|
316
|
+
end
|
317
|
+
|
318
|
+
context 'when top-level' do
|
319
|
+
it 'generates top level semantic side-effect code' do
|
320
|
+
top_level_code {|g| g.gen_skip action }.
|
321
|
+
should == '@foo = 2; true'
|
322
|
+
end
|
323
|
+
end
|
324
|
+
end
|
325
|
+
|
326
|
+
context 'given an action with parameters' do
|
327
|
+
|
328
|
+
let(:action) { SemanticAction['|a, b| @foo = a * b'] }
|
329
|
+
let(:captures) { ['2', '4'] }
|
330
|
+
|
331
|
+
context 'when nested' do
|
332
|
+
it 'generates nested semantic side-effect code using captures' do
|
333
|
+
nested_code {|g| g.gen_skip action, scope }.
|
334
|
+
should == '(@foo = 2 * 4; true)'
|
335
|
+
end
|
336
|
+
end
|
337
|
+
|
338
|
+
context 'when top-level' do
|
339
|
+
it 'generates top level semantic side-effect code using captures' do
|
340
|
+
top_level_code {|g| g.gen_skip action, scope }.
|
341
|
+
should == '@foo = 2 * 4; true'
|
342
|
+
end
|
343
|
+
end
|
344
|
+
end
|
345
|
+
|
346
|
+
context 'given an action using labels' do
|
347
|
+
|
348
|
+
let(:action) { SemanticAction['@foo = left * right'] }
|
349
|
+
let(:bindings) { {:left => '2', :right => '1'} }
|
350
|
+
|
351
|
+
context 'when nested' do
|
352
|
+
it 'generates nested semantic side-effect code using bindings' do
|
353
|
+
nested_code {|g| g.gen_skip action, scope }.
|
354
|
+
should == '(@foo = 2 * 1; true)'
|
355
|
+
end
|
356
|
+
end
|
357
|
+
|
358
|
+
context 'when top-level' do
|
359
|
+
it 'generates top level semantic side-effect code using bindings' do
|
360
|
+
top_level_code {|g| g.gen_skip action, scope }.
|
361
|
+
should == '@foo = 2 * 1; true'
|
362
|
+
end
|
363
|
+
end
|
364
|
+
end
|
365
|
+
end
|
366
|
+
|
367
|
+
describe '#gen_intermediate_assert' do
|
368
|
+
|
369
|
+
context 'given an action with no parameters' do
|
370
|
+
|
371
|
+
let(:action) { SemanticAction['@foo == 3'] }
|
372
|
+
|
373
|
+
it 'generates intermediate semantic assert code' do
|
374
|
+
nested_code {|g| g.gen_intermediate_assert action }.
|
375
|
+
should == '(@foo == 3)'
|
376
|
+
end
|
377
|
+
end
|
378
|
+
|
379
|
+
context 'given an action with parameters' do
|
380
|
+
|
381
|
+
let(:action) { SemanticAction['|a,b| a == b'] }
|
382
|
+
let(:captures) { ['2', '1'] }
|
383
|
+
|
384
|
+
it 'generates intermediate semantic assert code using captures' do
|
385
|
+
nested_code {|g| g.gen_intermediate_assert action, scope }.
|
386
|
+
should == '(2 == 1)'
|
387
|
+
end
|
388
|
+
end
|
389
|
+
|
390
|
+
context 'given an action using labels' do
|
391
|
+
|
392
|
+
let(:action) { SemanticAction['left < right'] }
|
393
|
+
let(:bindings) { {:left => '2', :right => '3'} }
|
394
|
+
|
395
|
+
it 'generates intermediate assert code using bindings' do
|
396
|
+
nested_code {|g| g.gen_intermediate_assert action, scope }.
|
397
|
+
should == '(2 < 3)'
|
398
|
+
end
|
399
|
+
end
|
400
|
+
end
|
401
|
+
|
402
|
+
describe '#gen_intermediate_skip' do
|
403
|
+
|
404
|
+
context 'given an action with no parameters' do
|
405
|
+
|
406
|
+
let(:action) { SemanticAction['@foo = 2'] }
|
407
|
+
|
408
|
+
it 'generates intermediate semantic side-effect code' do
|
409
|
+
nested_code {|g| g.gen_intermediate_skip action }.
|
410
|
+
should == '(@foo = 2)'
|
411
|
+
end
|
412
|
+
end
|
413
|
+
|
414
|
+
context 'given an action with parameters' do
|
415
|
+
|
416
|
+
let(:action) { SemanticAction['|a, b| @foo = a * b'] }
|
417
|
+
let(:captures) { ['2', '4'] }
|
418
|
+
|
419
|
+
it 'generates intermediate semantic side-effect code using captures' do
|
420
|
+
nested_code {|g| g.gen_intermediate_skip action, scope }.
|
421
|
+
should == '(@foo = 2 * 4)'
|
422
|
+
end
|
423
|
+
end
|
424
|
+
|
425
|
+
context 'given an action using labels' do
|
426
|
+
|
427
|
+
let(:action) { SemanticAction['@foo = left * right'] }
|
428
|
+
let(:bindings) { {:left => '2', :right => '1'} }
|
429
|
+
|
430
|
+
it 'generates intermediate semantic side-effect code using bindings' do
|
431
|
+
nested_code {|g| g.gen_intermediate_skip action, scope }.
|
432
|
+
should == '(@foo = 2 * 1)'
|
433
|
+
end
|
434
|
+
end
|
435
|
+
end
|
436
|
+
|
437
|
+
end
|