public string GenerateString(UnaryOpExpr expression)
        {
            string result = string.Empty;

            switch (expression.Op)
            {
            case UnaryOpExpr.Opcode.Cardinality:
            {
                result = "|" + GenerateString(expression.E) + "|";
                break;
            }

            case UnaryOpExpr.Opcode.Not:
            {
                result = "!" + GenerateString(expression.E);
                break;
            }
            }

            return(result);
        }
        public string GenerateConditionString(UnaryOpExpr expression, IDictionary <string, string> rename)
        {
            string result = string.Empty;

            switch (expression.Op)
            {
            case UnaryOpExpr.Opcode.Cardinality:
            {
                result = "|" + GenerateConditionString(expression.E, rename) + "|";
                break;
            }

            case UnaryOpExpr.Opcode.Not:
            {
                result = "!" + GenerateConditionString(expression.E, rename);
                break;
            }
            }

            return(result);
        }
예제 #3
0
 private static bool ShallowEq(UnaryOpExpr expr1, UnaryOpExpr expr2)
 {
     return(expr1.Op == expr2.Op);
 }
예제 #4
0
파일: Parser.cs 프로젝트: dbremner/dafny
 void UnaryExpression(out Expression e, bool allowSemi, bool allowLambda)
 {
     Contract.Ensures(Contract.ValueAtReturn(out e) != null); IToken/*!*/ x;  e = dummyExpr;
     if (la.kind == 128) {
     Get();
     x = t;
     UnaryExpression(out e, allowSemi, allowLambda);
     e = new NegationExpression(x, e);
     } else if (la.kind == 121 || la.kind == 122) {
     NegOp();
     x = t;
     UnaryExpression(out e, allowSemi, allowLambda);
     e = new UnaryOpExpr(x, UnaryOpExpr.Opcode.Not, e);
     } else if (IsMapDisplay()) {
     Expect(17);
     x = t;
     MapDisplayExpr(x, true, out e);
     while (IsSuffix()) {
         Suffix(ref e);
     }
     } else if (IsIMapDisplay()) {
     Expect(18);
     x = t;
     MapDisplayExpr(x, false, out e);
     while (IsSuffix()) {
         Suffix(ref e);
     }
     } else if (IsISetDisplay()) {
     Expect(14);
     x = t;
     ISetDisplayExpr(x, false, out e);
     while (IsSuffix()) {
         Suffix(ref e);
     }
     } else if (IsLambda(allowLambda)) {
     LambdaExpression(out e, allowSemi);
     } else if (StartOf(29)) {
     EndlessExpression(out e, allowSemi, allowLambda);
     } else if (la.kind == 1) {
     NameSegment(out e);
     while (IsSuffix()) {
         Suffix(ref e);
     }
     } else if (la.kind == 46 || la.kind == 48) {
     DisplayExpr(out e);
     while (IsSuffix()) {
         Suffix(ref e);
     }
     } else if (la.kind == 15) {
     MultiSetExpr(out e);
     while (IsSuffix()) {
         Suffix(ref e);
     }
     } else if (StartOf(27)) {
     ConstAtomExpression(out e, allowSemi, allowLambda);
     while (IsSuffix()) {
         Suffix(ref e);
     }
     } else SynErr(223);
 }
예제 #5
0
파일: Parser.cs 프로젝트: dbremner/dafny
        void ConstAtomExpression(out Expression e, bool allowSemi, bool allowLambda)
        {
            Contract.Ensures(Contract.ValueAtReturn(out e) != null);
            IToken/*!*/ x;  BigInteger n;   Basetypes.BigDec d;
            e = dummyExpr;  Type toType = null;

            switch (la.kind) {
            case 131: {
            Get();
            e = new LiteralExpr(t, false);
            break;
            }
            case 132: {
            Get();
            e = new LiteralExpr(t, true);
            break;
            }
            case 133: {
            Get();
            e = new LiteralExpr(t);
            break;
            }
            case 2: case 3: {
            Nat(out n);
            e = new LiteralExpr(t, n);
            break;
            }
            case 4: {
            Dec(out d);
            e = new LiteralExpr(t, d);
            break;
            }
            case 19: {
            Get();
            e = new CharLiteralExpr(t, t.val.Substring(1, t.val.Length - 2));
            break;
            }
            case 20: {
            Get();
            bool isVerbatimString;
            string s = Util.RemoveParsedStringQuotes(t.val, out isVerbatimString);
            e = new StringLiteralExpr(t, s, isVerbatimString);

            break;
            }
            case 134: {
            Get();
            e = new ThisExpr(t);
            break;
            }
            case 135: {
            Get();
            x = t;
            Expect(50);
            Expression(out e, true, true);
            Expect(51);
            e = new UnaryOpExpr(x, UnaryOpExpr.Opcode.Fresh, e);
            break;
            }
            case 136: {
            Get();
            x = t;
            Expect(50);
            Expression(out e, true, true);
            Expect(51);
            e = new OldExpr(x, e);
            break;
            }
            case 23: {
            Get();
            x = t;
            Expression(out e, true, true);
            e = new UnaryOpExpr(x, UnaryOpExpr.Opcode.Cardinality, e);
            Expect(23);
            break;
            }
            case 8: case 10: {
            if (la.kind == 8) {
                Get();
                x = t; toType = new IntType();
            } else {
                Get();
                x = t; toType = new RealType();
            }
            Expect(50);
            Expression(out e, true, true);
            Expect(51);
            e = new ConversionExpr(x, e, toType);
            break;
            }
            case 50: {
            ParensExpression(out e, allowSemi, allowLambda);
            break;
            }
            default: SynErr(234); break;
            }
        }
