private static bool ShallowEq(MultiSelectExpr expr1, MultiSelectExpr expr2) { return(true); }
void Suffix(ref Expression e) { Contract.Requires(e != null); Contract.Ensures(e!=null); IToken id, x; Expression e0 = null; Expression e1 = null; Expression ee; bool anyDots = false; List<Expression> multipleLengths = null; bool takeRest = false; // takeRest is relevant only if multipleLengths is non-null List<Expression> multipleIndices = null; if (la.kind == 27) { DotSuffix(out id, out x); if (x != null) { // process id as a Suffix in its own right e = new ExprDotName(id, e, id.val, null); id = x; // move to the next Suffix } IToken openParen = null; List<Type> typeArgs = null; List<Expression> args = null; if (IsGenericInstantiation()) { typeArgs = new List<Type>(); GenericInstantiation(typeArgs); } else if (la.kind == 106) { HashCall(id, out openParen, out typeArgs, out args); } else if (StartOf(30)) { } else SynErr(225); e = new ExprDotName(id, e, id.val, typeArgs); if (openParen != null) { e = new ApplySuffix(openParen, e, args); } } else if (la.kind == 48) { Get(); x = t; if (StartOf(7)) { Expression(out ee, true, true); e0 = ee; if (la.kind == 137) { Get(); anyDots = true; if (StartOf(7)) { Expression(out ee, true, true); e1 = ee; } } else if (la.kind == 95) { Get(); Expression(out ee, true, true); e1 = ee; } else if (la.kind == 21) { Get(); multipleLengths = new List<Expression>(); multipleLengths.Add(e0); // account for the Expression read before the colon takeRest = true; if (StartOf(7)) { Expression(out ee, true, true); multipleLengths.Add(ee); takeRest = false; while (IsNonFinalColon()) { Expect(21); Expression(out ee, true, true); multipleLengths.Add(ee); } if (la.kind == 21) { Get(); takeRest = true; } } } else if (la.kind == 22 || la.kind == 49) { while (la.kind == 22) { Get(); Expression(out ee, true, true); if (multipleIndices == null) { multipleIndices = new List<Expression>(); multipleIndices.Add(e0); } multipleIndices.Add(ee); } } else SynErr(226); } else if (la.kind == 137) { Get(); anyDots = true; if (StartOf(7)) { Expression(out ee, true, true); e1 = ee; } } else SynErr(227); if (multipleIndices != null) { e = new MultiSelectExpr(x, e, multipleIndices); // make sure an array class with this dimensionality exists var tmp = theBuiltIns.ArrayType(multipleIndices.Count, new IntType(), true); } else { if (!anyDots && e0 == null) { /* a parsing error occurred */ e0 = dummyExpr; } Contract.Assert(anyDots || e0 != null); if (anyDots) { //Contract.Assert(e0 != null || e1 != null); e = new SeqSelectExpr(x, false, e, e0, e1); } else if (multipleLengths != null) { Expression prev = null; List<Expression> seqs = new List<Expression>(); foreach (var len in multipleLengths) { var end = prev == null ? len : new BinaryExpr(x, BinaryExpr.Opcode.Add, prev, len); seqs.Add(new SeqSelectExpr(x, false, e, prev, end)); prev = end; } if (takeRest) { seqs.Add(new SeqSelectExpr(x, false, e, prev, null)); } e = new SeqDisplayExpr(x, seqs); } else if (e1 == null) { Contract.Assert(e0 != null); e = new SeqSelectExpr(x, true, e, e0, null); } else { Contract.Assert(e0 != null); e = new SeqUpdateExpr(x, e, e0, e1); } } Expect(49); } else if (la.kind == 50) { Get(); IToken openParen = t; var args = new List<Expression>(); if (StartOf(7)) { Expressions(args); } Expect(51); e = new ApplySuffix(openParen, e, args); } else SynErr(228); }