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))); } }
public override object VisitUnaryExpr(PParser.UnaryExprContext context) { return(null); }