Exemple #1
0
        private ExpressionSyntax ParsePrimary()
        {
            var k = this.CurrentToken.Kind;

            switch (k)
            {
            case SyntaxKind.OpenParenToken:
                var open  = this.EatToken();
                var expr  = this.ParseExpression();
                var close = this.EatToken(SyntaxKind.CloseParenToken);
                return(SyntaxFactory.ParenthesizedExpression(open, expr, close));

            case SyntaxKind.IdentifierToken:
                var identifier = TruncateIdentifier(this.EatToken());
                return(SyntaxFactory.IdentifierName(identifier));

            case SyntaxKind.TrueKeyword:
            case SyntaxKind.FalseKeyword:
                return(SyntaxFactory.LiteralExpression(
                           SyntaxFacts.GetLiteralExpression(k),
                           this.EatToken()
                           ));

            default:
                return(SyntaxFactory.IdentifierName(
                           this.EatToken(SyntaxKind.IdentifierToken, ErrorCode.ERR_InvalidPreprocExpr)
                           ));
            }
        }
        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 <SyntaxNodeBase> {
                    name
                }),
                                                                  closeParen));
            }

            return(expr);
        }
Exemple #3
0
        private ExpressionSyntax ParseTerm()
        {
            ExpressionSyntax expr;

            var tk = Current.Kind;

            switch (tk)
            {
            case SyntaxKind.FalseKeyword:
            case SyntaxKind.TrueKeyword:
            case SyntaxKind.IntegerLiteralToken:
            case SyntaxKind.FloatLiteralToken:
                expr = new LiteralExpressionSyntax(SyntaxFacts.GetLiteralExpression(Current.Kind), NextToken());
                break;

            default:
                expr = new EnumNameExpressionSyntax(new List <SyntaxToken> {
                    InsertMissingToken(SyntaxKind.IdentifierToken)
                });

                if (tk == SyntaxKind.EndOfFileToken)
                {
                    expr = WithDiagnostic(expr, DiagnosticId.ExpressionExpected);
                }
                else
                {
                    expr = WithDiagnostic(expr, DiagnosticId.InvalidExprTerm, tk.GetText());
                }

                break;
            }

            return(expr);
        }
Exemple #4
0
 public SyntaxKind GetKind()
 {
     if (Kind != SyntaxKind.None)
     {
         return(Kind);
     }
     return(SyntaxFacts.GetLiteralExpression(TameSyntaxFacts.SyntaxKindFromStr(TokenStr)));
 }
Exemple #5
0
        public void SyntaxFactsMethods()
        {
            Assert.AreEqual("protected internal", SyntaxFacts.GetText(Accessibility.ProtectedOrInternal));
            Assert.AreEqual("??", SyntaxFacts.GetText(SyntaxKind.QuestionQuestionToken));
            Assert.AreEqual("this", SyntaxFacts.GetText(SyntaxKind.ThisKeyword));

            Assert.AreEqual(SyntaxKind.CharacterLiteralExpression, SyntaxFacts.GetLiteralExpression(SyntaxKind.CharacterLiteralToken));
            Assert.AreEqual(SyntaxKind.CoalesceExpression, SyntaxFacts.GetBinaryExpression(SyntaxKind.QuestionQuestionToken));
            Assert.AreEqual(SyntaxKind.None, SyntaxFacts.GetBinaryExpression(SyntaxKind.UndefDirectiveTrivia));
            Assert.AreEqual(false, SyntaxFacts.IsPunctuation(SyntaxKind.StringLiteralToken));
        }
        public void TestPrimaryExpressions(SyntaxKind kind)
        {
            var text = kind.GetText();
            var expr = ParseExpression(text);

            Assert.NotNull(expr);
            var opKind = SyntaxFacts.GetLiteralExpression(kind);

            Assert.Equal(opKind, expr.Kind);
            Assert.Equal(0, expr.GetDiagnostics().Count());
            var us = (LiteralExpressionSyntax)expr;

            Assert.NotNull(us.Token);
            Assert.Equal(kind, us.Token.Kind);
        }
Exemple #7
0
 private ExpressionSyntax ParseUnityPossiblyNegativeNumericLiteralExpression()
 {
     if (Current.Kind == SyntaxKind.MinusToken)
     {
         var operatorToken = NextToken();
         var literalToken  = MatchOneOf(SyntaxKind.IntegerLiteralToken, SyntaxKind.FloatLiteralToken);
         var operand       = new LiteralExpressionSyntax(
             SyntaxFacts.GetLiteralExpression(literalToken.Kind),
             literalToken);
         return(new PrefixUnaryExpressionSyntax(
                    SyntaxFacts.GetPrefixUnaryExpression(operatorToken.Kind),
                    operatorToken, operand));
     }
     else
     {
         var literalToken = MatchOneOf(SyntaxKind.IntegerLiteralToken, SyntaxKind.FloatLiteralToken);
         return(new LiteralExpressionSyntax(
                    SyntaxFacts.GetLiteralExpression(literalToken.Kind),
                    literalToken));
     }
 }
Exemple #8
0
        private ExpressionSyntax ParseTerm(Precedence precedence)
        {
            ExpressionSyntax expr = null;

            var tk = CurrentToken.Kind;

            switch (tk)
            {
            case SyntaxKind.IdentifierToken:
                expr = SyntaxFactory.IdentifierName(ParseIdentifierToken());
                break;

            case SyntaxKind.NumericLiteralToken:
            case SyntaxKind.StringLiteralToken:
                expr = SyntaxFactory.LiteralExpression(SyntaxFacts.GetLiteralExpression(tk), EatToken(tk));
                break;

            default:
                expr = CreateMissingIdentifierName();
                break;
            }

            return(expr);
        }
        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));
        }
Exemple #10
0
 public void TestGetLiteralExpression(SyntaxKind tokenKind, SyntaxKind expressionKind)
 {
     Assert.Equal(expressionKind, SyntaxFacts.GetLiteralExpression(tokenKind));
 }