public override IPExpr VisitKeywordExpr(PParser.KeywordExprContext context) { switch (context.fun.Text) { case "keys": { IPExpr expr = Visit(context.expr()); if (!(expr.Type.Canonicalize() is MapType mapType)) { throw handler.TypeMismatch(expr, TypeKind.Map); } return(new KeysExpr(context, expr, new SequenceType(mapType.KeyType))); } case "values": { IPExpr expr = Visit(context.expr()); if (!(expr.Type.Canonicalize() is MapType mapType)) { throw handler.TypeMismatch(expr, TypeKind.Map); } return(new ValuesExpr(context, expr, new SequenceType(mapType.ValueType))); } case "sizeof": { var expr = Visit(context.expr()); if (!(expr.Type.Canonicalize() is SequenceType) && !(expr.Type.Canonicalize() is MapType) && !(expr.Type.Canonicalize() is SetType)) { throw handler.TypeMismatch(expr, TypeKind.Map, TypeKind.Sequence, TypeKind.Set); } return(new SizeofExpr(context, expr)); } case "default": { PLanguageType type = TypeResolver.ResolveType(context.type(), table, handler); return(new DefaultExpr(context, type.Canonicalize())); } default: { throw handler.InternalError(context, new ArgumentException($"Unknown keyword expression {context.fun.Text}", nameof(context))); } } }
public override object VisitKeywordExpr(PParser.KeywordExprContext context) { return(null); }