private ExpressionSyntax ParseTerm()
{
ExpressionSyntax expr;
var tk = Current.Kind;
switch (tk)
{
case SyntaxKind.IdentifierToken:
expr = ParseIdentifierOrFunctionInvocationExpression();
break;
case SyntaxKind.FalseKeyword:
case SyntaxKind.TrueKeyword:
case SyntaxKind.IntegerLiteralToken:
case SyntaxKind.FloatLiteralToken:
expr = new LiteralExpressionSyntax(SyntaxFacts.GetLiteralExpression(Current.Kind), NextToken());
break;
case SyntaxKind.StringLiteralToken:
{
var stringTokens = new List<SyntaxToken> {NextToken()};
while (Current.Kind == SyntaxKind.StringLiteralToken)
stringTokens.Add(NextToken());
expr = new StringLiteralExpressionSyntax(stringTokens);
break;
}
case SyntaxKind.OpenParenToken:
expr = ParseCastOrParenthesizedExpression();
break;
default:
if (_allowLinearAndPointAsIdentifiers && (tk == SyntaxKind.LinearKeyword || tk == SyntaxKind.PointKeyword))
goto case SyntaxKind.IdentifierToken;
if ((SyntaxFacts.IsPredefinedScalarType(tk) && tk != SyntaxKind.UnsignedKeyword && tk != SyntaxKind.VoidKeyword) || SyntaxFacts.IsPredefinedVectorType(tk) || SyntaxFacts.IsPredefinedMatrixType(tk))
{
if (Lookahead.Kind == SyntaxKind.OpenParenToken)
{
expr = ParseNumericConstructorInvocationExpression();
break;
}
}
expr = CreateMissingIdentifierName();
if (tk == SyntaxKind.EndOfFileToken)
expr = WithDiagnostic(expr, DiagnosticId.ExpressionExpected);
else
expr = WithDiagnostic(expr, DiagnosticId.InvalidExprTerm, tk.GetText());
break;
}
return ParsePostFixExpression(expr);
}