private ExpressionSyntax ParseDirectiveTerm()
{
ExpressionSyntax expr;
var tk = Current.Kind;
switch (tk)
{
case SyntaxKind.IdentifierToken:
expr = ParseIdentifier();
break;
case SyntaxKind.FalseKeyword:
case SyntaxKind.TrueKeyword:
case SyntaxKind.IntegerLiteralToken:
case SyntaxKind.FloatLiteralToken:
expr = new LiteralExpressionSyntax(SyntaxFacts.GetLiteralExpression(Current.Kind), NextToken());
break;
case SyntaxKind.OpenParenToken:
expr = ParseDirectiveParenthesizedExpression();
break;
default:
expr = CreateMissingIdentifierName();
if (tk == SyntaxKind.EndOfFileToken)
expr = WithDiagnostic(expr, DiagnosticId.ExpressionExpected);
else
expr = WithDiagnostic(expr, DiagnosticId.InvalidExprTerm, tk.GetText());
break;
}
// Might be function invocation. We only have one function in the preprocessor - "defined".
if (Current.Kind == SyntaxKind.OpenParenToken && expr.Kind == SyntaxKind.IdentifierName
&& ((IdentifierNameSyntax) expr).Name.ContextualKind == SyntaxKind.DefinedKeyword)
{
_lexer.ExpandMacros = false;
var openParen = Match(SyntaxKind.OpenParenToken);
var name = new IdentifierNameSyntax(NextToken());
_lexer.ExpandMacros = true;
var closeParen = Match(SyntaxKind.CloseParenToken);
expr = new FunctionInvocationExpressionSyntax((IdentifierNameSyntax) expr, new ArgumentListSyntax(
openParen,
new SeparatedSyntaxList<ExpressionSyntax>(new List<SyntaxNode> { name }),
closeParen));
}
return expr;
}