MCPcopy Create free account
hub / github.com/csyonghe/Spire / ParseExpression

Method ParseExpression

Source/SpireCore/Parser.cpp:1731–1786  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

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()

Callers 2

ParseModifiersFunction · 0.80
ParseVarDeclFunction · 0.80

Calls 7

ReadTokenFunction · 0.85
GetOpLevelFunction · 0.85
GetOpFromTokenFunction · 0.85
PeekTokenTypeMethod · 0.80
AdvanceTokenMethod · 0.80
PtrMethod · 0.45

Tested by

no test coverage detected