private void Visit(UnaryExpr expr) { var il = CurrentMethodIL; Visit((dynamic)expr.Expr); CILHelper.EmitExprOperation(il, expr.Op, expr.Expr.Type); }
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; } }
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); }