예제 #6
0
        List <Expression> GenerateAutoReqs(Expression expr, Function parent)
        {
            List <Expression> reqs = new List <Expression>();
            Func <Expression, List <Expression> > generateAutoReqs = e => GenerateAutoReqs(e, parent);

            if (expr is LiteralExpr)
            {
            }
            else if (expr is ThisExpr)
            {
            }
            else if (expr is IdentifierExpr)
            {
            }
            else if (expr is SeqDisplayExpr)
            {
                SeqDisplayExpr e = (SeqDisplayExpr)expr;
                foreach (var elt in e.Elements)
                {
                    reqs.AddRange(generateAutoReqs(elt));
                }
            }
            else if (expr is MemberSelectExpr && ((MemberSelectExpr)expr).Member is Field)
            {
                MemberSelectExpr e = (MemberSelectExpr)expr;
                reqs.AddRange(generateAutoReqs(e.Obj));
            }
            else if (expr is SeqSelectExpr)
            {
                SeqSelectExpr e = (SeqSelectExpr)expr;
                reqs.AddRange(generateAutoReqs(e.Seq));
                if (e.E0 != null)
                {
                    reqs.AddRange(generateAutoReqs(e.E0));
                }
                if (e.E1 != null)
                {
                    reqs.AddRange(generateAutoReqs(e.E1));
                }
            }
            else if (expr is SeqUpdateExpr)
            {
                SeqUpdateExpr e = (SeqUpdateExpr)expr;
                reqs.AddRange(generateAutoReqs(e.Seq));
                reqs.AddRange(generateAutoReqs(e.Index));
                reqs.AddRange(generateAutoReqs(e.Value));
            }
            else if (expr is FunctionCallExpr)
            {
                FunctionCallExpr e = (FunctionCallExpr)expr;
                foreach (var arg in e.Args)
                {
                    reqs.AddRange(generateAutoReqs(arg));
                }
                if (parent == null || parent.Name != e.name)
                {
                    ReqFunction(e.Function);
                    reqs.AddRange(GatherReqs(e.Function, e.Args));
                }
            }
            else if (expr is DatatypeValue)
            {
                DatatypeValue dtv = (DatatypeValue)expr;
                for (int i = 0; i < dtv.Arguments.Count; i++)
                {
                    Expression arg = dtv.Arguments[i];
                    reqs.AddRange(generateAutoReqs(arg));
                }
            }
            else if (expr is OldExpr)
            {
            }
            else if (expr is MatchExpr)
            {
                MatchExpr e = (MatchExpr)expr;
                reqs.AddRange(generateAutoReqs(e.Source));
                List <MatchCaseExpr> newMatches = new List <MatchCaseExpr>();
                foreach (MatchCaseExpr caseExpr in e.Cases)
                {
                    MatchCaseExpr c = new MatchCaseExpr(caseExpr.name, caseExpr.Arguments, Andify(generateAutoReqs(caseExpr.Body)));
                    newMatches.Add(c);
                }
                reqs.Add(new MatchExpr(e.Source, newMatches));
            }
            else if (expr is UnaryOpExpr)
            {
                UnaryOpExpr e   = (UnaryOpExpr)expr;
                Expression  arg = e.E;
                reqs.AddRange(generateAutoReqs(arg));
            }
            else if (expr is BinaryExpr)
            {
                BinaryExpr e = (BinaryExpr)expr;
                switch (e.Op)
                {
                case BinaryExpr.Opcode.Imp:
                case BinaryExpr.Opcode.And:
                    reqs.AddRange(generateAutoReqs(e.E0));
                    foreach (var req in generateAutoReqs(e.E1))
                    {
                        reqs.Add(new BinaryExpr(Token.NoToken, BinaryExpr.Opcode.Imp, e.E0, req));
                    }
                    break;

                case BinaryExpr.Opcode.Or:
                    reqs.AddRange(generateAutoReqs(e.E0));
                    foreach (var req in generateAutoReqs(e.E1))
                    {
                        reqs.Add(new BinaryExpr(Token.NoToken, BinaryExpr.Opcode.Imp,
                                                new UnaryOpExpr(Token.NoToken, UnaryOpExpr.Opcode.Not, e.E0), req));
                    }
                    break;

                default:
                    reqs.AddRange(generateAutoReqs(e.E0));
                    reqs.AddRange(generateAutoReqs(e.E1));
                    break;
                }
            }
            else if (expr is LetExpr)
            {
                var e = (LetExpr)expr;
                if (e.Exact)
                {
                    foreach (var rhs in e.RHSs)
                    {
                        reqs.AddRange(generateAutoReqs(rhs));
                    }
                    var new_reqs = generateAutoReqs(e.Body);
                    if (new_reqs.Count > 0)
                    {
                        reqs.Add(new LetExpr(e.Exact, e.LHSs, e.RHSs, Andify(new_reqs)));
                    }
                }
            }
            else if (expr is QuantifierExpr)
            {
                QuantifierExpr e         = (QuantifierExpr)expr;
                var            auto_reqs = generateAutoReqs(e.Term);
                if (auto_reqs.Count > 0)
                {
                    Expression allReqsSatisfied        = Andify(auto_reqs);
                    Expression allReqsSatisfiedAndTerm = new BinaryExpr(Token.NoToken, BinaryExpr.Opcode.And, allReqsSatisfied, e.Term);
                    e.Term = allReqsSatisfiedAndTerm;
                }
            }
            else if (expr is StmtExpr)
            {
                var e = (StmtExpr)expr;
                reqs.AddRange(generateAutoReqs(e.E));
            }
            else if (expr is ITEExpr)
            {
                ITEExpr e = (ITEExpr)expr;
                reqs.AddRange(generateAutoReqs(e.Test));
                reqs.Add(new ITEExpr(e.Test, Andify(generateAutoReqs(e.Thn)), Andify(generateAutoReqs(e.Els))));
            }
            return(reqs);
        }
