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
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'rattler/compiler/parser_generator'
|
2
|
+
|
3
|
+
module Rattler::Compiler::ParserGenerator
|
4
|
+
|
5
|
+
# @private
|
6
|
+
class AttributedSequenceGenerator < ExprGenerator #:nodoc:
|
7
|
+
include SequenceGenerating
|
8
|
+
|
9
|
+
def gen_basic(sequence, scope = ParserScope.empty)
|
10
|
+
with_backtracking do
|
11
|
+
gen_children_capturing(sequence, scope.nest) do |last_child, scope|
|
12
|
+
gen_nested last_child, :basic, scope
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
# @private
|
20
|
+
class NestedAttributedSequenceGenerator < AttributedSequenceGenerator #:nodoc:
|
21
|
+
include Nested
|
22
|
+
end
|
23
|
+
|
24
|
+
def AttributedSequenceGenerator.nested(*args)
|
25
|
+
NestedAttributedSequenceGenerator.new(*args)
|
26
|
+
end
|
27
|
+
|
28
|
+
# @private
|
29
|
+
class TopLevelAttributedSequenceGenerator < AttributedSequenceGenerator #:nodoc:
|
30
|
+
include TopLevel
|
31
|
+
end
|
32
|
+
|
33
|
+
def AttributedSequenceGenerator.top_level(*args)
|
34
|
+
TopLevelAttributedSequenceGenerator.new(*args)
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
@@ -1,48 +1,48 @@
|
|
1
|
-
require 'rattler/
|
1
|
+
require 'rattler/compiler/parser_generator'
|
2
2
|
|
3
|
-
module Rattler::
|
3
|
+
module Rattler::Compiler::ParserGenerator
|
4
4
|
|
5
5
|
# @private
|
6
6
|
class BackReferenceGenerator < ExprGenerator #:nodoc:
|
7
7
|
|
8
|
-
def gen_basic(ref, scope=
|
8
|
+
def gen_basic(ref, scope = ParserScope.empty)
|
9
9
|
@g << "@scanner.scan(#{ref.re_expr(scope)})"
|
10
10
|
end
|
11
11
|
|
12
|
-
def gen_assert(ref, scope=
|
12
|
+
def gen_assert(ref, scope = ParserScope.empty)
|
13
13
|
expr do
|
14
14
|
gen_intermediate_assert ref, scope
|
15
15
|
@g << ' && true'
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
|
-
def gen_disallow(ref, scope=
|
19
|
+
def gen_disallow(ref, scope = ParserScope.empty)
|
20
20
|
expr do
|
21
21
|
gen_intermediate_disallow ref, scope
|
22
22
|
@g << ' && true'
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
|
-
def gen_token(ref, scope=
|
26
|
+
def gen_token(ref, scope = ParserScope.empty)
|
27
27
|
gen_basic ref, scope
|
28
28
|
end
|
29
29
|
|
30
|
-
def gen_skip(ref, scope=
|
30
|
+
def gen_skip(ref, scope = ParserScope.empty)
|
31
31
|
expr do
|
32
32
|
gen_intermediate_skip ref, scope
|
33
33
|
@g << ' && true'
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
37
|
-
def gen_intermediate_assert(ref, scope=
|
37
|
+
def gen_intermediate_assert(ref, scope = ParserScope.empty)
|
38
38
|
@g << "@scanner.skip(/(?=#{ref.re_source(scope)})/)"
|
39
39
|
end
|
40
40
|
|
41
|
-
def gen_intermediate_disallow(ref, scope=
|
41
|
+
def gen_intermediate_disallow(ref, scope = ParserScope.empty)
|
42
42
|
@g << "@scanner.skip(/(?!#{ref.re_source(scope)})/)"
|
43
43
|
end
|
44
44
|
|
45
|
-
def gen_intermediate_skip(ref, scope=
|
45
|
+
def gen_intermediate_skip(ref, scope = ParserScope.empty)
|
46
46
|
@g << "@scanner.skip(#{ref.re_expr(scope)})"
|
47
47
|
end
|
48
48
|
|
@@ -1,55 +1,43 @@
|
|
1
|
-
require 'rattler/
|
1
|
+
require 'rattler/compiler/parser_generator'
|
2
2
|
|
3
|
-
module Rattler::
|
3
|
+
module Rattler::Compiler::ParserGenerator
|
4
4
|
|
5
5
|
# @private
|
6
6
|
class ChoiceGenerator < ExprGenerator #:nodoc:
|
7
7
|
include NestedSubGenerating
|
8
8
|
|
9
|
-
def gen_basic(choice, scope=
|
9
|
+
def gen_basic(choice, scope = ParserScope.empty)
|
10
10
|
expr :block do
|
11
11
|
@g.intersperse_nl(choice, ' ||') {|_| generate _, :basic, scope }
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
15
|
-
def gen_assert(choice, scope=
|
15
|
+
def gen_assert(choice, scope = ParserScope.empty)
|
16
16
|
expr do
|
17
17
|
gen_intermediate_assert choice, scope
|
18
18
|
@g << ' && true'
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
|
-
def gen_disallow(choice, scope=
|
22
|
+
def gen_disallow(choice, scope = ParserScope.empty)
|
23
23
|
@g << '!'
|
24
24
|
gen_intermediate_assert choice, scope
|
25
25
|
end
|
26
26
|
|
27
|
-
def
|
28
|
-
expr :block do
|
29
|
-
gen_action_code(choice) { code.bind scope, "[#{result_name}]" }
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
def gen_direct_action(choice, code, scope={})
|
34
|
-
expr :block do
|
35
|
-
gen_action_code(choice) { "(#{code.bind scope, [result_name]})" }
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
def gen_token(choice, scope={})
|
27
|
+
def gen_token(choice, scope = ParserScope.empty)
|
40
28
|
expr :block do
|
41
29
|
@g.intersperse_nl(choice, ' ||') {|_| generate _, :token, scope }
|
42
30
|
end
|
43
31
|
end
|
44
32
|
|
45
|
-
def gen_skip(choice, scope=
|
33
|
+
def gen_skip(choice, scope = ParserScope.empty)
|
46
34
|
expr do
|
47
35
|
gen_intermediate_skip choice, scope
|
48
36
|
@g << ' && true'
|
49
37
|
end
|
50
38
|
end
|
51
39
|
|
52
|
-
def gen_intermediate_assert(choice, scope=
|
40
|
+
def gen_intermediate_assert(choice, scope = ParserScope.empty)
|
53
41
|
@g.block 'begin' do
|
54
42
|
@g.intersperse_nl(choice, ' ||') do |_|
|
55
43
|
generate _, :intermediate_assert, scope
|
@@ -57,7 +45,7 @@ module Rattler::BackEnd::ParserGenerator
|
|
57
45
|
end
|
58
46
|
end
|
59
47
|
|
60
|
-
def gen_intermediate_skip(choice, scope=
|
48
|
+
def gen_intermediate_skip(choice, scope = ParserScope.empty)
|
61
49
|
@g.block 'begin' do
|
62
50
|
@g.intersperse_nl(choice, ' ||') do |_|
|
63
51
|
generate _, :intermediate_skip, scope
|
@@ -67,7 +55,7 @@ module Rattler::BackEnd::ParserGenerator
|
|
67
55
|
|
68
56
|
private
|
69
57
|
|
70
|
-
def gen_action_code(choice, scope=
|
58
|
+
def gen_action_code(choice, scope = ParserScope.empty)
|
71
59
|
@g.block("(#{result_name} = begin", 'end)') do
|
72
60
|
@g.intersperse_nl(choice, ' ||') {|child| generate child }
|
73
61
|
end << ' && '
|
@@ -1,53 +1,45 @@
|
|
1
|
-
require 'rattler/
|
1
|
+
require 'rattler/compiler/parser_generator'
|
2
2
|
|
3
|
-
module Rattler::
|
3
|
+
module Rattler::Compiler::ParserGenerator
|
4
4
|
|
5
5
|
# @private
|
6
6
|
class DisallowGenerator < ExprGenerator #:nodoc:
|
7
7
|
|
8
|
-
def gen_basic(disallow, scope=
|
8
|
+
def gen_basic(disallow, scope = ParserScope.empty)
|
9
9
|
generate disallow.child, :disallow, scope
|
10
10
|
end
|
11
11
|
|
12
|
-
def gen_assert(disallow, scope=
|
12
|
+
def gen_assert(disallow, scope = ParserScope.empty)
|
13
13
|
@g << 'false'
|
14
14
|
end
|
15
15
|
|
16
|
-
def gen_disallow(disallow, scope=
|
16
|
+
def gen_disallow(disallow, scope = ParserScope.empty)
|
17
17
|
gen_basic disallow, scope
|
18
18
|
end
|
19
19
|
|
20
|
-
def gen_skip(disallow, scope=
|
20
|
+
def gen_skip(disallow, scope = ParserScope.empty)
|
21
21
|
gen_basic disallow, scope
|
22
22
|
end
|
23
23
|
|
24
|
-
def
|
25
|
-
expr(:block) { gen_action disallow, code.bind(scope, '[]'), scope }
|
26
|
-
end
|
27
|
-
|
28
|
-
def gen_direct_action(disallow, code, scope={})
|
29
|
-
expr(:block) { gen_action disallow, "(#{code.bind scope, []})", scope }
|
30
|
-
end
|
31
|
-
|
32
|
-
def gen_token(disallow, scope={})
|
24
|
+
def gen_token(disallow, scope = ParserScope.empty)
|
33
25
|
expr(:block) { gen_action disallow, "''", scope }
|
34
26
|
end
|
35
27
|
|
36
|
-
def gen_intermediate(disallow, scope=
|
28
|
+
def gen_intermediate(disallow, scope = ParserScope.empty)
|
37
29
|
generate disallow.child, :intermediate_disallow, scope
|
38
30
|
end
|
39
31
|
|
40
|
-
def gen_intermediate_disallow(disallow, scope=
|
32
|
+
def gen_intermediate_disallow(disallow, scope = ParserScope.empty)
|
41
33
|
gen_intermediate disallow, scope
|
42
34
|
end
|
43
35
|
|
44
|
-
def gen_intermediate_skip(disallow, scope=
|
36
|
+
def gen_intermediate_skip(disallow, scope = ParserScope.empty)
|
45
37
|
gen_intermediate disallow, scope
|
46
38
|
end
|
47
39
|
|
48
40
|
private
|
49
41
|
|
50
|
-
def gen_action(disallow, result_code, scope=
|
42
|
+
def gen_action(disallow, result_code, scope = ParserScope.empty)
|
51
43
|
gen_intermediate disallow, scope
|
52
44
|
(@g << ' &&').newline << result_code
|
53
45
|
end
|
@@ -1,6 +1,6 @@
|
|
1
|
-
require 'rattler/
|
1
|
+
require 'rattler/compiler/parser_generator'
|
2
2
|
|
3
|
-
module Rattler::
|
3
|
+
module Rattler::Compiler::ParserGenerator
|
4
4
|
|
5
5
|
# @private
|
6
6
|
class ESymbolGenerator < ExprGenerator #:nodoc:
|
@@ -15,14 +15,6 @@ module Rattler::BackEnd::ParserGenerator
|
|
15
15
|
@g << 'false'
|
16
16
|
end
|
17
17
|
|
18
|
-
def gen_dispatch_action(eof, code, scope={})
|
19
|
-
@g << code.bind(scope, '[]')
|
20
|
-
end
|
21
|
-
|
22
|
-
def gen_direct_action(eof, code, scope={})
|
23
|
-
expr { @g << code.bind(scope, []) }
|
24
|
-
end
|
25
|
-
|
26
18
|
def gen_token(*_)
|
27
19
|
@g << "''"
|
28
20
|
end
|
@@ -1,6 +1,6 @@
|
|
1
|
-
require 'rattler/
|
1
|
+
require 'rattler/compiler/parser_generator'
|
2
2
|
|
3
|
-
module Rattler::
|
3
|
+
module Rattler::Compiler::ParserGenerator
|
4
4
|
|
5
5
|
# @private
|
6
6
|
class EofGenerator < ExprGenerator #:nodoc:
|
@@ -15,14 +15,6 @@ module Rattler::BackEnd::ParserGenerator
|
|
15
15
|
expr { @g << '!@scanner.eos?' }
|
16
16
|
end
|
17
17
|
|
18
|
-
def gen_dispatch_action(eof, code, scope={})
|
19
|
-
gen_symantic code.bind(scope, '[]')
|
20
|
-
end
|
21
|
-
|
22
|
-
def gen_direct_action(eof, code, scope={})
|
23
|
-
gen_symantic '(' + code.bind(scope, []) + ')'
|
24
|
-
end
|
25
|
-
|
26
18
|
def gen_token(*_)
|
27
19
|
gen_symantic "''"
|
28
20
|
end
|
@@ -1,6 +1,6 @@
|
|
1
|
-
require 'rattler/
|
1
|
+
require 'rattler/compiler/parser_generator'
|
2
2
|
|
3
|
-
module Rattler::
|
3
|
+
module Rattler::Compiler::ParserGenerator
|
4
4
|
|
5
5
|
# @private
|
6
6
|
class ExprGenerator #:nodoc:
|
@@ -14,21 +14,7 @@ module Rattler::BackEnd::ParserGenerator
|
|
14
14
|
@repeat_level = repeat_level
|
15
15
|
end
|
16
16
|
|
17
|
-
def
|
18
|
-
expr :block do
|
19
|
-
gen_capture { block_given? ? yield : gen_basic(parser, scope) }
|
20
|
-
(@g << ' &&').newline << code.bind(scope, dispatch_action_args)
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
def gen_direct_action(parser, code, scope={})
|
25
|
-
expr :block do
|
26
|
-
gen_capture { block_given? ? yield : gen_basic(parser, scope) }
|
27
|
-
(@g << ' &&').newline << '(' << code.bind(scope, direct_action_args) << ')'
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
def gen_token(parser, scope={})
|
17
|
+
def gen_token(parser, scope = ParserScope.empty)
|
32
18
|
expr :block do
|
33
19
|
(@g << "#{token_pos_name} = @scanner.pos").newline
|
34
20
|
gen_intermediate_skip parser, scope
|
@@ -37,19 +23,19 @@ module Rattler::BackEnd::ParserGenerator
|
|
37
23
|
end
|
38
24
|
end
|
39
25
|
|
40
|
-
def gen_intermediate(parser, scope=
|
26
|
+
def gen_intermediate(parser, scope = ParserScope.empty)
|
41
27
|
gen_basic parser, scope
|
42
28
|
end
|
43
29
|
|
44
|
-
def gen_intermediate_assert(parser, scope=
|
30
|
+
def gen_intermediate_assert(parser, scope = ParserScope.empty)
|
45
31
|
gen_assert parser, scope
|
46
32
|
end
|
47
33
|
|
48
|
-
def gen_intermediate_disallow(parser, scope=
|
34
|
+
def gen_intermediate_disallow(parser, scope = ParserScope.empty)
|
49
35
|
gen_disallow parser, scope
|
50
36
|
end
|
51
37
|
|
52
|
-
def gen_intermediate_skip(parser, scope=
|
38
|
+
def gen_intermediate_skip(parser, scope = ParserScope.empty)
|
53
39
|
gen_skip parser, scope
|
54
40
|
end
|
55
41
|
|
@@ -79,23 +65,11 @@ module Rattler::BackEnd::ParserGenerator
|
|
79
65
|
@g.surround("(#{result_name} = ", ')') { yield }
|
80
66
|
end
|
81
67
|
|
82
|
-
def dispatch_action_args
|
83
|
-
"[#{result_name}]"
|
84
|
-
end
|
85
|
-
|
86
|
-
def direct_action_args
|
87
|
-
[result_name]
|
88
|
-
end
|
89
|
-
|
90
68
|
end
|
91
69
|
|
92
70
|
# @private
|
93
|
-
class
|
94
|
-
include
|
95
|
-
|
96
|
-
def generate(parser)
|
97
|
-
super
|
98
|
-
end
|
71
|
+
class NestedExprGenerator < ExprGenerator #:nodoc:
|
72
|
+
include NestedSubGenerating
|
99
73
|
end
|
100
74
|
|
101
75
|
end
|
@@ -1,11 +1,11 @@
|
|
1
|
-
require 'rattler/
|
1
|
+
require 'rattler/compiler/parser_generator'
|
2
2
|
|
3
|
-
module Rattler::
|
3
|
+
module Rattler::Compiler::ParserGenerator
|
4
4
|
|
5
5
|
# @private
|
6
6
|
class FailGenerator < ExprGenerator #:nodoc:
|
7
7
|
|
8
|
-
def gen_basic(fail, scope=
|
8
|
+
def gen_basic(fail, scope = ParserScope.empty)
|
9
9
|
case fail.attrs[:type]
|
10
10
|
when :expr then gen_fail_expr fail.message
|
11
11
|
when :rule then gen_fail_rule fail.message
|
@@ -13,6 +13,10 @@ module Rattler::BackEnd::ParserGenerator
|
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
|
+
def gen_skip(fail, scope = ParserScope.empty)
|
17
|
+
gen_basic fail, scope
|
18
|
+
end
|
19
|
+
|
16
20
|
private
|
17
21
|
|
18
22
|
def gen_fail_expr(message)
|
@@ -1,14 +1,12 @@
|
|
1
|
-
require 'rattler/
|
1
|
+
require 'rattler/compiler/parser_generator'
|
2
2
|
|
3
|
-
module Rattler::
|
3
|
+
module Rattler::Compiler::ParserGenerator
|
4
4
|
|
5
5
|
# @private
|
6
6
|
GEN_METHOD_TYPES = %w{
|
7
7
|
basic
|
8
8
|
assert
|
9
9
|
disallow
|
10
|
-
dispatch_action
|
11
|
-
direct_action
|
12
10
|
token
|
13
11
|
skip
|
14
12
|
intermediate
|
@@ -17,7 +15,7 @@ module Rattler::BackEnd::ParserGenerator
|
|
17
15
|
intermediate_skip
|
18
16
|
}
|
19
17
|
|
20
|
-
@private
|
18
|
+
# @private
|
21
19
|
GEN_METHOD_NAMES = GEN_METHOD_TYPES.map {|_| :"gen_#{_}" }
|
22
20
|
|
23
21
|
end
|
@@ -1,6 +1,6 @@
|
|
1
|
-
require 'rattler/
|
1
|
+
require 'rattler/compiler/parser_generator'
|
2
2
|
|
3
|
-
module Rattler::
|
3
|
+
module Rattler::Compiler::ParserGenerator
|
4
4
|
|
5
5
|
# @private
|
6
6
|
class GeneralListGenerator < ExprGenerator #:nodoc:
|
@@ -11,7 +11,7 @@ module Rattler::BackEnd::ParserGenerator
|
|
11
11
|
super
|
12
12
|
end
|
13
13
|
|
14
|
-
def gen_basic(list, scope=
|
14
|
+
def gen_basic(list, scope = ParserScope.empty)
|
15
15
|
if list.capturing?
|
16
16
|
gen_capturing list, scope
|
17
17
|
else
|
@@ -19,31 +19,19 @@ module Rattler::BackEnd::ParserGenerator
|
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
|
-
def
|
23
|
-
gen_capturing list, scope do |a|
|
24
|
-
code.bind scope, "select_captures(#{a})"
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
def gen_direct_action(list, code, scope={})
|
29
|
-
gen_capturing list, scope do |a|
|
30
|
-
'(' + code.bind(scope, ["select_captures(#{a})"]) + ')'
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
def gen_assert(list, scope={})
|
22
|
+
def gen_assert(list, scope = ParserScope.empty)
|
35
23
|
gen_predicate(list, scope) do
|
36
24
|
@g.newline << "#{count_name} >= #{list.lower_bound}"
|
37
25
|
end
|
38
26
|
end
|
39
27
|
|
40
|
-
def gen_disallow(list, scope=
|
28
|
+
def gen_disallow(list, scope = ParserScope.empty)
|
41
29
|
gen_predicate(list, scope) do
|
42
30
|
@g.newline << "#{count_name} < #{list.lower_bound}"
|
43
31
|
end
|
44
32
|
end
|
45
33
|
|
46
|
-
def gen_skip(list, scope=
|
34
|
+
def gen_skip(list, scope = ParserScope.empty)
|
47
35
|
expr :block do
|
48
36
|
(@g << "#{count_name} = 0").newline
|
49
37
|
(@g << "#{start_pos_name} = @scanner.pos").newline
|