Saving state between lines in interactive mode (Fixes: #223)
authorChristopher L. Conway <christopherleeconway@gmail.com>
Fri, 22 Oct 2010 22:50:44 +0000 (22:50 +0000)
committerChristopher L. Conway <christopherleeconway@gmail.com>
Fri, 22 Oct 2010 22:50:44 +0000 (22:50 +0000)
src/main/interactive_shell.cpp
src/main/interactive_shell.h
src/parser/parser_builder.cpp
src/parser/parser_builder.h

index 7af72ed2d259fb3d0bce65b0dcf31949777cea01..3d37ade43abf9b39bca75c25e275812c0d066734 100644 (file)
@@ -93,6 +93,7 @@ Command* InteractiveShell::readCommand() {
   Parser *parser = 
     d_parserBuilder
         .withStringInput(input)
+        .withStateFrom(d_lastParser)
         .build();
 
   /* There may be more than one command in the input. Build up a
@@ -104,7 +105,9 @@ Command* InteractiveShell::readCommand() {
     cmd_seq->addCommand(cmd);
   }
 
-  delete parser;
+  delete d_lastParser;
+  d_lastParser = parser;
+
   return cmd_seq;
 }
 
index 66c134ecd572a48daa9ad681964529e90c76c411..8f207145eff8b2cd1979f2e34c050df1ddf7b788 100644 (file)
@@ -29,17 +29,19 @@ namespace CVC4 {
 
   using namespace parser;
 
-class InteractiveShell {
+class CVC4_PUBLIC InteractiveShell {
   std::istream& d_in;
   std::ostream& d_out;
   ParserBuilder d_parserBuilder;
+  Parser* d_lastParser;
 
 public:
   InteractiveShell(ParserBuilder& parserBuilder,
                   const Options& options) : 
     d_in(*options.in),
     d_out(*options.out),
-    d_parserBuilder(parserBuilder) {
+    d_parserBuilder(parserBuilder),
+    d_lastParser(NULL) {
   }
 
   /** Read a command from the interactive shell. This will read as
index 348fb6e6d3cec465c896cff3ec55919fd6b182be..35f7ee16c5a016775284e2d0b924a69986c98ad4 100644 (file)
@@ -83,6 +83,7 @@ ParserBuilder::ParserBuilder(ExprManager& exprManager, const std::string& filena
   d_filename = filename;
   d_streamInput = NULL;
   d_exprManager = exprManager;
+  d_parserToUseForState = NULL;
   d_checksEnabled = true;
   d_strictMode = false;
   d_mmap = false;
@@ -122,6 +123,11 @@ Parser *ParserBuilder::build() throw (InputStreamException,AssertionException) {
     parser->disableChecks();
   }
 
+  if( d_parserToUseForState != NULL ) {
+    parser->d_declScope = d_parserToUseForState->d_declScope;
+    parser->d_logicOperators = d_parserToUseForState->d_logicOperators;
+  }
+
   return parser;
 }
 
@@ -164,6 +170,11 @@ ParserBuilder& ParserBuilder::withOptions(const Options& options) {
       .withStrictMode(options.strictParsing);
   }
 
+ParserBuilder& ParserBuilder::withStateFrom(const Parser* parser) {
+  d_parserToUseForState = parser;
+  return *this;
+}
+
 ParserBuilder& ParserBuilder::withStrictMode(bool flag) {
   d_strictMode = flag;
   return *this;
index 4e8c06f780d9be6a52f3c1569634de5811bad915..44cb8285eaf66be830468913de7626420a0901ba 100644 (file)
@@ -80,6 +80,9 @@ class CVC4_PUBLIC ParserBuilder {
   /** The expression manager */
   ExprManager& d_exprManager;
 
+  /** Parser to derive the initial state from. */
+  const Parser* d_parserToUseForState;
+
   /** Should semantic checks be enabled during parsing? */
   bool d_checksEnabled;
 
@@ -128,6 +131,11 @@ public:
   /** Derive settings from the given options. */
   ParserBuilder& withOptions(const Options& options);
 
+  /** Copy the state (e.g., variable and type declaration) from
+   * an existing parser. If <code>parser</code> is <code>NULL</code>,
+   * the default initial state will be used. */
+  ParserBuilder& withStateFrom(const Parser* parser);
+
   /** Should the parser use strict mode? (Default: no) */
   ParserBuilder& withStrictMode(bool flag = true);