From 79eb9ef7bb81701ac1b2e4acbdc17747b28d07ee Mon Sep 17 00:00:00 2001
From: Manos Koukoutos <emmanouil.koukoutos@epfl.ch>
Date: Fri, 20 Nov 2015 15:54:12 +0100
Subject: [PATCH] String Tracing evaluator (invomplete!)

---
 .../leon/evaluators/RecursiveEvaluator.scala  |  2 +-
 .../evaluators/StringTracingEvaluator.scala   | 34 +++++++++++++++++++
 2 files changed, 35 insertions(+), 1 deletion(-)
 create mode 100644 src/main/scala/leon/evaluators/StringTracingEvaluator.scala

diff --git a/src/main/scala/leon/evaluators/RecursiveEvaluator.scala b/src/main/scala/leon/evaluators/RecursiveEvaluator.scala
index 3b77842b9..fecd9f6ba 100644
--- a/src/main/scala/leon/evaluators/RecursiveEvaluator.scala
+++ b/src/main/scala/leon/evaluators/RecursiveEvaluator.scala
@@ -26,7 +26,7 @@ abstract class RecursiveEvaluator(ctx: LeonContext, prog: Program, maxSteps: Int
 
   protected var clpCache = Map[(Choose, Seq[Expr]), Expr]()
 
-  protected def e(expr: Expr)(implicit rctx: RC, gctx: GC): Expr = expr match {
+  protected[evaluators] def e(expr: Expr)(implicit rctx: RC, gctx: GC): Expr = expr match {
     case Variable(id) =>
       rctx.mappings.get(id) match {
         case Some(v) if v != expr =>
diff --git a/src/main/scala/leon/evaluators/StringTracingEvaluator.scala b/src/main/scala/leon/evaluators/StringTracingEvaluator.scala
new file mode 100644
index 000000000..7ee82434a
--- /dev/null
+++ b/src/main/scala/leon/evaluators/StringTracingEvaluator.scala
@@ -0,0 +1,34 @@
+/* Copyright 2009-2015 EPFL, Lausanne */
+
+package leon
+package evaluators
+
+import purescala.Extractors.Operator
+import purescala.Expressions._
+import purescala.Definitions.Program
+import purescala.Expressions.Expr
+
+class StringTracingEvaluator(ctx: LeonContext, prog: Program) extends ContextualEvaluator(ctx, prog, 50000) with DefaultContexts {
+
+  val underlying = new DefaultEvaluator(ctx, prog)
+  override type Value = (Expr, Expr)
+
+  override val description: String = ??? // FIXME
+  override val name: String = ??? // FIXME
+
+  protected def e(expr: Expr)(implicit rctx: RC, gctx: GC): (Expr, Expr) = expr match {
+    case StringConcat(s1, s2) =>
+      val (es1, t1) = e(s1)
+      val (es2, t2) = e(s2)
+      (underlying.e(StringConcat(es1, es2)), StringConcat(t1, t2))
+
+    case StringLength(_) => ??? // FIXME
+    case StringLiteral(_) => ??? // FIXME
+
+    case Operator(es, builder) =>
+      val (ees, ts) = es.map(e).unzip
+      (underlying.e(builder(ees)), builder(ts))
+  }
+
+
+}
-- 
GitLab