| 638 | } |
| 639 | |
| 640 | bool parser_node_compare (struct parser_node* a, struct parser_node* b) |
| 641 | { |
| 642 | if ((a->type) < (b->type)) { |
| 643 | return true; |
| 644 | } else if ((a->type) == (b->type)) { |
| 645 | switch (a->type) |
| 646 | { |
| 647 | case PARSER_NUMBER: |
| 648 | return parser_get_number(a) < parser_get_number(b); |
| 649 | case PARSER_SYMBOL: |
| 650 | return std::strcmp(parser_get_name(a), |
| 651 | parser_get_name(b)) < 0; |
| 652 | case PARSER_ADD: |
| 653 | case PARSER_SUB: |
| 654 | case PARSER_MUL: |
| 655 | case PARSER_DIV: |
| 656 | return parser_node_compare(a->r, b->r) || |
| 657 | (parser_node_equal(a->r, b->r) && |
| 658 | parser_node_compare(a->l, b->l)); |
| 659 | case PARSER_F1: |
| 660 | return (((struct parser_f1*)(a))->ftype < |
| 661 | ((struct parser_f1*)(b))->ftype) || |
| 662 | ((((struct parser_f1*)(a))->ftype == |
| 663 | ((struct parser_f1*)(b))->ftype) && |
| 664 | parser_node_compare(a->l,b->l)); |
| 665 | case PARSER_F2: |
| 666 | if (((struct parser_f2*)(a))->ftype < |
| 667 | ((struct parser_f2*)(b))->ftype) { |
| 668 | return true; |
| 669 | } else if (((struct parser_f2*)(a))->ftype == |
| 670 | ((struct parser_f2*)(b))->ftype) { |
| 671 | return parser_node_compare(a->r, b->r) || |
| 672 | (parser_node_equal(a->r, b->r) && |
| 673 | parser_node_compare(a->l, b->l)); |
| 674 | } else { |
| 675 | return false; |
| 676 | } |
| 677 | default: |
| 678 | return false; |
| 679 | } |
| 680 | } |
| 681 | return false; |
| 682 | } |
| 683 | |
| 684 | template <typename F> |
| 685 | bool group_combinables (struct parser_node*& a, struct parser_node*& b, |
no test coverage detected