| 384 |
|
case '(': |
| 385 |
|
case ')': |
| 386 |
|
case ',': |
| 387 |
– |
case '*': |
| 388 |
– |
case '-': |
| 387 |
|
case '[': |
| 388 |
|
case ']': |
| 391 |
– |
case '+': |
| 392 |
– |
case ':': |
| 393 |
– |
case '@': |
| 394 |
– |
case '.': |
| 395 |
– |
case '%': |
| 389 |
|
break; |
| 390 |
|
case '&': |
| 391 |
|
case '|': |
| 410 |
|
if ((ch < 'a' || ch > 'z') && (ch < 'A' && ch > 'Z') && ch != '_') { |
| 411 |
|
return false; |
| 412 |
|
} |
| 413 |
+ |
case '*': |
| 414 |
|
case '?': // include question marks in identifier for atom expressions |
| 415 |
< |
while (ichT < cchScript && !std::isspace(ch = script[ichT]) && (std::isalpha(ch) ||std::isdigit(ch) || |
| 416 |
< |
ch == '_' || ch == '?') ) { |
| 415 |
> |
while (ichT < cchScript && !std::isspace(ch = script[ichT]) && |
| 416 |
> |
(std::isalpha(ch) ||std::isdigit(ch) || ch == '_' || ch == '.' || ch == '*' || ch == '?' || ch == '+' || ch == '-' || ch == '[' || ch == ']') ){ |
| 417 |
|
|
| 418 |
|
++ichT; |
| 419 |
|
} |
| 645 |
|
} |
| 646 |
|
|
| 647 |
|
bool SelectionCompiler::clauseChemObjName() { |
| 648 |
< |
std::string chemObjName; |
| 649 |
< |
int tok = tokPeek(); |
| 656 |
< |
if (!clauseName(chemObjName)){ |
| 657 |
< |
return false; |
| 658 |
< |
} |
| 648 |
> |
Token token = tokenNext(); |
| 649 |
> |
if (token.tok == Token::identifier && token.value.type() == typeid(std::string)) { |
| 650 |
|
|
| 651 |
+ |
std::string name = boost::any_cast<std::string>(token.value); |
| 652 |
+ |
if (isNameValid(name)) { |
| 653 |
+ |
return addTokenToPostfix(Token(Token::name, name)); |
| 654 |
+ |
} else { |
| 655 |
+ |
return compileError("invalid name: " + name); |
| 656 |
+ |
} |
| 657 |
+ |
} |
| 658 |
|
|
| 659 |
< |
tok = tokPeek(); |
| 660 |
< |
//allow two dot at most |
| 663 |
< |
if (tok == Token::dot) { |
| 664 |
< |
tokenNext(); |
| 665 |
< |
chemObjName += "."; |
| 666 |
< |
if (!clauseName(chemObjName)) { |
| 667 |
< |
return false; |
| 668 |
< |
} |
| 669 |
< |
tok = tokPeek(); |
| 670 |
< |
if (tok == Token::dot) { |
| 671 |
< |
tokenNext(); |
| 672 |
< |
chemObjName += "."; |
| 673 |
< |
|
| 674 |
< |
if (!clauseName(chemObjName)) { |
| 675 |
< |
return false; |
| 676 |
< |
} |
| 677 |
< |
} |
| 678 |
< |
} |
| 679 |
< |
|
| 680 |
< |
return addTokenToPostfix(Token(Token::name, chemObjName)); |
| 659 |
> |
return false; |
| 660 |
> |
|
| 661 |
|
} |
| 662 |
|
|
| 663 |
< |
bool SelectionCompiler:: clauseName(std::string& name) { |
| 664 |
< |
|
| 665 |
< |
int tok = tokPeek(); |
| 663 |
> |
bool SelectionCompiler::isNameValid(const std::string& name) { |
| 664 |
> |
int nbracket = 0; |
| 665 |
> |
int ndot = 0; |
| 666 |
> |
for (int i =0 ; i < name.size(); ++i) { |
| 667 |
> |
switch(name[i]) { |
| 668 |
|
|
| 669 |
< |
if (tok == Token::asterisk || tok == Token::identifier || tok == Token::integer) { |
| 670 |
< |
|
| 671 |
< |
Token token = tokenNext(); |
| 672 |
< |
if (token.value.type() == typeid(std::string)) { |
| 673 |
< |
name += boost::any_cast<std::string>(token.value); |
| 674 |
< |
} else if (token.value.type() == typeid(int)){ |
| 675 |
< |
int intVal = boost::any_cast<int>(token.value); |
| 676 |
< |
char buffer[255]; |
| 677 |
< |
sprintf(buffer,"%d", intVal); |
| 696 |
< |
name += buffer; /** @todo */ |
| 697 |
< |
//name += toString<int>(intVal); |
| 669 |
> |
case '[' : |
| 670 |
> |
++nbracket; |
| 671 |
> |
break; |
| 672 |
> |
case ']' : |
| 673 |
> |
--nbracket; |
| 674 |
> |
break; |
| 675 |
> |
case '.' : |
| 676 |
> |
++ndot; |
| 677 |
> |
break; |
| 678 |
|
} |
| 699 |
– |
while(true){ |
| 700 |
– |
tok = tokPeek(); |
| 701 |
– |
switch (tok) { |
| 702 |
– |
case Token::asterisk : |
| 703 |
– |
name += "*"; |
| 704 |
– |
tokenNext(); |
| 705 |
– |
break; |
| 706 |
– |
case Token::identifier : |
| 707 |
– |
name += boost::any_cast<std::string>(tokenNext().value); |
| 708 |
– |
break; |
| 709 |
– |
case Token::integer : |
| 710 |
– |
name += toString(boost::any_cast<int>(tokenNext().value)); |
| 711 |
– |
break; |
| 712 |
– |
case Token::dot : |
| 713 |
– |
return true; |
| 714 |
– |
default : |
| 715 |
– |
return true; |
| 716 |
– |
} |
| 717 |
– |
} |
| 718 |
– |
|
| 719 |
– |
}else { |
| 720 |
– |
return false; |
| 679 |
|
} |
| 680 |
|
|
| 681 |
+ |
//only allow 3 dots at most |
| 682 |
+ |
return (ndot <=3 && nbracket == 0) ? true : false; |
| 683 |
|
} |
| 684 |
|
|
| 685 |
|
bool SelectionCompiler::clauseIndex(){ |