Exemple #1
0
        public Expression TreeToExpression()
        {
            Contract.Ensures(Contract.Result <Expression>() != null);
            if (IsLeaf())
            {
                return(Data);
            }
            if (Data is TacnyBinaryExpr)
            {
                TacnyBinaryExpr bexp = (TacnyBinaryExpr)Data;
                Expression      E0   = LChild.TreeToExpression();
                Expression      E1   = RChild?.TreeToExpression();
                return(new TacnyBinaryExpr(bexp.tok, bexp.Op, E0, E1));
            }
            if (Data is BinaryExpr)
            {
                BinaryExpr bexp = (BinaryExpr)Data;
                Expression E0   = LChild.TreeToExpression();
                Expression E1   = RChild?.TreeToExpression();

                return(new BinaryExpr(bexp.tok, bexp.Op, E0, E1));
            }
            if (Data is ChainingExpression)
            {
                List <Expression>  operands = null;
                ChainingExpression ce       = (ChainingExpression)Data;
                operands = GetLeafData();
                operands.RemoveAt(1); // hack to remove the duplicate name statement
                List <BinaryExpr.Opcode> operators = new List <BinaryExpr.Opcode>();
                BinaryExpr expr = (BinaryExpr)LChild.TreeToExpression();
                operators.Add(((BinaryExpr)expr.E0).Op);
                operators.Add(((BinaryExpr)expr.E1).Op);
                return(new ChainingExpression(ce.tok, operands, operators, ce.PrefixLimits, expr));
            }
            if (Data is ParensExpression)
            {
                return(new ParensExpression(Data.tok, LChild.TreeToExpression()));
            }
            if (Data is QuantifierExpr)
            {
                QuantifierExpr qexp = (QuantifierExpr)Data;

                if (Data is ForallExpr)
                {
                    return(new ForallExpr(qexp.tok, qexp.BoundVars, qexp.Range, LChild.TreeToExpression(),
                                          qexp.Attributes));
                }
                if (Data is ExistsExpr)
                {
                    return(new ExistsExpr(qexp.tok, qexp.BoundVars, qexp.Range, LChild.TreeToExpression(),
                                          qexp.Attributes));
                }
            }
            else if (Data is NegationExpression)
            {
                return(new NegationExpression(Data.tok, LChild.TreeToExpression()));
            }
            else if (Data is SeqSelectExpr)
            {
                var e = (SeqSelectExpr)Data;
                return(new SeqSelectExpr(e.tok, e.SelectOne, e.Seq, LChild.TreeToExpression(),
                                         RChild?.TreeToExpression()));
            }

            return(Data);
        }
Exemple #2
0
	void LogicalExpression(out Expression e0, bool allowSemi, bool allowLambda) {
		Contract.Ensures(Contract.ValueAtReturn(out e0) != null); IToken/*!*/ x;  Expression/*!*/ e1; 
		RelationalExpression(out e0, allowSemi, allowLambda);
		if (IsAndOp() || IsOrOp() || IsTacnyOrOp()) {
			if (la.kind == 130 || la.kind == 131) {
				AndOp();
				x = t; 
				RelationalExpression(out e1, allowSemi, allowLambda);
				e0 = new BinaryExpr(x, BinaryExpr.Opcode.And, e0, e1); 
				while (IsAndOp()) {
					AndOp();
					x = t; 
					RelationalExpression(out e1, allowSemi, allowLambda);
					e0 = new BinaryExpr(x, BinaryExpr.Opcode.And, e0, e1); 
				}
			} else if (la.kind == 133) {
				TacnyOrOp();
				x = t; 
				RelationalExpression(out e1, allowSemi, allowLambda);
				e0 = new TacnyBinaryExpr(x, TacnyBinaryExpr.TacnyOpcode.TacnyOr, e0, e1); 
				while (IsTacnyOrOp()) {
					TacnyOrOp();
					x = t; 
					RelationalExpression(out e1, allowSemi, allowLambda);
					e0 = new TacnyBinaryExpr(x, TacnyBinaryExpr.TacnyOpcode.TacnyOr, e0, e1); 
				}
			} else if (la.kind == 105 || la.kind == 132) {
				OrOp();
				x = t; 
				RelationalExpression(out e1, allowSemi, allowLambda);
				e0 = new BinaryExpr(x, BinaryExpr.Opcode.Or, e0, e1); 
				while (IsOrOp()) {
					OrOp();
					x = t; 
					RelationalExpression(out e1, allowSemi, allowLambda);
					e0 = new BinaryExpr(x, BinaryExpr.Opcode.Or, e0, e1); 
				}
			} else SynErr(241);
		}
	}