From 2b27915b4e523cfd6aae90b629a95706a795ace7 Mon Sep 17 00:00:00 2001 From: Etienne Kneuss <ekneuss@gmail.com> Date: Fri, 26 Oct 2012 19:25:39 +0200 Subject: [PATCH] Define choose as an extractable --- src/main/scala/leon/purescala/TreeOps.scala | 14 ++++++++++---- src/main/scala/leon/purescala/Trees.scala | 5 ++++- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/main/scala/leon/purescala/TreeOps.scala b/src/main/scala/leon/purescala/TreeOps.scala index 2938be18e..0e63a4a27 100644 --- a/src/main/scala/leon/purescala/TreeOps.scala +++ b/src/main/scala/leon/purescala/TreeOps.scala @@ -960,24 +960,30 @@ object TreeOps { val (expr, ctx) = pre(eIn, cIn) val (newExpr, newC) = expr match { + case t: Terminal => + (expr, ctx) + case UnaryOperator(e, builder) => val (e1, c) = rec(e, ctx) - val newE = builder(e1) + (newE, combiner(newE, ctx, Seq(c))) + case BinaryOperator(e1, e2, builder) => val (ne1, c1) = rec(e1, ctx) val (ne2, c2) = rec(e2, ctx) - val newE = builder(ne1, ne2) + (newE, combiner(newE, ctx, Seq(c1, c2))) + case NAryOperator(es, builder) => val (nes, cs) = es.map(e => rec(e, ctx)).unzip - val newE = builder(nes) + (newE, combiner(newE, ctx, cs)) + case e => - sys.error("Expression "+e+" ["+e.getClass+"] has no defined extractor") + sys.error("Expression "+e+" ["+e.getClass+"] is not extractable") } post(newExpr, newC) diff --git a/src/main/scala/leon/purescala/Trees.scala b/src/main/scala/leon/purescala/Trees.scala index 246f335ad..4ba80bdc8 100644 --- a/src/main/scala/leon/purescala/Trees.scala +++ b/src/main/scala/leon/purescala/Trees.scala @@ -6,6 +6,7 @@ object Trees { import Common._ import TypeTrees._ import Definitions._ + import Extractors._ /* EXPRESSIONS */ @@ -42,7 +43,9 @@ object Trees { case class Epsilon(pred: Expr) extends Expr with ScalacPositional - case class Choose(vars: List[Identifier], pred: Expr) extends Expr with ScalacPositional + case class Choose(vars: List[Identifier], pred: Expr) extends Expr with ScalacPositional with UnaryExtractable { + def extract = Some((pred, (e: Expr) => Choose(vars, e))) + } /* Like vals */ case class Let(binder: Identifier, value: Expr, body: Expr) extends Expr { -- GitLab