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 |
|
} |