ELSEIF support and parser debugging with '-d parser'
authorDejan Jovanović <dejan.jovanovic@gmail.com>
Wed, 3 Feb 2010 22:10:21 +0000 (22:10 +0000)
committerDejan Jovanović <dejan.jovanovic@gmail.com>
Wed, 3 Feb 2010 22:10:21 +0000 (22:10 +0000)
src/parser/antlr_parser.cpp
src/parser/cvc/cvc_parser.g
src/parser/parser.cpp
src/util/command.cpp
src/util/command.h

index 01235bf88c5beb304c8a06821f95beabbbee320b..3522bfd756c2e7d246efc238c74b364a123e9cbd 100644 (file)
@@ -47,7 +47,6 @@ AntlrParser::AntlrParser(antlr::TokenStream& lexer, int k) :
 
 Expr AntlrParser::getVariable(std::string var_name) {
   Expr e = d_varSymbolTable.getObject(var_name);
-  Debug("parser") << "getvar " << var_name << " gives " << e << endl;
   return e;
 }
 
@@ -64,20 +63,27 @@ Expr AntlrParser::mkExpr(Kind kind, const Expr& child) {
 }
 
 Expr AntlrParser::mkExpr(Kind kind, const Expr& child_1, const Expr& child_2) {
-  return d_exprManager->mkExpr(kind, child_1, child_2);
+  Expr result = d_exprManager->mkExpr(kind, child_1, child_2);
+  Debug("parser") << "mkExpr() => " << result << std::endl;
+  return result;
 }
 
 Expr AntlrParser::mkExpr(Kind kind, const Expr& child_1, const Expr& child_2,
                          const Expr& child_3) {
-  return d_exprManager->mkExpr(kind, child_1, child_2, child_3);
+  Expr result = d_exprManager->mkExpr(kind, child_1, child_2, child_3);
+  Debug("parser") << "mkExpr() => " << result << std::endl;
+  return result;
 }
 
 Expr AntlrParser::mkExpr(Kind kind, const std::vector<Expr>& children) {
-  return d_exprManager->mkExpr(kind, children);
+  Expr result = d_exprManager->mkExpr(kind, children);
+  Debug("parser") << "mkExpr() => " << result << std::endl;
+  return result;
 }
 
 void AntlrParser::newPredicate(std::string name,
                                const std::vector<std::string>& sorts) {
+  Debug("parser") << "newPredicate(" << name << ")" << std::endl;
   if(sorts.size() == 0) {
     d_varSymbolTable.bindName(name, d_exprManager->mkVar());
   } else {
index 474c38c9619ec17eb52c02a924c7f493b6cf25c2..eb21283a3f95cbe51026c35275df9114d0b7dbbc 100644 (file)
@@ -223,10 +223,24 @@ iteFormula returns [CVC4::Expr formula]
 {
   Expr iteCondition, iteThen, iteElse;
 }
-  : IF     iteCondition = boolFormula 
-    THEN   iteThen      = boolFormula
-    ELSE   iteElse      = boolFormula 
-    ENDIF
+  : IF iteCondition = boolFormula 
+    THEN iteThen = boolFormula
+    iteElse = iteElseFormula
+    ENDIF     
+    { formula = mkExpr(CVC4::ITE, iteCondition, iteThen, iteElse); }  
+  ;
+
+/**
+ * Parses the else part of the ITE, i.e. ELSE f, or ELSIF b THEN f1 ...
+ */
+iteElseFormula returns [CVC4::Expr formula]
+{
+  Expr iteCondition, iteThen, iteElse;
+}
+  : ELSE formula = boolFormula
+  | ELSEIF iteCondition = boolFormula
+    THEN iteThen = boolFormula
+    iteElse = iteElseFormula
     { formula = mkExpr(CVC4::ITE, iteCondition, iteThen, iteElse); }
   ;
 
index a38868d3b8544fdd0f3da252dbba3f65b9dfb640..2f9ac6724ab6b368911407088707d4d7869142fd 100644 (file)
@@ -19,6 +19,7 @@
 
 #include "parser.h"
 #include "util/command.h"
+#include "util/output.h"
 #include "util/Assert.h"
 #include "parser_exception.h"
 #include "parser/antlr_parser.h"
@@ -41,21 +42,26 @@ bool Parser::done() const {
   return d_done;
 }
 
-Command* Parser::parseNextCommand() throw(ParserException, AssertionException) {
+Command* Parser::parseNextCommand() throw (ParserException, AssertionException) {
+  Debug("parser") << "parseNextCommand()" << std::endl;
   Command* cmd = NULL;
   if(!done()) {
     try {
       cmd = d_antlrParser->parseCommand();
-      if (cmd == NULL) setDone();
+      if(cmd == NULL) {
+        setDone();
+      }
     } catch(antlr::ANTLRException& e) {
       setDone();
       throw ParserException(e.toString());
     }
   }
+  Debug("parser") << "parseNextCommand() => " << cmd << std::endl;
   return cmd;
 }
 
-Expr Parser::parseNextExpression() throw(ParserException, AssertionException) {
+Expr Parser::parseNextExpression() throw (ParserException, AssertionException) {
+  Debug("parser") << "parseNextExpression()" << std::endl;
   Expr result;
   if(!done()) {
     try {
@@ -67,6 +73,7 @@ Expr Parser::parseNextExpression() throw(ParserException, AssertionException) {
       throw ParserException(e.toString());
     }
   }
+  Debug("parser") << "parseNextExpression() => " << result << std::endl;
   return result;
 }
 
@@ -78,8 +85,10 @@ Parser::~Parser() {
   }
 }
 
-Parser::Parser(istream* input, AntlrParser* antlrParser, CharScanner* antlrLexer, bool deleteInput) :
-  d_done(false), d_antlrParser(antlrParser), d_antlrLexer(antlrLexer), d_input(input), d_deleteInput(deleteInput) {
+Parser::Parser(istream* input, AntlrParser* antlrParser,
+               CharScanner* antlrLexer, bool deleteInput) :
+  d_done(false), d_antlrParser(antlrParser), d_antlrLexer(antlrLexer),
+      d_input(input), d_deleteInput(deleteInput) {
 }
 
 Parser* Parser::getNewParser(ExprManager* em, InputLanguage lang,
index 06545a0a0063e603ebd8cd18ee6b03b9e9fc70c4..90204a63f75d24e7dd61371eb730097521af1844 100644 (file)
@@ -34,6 +34,15 @@ ostream& operator<<(ostream& out, const Command& c) {
   return out;
 }
 
+ostream& operator<<(ostream& out, const Command* c) {
+  if (c == NULL) {
+    out << "null";
+  } else {
+    c->toStream(out);
+  }
+  return out;
+}
+
 std::string Command::toString() const {
   stringstream ss;
   toStream(ss);
@@ -111,7 +120,7 @@ void CheckSatCommand::toStream(ostream& out) const {
 
 void QueryCommand::toStream(ostream& out) const {
   out << "Query(";
-  d_expr.printAst(out, 2);
+  d_expr.printAst(out, 0);
   out << ")";
 }
 
index b41be45927ee7146840d70f30cb06917d8038692..57edfea01ba0052586d4d86b1dcee6756f285398 100644 (file)
@@ -30,6 +30,7 @@ namespace CVC4 {
 namespace CVC4 {
 
 std::ostream& operator<<(std::ostream&, const Command&) CVC4_PUBLIC;
+std::ostream& operator<<(std::ostream&, const Command*) CVC4_PUBLIC;
 
 class CVC4_PUBLIC Command {
 public: