Adding Parser::setInput and using it in InteractiveShell (Fixes: #225)
authorChristopher L. Conway <christopherleeconway@gmail.com>
Sat, 23 Oct 2010 14:49:06 +0000 (14:49 +0000)
committerChristopher L. Conway <christopherleeconway@gmail.com>
Sat, 23 Oct 2010 14:49:06 +0000 (14:49 +0000)
Removing ParserBuilder::withStateFrom

src/main/interactive_shell.cpp
src/main/interactive_shell.h
src/main/main.cpp
src/parser/input.h
src/parser/parser.h
src/parser/parser_builder.cpp
src/parser/parser_builder.h

index 3d37ade43abf9b39bca75c25e275812c0d066734..587c074952c4d3656e188ebff4877102fb7cdf51 100644 (file)
@@ -18,6 +18,7 @@
 
 #include "interactive_shell.h"
 #include "expr/command.h"
+#include "parser/input.h"
 #include "parser/parser.h"
 #include "parser/parser_builder.h"
 
@@ -25,6 +26,8 @@ using namespace std;
 
 namespace CVC4 {
 
+const string InteractiveShell::INPUT_FILENAME = "<shell>";
+
 Command* InteractiveShell::readCommand() {
   /* Don't do anything if the input is closed. */
   if( d_in.eof() ) {
@@ -90,23 +93,26 @@ Command* InteractiveShell::readCommand() {
     }
   }
 
-  Parser *parser = 
-    d_parserBuilder
-        .withStringInput(input)
-        .withStateFrom(d_lastParser)
-        .build();
+  d_parser->setInput(Input::newStringInput(d_language,input,INPUT_FILENAME));
+  // Parser *parser = 
+  //   d_parserBuilder
+  //       .withStringInput(input)
+  //       .withStateFrom(d_lastParser)
+  //       .build();
 
   /* There may be more than one command in the input. Build up a
      sequence. */
   CommandSequence *cmd_seq = new CommandSequence();
   Command *cmd;
 
-  while( (cmd = parser->nextCommand()) ) {
+  while( (cmd = d_parser->nextCommand()) ) {
     cmd_seq->addCommand(cmd);
   }
 
-  delete d_lastParser;
-  d_lastParser = parser;
+  // if( d_lastParser ) {
+  //   delete d_lastParser;
+  // }
+  // d_lastParser = parser;
 
   return cmd_seq;
 }
index 8f207145eff8b2cd1979f2e34c050df1ddf7b788..a60278ebad4fdd8999cb609131fa59416ff1e9b4 100644 (file)
@@ -21,6 +21,7 @@
 #include <string>
 
 #include "parser/parser_builder.h"
+#include "util/language.h"
 #include "util/options.h"
 
 namespace CVC4 {
@@ -32,16 +33,20 @@ namespace CVC4 {
 class CVC4_PUBLIC InteractiveShell {
   std::istream& d_in;
   std::ostream& d_out;
-  ParserBuilder d_parserBuilder;
-  Parser* d_lastParser;
+  Parser* d_parser;
+  const InputLanguage d_language;
+
+  static const std::string INPUT_FILENAME;
 
 public:
-  InteractiveShell(ParserBuilder& parserBuilder,
+  InteractiveShell(ExprManager& exprManager,
                   const Options& options) : 
     d_in(*options.in),
     d_out(*options.out),
-    d_parserBuilder(parserBuilder),
-    d_lastParser(NULL) {
+    d_language(options.inputLanguage) {
+    ParserBuilder parserBuilder(exprManager,INPUT_FILENAME,options);
+    /* Create parser with bogus input. */
+    d_parser = parserBuilder.withStringInput("").build();
   }
 
   /** Read a command from the interactive shell. This will read as
index 8bca6190eefd55a61f480a80dfe8d8498fa73743..7943da0e75bc89c30d15f9ff767687f4717596c4 100644 (file)
@@ -229,22 +229,23 @@ int runCvc4(int argc, char* argv[]) {
     Warning.getStream() << Expr::setlanguage(language);
   }
 
-  ParserBuilder parserBuilder =
-    ParserBuilder(exprMgr, filename, options);
-
-  if( inputFromStdin ) {
-    parserBuilder.withStreamInput(cin);
-  }
 
   // Parse and execute commands until we are done
   Command* cmd;
   if( options.interactive ) {
-    InteractiveShell shell(parserBuilder,options);
+    InteractiveShell shell(exprMgr,options);
     while((cmd = shell.readCommand())) {
       doCommand(smt,cmd);
       delete cmd;
     }
   } else {
+    ParserBuilder parserBuilder =
+      ParserBuilder(exprMgr, filename, options);
+
+    if( inputFromStdin ) {
+      parserBuilder.withStreamInput(cin);
+    }
+
     Parser *parser = parserBuilder.build();
     while((cmd = parser->nextCommand())) {
       doCommand(smt, cmd);
index 7cfafe429aa88204e030d689925d7c95f06db0f2..8a35480cd096e032bab5aedb7bb12428d93ea031 100644 (file)
@@ -99,6 +99,8 @@ class CVC4_PUBLIC Input {
   Input(const Input& input) { Unimplemented("Copy constructor for Input."); }
   Input& operator=(const Input& input) { Unimplemented("operator= for Input."); }
 
+public:
+
   /** Create an input for the given file.
     *
     * @param lang the input language
@@ -132,7 +134,6 @@ class CVC4_PUBLIC Input {
                                const std::string& name)
     throw (InputStreamException, AssertionException);
 
-public:
 
   /** Destructor. Frees the input stream and closes the input. */
   virtual ~Input();
@@ -151,8 +152,8 @@ protected:
   /** Retrieve the input stream for this parser. */
   InputStream *getInputStream();
 
-  /** Parse a command from
-   * the input by invoking the implementation-specific parsing method.  Returns
+  /** Parse a command from the input by invoking the
+   * implementation-specific parsing method.  Returns
    * <code>NULL</code> if there is no command there to parse.
    *
    * @throws ParserException if an error is encountered during parsing.
@@ -166,10 +167,9 @@ protected:
   virtual void parseError(const std::string& msg)
     throw (ParserException, AssertionException) = 0;
 
-  /** Parse an
-   * expression from the input by invoking the implementation-specific
-   * parsing method. Returns a null <code>Expr</code> if there is no
-   * expression there to parse.
+  /** Parse an expression from the input by invoking the
+   * implementation-specific parsing method. Returns a null
+   * <code>Expr</code> if there is no expression there to parse.
    *
    * @throws ParserException if an error is encountered during parsing.
    */
index 280bd3c97f94070024bd1cf6cb1e5297305a9211..ed7db63cf6f7ddcc657d4134187c8ac47c948593 100644 (file)
@@ -160,6 +160,14 @@ public:
     return d_input;
   }
 
+  /** Deletes and replaces the current parser input. */
+  void setInput(Input* input)  {
+    delete d_input;
+    d_input = input;
+    d_input->setParser(*this);
+    d_done = false;
+  }
+
   /**
    * Check if we are done -- either the end of input has been reached, or some
    * error has been encountered.
index 7291da1db1ff012d243c6a0878486b6e2662b306..2bf0aac31f77730d813cf4921ba948e21625bbc9 100644 (file)
@@ -29,67 +29,36 @@ namespace CVC4 {
 
 namespace parser {
 
-/*class FileInputBuilder : public InputBuilder {
-  bool d_useMmap;
-public:
-  FileInputBuilder(InputLanguage lang, const std::string& filename, bool useMmap) :
-    InputBuilder(lang,filename),
-    d_useMmap(useMmap) {
-  }
-  ParserBuilder& useMmap();
-
-  Input& build() {
-    return Input::newFileInput(d_lang,d_name,d_useMmap);
-  }
-};
-
-class StringInputBuilder : public InputBuilder {
-  std::string d_input;
-public:
-  StringInputBuilder(InputLanguage lang, const std::string& input, const std::string& name) :
-    InputBuilder(lang,name),
-    d_input(input) {
-  }
-
-  Input& build() {
-    return Input::newStringInput(lang,input,name);
-  }
-};*/
-
-ParserBuilder::ParserBuilder(ExprManager& exprManager, const std::string& filename)//  :
-    // d_inputType(FILE_INPUT),
-    // d_lang(language::input::LANG_AUTO),
-  : d_filename(filename),
-    // d_streamInput(NULL),
-   d_exprManager(exprManager)
-    // d_checksEnabled(true),
-    // d_strictMode(false),
-    // d_mmap(false)
-{
+ParserBuilder::ParserBuilder(ExprManager& exprManager, 
+                             const std::string& filename) : 
+  d_filename(filename),
+  d_exprManager(exprManager) {
   init(exprManager,filename);
 }
 
-  ParserBuilder::ParserBuilder(ExprManager& exprManager, const std::string& filename, const Options& options) :
+ParserBuilder::ParserBuilder(ExprManager& exprManager, 
+                             const std::string& filename, 
+                             const Options& options) :
   d_filename(filename),
-   d_exprManager(exprManager)
-{
+  d_exprManager(exprManager) {
   init(exprManager,filename);
   withOptions(options);
 }
 
-  void ParserBuilder::init(ExprManager& exprManager, const std::string& filename) {
+void ParserBuilder::init(ExprManager& exprManager, 
+                         const std::string& filename) {
   d_inputType = FILE_INPUT;
   d_lang = language::input::LANG_AUTO;
   d_filename = filename;
   d_streamInput = NULL;
   d_exprManager = exprManager;
-  d_parserToUseForState = NULL;
   d_checksEnabled = true;
   d_strictMode = false;
   d_mmap = false;
 }
 
-Parser *ParserBuilder::build() throw (InputStreamException,AssertionException) {
+Parser *ParserBuilder::build() 
+  throw (InputStreamException,AssertionException) {
   Input *input = NULL;
   switch( d_inputType ) {
   case FILE_INPUT:
@@ -125,11 +94,6 @@ 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;
 }
 
@@ -172,11 +136,6 @@ 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 44cb8285eaf66be830468913de7626420a0901ba..f1fd26ec10ff7cdd4e1fd38d28a1d372c8d637e8 100644 (file)
@@ -34,20 +34,6 @@ class ExprManager;
 
 namespace parser {
 
-/*
-class InputBuilder {
-protected:
-  InputLanguage d_lang;
-  std::string d_name;
-public:
-  InputBuilder(InputLanguage lang, const std::string& name) :
-    d_lang(lang),
-    d_name(name) {
-  }
-  virtual Input& build() = 0;
-};
-*/
-
 class Parser;
 
 /**
@@ -80,9 +66,6 @@ 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;
 
@@ -131,11 +114,6 @@ 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);