Fix for --force-logic to extend its reach to the parser.
authorMorgan Deters <mdeters@cs.nyu.edu>
Tue, 29 Apr 2014 21:57:17 +0000 (17:57 -0400)
committerMorgan Deters <mdeters@cs.nyu.edu>
Tue, 29 Apr 2014 23:54:13 +0000 (19:54 -0400)
src/main/interactive_shell.cpp
src/parser/parser.cpp
src/parser/parser.h
src/parser/parser_builder.cpp
src/parser/parser_builder.h
src/parser/smt1/smt1.cpp
src/parser/smt2/smt2.cpp

index 90229861fc27c67c7a9235664231c8f609e766b4..a19e23725142969976838c49417f69af829b29f2 100644 (file)
@@ -32,6 +32,7 @@
 #include "parser/parser.h"
 #include "parser/parser_builder.h"
 #include "options/options.h"
+#include "smt/options.h"
 #include "main/options.h"
 #include "util/language.h"
 #include "util/output.h"
@@ -93,6 +94,9 @@ InteractiveShell::InteractiveShell(ExprManager& exprManager,
   ParserBuilder parserBuilder(&exprManager, INPUT_FILENAME, options);
   /* Create parser with bogus input. */
   d_parser = parserBuilder.withStringInput("").build();
+  if(d_options.wasSetByUser(options::forceLogic)) {
+    d_parser->forceLogic(d_options[options::forceLogic].getLogicString());
+  }
 
 #if HAVE_LIBREADLINE
   if(d_in == cin) {
index c3019966a1229d2e4250893fb674a6b427d2f542..c40c352d911f1cda41cb3ea37d29b760d571f108 100644 (file)
@@ -48,7 +48,9 @@ Parser::Parser(ExprManager* exprManager, Input* input, bool strictMode, bool par
   d_checksEnabled(true),
   d_strictMode(strictMode),
   d_parseOnly(parseOnly),
-  d_canIncludeFile(true) {
+  d_canIncludeFile(true),
+  d_logicIsForced(false),
+  d_forcedLogic() {
   d_input->setParser(*this);
 }
 
index b6ba482b76d97faf0d5b9b5fe55318a81d220213..3f5e66492ae6ac058ac8e59ce605015181efe185 100644 (file)
@@ -164,6 +164,16 @@ class CVC4_PUBLIC Parser {
    */
   bool d_canIncludeFile;
 
+  /**
+   * Whether the logic has been forced with --force-logic.
+   */
+  bool d_logicIsForced;
+
+  /**
+   * The logic, if d_logicIsForced == true.
+   */
+  std::string d_forcedLogic;
+
   /** The set of operators available in the current logic. */
   std::set<Kind> d_logicOperators;
 
@@ -262,6 +272,10 @@ public:
   void disallowIncludeFile() { d_canIncludeFile = false; }
   bool canIncludeFile() const { return d_canIncludeFile; }
 
+  void forceLogic(const std::string& logic) { assert(!d_logicIsForced); d_logicIsForced = true; d_forcedLogic = logic; }
+  const std::string& getForcedLogic() const { return d_forcedLogic; }
+  bool logicIsForced() const { return d_logicIsForced; }
+
   /**
    * Returns a variable, given a name.
    *
index 7d0a0c4b9bf4a120b0e8244cb0147481f7b4ff25..c8171d180a0a2b05325a0da2e323d2e8d580a5f4 100644 (file)
@@ -25,6 +25,7 @@
 
 #include "expr/expr_manager.h"
 #include "parser/options.h"
+#include "smt/options.h"
 
 namespace CVC4 {
 namespace parser {
@@ -57,6 +58,8 @@ void ParserBuilder::init(ExprManager* exprManager,
   d_canIncludeFile = true;
   d_mmap = false;
   d_parseOnly = false;
+  d_logicIsForced = false;
+  d_forcedLogic = "";
 }
 
 Parser* ParserBuilder::build()
@@ -109,6 +112,10 @@ Parser* ParserBuilder::build()
     parser->disallowIncludeFile();
   }
 
+  if( d_logicIsForced ) {
+    parser->forceLogic(d_forcedLogic);
+  }
+
   return parser;
 }
 
@@ -148,14 +155,19 @@ ParserBuilder& ParserBuilder::withParseOnly(bool flag) {
 }
 
 ParserBuilder& ParserBuilder::withOptions(const Options& options) {
-  return
-    withInputLanguage(options[options::inputLanguage])
+  ParserBuilder& retval = *this;
+  retval =
+    retval.withInputLanguage(options[options::inputLanguage])
       .withMmap(options[options::memoryMap])
       .withChecks(options[options::semanticChecks])
       .withStrictMode(options[options::strictParsing])
       .withParseOnly(options[options::parseOnly])
       .withIncludeFile(options[options::filesystemAccess]);
+  if(options.wasSetByUser(options::forceLogic)) {
+    retval = retval.withForcedLogic(options[options::forceLogic].getLogicString());
   }
+  return retval;
+}
 
 ParserBuilder& ParserBuilder::withStrictMode(bool flag) {
   d_strictMode = flag;
@@ -167,6 +179,12 @@ ParserBuilder& ParserBuilder::withIncludeFile(bool flag) {
   return *this;
 }
 
+ParserBuilder& ParserBuilder::withForcedLogic(const std::string& logic) {
+  d_logicIsForced = true;
+  d_forcedLogic = logic;
+  return *this;
+}
+
 ParserBuilder& ParserBuilder::withStreamInput(std::istream& input) {
   d_inputType = STREAM_INPUT;
   d_streamInput = &input;
index b6e15b2ffeb1dba928cc11b2997990a48c05e7af..96590eb3eadcb6e5ed0749ab23c529eb8b328dfa 100644 (file)
@@ -80,6 +80,12 @@ class CVC4_PUBLIC ParserBuilder {
   /** Are we parsing only? */
   bool d_parseOnly;
 
+  /** Is the logic forced by the user? */
+  bool d_logicIsForced;
+
+  /** The forced logic name */
+  std::string d_forcedLogic;
+
   /** Initialize this parser builder */
   void init(ExprManager* exprManager, const std::string& filename);
 
@@ -164,6 +170,9 @@ public:
 
   /** Set the parser to use the given string for its input. */
   ParserBuilder& withStringInput(const std::string& input);
+
+  /** Set the parser to use the given logic string. */
+  ParserBuilder& withForcedLogic(const std::string& logic);
 };/* class ParserBuilder */
 
 }/* CVC4::parser namespace */
index 19be199fda41e48ae66dc160ff2b82529787cbcf..73838e3cc95cdb5f55788da2e86d4e8788099bea 100644 (file)
@@ -178,7 +178,11 @@ bool Smt1::logicIsSet() {
 
 void Smt1::setLogic(const std::string& name) {
   d_logicSet = true;
-  d_logic = toLogic(name);
+  if(logicIsForced()) {
+    d_logic = toLogic(getForcedLogic());
+  } else {
+    d_logic = toLogic(name);
+  }
 
   switch(d_logic) {
   case QF_S:
index e9e6ba857f965b2e38dc6dca4651216201c80207..5baa0b16f83f71e509640efe5b32b6df96327c9b 100644 (file)
@@ -233,7 +233,11 @@ bool Smt2::logicIsSet() {
 
 void Smt2::setLogic(const std::string& name) {
   d_logicSet = true;
-  d_logic = name;
+  if(logicIsForced()) {
+    d_logic = getForcedLogic();
+  } else {
+    d_logic = name;
+  }
 
   // Core theory belongs to every logic
   addTheory(THEORY_CORE);