rattler 0.4.2 → 0.5.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 +9 -3
- data/features/command_line/dest_option.feature +1 -1
- data/features/command_line/lib_option.feature +2 -2
- data/features/command_line/output_option.feature +2 -2
- data/features/command_line/parser_generator.feature +3 -3
- data/features/grammar/any_character.feature +0 -4
- data/features/grammar/back_reference.feature +0 -4
- data/features/grammar/character_class.feature +0 -4
- data/features/grammar/comments.feature +0 -4
- data/features/grammar/e_symbol.feature +18 -0
- data/features/grammar/eof.feature +0 -4
- data/features/grammar/fail.feature +0 -4
- data/features/grammar/list_matching.feature +52 -3
- data/features/grammar/literal.feature +0 -4
- data/features/grammar/negative_lookahead.feature +0 -4
- data/features/grammar/negative_semantic_predicate.feature +99 -0
- data/features/grammar/node_action.feature +17 -4
- data/features/grammar/nonterminal.feature +3 -7
- data/features/grammar/one_or_more.feature +0 -4
- data/features/grammar/optional.feature +0 -4
- data/features/grammar/ordered_choice.feature +0 -4
- data/features/grammar/positive_lookahead.feature +0 -4
- data/features/grammar/positive_semantic_predicate.feature +99 -0
- data/features/grammar/posix_class.feature +3 -6
- data/features/grammar/repeat.feature +50 -0
- data/features/grammar/sequence.feature +0 -4
- data/features/grammar/side_effect.feature +81 -0
- data/features/grammar/skip_operator.feature +2 -5
- data/features/grammar/start_rule.feature +1 -5
- data/features/grammar/symantic_action.feature +9 -4
- data/features/grammar/token.feature +0 -4
- data/features/grammar/whitespace.feature +0 -4
- data/features/grammar/word_literal.feature +0 -4
- data/features/grammar/zero_or_more.feature +0 -4
- data/features/step_definitions/grammar_steps.rb +5 -1
- data/lib/rattler/back_end/optimizer.rb +1 -0
- data/lib/rattler/back_end/optimizer/reduce_repeat_match.rb +20 -8
- data/lib/rattler/back_end/optimizer/simplify_redundant_repeat.rb +10 -7
- data/lib/rattler/back_end/optimizer/specialize_repeat.rb +40 -0
- data/lib/rattler/back_end/parser_generator.rb +11 -6
- data/lib/rattler/back_end/parser_generator/delegating_generator.rb +20 -0
- data/lib/rattler/back_end/parser_generator/e_symbol_generator.rb +52 -0
- data/lib/rattler/back_end/parser_generator/eof_generator.rb +58 -0
- data/lib/rattler/back_end/parser_generator/expr_generator.rb +6 -2
- data/lib/rattler/back_end/parser_generator/gen_method_names.rb +15 -5
- data/lib/rattler/back_end/parser_generator/general_list_generator.rb +194 -0
- data/lib/rattler/back_end/parser_generator/general_repeat_generator.rb +177 -0
- data/lib/rattler/back_end/parser_generator/label_generator.rb +4 -1
- data/lib/rattler/back_end/parser_generator/list0_generating.rb +36 -0
- data/lib/rattler/back_end/parser_generator/list1_generating.rb +30 -0
- data/lib/rattler/back_end/parser_generator/list_generator.rb +16 -20
- data/lib/rattler/back_end/parser_generator/one_or_more_generating.rb +25 -0
- data/lib/rattler/back_end/parser_generator/{optional_generator.rb → optional_generating.rb} +66 -81
- data/lib/rattler/back_end/parser_generator/predicate_propogating.rb +4 -4
- data/lib/rattler/back_end/parser_generator/repeat_generator.rb +53 -0
- data/lib/rattler/back_end/parser_generator/skip_propogating.rb +2 -2
- data/lib/rattler/back_end/parser_generator/sub_generating.rb +16 -18
- data/lib/rattler/back_end/parser_generator/token_propogating.rb +1 -1
- data/lib/rattler/back_end/parser_generator/zero_or_more_generating.rb +31 -0
- data/lib/rattler/grammar/grammar_parser.rb +20 -0
- data/lib/rattler/grammar/metagrammar.rb +131 -13
- data/lib/rattler/grammar/rattler.rtlr +25 -12
- data/lib/rattler/parsers.rb +9 -5
- data/lib/rattler/parsers/assert_code.rb +31 -0
- data/lib/rattler/parsers/atomic.rb +19 -0
- data/lib/rattler/parsers/direct_action.rb +12 -4
- data/lib/rattler/parsers/disallow_code.rb +31 -0
- data/lib/rattler/parsers/dispatch_action.rb +3 -2
- data/lib/rattler/parsers/e_symbol.rb +47 -0
- data/lib/rattler/parsers/effect_code.rb +31 -0
- data/lib/rattler/parsers/eof.rb +6 -13
- data/lib/rattler/parsers/list_parser.rb +33 -14
- data/lib/rattler/parsers/match.rb +1 -6
- data/lib/rattler/parsers/parser_dsl.rb +78 -35
- data/lib/rattler/parsers/predicate.rb +1 -4
- data/lib/rattler/parsers/repeat.rb +76 -0
- data/lib/rattler/parsers/semantic_assert.rb +19 -0
- data/lib/rattler/parsers/semantic_disallow.rb +19 -0
- data/lib/rattler/parsers/side_effect.rb +19 -0
- data/lib/rattler/parsers/skip.rb +1 -9
- data/lib/rattler/parsers/token.rb +1 -6
- data/lib/rattler/util/graphviz/node_builder.rb +6 -3
- data/spec/rattler/back_end/assert_compiler_examples.rb +187 -0
- data/spec/rattler/back_end/direct_action_compiler_examples.rb +227 -0
- data/spec/rattler/back_end/disallow_compiler_examples.rb +187 -0
- data/spec/rattler/back_end/dispatch_action_compiler_examples.rb +225 -0
- data/spec/rattler/back_end/optimizer/reduce_repeat_match_spec.rb +45 -33
- data/spec/rattler/back_end/optimizer/simplify_redundant_repeat_spec.rb +32 -172
- data/spec/rattler/back_end/parser_generator/e_symbol_generator_spec.rb +149 -0
- data/spec/rattler/back_end/parser_generator/eof_generator_spec.rb +152 -0
- data/spec/rattler/back_end/parser_generator/label_generator_spec.rb +4 -4
- data/spec/rattler/back_end/parser_generator/list0_generator_examples.rb +322 -0
- data/spec/rattler/back_end/parser_generator/list1_generator_examples.rb +343 -0
- data/spec/rattler/back_end/parser_generator/list_generator_spec.rb +597 -140
- data/spec/rattler/back_end/parser_generator/one_or_more_generator_examples.rb +292 -0
- data/spec/rattler/back_end/parser_generator/optional_generator_examples.rb +233 -0
- data/spec/rattler/back_end/parser_generator/repeat_generator_spec.rb +281 -0
- data/spec/rattler/back_end/parser_generator/zero_or_more_generator_examples.rb +277 -0
- data/spec/rattler/back_end/semantic_assert_compiler_examples.rb +152 -0
- data/spec/rattler/back_end/semantic_disallow_compiler_examples.rb +152 -0
- data/spec/rattler/back_end/shared_compiler_examples.rb +106 -651
- data/spec/rattler/back_end/side_effect_compiler_examples.rb +227 -0
- data/spec/rattler/back_end/skip_compiler_examples.rb +161 -0
- data/spec/rattler/back_end/token_compiler_examples.rb +262 -0
- data/spec/rattler/grammar/grammar_parser_spec.rb +302 -23
- data/spec/rattler/parsers/apply_spec.rb +6 -0
- data/spec/rattler/parsers/assert_spec.rb +18 -7
- data/spec/rattler/parsers/back_reference_spec.rb +9 -0
- data/spec/rattler/parsers/choice_spec.rb +36 -21
- data/spec/rattler/parsers/direct_action_spec.rb +76 -36
- data/spec/rattler/parsers/disallow_spec.rb +18 -7
- data/spec/rattler/parsers/dispatch_action_spec.rb +128 -22
- data/spec/rattler/parsers/e_symbol_spec.rb +30 -0
- data/spec/rattler/parsers/eof_spec.rb +15 -6
- data/spec/rattler/parsers/label_spec.rb +15 -2
- data/spec/rattler/parsers/list_parser_spec.rb +187 -0
- data/spec/rattler/parsers/match_spec.rb +16 -7
- data/spec/rattler/parsers/parser_dsl_spec.rb +82 -23
- data/spec/rattler/parsers/repeat_spec.rb +233 -0
- data/spec/rattler/parsers/semantic_assert_spec.rb +83 -0
- data/spec/rattler/parsers/semantic_disallow_spec.rb +83 -0
- data/spec/rattler/parsers/sequence_spec.rb +34 -20
- data/spec/rattler/parsers/side_effect_spec.rb +214 -0
- data/spec/rattler/parsers/skip_spec.rb +17 -6
- data/spec/rattler_spec.rb +2 -0
- data/spec/support/compiler_spec_helper.rb +8 -0
- metadata +156 -447
- data/bin/rtlr.compiled.rbc +0 -201
- data/features/step_definitions/cli_steps.rbc +0 -149
- data/features/step_definitions/grammar_steps.rbc +0 -1211
- data/features/support/env.rbc +0 -389
- data/lib/rattler.rbc +0 -1231
- data/lib/rattler/back_end.rbc +0 -286
- data/lib/rattler/back_end/compiler.rbc +0 -1394
- data/lib/rattler/back_end/optimizer.rbc +0 -2000
- data/lib/rattler/back_end/optimizer/composite_reducing.rbc +0 -337
- data/lib/rattler/back_end/optimizer/flatten_choice.rbc +0 -443
- data/lib/rattler/back_end/optimizer/flatten_sequence.rbc +0 -827
- data/lib/rattler/back_end/optimizer/flattening.rbc +0 -570
- data/lib/rattler/back_end/optimizer/inline_regular_rules.rbc +0 -691
- data/lib/rattler/back_end/optimizer/join_match_capturing_sequence.rbc +0 -1299
- data/lib/rattler/back_end/optimizer/join_match_choice.rbc +0 -523
- data/lib/rattler/back_end/optimizer/join_match_matching_sequence.rbc +0 -619
- data/lib/rattler/back_end/optimizer/join_match_sequence.rbc +0 -174
- data/lib/rattler/back_end/optimizer/join_predicate_bare_match.rbc +0 -1505
- data/lib/rattler/back_end/optimizer/join_predicate_match.rbc +0 -174
- data/lib/rattler/back_end/optimizer/join_predicate_nested_match.rbc +0 -620
- data/lib/rattler/back_end/optimizer/join_predicate_or_bare_match.rbc +0 -1502
- data/lib/rattler/back_end/optimizer/join_predicate_or_match.rbc +0 -174
- data/lib/rattler/back_end/optimizer/join_predicate_or_nested_match.rbc +0 -616
- data/lib/rattler/back_end/optimizer/match_joining.rbc +0 -1454
- data/lib/rattler/back_end/optimizer/optimization.rbc +0 -1366
- data/lib/rattler/back_end/optimizer/optimization_context.rbc +0 -1386
- data/lib/rattler/back_end/optimizer/optimization_sequence.rbc +0 -520
- data/lib/rattler/back_end/optimizer/optimize_children.rbc +0 -793
- data/lib/rattler/back_end/optimizer/reduce_repeat_match.rbc +0 -788
- data/lib/rattler/back_end/optimizer/remove_meaningless_wrapper.rbc +0 -508
- data/lib/rattler/back_end/optimizer/simplify_redundant_repeat.rbc +0 -807
- data/lib/rattler/back_end/optimizer/simplify_token_match.rbc +0 -561
- data/lib/rattler/back_end/parser_generator.rbc +0 -1326
- data/lib/rattler/back_end/parser_generator/apply_generator.rbc +0 -2148
- data/lib/rattler/back_end/parser_generator/assert_generator.rbc +0 -1967
- data/lib/rattler/back_end/parser_generator/back_reference_generator.rbc +0 -1665
- data/lib/rattler/back_end/parser_generator/choice_generator.rbc +0 -2793
- data/lib/rattler/back_end/parser_generator/direct_action_generator.rbc +0 -1071
- data/lib/rattler/back_end/parser_generator/disallow_generator.rbc +0 -1967
- data/lib/rattler/back_end/parser_generator/dispatch_action_generator.rbc +0 -1071
- data/lib/rattler/back_end/parser_generator/expr_generator.rbc +0 -2295
- data/lib/rattler/back_end/parser_generator/fail_generator.rbc +0 -1216
- data/lib/rattler/back_end/parser_generator/gen_method_names.rbc +0 -296
- data/lib/rattler/back_end/parser_generator/group_match.rbc +0 -612
- data/lib/rattler/back_end/parser_generator/group_match_generator.rbc +0 -1647
- data/lib/rattler/back_end/parser_generator/label_generator.rbc +0 -1401
- data/lib/rattler/back_end/parser_generator/list1_generator.rb +0 -54
- data/lib/rattler/back_end/parser_generator/list1_generator.rbc +0 -1237
- data/lib/rattler/back_end/parser_generator/list_generating.rb +0 -71
- data/lib/rattler/back_end/parser_generator/list_generating.rbc +0 -1900
- data/lib/rattler/back_end/parser_generator/list_generator.rbc +0 -1068
- data/lib/rattler/back_end/parser_generator/match_generator.rbc +0 -1743
- data/lib/rattler/back_end/parser_generator/nested.rbc +0 -496
- data/lib/rattler/back_end/parser_generator/one_or_more_generator.rb +0 -56
- data/lib/rattler/back_end/parser_generator/one_or_more_generator.rbc +0 -1277
- data/lib/rattler/back_end/parser_generator/optional_generator.rbc +0 -2025
- data/lib/rattler/back_end/parser_generator/predicate_propogating.rbc +0 -648
- data/lib/rattler/back_end/parser_generator/repeat_generating.rb +0 -57
- data/lib/rattler/back_end/parser_generator/repeat_generating.rbc +0 -1549
- data/lib/rattler/back_end/parser_generator/rule_generator.rbc +0 -1239
- data/lib/rattler/back_end/parser_generator/rule_set_generator.rbc +0 -2641
- data/lib/rattler/back_end/parser_generator/sequence_generator.rbc +0 -4867
- data/lib/rattler/back_end/parser_generator/skip_generator.rbc +0 -1278
- data/lib/rattler/back_end/parser_generator/skip_propogating.rbc +0 -432
- data/lib/rattler/back_end/parser_generator/sub_generating.rbc +0 -2785
- data/lib/rattler/back_end/parser_generator/token_generator.rbc +0 -755
- data/lib/rattler/back_end/parser_generator/token_propogating.rbc +0 -324
- data/lib/rattler/back_end/parser_generator/top_level.rbc +0 -352
- data/lib/rattler/back_end/parser_generator/zero_or_more_generator.rb +0 -53
- data/lib/rattler/back_end/parser_generator/zero_or_more_generator.rbc +0 -1111
- data/lib/rattler/back_end/ruby_generator.rbc +0 -1841
- data/lib/rattler/grammar.rbc +0 -557
- data/lib/rattler/grammar/analysis.rbc +0 -1944
- data/lib/rattler/grammar/grammar.rbc +0 -1090
- data/lib/rattler/grammar/grammar_dsl.rbc +0 -1401
- data/lib/rattler/grammar/grammar_parser.rbc +0 -2096
- data/lib/rattler/grammar/metagrammar.rbc +0 -11014
- data/lib/rattler/parsers.rbc +0 -1006
- data/lib/rattler/parsers/action_code.rbc +0 -1577
- data/lib/rattler/parsers/apply.rbc +0 -562
- data/lib/rattler/parsers/assert.rbc +0 -378
- data/lib/rattler/parsers/back_reference.rbc +0 -871
- data/lib/rattler/parsers/choice.rbc +0 -607
- data/lib/rattler/parsers/combinator_parser.rbc +0 -612
- data/lib/rattler/parsers/combining.rbc +0 -570
- data/lib/rattler/parsers/direct_action.rbc +0 -1472
- data/lib/rattler/parsers/disallow.rbc +0 -379
- data/lib/rattler/parsers/dispatch_action.rbc +0 -2078
- data/lib/rattler/parsers/eof.rbc +0 -567
- data/lib/rattler/parsers/fail.rbc +0 -745
- data/lib/rattler/parsers/label.rbc +0 -749
- data/lib/rattler/parsers/list.rbc +0 -292
- data/lib/rattler/parsers/list0.rb +0 -26
- data/lib/rattler/parsers/list0.rbc +0 -292
- data/lib/rattler/parsers/list1.rb +0 -26
- data/lib/rattler/parsers/list1.rbc +0 -305
- data/lib/rattler/parsers/list_parser.rbc +0 -886
- data/lib/rattler/parsers/match.rbc +0 -621
- data/lib/rattler/parsers/node_code.rbc +0 -1064
- data/lib/rattler/parsers/one_or_more.rb +0 -47
- data/lib/rattler/parsers/one_or_more.rbc +0 -475
- data/lib/rattler/parsers/optional.rb +0 -42
- data/lib/rattler/parsers/optional.rbc +0 -450
- data/lib/rattler/parsers/parser.rbc +0 -994
- data/lib/rattler/parsers/parser_dsl.rbc +0 -4765
- data/lib/rattler/parsers/predicate.rbc +0 -490
- data/lib/rattler/parsers/rule.rbc +0 -777
- data/lib/rattler/parsers/rule_set.rbc +0 -1438
- data/lib/rattler/parsers/sequence.rbc +0 -1040
- data/lib/rattler/parsers/skip.rbc +0 -613
- data/lib/rattler/parsers/token.rbc +0 -457
- data/lib/rattler/parsers/zero_or_more.rb +0 -40
- data/lib/rattler/parsers/zero_or_more.rbc +0 -462
- data/lib/rattler/runner.rbc +0 -3813
- data/lib/rattler/runtime.rbc +0 -370
- data/lib/rattler/runtime/extended_packrat_parser.rbc +0 -2351
- data/lib/rattler/runtime/packrat_parser.rbc +0 -1390
- data/lib/rattler/runtime/parse_failure.rbc +0 -909
- data/lib/rattler/runtime/parse_node.rbc +0 -1007
- data/lib/rattler/runtime/parser.rbc +0 -2267
- data/lib/rattler/runtime/parser_helper.rbc +0 -337
- data/lib/rattler/runtime/recursive_descent_parser.rbc +0 -942
- data/lib/rattler/util.rbc +0 -286
- data/lib/rattler/util/graphviz.rbc +0 -327
- data/lib/rattler/util/graphviz/node_builder.rbc +0 -2207
- data/lib/rattler/util/line_counter.rbc +0 -988
- data/lib/rattler/util/node.rbc +0 -2393
- data/lib/rattler/util/parser_spec_helper.rbc +0 -2533
- data/spec/rattler/back_end/compiler_spec.rbc +0 -1187
- data/spec/rattler/back_end/optimizer/flatten_choice_spec.rbc +0 -2093
- data/spec/rattler/back_end/optimizer/flatten_sequence_spec.rbc +0 -4055
- data/spec/rattler/back_end/optimizer/inline_regular_rules_spec.rbc +0 -2345
- data/spec/rattler/back_end/optimizer/join_match_capturing_sequence_spec.rbc +0 -7006
- data/spec/rattler/back_end/optimizer/join_match_choice_spec.rbc +0 -3252
- data/spec/rattler/back_end/optimizer/join_match_matching_sequence_spec.rbc +0 -3681
- data/spec/rattler/back_end/optimizer/join_predicate_bare_match_spec.rbc +0 -5603
- data/spec/rattler/back_end/optimizer/join_predicate_nested_match_spec.rbc +0 -5232
- data/spec/rattler/back_end/optimizer/join_predicate_or_bare_match_spec.rbc +0 -4272
- data/spec/rattler/back_end/optimizer/join_predicate_or_nested_match_spec.rbc +0 -4342
- data/spec/rattler/back_end/optimizer/reduce_repeat_match_spec.rbc +0 -2960
- data/spec/rattler/back_end/optimizer/simplify_redundant_repeat_spec.rbc +0 -6929
- data/spec/rattler/back_end/optimizer/simplify_token_match_spec.rbc +0 -2327
- data/spec/rattler/back_end/optimizer_spec.rbc +0 -372
- data/spec/rattler/back_end/parser_generator/apply_generator_spec.rbc +0 -4710
- data/spec/rattler/back_end/parser_generator/assert_generator_spec.rbc +0 -4697
- data/spec/rattler/back_end/parser_generator/back_reference_generator_spec.rbc +0 -4855
- data/spec/rattler/back_end/parser_generator/choice_generator_spec.rbc +0 -5350
- data/spec/rattler/back_end/parser_generator/direct_action_generator_spec.rbc +0 -4737
- data/spec/rattler/back_end/parser_generator/disallow_generator_spec.rbc +0 -4697
- data/spec/rattler/back_end/parser_generator/dispatch_action_generator_spec.rbc +0 -4731
- data/spec/rattler/back_end/parser_generator/fail_generator_spec.rbc +0 -2115
- data/spec/rattler/back_end/parser_generator/group_match_generator_spec.rbc +0 -4195
- data/spec/rattler/back_end/parser_generator/group_match_spec.rbc +0 -1414
- data/spec/rattler/back_end/parser_generator/label_generator_spec.rbc +0 -4696
- data/spec/rattler/back_end/parser_generator/list1_generator_spec.rb +0 -309
- data/spec/rattler/back_end/parser_generator/list1_generator_spec.rbc +0 -5213
- data/spec/rattler/back_end/parser_generator/list_generator_spec.rbc +0 -5179
- data/spec/rattler/back_end/parser_generator/match_generator_spec.rbc +0 -4681
- data/spec/rattler/back_end/parser_generator/one_or_more_generator_spec.rb +0 -259
- data/spec/rattler/back_end/parser_generator/one_or_more_generator_spec.rbc +0 -4957
- data/spec/rattler/back_end/parser_generator/optional_generator_spec.rb +0 -190
- data/spec/rattler/back_end/parser_generator/optional_generator_spec.rbc +0 -4704
- data/spec/rattler/back_end/parser_generator/rule_generator_spec.rbc +0 -545
- data/spec/rattler/back_end/parser_generator/rule_set_generator_spec.rbc +0 -1110
- data/spec/rattler/back_end/parser_generator/sequence_generator_spec.rbc +0 -5453
- data/spec/rattler/back_end/parser_generator/skip_generator_spec.rbc +0 -4691
- data/spec/rattler/back_end/parser_generator/token_generator_spec.rbc +0 -4691
- data/spec/rattler/back_end/parser_generator/zero_or_more_generator_spec.rb +0 -244
- data/spec/rattler/back_end/parser_generator/zero_or_more_generator_spec.rbc +0 -4924
- data/spec/rattler/back_end/ruby_generator_spec.rbc +0 -2460
- data/spec/rattler/back_end/shared_compiler_examples.rbc +0 -41886
- data/spec/rattler/grammar/analysis_spec.rbc +0 -4365
- data/spec/rattler/grammar/grammar_parser_spec.rbc +0 -10344
- data/spec/rattler/grammar/grammar_spec.rbc +0 -1701
- data/spec/rattler/parsers/action_code_spec.rbc +0 -4674
- data/spec/rattler/parsers/apply_spec.rbc +0 -851
- data/spec/rattler/parsers/assert_spec.rbc +0 -752
- data/spec/rattler/parsers/back_reference_spec.rbc +0 -1002
- data/spec/rattler/parsers/choice_spec.rbc +0 -1696
- data/spec/rattler/parsers/combinator_parser_spec.rbc +0 -361
- data/spec/rattler/parsers/direct_action_spec.rbc +0 -5222
- data/spec/rattler/parsers/disallow_spec.rbc +0 -752
- data/spec/rattler/parsers/dispatch_action_spec.rbc +0 -3033
- data/spec/rattler/parsers/eof_spec.rbc +0 -728
- data/spec/rattler/parsers/fail_spec.rbc +0 -548
- data/spec/rattler/parsers/label_spec.rbc +0 -1091
- data/spec/rattler/parsers/list0_spec.rb +0 -82
- data/spec/rattler/parsers/list0_spec.rbc +0 -2308
- data/spec/rattler/parsers/list1_spec.rb +0 -82
- data/spec/rattler/parsers/list1_spec.rbc +0 -2287
- data/spec/rattler/parsers/list_spec.rbc +0 -2308
- data/spec/rattler/parsers/match_spec.rbc +0 -780
- data/spec/rattler/parsers/node_code_spec.rbc +0 -1754
- data/spec/rattler/parsers/one_or_more_spec.rb +0 -64
- data/spec/rattler/parsers/one_or_more_spec.rbc +0 -1698
- data/spec/rattler/parsers/optional_spec.rb +0 -64
- data/spec/rattler/parsers/optional_spec.rbc +0 -1717
- data/spec/rattler/parsers/parser_dsl_spec.rbc +0 -10150
- data/spec/rattler/parsers/rule_set_spec.rbc +0 -1060
- data/spec/rattler/parsers/sequence_spec.rbc +0 -2899
- data/spec/rattler/parsers/skip_spec.rbc +0 -753
- data/spec/rattler/parsers/token_spec.rbc +0 -1511
- data/spec/rattler/parsers/zero_or_more_spec.rb +0 -64
- data/spec/rattler/parsers/zero_or_more_spec.rbc +0 -1719
- data/spec/rattler/runtime/extended_packrat_parser_spec.rbc +0 -1341
- data/spec/rattler/runtime/packrat_parser_spec.rbc +0 -210
- data/spec/rattler/runtime/parse_failure_spec.rbc +0 -2244
- data/spec/rattler/runtime/parse_node_spec.rbc +0 -2008
- data/spec/rattler/runtime/parser_spec.rbc +0 -2757
- data/spec/rattler/runtime/recursive_descent_parser_spec.rbc +0 -210
- data/spec/rattler/runtime/shared_parser_examples.rbc +0 -2567
- data/spec/rattler/util/graphviz/node_builder_spec.rbc +0 -3439
- data/spec/rattler/util/line_counter_spec.rbc +0 -2272
- data/spec/rattler/util/node_spec.rbc +0 -15023
- data/spec/rattler_spec.rbc +0 -1591
- data/spec/spec_helper.rbc +0 -336
- data/spec/support/combinator_parser_spec_helper.rbc +0 -1284
- data/spec/support/compiler_spec_helper.rbc +0 -1941
- data/spec/support/parser_generator_spec_helper.rbc +0 -718
- data/spec/support/runtime_parser_spec_helper.rbc +0 -313
@@ -10,215 +10,75 @@ describe SimplifyRedundantRepeat do
|
|
10
10
|
|
11
11
|
describe '#apply' do
|
12
12
|
|
13
|
-
|
13
|
+
let(:outer) { Repeat[inner, *outer_bounds] }
|
14
|
+
let(:inner) { Repeat[match, *inner_bounds] }
|
15
|
+
let(:match) { Match[/a/]}
|
14
16
|
|
15
|
-
|
17
|
+
context 'given a repeat with one-or-more bounds of a repeat with one-or-more bounds' do
|
16
18
|
|
17
|
-
|
19
|
+
let(:outer_bounds) { [1, nil] }
|
20
|
+
let(:inner_bounds) { [1, nil] }
|
18
21
|
|
19
|
-
|
20
|
-
|
21
|
-
it 'returns the inner ZeroOrMore' do
|
22
|
-
subject.apply(parser, matching).should == ZeroOrMore[Match[/a/]]
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
context 'with a one-or-more' do
|
27
|
-
|
28
|
-
let(:child) { OneOrMore[Match[/a/]] }
|
29
|
-
|
30
|
-
it 'returns a ZeroOrMore' do
|
31
|
-
subject.apply(parser, matching).should == ZeroOrMore[Match[/a/]]
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
context 'with an optional' do
|
36
|
-
|
37
|
-
let(:child) { Optional[Match[/a/]] }
|
38
|
-
|
39
|
-
it 'returns a ZeroOrMore' do
|
40
|
-
subject.apply(parser, matching).should == ZeroOrMore[Match[/a/]]
|
41
|
-
end
|
22
|
+
it 'returns a repeat with one-or-more bounds' do
|
23
|
+
subject.apply(outer, matching).should == Repeat[match, 1, nil]
|
42
24
|
end
|
43
25
|
end
|
44
26
|
|
45
|
-
context 'given a
|
46
|
-
|
47
|
-
let(:parser) { OneOrMore[child] }
|
48
|
-
|
49
|
-
context 'with a zero-or-more' do
|
50
|
-
|
51
|
-
let(:child) { ZeroOrMore[Match[/a/]] }
|
52
|
-
|
53
|
-
it 'returns the inner ZeroOrMore' do
|
54
|
-
subject.apply(parser, matching).should == ZeroOrMore[Match[/a/]]
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
context 'with a one-or-more' do
|
59
|
-
|
60
|
-
let(:child) { OneOrMore[Match[/a/]] }
|
61
|
-
|
62
|
-
it 'returns the inner OneOrMore' do
|
63
|
-
subject.apply(parser, matching).should == OneOrMore[Match[/a/]]
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
context 'with an optional' do
|
27
|
+
context 'given a repeat with optional bounds of a repeat with optional bounds' do
|
68
28
|
|
69
|
-
|
29
|
+
let(:outer_bounds) { [0, 1] }
|
30
|
+
let(:inner_bounds) { [0, 1] }
|
70
31
|
|
71
|
-
|
72
|
-
|
73
|
-
end
|
32
|
+
it 'returns a repeat with one-or-more bounds' do
|
33
|
+
subject.apply(outer, matching).should == Repeat[match, 0, 1]
|
74
34
|
end
|
75
35
|
end
|
76
36
|
|
77
|
-
context 'given
|
78
|
-
|
79
|
-
let(:parser) { Optional[child] }
|
80
|
-
|
81
|
-
context 'with a zero-or-more' do
|
82
|
-
|
83
|
-
let(:child) { ZeroOrMore[Match[/a/]] }
|
84
|
-
|
85
|
-
it 'returns the inner ZeroOrMore' do
|
86
|
-
subject.apply(parser, matching).should == ZeroOrMore[Match[/a/]]
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
context 'with a one-or-more' do
|
91
|
-
|
92
|
-
let(:child) { OneOrMore[Match[/a/]] }
|
93
|
-
|
94
|
-
it 'returns a ZeroOrMore' do
|
95
|
-
subject.apply(parser, matching).should == ZeroOrMore[Match[/a/]]
|
96
|
-
end
|
97
|
-
end
|
98
|
-
|
99
|
-
context 'with an optional' do
|
37
|
+
context 'given a repeat with zero-or-more bounds of a repeat' do
|
100
38
|
|
101
|
-
|
39
|
+
let(:outer_bounds) { [0, nil] }
|
40
|
+
let(:inner_bounds) { [1, nil] }
|
102
41
|
|
103
|
-
|
104
|
-
|
105
|
-
end
|
42
|
+
it 'returns a repeat with zero-or-more bounds' do
|
43
|
+
subject.apply(outer, matching).should == Repeat[match, 0, nil]
|
106
44
|
end
|
107
45
|
end
|
108
46
|
end
|
109
47
|
|
110
48
|
describe '#applies_to?' do
|
111
49
|
|
112
|
-
context 'given a
|
113
|
-
|
114
|
-
let(:parser) { ZeroOrMore[child] }
|
115
|
-
|
116
|
-
context 'with a zero-or-more' do
|
117
|
-
|
118
|
-
let(:child) { ZeroOrMore[Match[/a/]] }
|
119
|
-
|
120
|
-
context 'in the :matching context' do
|
121
|
-
it 'returns true' do
|
122
|
-
subject.applies_to?(parser, matching).should be_true
|
123
|
-
end
|
124
|
-
end
|
125
|
-
|
126
|
-
context 'in the :capturing context' do
|
127
|
-
it 'returns false' do
|
128
|
-
subject.applies_to?(parser, capturing).should be_false
|
129
|
-
end
|
130
|
-
end
|
131
|
-
end
|
132
|
-
|
133
|
-
context 'with something other than a repeat' do
|
134
|
-
|
135
|
-
let(:child) { Match[/a/] }
|
50
|
+
context 'given a repeat of a repeat' do
|
136
51
|
|
137
|
-
|
138
|
-
subject.applies_to?(parser, matching).should be_false
|
139
|
-
end
|
140
|
-
end
|
141
|
-
|
142
|
-
context 'with a one-or-more' do
|
143
|
-
|
144
|
-
let(:child) { OneOrMore[Match[/a/]] }
|
52
|
+
let(:parser) { Repeat[Repeat[Match[/a/], 1, nil], 0, nil] }
|
145
53
|
|
54
|
+
context 'in the :matching context' do
|
146
55
|
it 'returns true' do
|
147
56
|
subject.applies_to?(parser, matching).should be_true
|
148
57
|
end
|
149
58
|
end
|
150
59
|
|
151
|
-
context '
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
it 'returns true' do
|
156
|
-
subject.applies_to?(parser, matching).should be_true
|
60
|
+
context 'in the :capturing context' do
|
61
|
+
it 'returns false' do
|
62
|
+
subject.applies_to?(parser, capturing).should be_false
|
157
63
|
end
|
158
64
|
end
|
159
65
|
end
|
160
66
|
|
161
|
-
context 'given a
|
162
|
-
|
163
|
-
let(:parser) { OneOrMore[child] }
|
164
|
-
|
165
|
-
context 'with a zero-or-more' do
|
166
|
-
|
167
|
-
let(:child) { ZeroOrMore[Match[/a/]] }
|
168
|
-
|
169
|
-
it 'returns true' do
|
170
|
-
subject.applies_to?(parser, matching).should be_true
|
171
|
-
end
|
172
|
-
end
|
173
|
-
|
174
|
-
context 'with a one-or-more' do
|
175
|
-
|
176
|
-
let(:child) { OneOrMore[Match[/a/]] }
|
177
|
-
|
178
|
-
it 'returns true' do
|
179
|
-
subject.applies_to?(parser, matching).should be_true
|
180
|
-
end
|
181
|
-
end
|
182
|
-
|
183
|
-
context 'with an optional' do
|
67
|
+
context 'given a repeat of something other than a repeat' do
|
184
68
|
|
185
|
-
|
69
|
+
let(:parser) { Repeat[Match[/a/], 2, 4] }
|
186
70
|
|
187
|
-
|
188
|
-
|
189
|
-
end
|
71
|
+
it 'returns false' do
|
72
|
+
subject.applies_to?(parser, capturing).should be_false
|
190
73
|
end
|
191
74
|
end
|
192
75
|
|
193
|
-
context 'given
|
194
|
-
|
195
|
-
let(:parser) { Optional[child] }
|
196
|
-
|
197
|
-
context 'with a zero-or-more' do
|
198
|
-
|
199
|
-
let(:child) { ZeroOrMore[Match[/a/]] }
|
200
|
-
|
201
|
-
it 'returns true' do
|
202
|
-
subject.applies_to?(parser, matching).should be_true
|
203
|
-
end
|
204
|
-
end
|
205
|
-
|
206
|
-
context 'with a one-or-more' do
|
207
|
-
|
208
|
-
let(:child) { OneOrMore[Match[/a/]] }
|
209
|
-
|
210
|
-
it 'returns true' do
|
211
|
-
subject.applies_to?(parser, matching).should be_true
|
212
|
-
end
|
213
|
-
end
|
214
|
-
|
215
|
-
context 'with an optional' do
|
76
|
+
context 'given something other than a repeat' do
|
216
77
|
|
217
|
-
|
78
|
+
let(:parser) { Match[/a/] }
|
218
79
|
|
219
|
-
|
220
|
-
|
221
|
-
end
|
80
|
+
it 'returns false' do
|
81
|
+
subject.applies_to?(parser, capturing).should be_false
|
222
82
|
end
|
223
83
|
end
|
224
84
|
end
|
@@ -0,0 +1,149 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../../spec_helper')
|
2
|
+
|
3
|
+
include Rattler::BackEnd::ParserGenerator
|
4
|
+
include Rattler::Parsers
|
5
|
+
|
6
|
+
describe ESymbolGenerator do
|
7
|
+
|
8
|
+
include ParserGeneratorSpecHelper
|
9
|
+
|
10
|
+
describe '#gen_basic' do
|
11
|
+
|
12
|
+
context 'when nested' do
|
13
|
+
it 'generates nested eof matching code' do
|
14
|
+
nested_code {|g| g.gen_basic ESymbol[] }.should == 'true'
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
context 'when top-level' do
|
19
|
+
it 'generates top level eof matching code' do
|
20
|
+
top_level_code {|g| g.gen_basic ESymbol[] }.should == 'true'
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe '#gen_assert' do
|
26
|
+
|
27
|
+
context 'when nested' do
|
28
|
+
it 'generates nested eof matching code' do
|
29
|
+
nested_code {|g| g.gen_assert ESymbol[] }.should == 'true'
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
context 'when top-level' do
|
34
|
+
it 'generates top level eof matching code' do
|
35
|
+
top_level_code {|g| g.gen_assert ESymbol[] }.should == 'true'
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe '#gen_disallow' do
|
41
|
+
|
42
|
+
context 'when nested' do
|
43
|
+
it 'generates nested eof disallowing code' do
|
44
|
+
nested_code {|g| g.gen_disallow ESymbol[] }.should == 'false'
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
context 'when top-level' do
|
49
|
+
it 'generates top level eof disallowing code' do
|
50
|
+
top_level_code {|g| g.gen_disallow ESymbol[] }.should == 'false'
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
describe '#gen_dispatch_action' do
|
56
|
+
|
57
|
+
let(:code) { NodeCode.new('Word', 'parsed') }
|
58
|
+
|
59
|
+
context 'when nested' do
|
60
|
+
it 'generates nested eof matching code with a dispatch action' do
|
61
|
+
nested_code {|g| g.gen_dispatch_action ESymbol[], code }.
|
62
|
+
should == 'Word.parsed([])'
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
context 'when top-level' do
|
67
|
+
it 'generates top level eof matching code with a dispatch action' do
|
68
|
+
top_level_code {|g| g.gen_dispatch_action ESymbol[], code }.
|
69
|
+
should == 'Word.parsed([])'
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
describe '#gen_direct_action' do
|
75
|
+
|
76
|
+
let(:code) { ActionCode.new(':foo') }
|
77
|
+
|
78
|
+
context 'when nested' do
|
79
|
+
it 'generates nested eof matching code with a direct action' do
|
80
|
+
nested_code {|g| g.gen_direct_action ESymbol[], code }.
|
81
|
+
should == '(:foo)'
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
context 'when top-level' do
|
86
|
+
it 'generates top level eof matching code with a direct action' do
|
87
|
+
top_level_code {|g| g.gen_direct_action ESymbol[], code }.
|
88
|
+
should == ':foo'
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
describe '#gen_token' do
|
94
|
+
|
95
|
+
context 'when nested' do
|
96
|
+
it 'generates nested eof matching code matching as ""' do
|
97
|
+
nested_code {|g| g.gen_token ESymbol[] }.
|
98
|
+
should == "''"
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
context 'when top-level' do
|
103
|
+
it 'generates top level eof matching code matching as ""' do
|
104
|
+
top_level_code {|g| g.gen_token ESymbol[] }.
|
105
|
+
should == "''"
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
describe '#gen_skip' do
|
111
|
+
|
112
|
+
context 'when nested' do
|
113
|
+
it 'generates nested eof skipping code' do
|
114
|
+
nested_code {|g| g.gen_skip ESymbol[] }.should == 'true'
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
context 'when top-level' do
|
119
|
+
it 'generates top level eof skipping code' do
|
120
|
+
top_level_code {|g| g.gen_skip ESymbol[] }.should == 'true'
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
describe '#gen_intermediate' do
|
126
|
+
it 'generates basic eof matching code' do
|
127
|
+
nested_code {|g| g.gen_intermediate ESymbol[] }.should == 'true'
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
describe '#gen_intermediate_assert' do
|
132
|
+
it 'generates intermediate eof matching code' do
|
133
|
+
nested_code {|g| g.gen_intermediate_assert ESymbol[] }.should == 'true'
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
describe '#gen_intermediate_disallow' do
|
138
|
+
it 'generates intermediate eof disallowing code' do
|
139
|
+
nested_code {|g| g.gen_intermediate_disallow ESymbol[] }.should == 'false'
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
describe '#gen_intermediate_skip' do
|
144
|
+
it 'generates intermediate eof skipping code' do
|
145
|
+
nested_code {|g| g.gen_intermediate_skip ESymbol[] }.should == 'true'
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
end
|
@@ -0,0 +1,152 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../../spec_helper')
|
2
|
+
|
3
|
+
include Rattler::BackEnd::ParserGenerator
|
4
|
+
include Rattler::Parsers
|
5
|
+
|
6
|
+
describe EofGenerator do
|
7
|
+
|
8
|
+
include ParserGeneratorSpecHelper
|
9
|
+
|
10
|
+
describe '#gen_basic' do
|
11
|
+
|
12
|
+
context 'when nested' do
|
13
|
+
it 'generates nested eof matching code' do
|
14
|
+
nested_code {|g| g.gen_basic Eof[] }.should == '@scanner.eos?'
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
context 'when top-level' do
|
19
|
+
it 'generates top level eof matching code' do
|
20
|
+
top_level_code {|g| g.gen_basic Eof[] }.should == '@scanner.eos?'
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe '#gen_assert' do
|
26
|
+
|
27
|
+
context 'when nested' do
|
28
|
+
it 'generates nested eof matching code' do
|
29
|
+
nested_code {|g| g.gen_assert Eof[] }.should == '@scanner.eos?'
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
context 'when top-level' do
|
34
|
+
it 'generates top level eof matching code' do
|
35
|
+
top_level_code {|g| g.gen_assert Eof[] }.should == '@scanner.eos?'
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe '#gen_disallow' do
|
41
|
+
|
42
|
+
context 'when nested' do
|
43
|
+
it 'generates nested eof disallowing code' do
|
44
|
+
nested_code {|g| g.gen_disallow Eof[] }.should == '(!@scanner.eos?)'
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
context 'when top-level' do
|
49
|
+
it 'generates top level eof disallowing code' do
|
50
|
+
top_level_code {|g| g.gen_disallow Eof[] }.should == '!@scanner.eos?'
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
describe '#gen_dispatch_action' do
|
56
|
+
|
57
|
+
let(:code) { NodeCode.new('Word', 'parsed') }
|
58
|
+
|
59
|
+
context 'when nested' do
|
60
|
+
it 'generates nested eof matching code with a dispatch action' do
|
61
|
+
nested_code {|g| g.gen_dispatch_action Eof[], code }.
|
62
|
+
should == '(Word.parsed([]) if @scanner.eos?)'
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
context 'when top-level' do
|
67
|
+
it 'generates top level eof matching code with a dispatch action' do
|
68
|
+
top_level_code {|g| g.gen_dispatch_action Eof[], code }.
|
69
|
+
should == 'Word.parsed([]) if @scanner.eos?'
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
describe '#gen_direct_action' do
|
75
|
+
|
76
|
+
let(:code) { ActionCode.new(':eof') }
|
77
|
+
|
78
|
+
context 'when nested' do
|
79
|
+
it 'generates nested eof matching code with a direct action' do
|
80
|
+
nested_code {|g| g.gen_direct_action Eof[], code }.
|
81
|
+
should == '((:eof) if @scanner.eos?)'
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
context 'when top-level' do
|
86
|
+
it 'generates top level eof matching code with a direct action' do
|
87
|
+
top_level_code {|g| g.gen_direct_action Eof[], code }.
|
88
|
+
should == '(:eof) if @scanner.eos?'
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
describe '#gen_token' do
|
94
|
+
|
95
|
+
context 'when nested' do
|
96
|
+
it 'generates nested eof matching code matching as ""' do
|
97
|
+
nested_code {|g| g.gen_token Eof[] }.
|
98
|
+
should == "('' if @scanner.eos?)"
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
context 'when top-level' do
|
103
|
+
it 'generates top level eof matching code matching as ""' do
|
104
|
+
top_level_code {|g| g.gen_token Eof[] }.
|
105
|
+
should == "'' if @scanner.eos?"
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
describe '#gen_skip' do
|
111
|
+
|
112
|
+
context 'when nested' do
|
113
|
+
it 'generates nested eof skipping code' do
|
114
|
+
nested_code {|g| g.gen_skip Eof[] }.should == '@scanner.eos?'
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
context 'when top-level' do
|
119
|
+
it 'generates top level eof skipping code' do
|
120
|
+
top_level_code {|g| g.gen_skip Eof[] }.should == '@scanner.eos?'
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
describe '#gen_intermediate' do
|
126
|
+
it 'generates basic eof matching code' do
|
127
|
+
nested_code {|g| g.gen_intermediate Eof[] }.should == '@scanner.eos?'
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
describe '#gen_intermediate_assert' do
|
132
|
+
it 'generates intermediate eof matching code' do
|
133
|
+
nested_code {|g| g.gen_intermediate_assert Eof[] }.
|
134
|
+
should == '@scanner.eos?'
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
describe '#gen_intermediate_disallow' do
|
139
|
+
it 'generates intermediate eof disallowing code' do
|
140
|
+
nested_code {|g| g.gen_intermediate_disallow Eof[] }.
|
141
|
+
should == '(!@scanner.eos?)'
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
describe '#gen_intermediate_skip' do
|
146
|
+
it 'generates intermediate eof skipping code' do
|
147
|
+
nested_code {|g| g.gen_intermediate_skip Eof[] }.
|
148
|
+
should == '@scanner.eos?'
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
end
|