Better automatic handling of output language setting.
authorMorgan Deters <mdeters@cs.nyu.edu>
Tue, 24 Dec 2013 18:24:56 +0000 (13:24 -0500)
committerMorgan Deters <mdeters@cs.nyu.edu>
Tue, 24 Dec 2013 18:24:56 +0000 (13:24 -0500)
NEWS
src/expr/command.h
src/expr/expr_template.h
src/expr/node.h
src/expr/node_value.cpp
src/expr/node_value.h
src/expr/type_node.h
src/printer/cvc/cvc_printer.cpp
src/printer/printer.h
test/unit/expr/expr_public.h
test/unit/expr/node_black.h

diff --git a/NEWS b/NEWS
index 5c42481b414760699fffe2751d16879ed484d7da..695c91c7ee293a879dbe97a6cae1c597dd445b06 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -11,6 +11,12 @@ Changes since 1.3
   version of CVC4.  However, the new configure option "--bsd" disables
   these GPL dependences and builds the best-performing BSD-licenced version
   of CVC4.
+* Better automatic handling of output language setting when using CVC4
+  via API.  Previously, the "automatic" language setting was sometimes
+  (though not always) defaulting to the internal "AST" language; it
+  should now (correctly) default to the same as the input language
+  (if the input language is supported as an output language), or the
+  "CVC4" native output language if no input language setting is applied.
 
 Changes since 1.2
 =================
index a3d58e5dd120c4720aea931993a888e41e1b7154..0d173faf6b6339a104cdf1d591c5c9a21c8fb61c 100644 (file)
@@ -156,7 +156,7 @@ protected:
 public:
   virtual ~CommandStatus() throw() {}
   void toStream(std::ostream& out,
-                OutputLanguage language = language::output::LANG_AST) const throw();
+                OutputLanguage language = language::output::LANG_AUTO) const throw();
   virtual CommandStatus& clone() const = 0;
 };/* class CommandStatus */
 
@@ -211,7 +211,7 @@ public:
   virtual void invoke(SmtEngine* smtEngine, std::ostream& out) throw();
 
   virtual void toStream(std::ostream& out, int toDepth = -1, bool types = false, size_t dag = 1,
-                        OutputLanguage language = language::output::LANG_AST) const throw();
+                        OutputLanguage language = language::output::LANG_AUTO) const throw();
 
   std::string toString() const throw();
 
index 0c7acce9c1232c5f0bfa26756660801576531344..828b1923c4f98952541a483c8f203acb89f6feee 100644 (file)
@@ -459,7 +459,7 @@ public:
    * @param language the language in which to output
    */
   void toStream(std::ostream& out, int toDepth = -1, bool types = false, size_t dag = 1,
-                OutputLanguage language = language::output::LANG_AST) const;
+                OutputLanguage language = language::output::LANG_AUTO) const;
 
   /**
    * Check if this is a null expression.
@@ -861,7 +861,7 @@ class CVC4_PUBLIC ExprSetLanguage {
    * setlanguage() applied to them and where the current Options
    * information isn't available.
    */
-  static const int s_defaultOutputLanguage = language::output::LANG_AST;
+  static const int s_defaultOutputLanguage = language::output::LANG_AUTO;
 
   /**
    * When this manipulator is used, the setting is stored here.
index a6914aedb425498a3a2d685fbe6f22292c166d2c..e7c51f0e211ac4512bd412e88b0c61c73d52e54b 100644 (file)
@@ -815,7 +815,7 @@ public:
    * @param language the language in which to output
    */
   inline void toStream(std::ostream& out, int toDepth = -1, bool types = false, size_t dag = 1,
-                       OutputLanguage language = language::output::LANG_AST) const {
+                       OutputLanguage language = language::output::LANG_AUTO) const {
     assertTNodeNotExpired();
     d_nv->toStream(out, toDepth, types, dag, language);
   }
index ed7a8add373701d35ef3f505085b08f7a5aab1bb..d5b08bc185a4396405d8c4caf5885357fe7ac4cb 100644 (file)
@@ -37,11 +37,8 @@ NodeValue NodeValue::s_null(0);
 string NodeValue::toString() const {
   stringstream ss;
 
-  OutputLanguage outlang = (this == &s_null) ? language::output::LANG_AST : options::outputLanguage();
-  toStream(ss, -1, false, false,
-           outlang == language::output::LANG_AUTO ?
-             language::output::LANG_AST :
-             outlang);
+  OutputLanguage outlang = (this == &s_null) ? language::output::LANG_AUTO : options::outputLanguage();
+  toStream(ss, -1, false, false, outlang);
   return ss.str();
 }
 
index 5c73b39b5420df781595db61f521706d6dc9bc47..85abca524808ee3c84a66873350c127d9243f866 100644 (file)
@@ -268,7 +268,7 @@ public:
 
   std::string toString() const;
   void toStream(std::ostream& out, int toDepth = -1, bool types = false, size_t dag = 1,
-                OutputLanguage = language::output::LANG_AST) const;
+                OutputLanguage = language::output::LANG_AUTO) const;
 
   static inline unsigned kindToDKind(Kind k) {
     return ((unsigned) k) & kindMask;
index 1dd0ffed13eab2143bb78d38ee236142f95acd12..c823190bfed959d9fdeb01dddbfae8e0b2c38d8e 100644 (file)
@@ -374,11 +374,8 @@ public:
    */
   inline std::string toString() const {
     std::stringstream ss;
-    OutputLanguage outlang = (this == &s_null) ? language::output::LANG_AST : options::outputLanguage();
-    d_nv->toStream(ss, -1, false, 0,
-                   outlang == language::output::LANG_AUTO ?
-                     language::output::LANG_AST :
-                     outlang);
+    OutputLanguage outlang = (this == &s_null) ? language::output::LANG_AUTO : options::outputLanguage();
+    d_nv->toStream(ss, -1, false, 0, outlang);
     return ss.str();
   }
 
@@ -389,7 +386,7 @@ public:
    * @param out the stream to serialize this node to
    * @param language the language in which to output
    */
-  inline void toStream(std::ostream& out, OutputLanguage language = language::output::LANG_AST) const {
+  inline void toStream(std::ostream& out, OutputLanguage language = language::output::LANG_AUTO) const {
     d_nv->toStream(out, -1, false, 0, language);
   }
 
index bd2626ddd696e8ef751fe948174b50c01f35bdaa..b0dfbbd6728848f20ef894d2f7a4db6f208b1b85 100644 (file)
@@ -80,7 +80,7 @@ void CvcPrinter::toStream(std::ostream& out, TNode n, int depth, bool types, boo
 
   // null
   if(n.getKind() == kind::NULL_EXPR) {
-    out << "NULL";
+    out << "null";
     return;
   }
 
index a7ae8c447ae9f8c722d04852fdd928a621e1a332..9ddac096d65a860a1859af0db0eaba7596c7ec6a 100644 (file)
@@ -54,7 +54,21 @@ public:
   /** Get the Printer for a given OutputLanguage */
   static Printer* getPrinter(OutputLanguage lang) throw() {
     if(lang == language::output::LANG_AUTO) {
-      lang = language::output::LANG_CVC4; // default
+      // Infer the language to use for output.
+      //
+      // Options can be null in certain circumstances (e.g., when printing
+      // the singleton "null" expr.  So we guard against segfault
+      if(&Options::current() != NULL) {
+        if(options::outputLanguage.wasSetByUser()) {
+          lang = options::outputLanguage();
+        }
+        if(lang == language::output::LANG_AUTO && options::inputLanguage.wasSetByUser()) {
+          lang = language::toOutputLanguage(options::inputLanguage());
+        }
+      }
+      if(lang == language::output::LANG_AUTO) {
+        lang = language::output::LANG_CVC4; // default
+      }
     }
     if(d_printers[lang] == NULL) {
       d_printers[lang] = makePrinter(lang);
index 7f6385d36f8942faf02b4c63bbffbe2edb6470b3..4a9d73cb7c08812155f952b93a213813c9b7711d 100644 (file)
@@ -30,6 +30,8 @@ using namespace std;
 class ExprPublic : public CxxTest::TestSuite {
 private:
 
+  Options opts;
+
   ExprManager* d_em;
 
   Expr* a_bool;
@@ -51,7 +53,14 @@ public:
 
   void setUp() {
     try {
-      d_em = new ExprManager;
+      char *argv[2];
+      argv[0] = strdup("");
+      argv[1] = strdup("--output-language=ast");
+      opts.parseOptions(2, argv);
+      free(argv[0]);
+      free(argv[1]);
+
+      d_em = new ExprManager(opts);
 
       a_bool = new Expr(d_em->mkVar("a",d_em->booleanType()));
       b_bool = new Expr(d_em->mkVar("b", d_em->booleanType()));
@@ -61,7 +70,7 @@ public:
       fun_type = new Type(d_em->mkFunctionType(d_em->booleanType(), d_em->booleanType()));
       fun_op = new Expr(d_em->mkVar("f", *fun_type));
       d_apply_fun_bool = new Expr(d_em->mkExpr(APPLY_UF, *fun_op, *a_bool));
-      null = new Expr;
+      null = new Expr();
 
       i1 = new Expr(d_em->mkConst(Rational("0")));
       i2 = new Expr(d_em->mkConst(Rational(23)));
index 8e8263fe75db0ab5729cd43b2718c272758b0342..6cf85fb7ef3807799cbbc0f6f152c06c38ce3467 100644 (file)
@@ -34,6 +34,7 @@ using namespace std;
 class NodeBlack : public CxxTest::TestSuite {
 private:
 
+  Options opts;
   Context* d_ctxt;
   NodeManager* d_nodeManager;
   NodeManagerScope* d_scope;
@@ -43,8 +44,15 @@ private:
 public:
 
   void setUp() {
-    d_ctxt = new Context;
-    d_nodeManager = new NodeManager(d_ctxt, NULL);
+    char *argv[2];
+    argv[0] = strdup("");
+    argv[1] = strdup("--output-language=ast");
+    opts.parseOptions(2, argv);
+    free(argv[0]);
+    free(argv[1]);
+
+    d_ctxt = new Context();
+    d_nodeManager = new NodeManager(d_ctxt, NULL, opts);
     d_scope = new NodeManagerScope(d_nodeManager);
     d_booleanType = new TypeNode(d_nodeManager->booleanType());
     d_realType = new TypeNode(d_nodeManager->realType());