Code cleanup in parser
authorChristopher L. Conway <christopherleeconway@gmail.com>
Wed, 31 Mar 2010 19:53:41 +0000 (19:53 +0000)
committerChristopher L. Conway <christopherleeconway@gmail.com>
Wed, 31 Mar 2010 19:53:41 +0000 (19:53 +0000)
src/parser/antlr_input.cpp
src/parser/antlr_input.h
src/parser/cvc/Cvc.g
src/parser/cvc/cvc_input.cpp
src/parser/cvc/cvc_input.h
src/parser/input.h
src/parser/smt/Smt.g
src/parser/smt/smt_input.cpp
src/parser/smt/smt_input.h

index 02e07bc8f2fe7e3903f73088276f3fdec1950d2d..0c0006031ae29ca44ceba8e53643cd4c771ad3d6 100644 (file)
@@ -308,6 +308,9 @@ void AntlrInput::setLexer(pANTLR3_LEXER pLexer) {
 void AntlrInput::setParser(pANTLR3_PARSER pParser) {
   d_parser = pParser;
   // ANTLR isn't using super, AFAICT.
+  // We could also use @parser::context to add a field to the generated parser, but then
+  // it would have to be declared separately in every input's grammar and we'd have to
+  // pass it in as an address anyway.
   d_parser->super = this;
   d_parser->rec->reportError = &reportError;
 }
index 01ebe8339467065816a7bbf0ae4a307d4b2885fb..05d785df369baf97a7259cf9832a1bacdae4dc94 100644 (file)
@@ -41,38 +41,78 @@ namespace parser {
  * Wrapper for an ANTLR parser that includes convenience methods to set up input and token streams.
  */
 class AntlrInput : public Input {
-
+  /** The token lookahead used to lex and parse the input. This should usually be equal to
+   * <code>K</code> for an LL(k) grammar. */
   unsigned int d_lookahead;
+
+  /** The ANTLR3 lexer associated with this input. This will be <code>NULL</code> initially. It
+   *  must be set by a call to <code>setLexer</code>, preferably in the subclass constructor. */
   pANTLR3_LEXER d_lexer;
+
+  /** The ANTLR3 parser associated with this input. This will be <code>NULL</code> initially. It
+   *  must be set by a call to <code>setParser</code>, preferably in the subclass constructor.
+   *  The <code>super</code> field of <code>d_parser</code> will be set to <code>this</code> and
+   *  <code>reportError</code> will be set to <code>AntlrInput::reportError</code>. */
   pANTLR3_PARSER d_parser;
+
+  /** The ANTLR3 token stream associated with this input. We only need this so we can free it on exit.
+   *  This is set by <code>setLexer</code>.
+   *  NOTE: We assume that we <em>can</em> free it on exit. No sharing! */
   pANTLR3_COMMON_TOKEN_STREAM d_tokenStream;
+
+  /** The ANTLR3 token stream associated with this input. We only need this so we can free it on exit.
+   *  NOTE: We assume that we <em>can</em> free it on exit. No sharing! */
   pANTLR3_INPUT_STREAM d_input;
 
+  /** Turns an ANTLR3 exception into a message for the user and calls <code>parseError</code>. */
   static void reportError(pANTLR3_BASE_RECOGNIZER recognizer);
 
 public:
+
+  /** Create a file input.
+   *
+   * @param exprManager the manager to use when building expressions from the input
+   * @param filename the path of the file to read
+   * @param lookahead the lookahead needed to parse the input (i.e., k for an LL(k) grammar)
+   * @param useMmap <code>true</code> if the input should use memory-mapped I/O; otherwise, the
+   * input will use the standard ANTLR3 I/O implementation.
+   */
   AntlrInput(ExprManager* exprManager, const std::string& filename, unsigned int lookahead, bool useMmap);
+
+  /** Create an input from an istream. */
   // AntlrParser(ExprManager* em, std::istream& input, const std::string& name, unsigned int lookahead);
+
+  /** Create a string input.
+   *
+   * @param exprManager the manager to use when building expressions from the input
+   * @param input the string to read
+   * @param name the "filename" to use when reporting errors
+   * @param lookahead the lookahead needed to parse the input (i.e., k for an LL(k) grammar)
+   */
   AntlrInput(ExprManager* exprManager, const std::string& input, const std::string& name, unsigned int lookahead);
+
+  /** Destructor. Frees the token stream and closes the input. */
   ~AntlrInput();
 
+  /** Retrieve the text associated with a token. */
   inline static std::string tokenText(pANTLR3_COMMON_TOKEN token);
 
 protected:
 
   /**
-   * Throws a semantic exception with the given message.
+   * Throws a <code>ParserException</code> with the given message.
    */
   void parseError(const std::string& msg) throw (ParserException);
 
-  /** Get the lexer */
-  pANTLR3_LEXER getLexer();
   /** Retrieve the input stream for this parser. */
   pANTLR3_INPUT_STREAM getInputStream();
-  /** Retrieve the token stream for this parser. Must not be called before <code>setLexer()</code>. */
+  /** Retrieve the token stream for this parser. Must not be called before
+   * <code>setLexer()</code>. */
   pANTLR3_COMMON_TOKEN_STREAM getTokenStream();
+
   /** Set the ANTLR lexer for this parser. */
   void setLexer(pANTLR3_LEXER pLexer);
+
   /** Set the ANTLR parser implementation for this parser. */
   void setParser(pANTLR3_PARSER pParser);
 };
@@ -80,6 +120,8 @@ protected:
 std::string AntlrInput::tokenText(pANTLR3_COMMON_TOKEN token) {
   ANTLR3_MARKER start = token->getStartIndex(token);
   ANTLR3_MARKER end = token->getStopIndex(token);
+  /* start and end are boundary pointers. The text is a string
+   * of (end-start+1) bytes beginning at start. */
   std::string txt( (const char *)start, end-start+1 );
   Debug("parser-extra") << "tokenText: start=" << start << std::endl
                         <<  "end=" << end << std::endl
index a9dff77bf34dba7bb1cfa4cacf506c38f7a745bc..84713fc590ab64016fbe2a8b600c07a2902ab1d8 100644 (file)
@@ -33,6 +33,11 @@ options {
 }
 
 @lexer::includes {
+/** This suppresses warnings about the redefinition of token symbols between different
+  * parsers. The redefinitions should be harmless as long as no client: (a) #include's 
+  * the lexer headers for two grammars AND (b) uses the token symbol definitions. */
+#pragma GCC system_header
+
 /* This improves performance by ~10 percent on big inputs.
  * This option is only valid if we know the input is ASCII (or some 8-bit encoding).
  * If we know the input is UTF-16, we can use ANTLR3_INLINE_INPUT_UTF16.
@@ -43,40 +48,25 @@ options {
 
 @parser::includes {
 #include "expr/command.h"
-#include "parser/input.h"
 
 namespace CVC4 {
   class Expr;
-namespace parser {
-  class CvcInput;
-}
 }
-
-extern
-void SetCvcInput(CVC4::parser::CvcInput* input);
-
 }
 
 @parser::postinclude {
 #include "expr/expr.h"
 #include "expr/kind.h"
 #include "expr/type.h"
-#include "parser/input.h"
 #include "parser/cvc/cvc_input.h"
 #include "util/output.h"
 #include <vector>
 
 using namespace CVC4;
 using namespace CVC4::parser;
-}
-
-@members {
-static CVC4::parser::CvcInput *input;
 
-extern
-void SetCvcInput(CVC4::parser::CvcInput* _input) {
-  input = _input;
-}
+#undef CVC_INPUT
+#define CVC_INPUT ((CvcInput*)(PARSER->super))
 }
 
 /**
@@ -108,7 +98,7 @@ command returns [CVC4::Command* cmd = 0]
   : ASSERT_TOK formula[f] SEMICOLON { cmd = new AssertCommand(f);   }
   | QUERY_TOK formula[f] SEMICOLON { cmd = new QueryCommand(f);    }
   | CHECKSAT_TOK formula[f] SEMICOLON { cmd = new CheckSatCommand(f); }
-  | CHECKSAT_TOK SEMICOLON { cmd = new CheckSatCommand(input->getTrueExpr()); }
+  | CHECKSAT_TOK SEMICOLON { cmd = new CheckSatCommand(CVC_INPUT->getTrueExpr()); }
   | PUSH_TOK SEMICOLON { cmd = new PushCommand(); }
   | POP_TOK SEMICOLON { cmd = new PopCommand(); }
   | declaration[cmd]
@@ -136,9 +126,9 @@ declType[CVC4::Type*& t, std::vector<std::string>& idList]
   Debug("parser-extra") << "declType: " << AntlrInput::tokenText(LT(1)) << std::endl;
 }
   : /* A sort declaration (e.g., "T : TYPE") */
-    TYPE_TOK { input->newSorts(idList); t = input->kindType(); }
+    TYPE_TOK { CVC_INPUT->newSorts(idList); t = CVC_INPUT->kindType(); }
   | /* A variable declaration */
-    type[t] { input->mkVars(idList,t); }
+    type[t] { CVC_INPUT->mkVars(idList,t); }
   ;
 
 /**
@@ -155,13 +145,13 @@ type[CVC4::Type*& t]
   | /* Single-parameter function type */
     baseType[t] { typeList.push_back(t); }
     ARROW_TOK baseType[t] 
-    { t = input->functionType(typeList,t); }
+    { t = CVC_INPUT->functionType(typeList,t); }
   | /* Multi-parameter function type */
     LPAREN baseType[t]
     { typeList.push_back(t); }
     (COMMA baseType[t] { typeList.push_back(t); } )+
     RPAREN ARROW_TOK baseType[t]
-    { t = input->functionType(typeList,t); }
+    { t = CVC_INPUT->functionType(typeList,t); }
   ;
 
 /**
@@ -189,7 +179,7 @@ identifier[std::string& id,
            CVC4::parser::SymbolType type]
   : IDENTIFIER
     { id = AntlrInput::tokenText($IDENTIFIER);
-      input->checkDeclaration(id, check, type); }
+      CVC_INPUT->checkDeclaration(id, check, type); }
   ;
 
 /**
@@ -201,7 +191,7 @@ baseType[CVC4::Type*& t]
   std::string id;
   Debug("parser-extra") << "base type: " << AntlrInput::tokenText(LT(1)) << std::endl;
 }
-  : BOOLEAN_TOK { t = input->booleanType(); }
+  : BOOLEAN_TOK { t = CVC_INPUT->booleanType(); }
   | typeSymbol[t]
   ;
 
@@ -214,7 +204,7 @@ typeSymbol[CVC4::Type*& t]
   Debug("parser-extra") << "type symbol: " << AntlrInput::tokenText(LT(1)) << std::endl;
 }
   : identifier[id,CHECK_DECLARED,SYM_SORT]
-    { t = input->getSort(id); }
+    { t = CVC_INPUT->getSort(id); }
   ;
 
 /**
@@ -252,7 +242,7 @@ iffFormula[CVC4::Expr& f]
   : impliesFormula[f]
     ( IFF_TOK 
        iffFormula[e]
-        { f = input->mkExpr(CVC4::kind::IFF, f, e); }
+        { f = CVC_INPUT->mkExpr(CVC4::kind::IFF, f, e); }
     )?
   ;
 
@@ -266,7 +256,7 @@ impliesFormula[CVC4::Expr& f]
 }
   : orFormula[f]
     ( IMPLIES_TOK impliesFormula[e]
-        { f = input->mkExpr(CVC4::kind::IMPLIES, f, e); }
+        { f = CVC_INPUT->mkExpr(CVC4::kind::IMPLIES, f, e); }
     )?
   ;
 
@@ -283,7 +273,7 @@ orFormula[CVC4::Expr& f]
         xorFormula[f] { exprs.push_back(f); } )*
     {
       if( exprs.size() > 0 ) {
-        f = input->mkExpr(CVC4::kind::OR, exprs);
+        f = CVC_INPUT->mkExpr(CVC4::kind::OR, exprs);
       }
     }
   ;
@@ -298,7 +288,7 @@ xorFormula[CVC4::Expr& f]
 }
   : andFormula[f]
     ( XOR_TOK andFormula[e]
-      { f = input->mkExpr(CVC4::kind::XOR,f, e); }
+      { f = CVC_INPUT->mkExpr(CVC4::kind::XOR,f, e); }
     )*
   ;
 
@@ -315,7 +305,7 @@ andFormula[CVC4::Expr& f]
       notFormula[f] { exprs.push_back(f); } )*
     {
       if( exprs.size() > 0 ) {
-        f = input->mkExpr(CVC4::kind::AND, exprs);
+        f = CVC_INPUT->mkExpr(CVC4::kind::AND, exprs);
       }
     }
   ;
@@ -330,7 +320,7 @@ notFormula[CVC4::Expr& f]
 }
   : /* negation */
     NOT_TOK notFormula[f]
-    { f = input->mkExpr(CVC4::kind::NOT, f); }
+    { f = CVC_INPUT->mkExpr(CVC4::kind::NOT, f); }
   | /* a boolean atom */
     predFormula[f]
   ;
@@ -342,7 +332,7 @@ predFormula[CVC4::Expr& f]
 }
   : term[f]
     (EQUAL_TOK term[e]
-      { f = input->mkExpr(CVC4::kind::EQUAL, f, e); }
+      { f = CVC_INPUT->mkExpr(CVC4::kind::EQUAL, f, e); }
     )?
   ; // TODO: lt, gt, etc.
 
@@ -361,7 +351,7 @@ term[CVC4::Expr& f]
     { args.push_back( f ); }
     LPAREN formulaList[args] RPAREN
     // TODO: check arity
-    { f = input->mkExpr(CVC4::kind::APPLY_UF, args); }
+    { f = CVC_INPUT->mkExpr(CVC4::kind::APPLY_UF, args); }
 
   | /* if-then-else */
     iteTerm[f]
@@ -370,12 +360,12 @@ term[CVC4::Expr& f]
     LPAREN formula[f] RPAREN
 
     /* constants */
-  | TRUE_TOK  { f = input->getTrueExpr(); }
-  | FALSE_TOK { f = input->getFalseExpr(); }
+  | TRUE_TOK  { f = CVC_INPUT->getTrueExpr(); }
+  | FALSE_TOK { f = CVC_INPUT->getFalseExpr(); }
 
   | /* variable */
     identifier[name,CHECK_DECLARED,SYM_VARIABLE]
-    { f = input->getVariable(name); }
+    { f = CVC_INPUT->getVariable(name); }
   ;
 
 /**
@@ -390,7 +380,7 @@ iteTerm[CVC4::Expr& f]
     THEN_TOK formula[f] { args.push_back(f); }
     iteElseTerm[f] { args.push_back(f); }
     ENDIF_TOK
-    { f = input->mkExpr(CVC4::kind::ITE, args); }
+    { f = CVC_INPUT->mkExpr(CVC4::kind::ITE, args); }
   ;
 
 /**
@@ -405,7 +395,7 @@ iteElseTerm[CVC4::Expr& f]
   | ELSEIF_TOK iteCondition = formula[f] { args.push_back(f); }
     THEN_TOK iteThen = formula[f] { args.push_back(f); }
     iteElse = iteElseTerm[f] { args.push_back(f); }
-    { f = input->mkExpr(CVC4::kind::ITE, args); }
+    { f = CVC_INPUT->mkExpr(CVC4::kind::ITE, args); }
   ;
 
 /**
@@ -419,8 +409,8 @@ functionSymbol[CVC4::Expr& f]
   std::string name;
 }
   : identifier[name,CHECK_DECLARED,SYM_FUNCTION]
-    { input->checkFunction(name);
-      f = input->getFunction(name); }
+    { CVC_INPUT->checkFunction(name);
+      f = CVC_INPUT->getFunction(name); }
   ;
 
 
index 9de608aae93a919cbe7c6eed66de6e69257feb4d..1f1a602c55efc5d7cd76ff1111900cfa18609105 100644 (file)
@@ -47,7 +47,6 @@ void CvcInput::init() {
   }
 
   setParser(d_pCvcParser->pParser);
-  SetCvcInput(this);
 }
 
 
@@ -64,9 +63,11 @@ Expr CvcInput::doParseExpr() throw (ParserException) {
   return d_pCvcParser->parseExpr(d_pCvcParser);
 }
 
+/*
 pANTLR3_LEXER CvcInput::getLexer() {
   return d_pCvcLexer->pLexer;
 }
+*/
 
 } // namespace parser
 
index 65912340149ce031d7bcdc032a50ca69ff02749d..a6117b4a9b4b2a967151aa76548a0b4d115e2e1e 100644 (file)
@@ -23,22 +23,57 @@ class ExprManager;
 namespace parser {
 
 class CvcInput : public AntlrInput {
+  /** The ANTLR3 CVC lexer for the input. */
+  pCvcLexer d_pCvcLexer;
+
+  /** The ANTLR3 CVC parser for the input. */
+  pCvcParser d_pCvcParser;
+
 public:
+
+  /** Create a file input.
+   *
+   * @param exprManager the manager to use when building expressions from the input
+   * @param filename the path of the file to read
+   * @param useMmap <code>true</code> if the input should use memory-mapped
+   * I/O; otherwise, the input will use the standard ANTLR3 I/O implementation.
+   */
   CvcInput(ExprManager* exprManager, const std::string& filename, bool useMmap);
-  CvcInput(ExprManager* exprManager, const std::string& input, const std::string& name);
+
+  /** Create a string input.
+   *
+   * @param exprManager the manager to use when building expressions from the input
+   * @param input the string to read
+   * @param name the "filename" to use when reporting errors
+   */
+  CvcInput(ExprManager* exprManager, const std::string& input,
+           const std::string& name);
+
+  /* Destructor. Frees the lexer and the parser. */
   ~CvcInput();
 
 protected:
+
+  /** Parse a command from the input. Returns <code>NULL</code> if there is
+   * no command there to parse.
+   *
+   * @throws ParserException if an error is encountered during parsing.
+   */
   Command* doParseCommand() throw(ParserException);
+
+  /** Parse an expression from the input. Returns a null <code>Expr</code>
+   * if there is no expression there to parse.
+   *
+   * @throws ParserException if an error is encountered during parsing.
+   */
   Expr doParseExpr() throw(ParserException);
-  pANTLR3_LEXER getLexer();
-  pANTLR3_LEXER createLexer(pANTLR3_INPUT_STREAM input);
-  pANTLR3_PARSER createParser(pANTLR3_COMMON_TOKEN_STREAM tokenStream);
 
 private:
+
+  /** Initialize the class. Called from the constructors once the input stream
+   * is initialized. */
   void init();
-  pCvcLexer d_pCvcLexer;
-  pCvcParser d_pCvcParser;
+
 }; // class CvcInput
 
 } // namespace parser
index 68db0f5dd66893e05b3d312d0b13ade6bc166b0b..af580d78eb5aad9faf7fe39a3871394fb466d14e 100644 (file)
@@ -92,7 +92,41 @@ inline std::string toString(SymbolType type) {
  */
 class CVC4_PUBLIC Input {
 
+  /** Whether to de-allocate the input */
+//  bool d_deleteInput;
+
+  /** The expression manager */
+  ExprManager* d_exprManager;
+
+  /** The symbol table lookup */
+  SymbolTable<Expr> d_varSymbolTable;
+
+  /** The sort table */
+  SymbolTable<Type*> d_sortTable;
+
+  /** The name of the input file. */
+  std::string d_filename;
+
+  /** Are we done */
+  bool d_done;
+
+  /** Are semantic checks enabled during parsing? */
+  bool d_checksEnabled;
+
 public:
+
+  /**
+   * Create a new parser for the given file.
+   * @param exprManager the ExprManager to use
+   * @param filename the path of the file to parse
+   */
+  Input(ExprManager* exprManager, const std::string& filename);
+
+  /**
+   * Destructor.
+   */
+  ~Input();
+
   /** Create a parser for the given file.
     *
     * @param exprManager the ExprManager for creating expressions from the input
@@ -119,14 +153,11 @@ public:
    */
   static Input* newStringParser(ExprManager* exprManager, InputLanguage lang, const std::string& input, const std::string& name);
 
-  /**
-   * Destructor.
-   */
-  ~Input();
-
   /**
    * Parse the next command of the input. If EOF is encountered a EmptyCommand
    * is returned and done flag is set.
+   *
+   * @throws ParserException if an error is encountered during parsing.
    */
   Command* parseNextCommand() throw(ParserException);
 
@@ -134,6 +165,7 @@ public:
    * Parse the next expression of the stream. If EOF is encountered a null
    * expression is returned and done flag is set.
    * @return the parsed expression
+   * @throws ParserException if an error is encountered during parsing.
    */
   Expr parseNextExpression() throw(ParserException);
 
@@ -344,18 +376,29 @@ public:
     /** Returns the maximum arity of the given kind. */
     static unsigned int maxArity(Kind kind);
 
+    /** Throws a <code>ParserException</code> with the given error message.
+     * Implementations should fill in the <code>ParserException</code> with
+     * line number information, etc. */
     virtual void parseError(const std::string& msg) throw (ParserException) = 0;
 
 protected:
-    virtual Command* doParseCommand() throw(ParserException) = 0;
-    virtual Expr doParseExpr() throw(ParserException) = 0;
 
-    /**
-     * Create a new parser for the given file.
-     * @param exprManager the ExprManager to use
-     * @param filename the path of the file to parse
-     */
-    Input(ExprManager* exprManager, const std::string& filename);
+  /** Called by <code>parseNextCommand</code> to actually 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.
+   */
+  virtual Command* doParseCommand() throw(ParserException) = 0;
+
+  /** Called by <code>parseNextExpression</code> to actually 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.
+   */
+  virtual Expr doParseExpr() throw(ParserException) = 0;
 
 private:
 
@@ -365,27 +408,6 @@ private:
   /** Lookup a symbol in the given namespace. */
   Expr getSymbol(const std::string& var_name, SymbolType type);
 
-  /** Whether to de-allocate the input */
-//  bool d_deleteInput;
-
-  /** The expression manager */
-  ExprManager* d_exprManager;
-
-  /** The symbol table lookup */
-  SymbolTable<Expr> d_varSymbolTable;
-
-  /** The sort table */
-  SymbolTable<Type*> d_sortTable;
-
-  /** The name of the input file. */
-  std::string d_filename;
-
-  /** Are we done */
-  bool d_done;
-
-  /** Are semantic checks enabled during parsing? */
-  bool d_checksEnabled;
-
 }; // end of class Parser
 
 }/* CVC4::parser namespace */
index 7095c7269b8174ce89ff948ad58e2ec592e3e548..e97ced324136ee099735cdff41ce7886a2a44bdf 100644 (file)
@@ -33,6 +33,11 @@ options {
 }
 
 @lexer::includes {
+/** This suppresses warnings about the redefinition of token symbols between different
+  * parsers. The redefinitions should be harmless as long as no client: (a) #include's 
+  * the lexer headers for two grammars AND (b) uses the token symbol definitions. */
+#pragma GCC system_header
+
 /* This improves performance by ~10 percent on big inputs.
  * This option is only valid if we know the input is ASCII (or some 8-bit encoding).
  * If we know the input is UTF-16, we can use ANTLR3_INLINE_INPUT_UTF16.
@@ -43,40 +48,25 @@ options {
 
 @parser::includes {
 #include "expr/command.h"
-#include "parser/input.h"
 
 namespace CVC4 {
   class Expr;
-namespace parser {
-  class SmtInput;
-}
 }
-
-extern
-void SetSmtInput(CVC4::parser::SmtInput* smt);
-
 }
 
 @parser::postinclude {
 #include "expr/expr.h"
 #include "expr/kind.h"
 #include "expr/type.h"
-#include "parser/input.h"
 #include "parser/smt/smt_input.h"
 #include "util/output.h"
 #include <vector>
 
 using namespace CVC4;
 using namespace CVC4::parser;
-}
-
-@members {
-static CVC4::parser::SmtInput *input;
 
-extern
-void SetSmtInput(CVC4::parser::SmtInput* _input) {
-  input = _input;
-}
+#undef SMT_INPUT
+#define SMT_INPUT ((SmtInput*)(PARSER->super))
 }
 
 /**
@@ -130,7 +120,7 @@ benchAttribute returns [CVC4::Command* smt_command]
   Expr expr;
 }
   : LOGIC_TOK identifier[name,CHECK_NONE,SYM_VARIABLE]
-    { input->setLogic(name);
+    { SMT_INPUT->setLogic(name);
       smt_command = new SetBenchmarkLogicCommand(name);   }
   | ASSUMPTION_TOK annotatedFormula[expr]
     { smt_command = new AssertCommand(expr);   }
@@ -158,13 +148,13 @@ annotatedFormula[CVC4::Expr& expr]
 } 
   : /* a built-in operator application */
     LPAREN_TOK builtinOp[kind] annotatedFormulas[args,expr] RPAREN_TOK 
-    { input->checkArity(kind, args.size());
+    { SMT_INPUT->checkArity(kind, args.size());
       if((kind == CVC4::kind::AND || kind == CVC4::kind::OR) && args.size() == 1) {
         /* Unary AND/OR can be replaced with the argument.
               It just so happens expr should already by the only argument. */
         Assert( expr == args[0] );
       } else {
-        expr = input->mkExpr(kind, args);
+        expr = SMT_INPUT->mkExpr(kind, args);
       }
     }
 
@@ -179,7 +169,7 @@ annotatedFormula[CVC4::Expr& expr]
     { args.push_back(expr); }
     annotatedFormulas[args,expr] RPAREN_TOK
     // TODO: check arity
-    { expr = input->mkExpr(CVC4::kind::APPLY_UF,args); }
+    { expr = SMT_INPUT->mkExpr(CVC4::kind::APPLY_UF,args); }
 
   | /* An ite expression */
     LPAREN_TOK (ITE_TOK | IF_THEN_ELSE_TOK) 
@@ -190,27 +180,27 @@ annotatedFormula[CVC4::Expr& expr]
     annotatedFormula[expr]
     { args.push_back(expr); } 
     RPAREN_TOK
-    { expr = input->mkExpr(CVC4::kind::ITE, args); }
+    { expr = SMT_INPUT->mkExpr(CVC4::kind::ITE, args); }
 
   | /* a let/flet binding */
     LPAREN_TOK 
     (LET_TOK LPAREN_TOK var_identifier[name,CHECK_UNDECLARED]
       | FLET_TOK LPAREN_TOK fun_identifier[name,CHECK_UNDECLARED] )
     annotatedFormula[expr] RPAREN_TOK
-    { input->defineVar(name,expr); }
+    { SMT_INPUT->defineVar(name,expr); }
     annotatedFormula[expr]
     RPAREN_TOK
-    { input->undefineVar(name); }
+    { SMT_INPUT->undefineVar(name); }
 
   | /* a variable */
     ( identifier[name,CHECK_DECLARED,SYM_VARIABLE]
       | var_identifier[name,CHECK_DECLARED] 
       | fun_identifier[name,CHECK_DECLARED] )
-    { expr = input->getVariable(name); }
+    { expr = SMT_INPUT->getVariable(name); }
 
     /* constants */
-  | TRUE_TOK          { expr = input->getTrueExpr(); }
-  | FALSE_TOK         { expr = input->getFalseExpr(); }
+  | TRUE_TOK          { expr = SMT_INPUT->getTrueExpr(); }
+  | FALSE_TOK         { expr = SMT_INPUT->getFalseExpr(); }
     /* TODO: let, flet, quantifiers, arithmetic constants */
   ;
 
@@ -269,8 +259,8 @@ functionSymbol[CVC4::Expr& fun]
        std::string name;
 }
   : functionName[name,CHECK_DECLARED]
-    { input->checkFunction(name);
-      fun = input->getFunction(name); }
+    { SMT_INPUT->checkFunction(name);
+      fun = SMT_INPUT->getFunction(name); }
   ;
   
 /**
@@ -291,8 +281,8 @@ functionDeclaration
       t = sortSymbol // require at least one sort
     { sorts.push_back(t); }
       sortList[sorts] RPAREN_TOK
-    { t = input->functionType(sorts);
-      input->mkVar(name, t); } 
+    { t = SMT_INPUT->functionType(sorts);
+      SMT_INPUT->mkVar(name, t); } 
   ;
               
 /**
@@ -304,8 +294,8 @@ predicateDeclaration
   std::vector<Type*> p_sorts;
 }
   : LPAREN_TOK predicateName[name,CHECK_UNDECLARED] sortList[p_sorts] RPAREN_TOK
-    { Type *t = input->predicateType(p_sorts);
-      input->mkVar(name, t); } 
+    { Type *t = SMT_INPUT->predicateType(p_sorts);
+      SMT_INPUT->mkVar(name, t); } 
   ;
 
 sortDeclaration 
@@ -314,7 +304,7 @@ sortDeclaration
 }
   : sortName[name,CHECK_UNDECLARED]
     { Debug("parser") << "sort decl: '" << name << "'" << std::endl;
-      input->newSort(name); }
+      SMT_INPUT->newSort(name); }
   ;
   
 /**
@@ -337,7 +327,7 @@ sortSymbol returns [CVC4::Type* t]
   std::string name;
 }
   : sortName[name,CHECK_NONE] 
-       { $t = input->getSort(name); }
+       { $t = SMT_INPUT->getSort(name); }
   ;
 
 /**
@@ -370,7 +360,7 @@ identifier[std::string& id,
       Debug("parser") << "identifier: " << id
                       << " check? " << toString(check)
                       << " type? " << toString(type) << std::endl;
-      input->checkDeclaration(id, check, type); }
+      SMT_INPUT->checkDeclaration(id, check, type); }
   ;
 
 /**
@@ -384,7 +374,7 @@ var_identifier[std::string& id,
     { id = AntlrInput::tokenText($VAR_IDENTIFIER);
       Debug("parser") << "var_identifier: " << id
                       << " check? " << toString(check) << std::endl;
-      input->checkDeclaration(id, check, SYM_VARIABLE); }
+      SMT_INPUT->checkDeclaration(id, check, SYM_VARIABLE); }
   ;
 
 /**
@@ -398,7 +388,7 @@ fun_identifier[std::string& id,
     { id = AntlrInput::tokenText($FUN_IDENTIFIER);
       Debug("parser") << "fun_identifier: " << id
                       << " check? " << toString(check) << std::endl;
-      input->checkDeclaration(id, check, SYM_FUNCTION); }
+      SMT_INPUT->checkDeclaration(id, check, SYM_FUNCTION); }
   ;
 
 
index 7a28c30f1d15e493a447bc6e80741f01ab4ff2b4..db4d8986024bd8944ba23a7a500e66bbdc35e73c 100644 (file)
@@ -17,13 +17,15 @@ namespace CVC4 {
 namespace parser {
 
 /* Use lookahead=2 */
-SmtInput::SmtInput(ExprManager* exprManager, const std::string& filename, bool useMmap) :
-  AntlrInput(exprManager,filename,2,useMmap) {
+SmtInput::SmtInput(ExprManager* exprManager, const std::string& filename,
+                   bool useMmap) :
+  AntlrInput(exprManager, filename, 2, useMmap) {
   init();
 }
 
-SmtInput::SmtInput(ExprManager* exprManager, const std::string& input, const std::string& name) :
-  AntlrInput(exprManager,input,name,2) {
+SmtInput::SmtInput(ExprManager* exprManager, const std::string& input,
+                   const std::string& name) :
+  AntlrInput(exprManager, input, name, 2) {
   init();
 }
 
@@ -47,7 +49,6 @@ void SmtInput::init() {
   }
 
   setParser(d_pSmtParser->pParser);
-  SetSmtInput(this);
 }
 
 
@@ -64,10 +65,6 @@ Expr SmtInput::doParseExpr() throw (ParserException) {
   return d_pSmtParser->parseExpr(d_pSmtParser);
 }
 
-pANTLR3_LEXER SmtInput::getLexer() {
-  return d_pSmtLexer->pLexer;
-}
-
 } // namespace parser
 
 } // namespace CVC4
index b3613d67b0ba18553d08af63dd37bc1803a57f22..4795edc9129abbdd111e99ee34385c4e33716591 100644 (file)
@@ -23,23 +23,59 @@ class ExprManager;
 namespace parser {
 
 class SmtInput : public AntlrInput {
+
+  /** The ANTLR3 SMT lexer for the input. */
+  pSmtLexer d_pSmtLexer;
+
+  /** The ANTLR3 CVC parser for the input. */
+  pSmtParser d_pSmtParser;
+
 public:
+
+  /** Create a file input.
+   *
+   * @param exprManager the manager to use when building expressions from the input
+   * @param filename the path of the file to read
+   * @param useMmap <code>true</code> if the input should use memory-mapped
+   * I/O; otherwise, the input will use the standard ANTLR3 I/O implementation.
+   */
   SmtInput(ExprManager* exprManager, const std::string& filename, bool useMmap);
+
+  /** Create a string input.
+   *
+   * @param exprManager the manager to use when building expressions from the input
+   * @param input the string to read
+   * @param name the "filename" to use when reporting errors
+   */
   SmtInput(ExprManager* exprManager, const std::string& input, const std::string& name);
+
+  /* Destructor. Frees the lexer and the parser. */
   ~SmtInput();
 
 protected:
+
+  /** Parse a command from the input. Returns <code>NULL</code> if there is
+   * no command there to parse.
+   *
+   * @throws ParserException if an error is encountered during parsing.
+   */
   Command* doParseCommand() throw(ParserException);
+
+  /** Parse an expression from the input. Returns a null <code>Expr</code>
+   * if there is no expression there to parse.
+   *
+   * @throws ParserException if an error is encountered during parsing.
+   */
   Expr doParseExpr() throw(ParserException);
-  pANTLR3_LEXER getLexer();
-  pANTLR3_LEXER createLexer(pANTLR3_INPUT_STREAM input);
-  pANTLR3_PARSER createParser(pANTLR3_COMMON_TOKEN_STREAM tokenStream);
 
 private:
+
+  /** Initialize the class. Called from the constructors once the input stream
+   * is initialized. */
   void init();
-  pSmtLexer d_pSmtLexer;
-  pSmtParser d_pSmtParser;
+
 }; // class SmtInput
+
 } // namespace parser
 
 } // namespace CVC4