| 1729 | } |
| 1730 | |
| 1731 | RefPtr<ExpressionSyntaxNode> Parser::ParseExpression(int level) |
| 1732 | { |
| 1733 | if (level == MaxExprLevel) |
| 1734 | return ParseLeafExpression(); |
| 1735 | if (level == 1) |
| 1736 | { |
| 1737 | // parse select clause |
| 1738 | auto condition = ParseExpression(level + 1); |
| 1739 | if (LookAheadToken(TokenType::QuestionMark)) |
| 1740 | { |
| 1741 | RefPtr<SelectExpressionSyntaxNode> select = new SelectExpressionSyntaxNode(); |
| 1742 | FillPosition(select.Ptr()); |
| 1743 | ReadToken(TokenType::QuestionMark); |
| 1744 | select->SelectorExpr = condition; |
| 1745 | select->Expr0 = ParseExpression(level); |
| 1746 | ReadToken(TokenType::Colon); |
| 1747 | select->Expr1 = ParseExpression(level); |
| 1748 | return select; |
| 1749 | } |
| 1750 | else |
| 1751 | return condition; |
| 1752 | } |
| 1753 | else |
| 1754 | { |
| 1755 | if (GetAssociativityFromLevel(level) == Associativity::Left) |
| 1756 | { |
| 1757 | auto left = ParseExpression(level + 1); |
| 1758 | while (GetOpLevel(tokenReader.PeekTokenType()) == level) |
| 1759 | { |
| 1760 | RefPtr<BinaryExpressionSyntaxNode> tmp = new BinaryExpressionSyntaxNode(); |
| 1761 | tmp->LeftExpression = left; |
| 1762 | FillPosition(tmp.Ptr()); |
| 1763 | Token opToken = tokenReader.AdvanceToken(); |
| 1764 | tmp->Operator = GetOpFromToken(opToken); |
| 1765 | tmp->RightExpression = ParseExpression(level + 1); |
| 1766 | left = tmp; |
| 1767 | } |
| 1768 | return left; |
| 1769 | } |
| 1770 | else |
| 1771 | { |
| 1772 | auto left = ParseExpression(level + 1); |
| 1773 | if (GetOpLevel(tokenReader.PeekTokenType()) == level) |
| 1774 | { |
| 1775 | RefPtr<BinaryExpressionSyntaxNode> tmp = new BinaryExpressionSyntaxNode(); |
| 1776 | tmp->LeftExpression = left; |
| 1777 | FillPosition(tmp.Ptr()); |
| 1778 | Token opToken = tokenReader.AdvanceToken(); |
| 1779 | tmp->Operator = GetOpFromToken(opToken); |
| 1780 | tmp->RightExpression = ParseExpression(level); |
| 1781 | left = tmp; |
| 1782 | } |
| 1783 | return left; |
| 1784 | } |
| 1785 | } |
| 1786 | } |
| 1787 | |
| 1788 | RefPtr<ExpressionSyntaxNode> Parser::ParseLeafExpression() |
no test coverage detected