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); }
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); } }