Пример #1
0
        public override IPExpr VisitSeqAccessExpr(PParser.SeqAccessExprContext context)
        {
            IPExpr seqOrMap  = Visit(context.seq);
            IPExpr indexExpr = Visit(context.index);

            switch (seqOrMap.Type.Canonicalize())
            {
            case SequenceType seqType:
                if (!PrimitiveType.Int.IsAssignableFrom(indexExpr.Type))
                {
                    throw handler.TypeMismatch(context.index, indexExpr.Type, PrimitiveType.Int);
                }

                return(new SeqAccessExpr(context, seqOrMap, indexExpr, seqType.ElementType));

            case MapType mapType:
                if (!mapType.KeyType.IsAssignableFrom(indexExpr.Type))
                {
                    throw handler.TypeMismatch(context.index, indexExpr.Type, mapType.KeyType);
                }

                return(new MapAccessExpr(context, seqOrMap, indexExpr, mapType.ValueType));
            }

            throw handler.TypeMismatch(seqOrMap, TypeKind.Sequence, TypeKind.Map);
        }
Пример #2
0
 public override object VisitSeqAccessExpr(PParser.SeqAccessExprContext context)
 {
     return(null);
 }