| 560 |  | switch (tok) { | 
| 561 |  | case Token::within: | 
| 562 |  | return clauseWithin(); | 
| 563 | < | case Token::name : | 
| 564 | < | return clauseName(Token::name); | 
| 565 | < | case Token::index : | 
| 566 | < | return clauseIndex(Token::index); | 
| 567 | < | case Token::molname : | 
| 568 | < | return clauseName(Token::molname); | 
| 569 | < | case Token::molindex : | 
| 570 | < | return clauseIndex(Token::molindex); | 
| 571 | < |  | 
| 563 | > |  | 
| 564 | > | case Token::asterisk: | 
| 565 | > | case Token::identifier: | 
| 566 | > | return clauseChemObjName(); | 
| 567 | > |  | 
| 568 |  | default: | 
| 569 |  | if ((tok & Token::atomproperty) == Token::atomproperty) { | 
| 570 |  | return clauseComparator(); | 
| 642 |  |  | 
| 643 |  | return addTokenToPostfix(Token(Token::within, distance)); | 
| 644 |  | } | 
| 645 | + |  | 
| 646 | + | bool SelectionCompiler::clauseChemObjName() { | 
| 647 | + | std::string chemObjName; | 
| 648 | + | int tok = tokPeek(); | 
| 649 | + | if (!clauseName(chemObjName)){ | 
| 650 | + | return false; | 
| 651 | + | } | 
| 652 |  |  | 
| 653 |  |  | 
| 654 | < | bool SelectionCompiler:: clauseName(int tok) { | 
| 655 | < | Token tokenName = tokenNext(); | 
| 656 | < | std::string name = boost::any_cast<std::string>(tokenName.value); | 
| 657 | < | return addTokenToPostfix(Token(tok, name)); /**@todo */ | 
| 658 | < |  | 
| 654 | > | tok = tokPeek(); | 
| 655 | > | //allow two dot at most | 
| 656 | > | if (tok == Token::dot) { | 
| 657 | > | if (!clauseName(chemObjName)) { | 
| 658 | > | return false; | 
| 659 | > | } | 
| 660 | > | tok = tokPeek(); | 
| 661 | > | if (tok == Token::dot) { | 
| 662 | > | if (!clauseName(chemObjName)) { | 
| 663 | > | return false; | 
| 664 | > | } | 
| 665 | > | } | 
| 666 | > | } | 
| 667 | > |  | 
| 668 | > | return addTokenToPostfix(Token(Token::name, chemObjName)); | 
| 669 |  | } | 
| 670 |  |  | 
| 671 | < | bool SelectionCompiler:: clauseIndex(int tok) { | 
| 672 | < | //return addTokenToPostfix(Token(tok, )); /**@todo*/ | 
| 673 | < | return true; | 
| 671 | > | bool SelectionCompiler:: clauseName(std::string& name) { | 
| 672 | > |  | 
| 673 | > | int tok = tokPeek(); | 
| 674 | > |  | 
| 675 | > | if (tok == Token::asterisk || tok == Token::identifier) { | 
| 676 | > | name += boost::any_cast<std::string>(tokenNext().value); | 
| 677 | > |  | 
| 678 | > | while(true){ | 
| 679 | > | tok = tokPeek(); | 
| 680 | > | switch (tok) { | 
| 681 | > | case Token::asterisk : | 
| 682 | > | name += "*"; | 
| 683 | > | tokenNext(); | 
| 684 | > | break; | 
| 685 | > | case Token::identifier : | 
| 686 | > | name += boost::any_cast<std::string>(tokenNext().value); | 
| 687 | > | break; | 
| 688 | > | case Token::integer : | 
| 689 | > | name += toString(boost::any_cast<int>(tokenNext().value)); | 
| 690 | > | break; | 
| 691 | > | case Token::dot : | 
| 692 | > | return true; | 
| 693 | > | default : | 
| 694 | > | return true; | 
| 695 | > | } | 
| 696 | > | } | 
| 697 | > |  | 
| 698 | > | }else { | 
| 699 | > | return false; | 
| 700 | > | } | 
| 701 | > |  | 
| 702 |  | } | 
| 703 |  |  | 
| 704 | + |  | 
| 705 |  | } |