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

Method ParseLeafExpression

Source/SpireCore/Parser.cpp:1788–1950  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1786 }
1787
1788 RefPtr<ExpressionSyntaxNode> Parser::ParseLeafExpression()
1789 {
1790 RefPtr<ExpressionSyntaxNode> rs;
1791 if (LookAheadToken("project"))
1792 {
1793 RefPtr<ProjectExpressionSyntaxNode> project = new ProjectExpressionSyntaxNode();
1794 FillPosition(project.Ptr());
1795 ReadToken("project");
1796 ReadToken(TokenType::LParent);
1797 project->BaseExpression = ParseExpression();
1798 ReadToken(TokenType::RParent);
1799 return project;
1800 }
1801 if (LookAheadToken(TokenType::OpInc) ||
1802 LookAheadToken(TokenType::OpDec) ||
1803 LookAheadToken(TokenType::OpNot) ||
1804 LookAheadToken(TokenType::OpBitNot) ||
1805 LookAheadToken(TokenType::OpSub))
1806 {
1807 RefPtr<UnaryExpressionSyntaxNode> unaryExpr = new UnaryExpressionSyntaxNode();
1808 Token token = tokenReader.AdvanceToken();
1809 FillPosition(unaryExpr.Ptr());
1810 unaryExpr->Operator = GetOpFromToken(token);
1811 if (unaryExpr->Operator == Operator::PostInc)
1812 unaryExpr->Operator = Operator::PreInc;
1813 else if (unaryExpr->Operator == Operator::PostDec)
1814 unaryExpr->Operator = Operator::PreDec;
1815 else if (unaryExpr->Operator == Operator::Sub)
1816 unaryExpr->Operator = Operator::Neg;
1817
1818 unaryExpr->Expression = ParseLeafExpression();
1819 rs = unaryExpr;
1820 return rs;
1821 }
1822
1823 if (LookAheadToken(TokenType::LParent))
1824 {
1825 ReadToken(TokenType::LParent);
1826 RefPtr<ExpressionSyntaxNode> expr;
1827 if (IsTypeKeyword() && LookAheadToken(TokenType::RParent, 1))
1828 {
1829 RefPtr<TypeCastExpressionSyntaxNode> tcexpr = new TypeCastExpressionSyntaxNode();
1830 FillPosition(tcexpr.Ptr());
1831 tcexpr->TargetType = ParseType();
1832 ReadToken(TokenType::RParent);
1833 tcexpr->Expression = ParseExpression();
1834 expr = tcexpr;
1835 }
1836 else
1837 {
1838 expr = ParseExpression();
1839 ReadToken(TokenType::RParent);
1840 }
1841 rs = expr;
1842 }
1843 else if (LookAheadToken(TokenType::IntLiterial) ||
1844 LookAheadToken(TokenType::DoubleLiterial))
1845 {

Callers

nothing calls this directly

Calls 10

ReadTokenFunction · 0.85
GetOpFromTokenFunction · 0.85
StringToIntFunction · 0.85
StringToDoubleFunction · 0.85
AdvanceTokenMethod · 0.80
IsAtEndMethod · 0.80
diagnoseMethod · 0.80
PeekLocMethod · 0.80
PtrMethod · 0.45
AddMethod · 0.45

Tested by

no test coverage detected