Example #1
0
        public override IPExpr VisitUnaryExpr(PParser.UnaryExprContext context)
        {
            var subExpr = Visit(context.expr());

            switch (context.op.Text)
            {
            case "-":
                if (!PrimitiveType.Int.IsAssignableFrom(subExpr.Type) &&
                    !PrimitiveType.Float.IsAssignableFrom(subExpr.Type))
                {
                    throw handler.TypeMismatch(context.expr(),
                                               subExpr.Type,
                                               PrimitiveType.Int,
                                               PrimitiveType.Float);
                }
                return(new UnaryOpExpr(context, UnaryOpType.Negate, subExpr));

            case "!":
                if (!PrimitiveType.Bool.IsAssignableFrom(subExpr.Type))
                {
                    throw handler.TypeMismatch(context.expr(), subExpr.Type, PrimitiveType.Bool);
                }
                return(new UnaryOpExpr(context, UnaryOpType.Not, subExpr));

            default:
                throw handler.InternalError(context,
                                            new ArgumentException($"Unknown unary op `{context.op.Text}`", nameof(context)));
            }
        }
Example #2
0
 public override object VisitUnaryExpr(PParser.UnaryExprContext context)
 {
     return(null);
 }