Пример #1
0
        private void Visit(UnaryExpr expr)
        {
            var il = CurrentMethodIL;

            Visit((dynamic)expr.Expr);
            CILHelper.EmitExprOperation(il, expr.Op, expr.Expr.Type);
        }
Пример #2
0
        private void Visit(UnaryExpr unaryExpr)
        {
            Visit((dynamic)unaryExpr.Expr);
            TypeInfo type = TypeStack.Pop();

            if (IsNotVoid(type))
            {
                TypeInfo opType = TypeChecker.FindOpProductionType(type, unaryExpr.Op);
                if (opType.SameAs(TypeInfo.BasicVoid))
                {
                    AddError(string.Format("Can't apply operator {0} on type {1}", unaryExpr.Op, type), unaryExpr);
                }
                TypeStack.Push(opType);
                unaryExpr.Type = opType;
            }
        }
Пример #3
0
        private Expression ParseFactor()
        {
            Expression factor;

            if (CurrentToken.Type == TokenType.Identifier)
            {
                factor = ParseCallOrVarExpr();
            }
            else if (Accept(TokenType.IntLiteral))
            {
                factor = new IntLiteralExpr(AcceptedToken);
            }
            else if (Accept(TokenType.StringLiteral))
            {
                factor = new StringLiteralExpr(AcceptedToken);
            }
            else if (Accept(TokenType.RealLiteral))
            {
                factor = new RealLiteralExpr(AcceptedToken);
            }
            else if (Accept(TokenType.LParen))
            {
                Expression expr = ParseExpression();
                Match(TokenType.RParen);
                factor = expr;
            }
            else if (Accept(TokenType.OpNot))
            {
                UnaryExpr expr = new UnaryExpr(AcceptedToken);
                expr.Op   = Operator.Not;
                expr.Expr = ParseFactor();
                factor    = expr;
            }
            else
            {
                throw new Exception(string.Format("Expected a factor, {0} found", CurrentToken.Type));
            }

            if (Accept(TokenType.OpDot))
            {
                MemberAccessExpr expr = new MemberAccessExpr(AcceptedToken);
                expr.AccessedExpr = factor;
                expr.MemberId     = ParseIdentifier();
                return(expr);
            }
            return(factor);
        }