Ejemplo n.º 1
0
 private static bool ShallowEq(MultiSelectExpr expr1, MultiSelectExpr expr2)
 {
     return(true);
 }
Ejemplo n.º 2
0
        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);
        }