| 590 | } |
| 591 | |
| 592 | cASTNode* cParser::parseExprP6() |
| 593 | { |
| 594 | PARSE_TRACE("parseExprP6"); |
| 595 | Apto::SmartPtr<cASTNode> expr; |
| 596 | |
| 597 | bool is_matrix = false; |
| 598 | |
| 599 | switch (currentToken()) { |
| 600 | case TOKEN(FLOAT): |
| 601 | expr.Set(new cASTLiteral(FILEPOS, AS_TYPE_FLOAT, currentText())); |
| 602 | break; |
| 603 | case TOKEN(INT): |
| 604 | expr.Set(new cASTLiteral(FILEPOS, AS_TYPE_INT, currentText())); |
| 605 | break; |
| 606 | case TOKEN(CHAR): |
| 607 | expr.Set(new cASTLiteral(FILEPOS, AS_TYPE_CHAR, |
| 608 | currentText().Substring(1, currentText().GetSize() - 2).ParseEscapeSequences())); |
| 609 | break; |
| 610 | case TOKEN(BOOL): |
| 611 | expr.Set(new cASTLiteral(FILEPOS, AS_TYPE_BOOL, currentText())); |
| 612 | break; |
| 613 | case TOKEN(STRING): |
| 614 | expr.Set(new cASTLiteral(FILEPOS, AS_TYPE_STRING, |
| 615 | currentText().Substring(1, currentText().GetSize() - 2).ParseEscapeSequences())); |
| 616 | break; |
| 617 | case TOKEN(ID): |
| 618 | if (peekToken() == TOKEN(PREC_OPEN)) { |
| 619 | cASTFunctionCall* fc = new cASTFunctionCall(FILEPOS, currentText()); |
| 620 | expr.Set(fc); |
| 621 | nextToken(); // consume id token |
| 622 | if (nextToken() != TOKEN(PREC_CLOSE)) fc->SetArguments(parseArgumentList()); |
| 623 | if (currentToken() != TOKEN(PREC_CLOSE)) PARSE_UNEXPECT(); |
| 624 | } else { |
| 625 | expr = new cASTVariableReference(FILEPOS, currentText()); |
| 626 | } |
| 627 | break; |
| 628 | case TOKEN(BUILTIN_CALL): |
| 629 | if (peekToken() == TOKEN(PREC_OPEN)) { |
| 630 | cASTBuiltInCall* bi = new cASTBuiltInCall(FILEPOS, currentText()); |
| 631 | expr.Set(bi); |
| 632 | nextToken(); // consume builtin methon name token |
| 633 | if (nextToken() != TOKEN(PREC_CLOSE)) bi->SetArguments(parseArgumentList()); |
| 634 | if (currentToken() != TOKEN(PREC_CLOSE)) PARSE_UNEXPECT(); |
| 635 | } else { |
| 636 | PARSE_UNEXPECT(); |
| 637 | } |
| 638 | break; |
| 639 | case TOKEN(PREC_OPEN): |
| 640 | nextToken(); // consume '(' |
| 641 | expr.Set(parseExpression()); |
| 642 | if (expr.IsNull()) PARSE_ERROR(NULL_EXPR); |
| 643 | if (currentToken() != TOKEN(PREC_CLOSE)) PARSE_UNEXPECT(); |
| 644 | break; |
| 645 | |
| 646 | case TOKEN(LITERAL_DICT): |
| 647 | expr.Set(parseLiteralDict()); |
| 648 | if (currentToken() != TOKEN(ARR_CLOSE)) PARSE_UNEXPECT(); |
| 649 | break; |
nothing calls this directly
no test coverage detected