예제 #7
0
        void ConstAtomExpression(out Expression e, bool allowSemi, bool allowLambda)
        {
            Contract.Ensures(Contract.ValueAtReturn(out e) != null);
            IToken/*!*/ x;  BigInteger n;   Basetypes.BigDec d;
            e = dummyExpr;  Type toType = null;

            switch (la.kind) {
            case 138: {
            Get();
            e = new LiteralExpr(t, false);
            break;
            }
            case 139: {
            Get();
            e = new LiteralExpr(t, true);
            break;
            }
            case 140: {
            Get();
            e = new LiteralExpr(t);
            break;
            }
            case 2: case 3: {
            Nat(out n);
            e = new LiteralExpr(t, n);
            break;
            }
            case 4: {
            Dec(out d);
            e = new LiteralExpr(t, d);
            break;
            }
            case 20: {
            Get();
            e = new CharLiteralExpr(t, t.val.Substring(1, t.val.Length - 2));
            break;
            }
            case 21: {
            Get();
            bool isVerbatimString;
            string s = Util.RemoveParsedStringQuotes(t.val, out isVerbatimString);
            e = new StringLiteralExpr(t, s, isVerbatimString);

            break;
            }
            case 141: {
            Get();
            e = new ThisExpr(t);
            break;
            }
            case 142: {
            Get();
            x = t;
            Expect(54);
            Expression(out e, true, true);
            Expect(55);
            e = new UnaryOpExpr(x, UnaryOpExpr.Opcode.Fresh, e);
            break;
            }
            case 143: {
            Get();
            x = t;
            Expect(54);
            Expression(out e, true, true);
            Expect(55);
            e = new UnaryOpExpr(x, UnaryOpExpr.Opcode.Allocated, e);
            break;
            }
            case 144: {
            Get();
            x = t; FrameExpression fe; var mod = new List<FrameExpression>();
            Expect(54);
            FrameExpression(out fe, false, false);
            mod.Add(fe);
            while (la.kind == 23) {
                Get();
                FrameExpression(out fe, false, false);
                mod.Add(fe);
            }
            Expect(55);
            e = new UnchangedExpr(x, mod);
            break;
            }
            case 145: {
            Get();
            x = t;
            Expect(54);
            Expression(out e, true, true);
            Expect(55);
            e = new OldExpr(x, e);
            break;
            }
            case 24: {
            Get();
            x = t;
            Expression(out e, true, true, false);
            e = new UnaryOpExpr(x, UnaryOpExpr.Opcode.Cardinality, e);
            Expect(24);
            break;
            }
            case 9: case 11: {
            if (la.kind == 9) {
                Get();
                x = t; toType = new IntType();
            } else {
                Get();
                x = t; toType = new RealType();
            }
            errors.Deprecated(t, string.Format("the syntax \"{0}(expr)\" for type conversions has been deprecated; the new syntax is \"expr as {0}\"", x.val));
            Expect(54);
            Expression(out e, true, true);
            Expect(55);
            e = new ConversionExpr(x, e, toType);
            break;
            }
            case 54: {
            ParensExpression(out e, allowSemi, allowLambda);
            break;
            }
            default: SynErr(262); break;
            }
        }