Example #1
0
        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)));
            }
            }
        }
Example #2
0
 public override object VisitKeywordExpr(PParser.KeywordExprContext context)
 {
     return(null);
 }