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