| 613 | } |
| 614 | |
| 615 | void compiler_type::process_brackets(std::deque<token_base *> &tokens) |
| 616 | { |
| 617 | if (tokens.empty()) |
| 618 | throw compile_error("Received empty token buffer."); |
| 619 | process_empty_brackets(tokens); |
| 620 | std::deque<token_base *> oldt; |
| 621 | std::swap(tokens, oldt); |
| 622 | tokens.clear(); |
| 623 | std::deque<std::deque<token_base *>> blist; |
| 624 | std::deque<token_base *> btokens; |
| 625 | std::deque<int> blist_stack; |
| 626 | for (auto &ptr : oldt) { |
| 627 | if (ptr->get_type() == token_types::signal) { |
| 628 | switch (static_cast<token_signal *>(ptr)->get_signal()) { |
| 629 | default: |
| 630 | break; |
| 631 | case signal_types::slb_: |
| 632 | blist_stack.push_front(1); |
| 633 | if (blist_stack.size() == 1) |
| 634 | continue; |
| 635 | break; |
| 636 | case signal_types::mlb_: |
| 637 | blist_stack.push_front(2); |
| 638 | if (blist_stack.size() == 1) |
| 639 | continue; |
| 640 | break; |
| 641 | case signal_types::llb_: |
| 642 | blist_stack.push_front(3); |
| 643 | if (blist_stack.size() == 1) |
| 644 | continue; |
| 645 | break; |
| 646 | case signal_types::srb_: |
| 647 | if (blist_stack.empty()) |
| 648 | throw compile_error("Parentheses do not match."); |
| 649 | if (blist_stack.front() != 1) |
| 650 | throw compile_error("The parentheses type does not match.(Request Small Bracket)"); |
| 651 | blist_stack.pop_front(); |
| 652 | if (blist_stack.empty()) { |
| 653 | process_brackets(btokens); |
| 654 | blist.push_back(btokens); |
| 655 | tokens.push_back(new token_sblist(blist)); |
| 656 | blist.clear(); |
| 657 | btokens.clear(); |
| 658 | continue; |
| 659 | } |
| 660 | break; |
| 661 | case signal_types::mrb_: |
| 662 | if (blist_stack.empty()) |
| 663 | throw compile_error("Parentheses do not match."); |
| 664 | if (blist_stack.front() != 2) |
| 665 | throw compile_error("The parentheses type does not match.(Request Middle Bracket)"); |
| 666 | blist_stack.pop_front(); |
| 667 | if (blist_stack.empty()) { |
| 668 | process_brackets(btokens); |
| 669 | blist.push_back(btokens); |
| 670 | tokens.push_back(new token_mblist(blist)); |
| 671 | blist.clear(); |
| 672 | btokens.clear(); |
nothing calls this directly
no test coverage detected