summaryrefslogtreecommitdiff
path: root/src/parser/parser.cpp
diff options
context:
space:
mode:
authorDejan Jovanović <dejan.jovanovic@gmail.com>2009-12-18 05:07:19 +0000
committerDejan Jovanović <dejan.jovanovic@gmail.com>2009-12-18 05:07:19 +0000
commit2eef69eb63f3a5637f8711944e3d056672872f20 (patch)
treeab534fd3345dfb307267b991994a54e860d79064 /src/parser/parser.cpp
parent093492af43fae12d7f1d4607e63b1da686044ea6 (diff)
Lots of parser changes to make Chris happy. Yet more to come later.
Diffstat (limited to 'src/parser/parser.cpp')
-rw-r--r--src/parser/parser.cpp89
1 files changed, 85 insertions, 4 deletions
diff --git a/src/parser/parser.cpp b/src/parser/parser.cpp
index 2ff409686..e919a53e8 100644
--- a/src/parser/parser.cpp
+++ b/src/parser/parser.cpp
@@ -15,6 +15,7 @@
#include <iostream>
#include <fstream>
+#include <antlr/CharScanner.hpp>
#include "parser.h"
#include "util/command.h"
@@ -27,14 +28,11 @@
#include "parser/cvc/generated/AntlrCvcLexer.hpp"
using namespace std;
+using namespace antlr;
namespace CVC4 {
namespace parser {
-Parser::Parser(ExprManager* em) :
- d_expr_manager(em), d_done(false) {
-}
-
void Parser::setDone(bool done) {
d_done = done;
}
@@ -43,5 +41,88 @@ bool Parser::done() const {
return d_done;
}
+Command* Parser::parseNextCommand() throw (ParserException) {
+ Command* cmd = 0;
+ if(!done()) {
+ try {
+ cmd = d_antlrParser->parseCommand();
+ if(cmd == 0) {
+ setDone();
+ cmd = new EmptyCommand("EOF");
+ }
+ } catch(antlr::ANTLRException& e) {
+ setDone();
+ throw ParserException(e.toString());
+ }
+ }
+ return cmd;
+}
+
+Expr Parser::parseNextExpression() throw (ParserException) {
+ Expr result;
+ if(!done()) {
+ try {
+ result = d_antlrParser->parseExpr();
+ if(result.isNull())
+ setDone();
+ } catch(antlr::ANTLRException& e) {
+ setDone();
+ throw ParserException(e.toString());
+ }
+ }
+ return result;
+}
+
+Parser::~Parser() {
+ delete d_antlrParser;
+ delete d_antlrLexer;
+ if (d_deleteInput) delete d_input;
+}
+
+Parser::Parser(istream* input, AntlrParser* antlrParser, CharScanner* antlrLexer, bool deleteInput) :
+ d_done(false), d_input(input), d_antlrParser(antlrParser), d_antlrLexer(antlrLexer), d_deleteInput(deleteInput) {
+}
+
+Parser* Parser::getNewParser(ExprManager* em, InputLanguage lang,
+ istream* input, string filename, bool deleteInput) {
+
+ AntlrParser* antlrParser = 0;
+ antlr::CharScanner* antlrLexer = 0;
+
+ switch(lang) {
+ case LANG_CVC4: {
+ antlrLexer = new AntlrCvcLexer(*input);
+ antlrLexer->setFilename(filename);
+ antlrParser = new AntlrCvcParser(*antlrLexer);
+ antlrParser->setFilename(filename);
+ antlrParser->setExpressionManager(em);
+ break;
+ }
+ case LANG_SMTLIB: {
+ antlrLexer = new AntlrSmtLexer(*input);
+ antlrLexer->setFilename(filename);
+ antlrParser = new AntlrSmtParser(*antlrLexer);
+ antlrParser->setFilename(filename);
+ antlrParser->setExpressionManager(em);
+ break;
+ }
+ default:
+ Unhandled("Unknown Input language!");
+ }
+
+ return new Parser(input, antlrParser, antlrLexer, deleteInput);
+}
+
+Parser* Parser::getNewParser(ExprManager* em, InputLanguage lang,
+ string filename) {
+ istream* input = new ifstream(filename.c_str());
+ return getNewParser(em, lang, input, filename, true);
+}
+
+Parser* Parser::getNewParser(ExprManager* em, InputLanguage lang,
+ istream& input) {
+ return getNewParser(em, lang, &input, "", false);
+}
+
}/* CVC4::parser namespace */
}/* CVC4 namespace */
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback