From 318d65ce2253eebd61041120a207680dbc4cf92a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Mika=C3=ABl=20Mayer?= <a-mikmay@microsoft.com>
Date: Wed, 9 Dec 2015 16:14:15 +0100
Subject: [PATCH] Adding a new online case for synthesis (grammars)

---
 .../synthesis/23_String_Grammar_Render.scala  | 111 ++++++++++++++++++
 1 file changed, 111 insertions(+)
 create mode 100644 testcases/web/synthesis/23_String_Grammar_Render.scala

diff --git a/testcases/web/synthesis/23_String_Grammar_Render.scala b/testcases/web/synthesis/23_String_Grammar_Render.scala
new file mode 100644
index 000000000..4bed0c51e
--- /dev/null
+++ b/testcases/web/synthesis/23_String_Grammar_Render.scala
@@ -0,0 +1,111 @@
+import leon.lang._
+import leon.annotation._
+import leon.collection._
+import leon.collection.ListOps._
+import leon.lang.synthesis._
+
+object GrammarRender {
+  abstract class Symbol
+  case class Terminal(i: Int) extends Symbol
+  case class NonTerminal(i: Int) extends Symbol
+
+  case class Rule(left: Symbol, right: List[Symbol])
+  case class Grammar(start: Symbol, rules: List[Rule])
+
+  /** Synthesis by example specs */
+  @inline def psStandard(s: Grammar) = (res: String) => (s, res) passes {
+    case Grammar(NonTerminal(0), Nil()) => "Grammar(NonTerminal(0), Nil())"
+    case Grammar(NonTerminal(0), Cons(Rule(NonTerminal(0), Cons(Terminal(1), Nil())), Nil())) =>
+      "Grammar(NonTerminal(0), Cons(Rule(NonTerminal(0), Cons(Terminal(1), Nil())), Nil()))"
+    case Grammar(NonTerminal(0), Cons(Rule(NonTerminal(0), Cons(Terminal(1), Nil())), Cons(Rule(NonTerminal(0), Cons(NonTerminal(0), Cons(Terminal(1), Nil()))), Nil()))) =>
+      "Grammar(NonTerminal(0), Cons(Rule(NonTerminal(0), Cons(Terminal(1), Nil())), Cons(Rule(NonTerminal(0), Cons(NonTerminal(0), Cons(Terminal(1), Nil()))), Nil())))"
+  }
+
+  @inline def psRemoveNames(s: Grammar) = (res: String) => (s, res) passes {
+    case Grammar(NonTerminal(0), Nil()) => "(S0, ())"
+    case Grammar(NonTerminal(0), Cons(Rule(NonTerminal(0), Cons(Terminal(1), Nil())), Nil())) =>
+      "(S0, ((S0, (t1, ())), ()))"
+    case Grammar(NonTerminal(0), Cons(Rule(NonTerminal(0), Cons(Terminal(1), Nil())), Cons(Rule(NonTerminal(0), Cons(NonTerminal(0), Cons(Terminal(1), Nil()))), Nil()))) =>
+      "(S0, ((S0, (t1, ())), ((S0, (S0, (t1, ()))), ())))"
+  }
+
+  @inline def psArrowRules(s: Grammar) = (res: String) => (s, res) passes {
+    case Grammar(NonTerminal(0), Nil()) => "(S0, ())"
+    case Grammar(NonTerminal(0), Cons(Rule(NonTerminal(0), Cons(Terminal(1), Nil())), Nil())) =>
+      "(S0, ((S0 -> (t1, ())), ()))"
+    case Grammar(NonTerminal(0), Cons(Rule(NonTerminal(0), Cons(Terminal(1), Nil())), Cons(Rule(NonTerminal(0), Cons(NonTerminal(0), Cons(Terminal(1), Nil()))), Nil()))) =>
+      "(S0, ((S0 -> (t1, ())), ((S0 -> (S0, (t1, ()))), ())))"
+  }
+
+  @inline def psListRules(s: Grammar) = (res: String) => (s, res) passes {
+    case Grammar(NonTerminal(0), Nil()) => "(S0, [])"
+    case Grammar(NonTerminal(0), Cons(Rule(NonTerminal(0), Cons(Terminal(1), Nil())), Nil())) =>
+      "(S0, [S0 -> [t1]])"
+    case Grammar(NonTerminal(0), Cons(Rule(NonTerminal(0), Cons(Terminal(1), Nil())), Cons(Rule(NonTerminal(0), Cons(NonTerminal(0), Cons(Terminal(1), Nil()))), Nil()))) =>
+      "(S0, [S0 -> [t1], S0 -> [S0, t1])"
+  }
+
+  // The difficulty here is that two lists have to be rendered differently.
+  @inline def psSpaceRules(s: Grammar) = (res: String) => (s, res) passes {
+    case Grammar(NonTerminal(0), Nil()) => "(S0, [])"
+    case Grammar(NonTerminal(0), Cons(Rule(NonTerminal(0), Cons(Terminal(1), Nil())), Nil())) =>
+      "(S0, [S0 -> t1])"
+    case Grammar(NonTerminal(0), Cons(Rule(NonTerminal(0), Cons(Terminal(1), Nil())), Cons(Rule(NonTerminal(0), Cons(NonTerminal(0), Cons(Terminal(1), Nil()))), Nil()))) =>
+      "(S0, [S0 -> t1, S0 -> S0 t1)"
+  }
+
+  // Full HTML generation
+  @inline def psHTMLRules(s: Grammar) = (res: String) => (s, res) passes {
+    case Grammar(NonTerminal(0), Nil()) => "<b>Start:</b> S0<br><pre></pre>"
+    case Grammar(NonTerminal(0), Cons(Rule(NonTerminal(0), Cons(Terminal(1), Nil())), Nil())) =>
+      "<b>Start:</b> S0<br><pre>S0 -> t1</pre>"
+    case Grammar(NonTerminal(0), Cons(Rule(NonTerminal(0), Cons(Terminal(1), Nil())), Cons(Rule(NonTerminal(0), Cons(NonTerminal(0), Cons(Terminal(1), Nil()))), Nil()))) =>
+      "<b>Start:</b> S0<br><pre>S0 -> t1<br>S0 -> S0 t1</pre>"
+  }
+  //Render in plain text.
+  @inline def psPlainTextRules(s: Grammar) = (res: String) => (s, res) passes {
+    case Grammar(NonTerminal(0), Nil()) =>
+    """Start:S0"""
+    case Grammar(NonTerminal(0), Cons(Rule(NonTerminal(0), Cons(Terminal(1), Nil())), Nil())) =>
+    """Start:S0
+S0 -> t1"""
+    case Grammar(NonTerminal(0), Cons(Rule(NonTerminal(0), Cons(Terminal(1), Nil())), Cons(Rule(NonTerminal(0), Cons(NonTerminal(0), Cons(Terminal(1), Nil()))), Nil()))) =>
+    """Start:S0
+S0 -> t1
+S0 -> S0 t1"""
+  }
+  
+  //////////////////////////////////////////////
+  // Non-incremental examples: pure synthesis //
+  //////////////////////////////////////////////
+  def synthesizeStandard(s: Grammar): String = {
+    ???[String]
+  } ensuring psStandard(s)
+  
+  def synthesizeRemoveNames(s: Grammar): String = {
+    ???[String]
+  } ensuring psRemoveNames(s)
+
+  def synthesizeArrowRules(s: Grammar): String = {
+    ???[String]
+  } ensuring psArrowRules(s)
+
+  def synthesizeListRules(s: Grammar): String = {
+    ???[String]
+  } ensuring psListRules(s)
+
+  def synthesizeSpaceRules(s: Grammar): String = {
+    ???[String]
+  } ensuring psSpaceRules(s)
+
+  def synthesizeHTMLRules(s: Grammar): String = {
+    ???[String]
+  } ensuring psHTMLRules(s)
+
+  def synthesizePlainTextRulesToString(s: Grammar): String = {
+    ???[String]
+  } ensuring psPlainTextRules(s)
+  
+  def allGrammarsAreIdentical(g: Grammar, g2: Grammar) = (g == g2 || g.rules == g2.rules) holds
+
+}
\ No newline at end of file
-- 
GitLab