about summary refs log tree commit diff homepage
diff options
context:
space:
mode:
authorCristian Cadar <cristic@cs.stanford.edu>2009-06-13 01:24:40 +0000
committerCristian Cadar <cristic@cs.stanford.edu>2009-06-13 01:24:40 +0000
commit48bc0478e93b095407b6f53dfa33af5edf98b8d1 (patch)
tree03a3bdd565b1672c5adbbb1de8c3934e2310d819
parentc5f2596a973bc30dcbaf4284f88d2f87b9bc840c (diff)
downloadklee-48bc0478e93b095407b6f53dfa33af5edf98b8d1.tar.gz
Support for parsing SMTLIB headers.
git-svn-id: https://llvm.org/svn/llvm-project/klee/trunk@73278 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/SMT/smtlib.y215
1 files changed, 59 insertions, 156 deletions
diff --git a/lib/SMT/smtlib.y b/lib/SMT/smtlib.y
index 422c28ad..456adff7 100644
--- a/lib/SMT/smtlib.y
+++ b/lib/SMT/smtlib.y
@@ -32,10 +32,12 @@ using namespace klee;
 using namespace klee::expr;
 
 // Define shortcuts for various things
-#define TMP SMTParser::parserTemp
-#define EXPR SMTParser::parserTemp->expr
-#define ARRAYSENABLED (SMTParser::parserTemp->arrFlag)
-#define BVENABLED (SMTParser::parserTemp->bvFlag)
+#define DONE SMTParser::parserTemp->done
+#define EXPR SMTParser::parserTemp->query
+#define ASSUMPTIONS SMTParser::parserTemp->assumptions
+#define QUERY SMTParser::parserTemp->query
+
+#define ARRAYSENABLED (SMTParser::parserTemp->arraysEnabled)
 #define BVSIZE (SMTParser::parserTemp->bvSize)
 #define QUERYPARSED SMTParser::parserTemp->queryParsed
 
@@ -55,7 +57,6 @@ int smtliberror(const char *s)
 }
 
 
-
 #define YYLTYPE_IS_TRIVIAL 1
 #define YYMAXDEPTH 10485760
 
@@ -71,7 +72,6 @@ int smtliberror(const char *s)
 };
 */
 
-
 %union {
   std::string *str;
   klee::expr::ExprHandle node;
@@ -95,8 +95,10 @@ int smtliberror(const char *s)
 %type <strvec> annotations
 %type <pat_ann> patterns_annotations
 */
-%type <node> benchmark bench_name  bench_attribute  bench_attributes
+
 %type <node> an_formula an_atom prop_atom
+%type <str> logic_name status attribute annotation user_value
+
 
 %token <str> NUMERAL_TOK
 %token <str> SYM_TOK
@@ -155,191 +157,82 @@ int smtliberror(const char *s)
 cmd:
     benchmark
     {
-      EXPR = $1;
       YYACCEPT;
     }
 ;
 
 benchmark:
-    LPAREN_TOK BENCHMARK_TOK bench_name bench_attributes RPAREN_TOK
-    {
-      /*
-      if (!QUERYPARSED)
-        $4->push_back(CVC3::Expr(VC->listExpr("_CHECKSAT", CVC3::Expr(VC->idExpr("_TRUE_EXPR")))));
-      $$ = new CVC3::Expr(VC->listExpr("_SEQ",*$4));
-      delete $4;
-      */
-      $$ = $4;
-    }
+    LPAREN_TOK BENCHMARK_TOK bench_name bench_attributes RPAREN_TOK { }
+
   | EOF_TOK
     { 
-      TMP->done = true;
-      //$$ = new CVC3::Expr();
-      //$$ = ConstantExpr::create(1, 1);
-      $$ = ExprHandle();
+      DONE = true;
     }
 ;
 
 bench_name:
-    SYM_TOK
-    {
-      $$ = NULL;
-      delete $1;
-    }
+    SYM_TOK { }
 ;
 
 bench_attributes:
-    bench_attribute
-    {
-      $$ = $1;
-    }
-/*
-    {
-      $$ = new std::vector<CVC3::Expr>;
-      if ($1) {
-	$$->push_back(*$1);
-	delete $1;
-      }
-    }
-  | bench_attributes bench_attribute
-    {
-      $$ = $1;
-      if ($2) {
-	$$->push_back(*$2);
-	delete $2;
-      }
-    }
-*/
+    bench_attribute { }
+
+  | bench_attributes bench_attribute { }
 ;
 
 bench_attribute:
     COLON_TOK ASSUMPTION_TOK an_formula
     {
-      /*
-      $$ = new CVC3::Expr(VC->listExpr("_ASSERT", *$3));      
-      delete $3;
-      */
-      $$ = $3;
+      ASSUMPTIONS.push_back($3);
     }
+
   | COLON_TOK FORMULA_TOK an_formula 
     {
-      /*
-      $$ = new CVC3::Expr(VC->listExpr("_CHECKSAT", *$3));
       QUERYPARSED = true;
-      delete $3;
-      */
-      $$ = $3;
-    }
-/*
-  | COLON_TOK STATUS_TOK status 
-    {
-      $$ = NULL;
+      QUERY = $3;
     }
+
+  | COLON_TOK STATUS_TOK status { }
+
   | COLON_TOK LOGIC_TOK logic_name 
     {
-      ARRAYSENABLED = false;
-      BVENABLED = false;
-      if (*$3 == "QF_UF") {
-        $$ = new CVC3::Expr(VC->listExpr("_TYPE", VC->idExpr("U")));
+      if (*$3 != "QF_BV" && *$3 != "QF_AUFBV" && *$3 != "QF_UFBV") {
+	std::cerr << "ERROR: Logic " << *$3 << " not supported.";
+	exit(1);
       }
-      else if (*$3 == "QF_A" ||
-               *$3 == "QF_AX") {
-        ARRAYSENABLED = true;
-        std::vector<CVC3::Expr> tmp;
-        tmp.push_back(VC->listExpr("_TYPE", VC->idExpr("Index")));
-        tmp.push_back(VC->listExpr("_TYPE", VC->idExpr("Element")));
-        tmp.push_back(VC->listExpr("_TYPEDEF", VC->idExpr("Array"),
-                                   VC->listExpr("_ARRAY",
-                                                VC->idExpr("Index"),
-                                                VC->idExpr("Element"))));
-        $$ = new CVC3::Expr(VC->listExpr("_SEQ", tmp));
-	$$ = NULL;
-      }
-      else if (*$3 == "QF_AUFLIA" ||
-               *$3 == "AUFLIA") {
-        ARRAYSENABLED = true;
-        std::vector<CVC3::Expr> tmp;
-        tmp.push_back(VC->listExpr("_TYPEDEF", VC->idExpr("Array"),
-                                   VC->listExpr("_ARRAY",
-                                                VC->idExpr("_INT"),
-                                                VC->idExpr("_INT"))));
-        $$ = new CVC3::Expr(VC->listExpr("_SEQ", tmp));
-      }
-      else if (*$3 == "QF_AUFLIRA" ||
-               *$3 == "AUFLIRA" ||
-               *$3 == "QF_AUFNIRA" ||
-               *$3 == "AUFNIRA") {
-        ARRAYSENABLED = true;
-        std::vector<CVC3::Expr> tmp;
-        tmp.push_back(VC->listExpr("_TYPEDEF", VC->idExpr("Array1"),
-                                   VC->listExpr("_ARRAY",
-                                                VC->idExpr("_INT"),
-                                                VC->idExpr("_REAL"))));
-        tmp.push_back(VC->listExpr("_TYPEDEF", VC->idExpr("Array2"),
-                                   VC->listExpr("_ARRAY",
-                                                VC->idExpr("_INT"),
-                                                VC->idExpr("Array1"))));
-        $$ = new CVC3::Expr(VC->listExpr("_SEQ", tmp));
-      }
-      else if (*$3 == "QF_AUFBV" ||
-               *$3 == "QF_ABV") {
+
+      if (*$3 == "QF_AUFBV")
         ARRAYSENABLED = true;
-        BVENABLED = true;
-        $$ = NULL;
-//         $$ = new CVC3::Expr(VC->listExpr("_TYPEDEF", VC->idExpr("Array"),
-//                                          VC->listExpr("_ARRAY",
-//                                                       VC->listExpr("_BITVECTOR", VC->ratExpr(32)),
-//                                                       VC->listExpr("_BITVECTOR", VC->ratExpr(8)))));
-      }
-      else if (*$3 == "QF_BV" ||
-               *$3 == "QF_UFBV") {
-        BVENABLED = true;
-        $$ = NULL;
-      }
-    // This enables the new arith for QF_LRA, but this results in assertion failures in DEBUG mode
-      else if (*$3 == "QF_LRA") {
-         $$ = new CVC3::Expr(VC->listExpr("_OPTION", VC->stringExpr("arith-new"), VC->ratExpr(1)));
-       }
-      else {
-        $$ = NULL;
-      }
-      delete $3;
     }
+/*
   | COLON_TOK EXTRASORTS_TOK LPAREN_TOK sort_symbs RPAREN_TOK
-    {
-      $$ = new CVC3::Expr(VC->listExpr("_TYPE", *$4));
-      delete $4;
+    { 
+      // XXX?
     }
+
   | COLON_TOK EXTRAFUNS_TOK LPAREN_TOK fun_symb_decls RPAREN_TOK
     {
-      $$ = new CVC3::Expr(VC->listExpr("_SEQ", *$4));
-      delete $4;
+      //$$ = new CVC3::Expr(VC->listExpr("_SEQ", *$4));
+      //delete $4;
     }
   | COLON_TOK EXTRAPREDS_TOK LPAREN_TOK pred_symb_decls RPAREN_TOK
     {
-      $$ = new CVC3::Expr(VC->listExpr("_SEQ", *$4));
-      delete $4;
+      //$$ = new CVC3::Expr(VC->listExpr("_SEQ", *$4));
+      //delete $4;
     }
+*/
   | COLON_TOK NOTES_TOK STRING_TOK
-    {
-      $$ = NULL;
-      delete $3;
-    }
+    {  }
+
   | COLON_TOK CVC_COMMAND_TOK STRING_TOK
-    {
-      $$ = new CVC3::Expr(VC->listExpr(VC->idExpr("_"+*$3)));
-      delete $3;
-    }
+    {  }
+
   | annotation
-    {
-      $$ = NULL;
-      delete $1;
-    }
-*/
+    {  }
 ;
 
-/*
-logic_name:
+
+logic_name  :
     SYM_TOK LBRACKET_TOK NUMERAL_TOK RBRACKET_TOK
     {
       BVSIZE = atoi($3->c_str());
@@ -353,11 +246,12 @@ logic_name:
 ;
 
 status:
-    SAT_TOK { $$ = NULL; }
-  | UNSAT_TOK { $$ = NULL; }
-  | UNKNOWN_TOK { $$ = NULL; }
+    SAT_TOK { }
+  | UNSAT_TOK { }
+  | UNKNOWN_TOK { }
 ;
 
+/*
 sort_symbs:
     sort_symb 
     {
@@ -461,7 +355,9 @@ pred_sig:
       delete $1;
     }
 ;
+*/
 
+/*
 an_formulas:
     an_formula
     {
@@ -860,11 +756,12 @@ basic_term:
       delete $1;
     }
 ;
+*/
 
+/*
 annotations:
     annotation
     {
-      $$ = new std::vector<std::string>;
       $$->push_back(*$1);
       delete $1;
     }
@@ -875,15 +772,18 @@ annotations:
       delete $2;
     }
   ;
-  
+*/
 
 annotation:
     attribute
     { $$ = $1; }
+
   | attribute user_value
     { $$ = $1; }
+
 ;
 
+
 user_value:
     USER_VAL_TOK
     {
@@ -892,7 +792,7 @@ user_value:
     }
 ;
 
-
+/*
 sort_symb:
     SYM_TOK LBRACKET_TOK NUMERAL_TOK RBRACKET_TOK
     {
@@ -1236,6 +1136,8 @@ fun_symb:
       delete $1;
     }
 ;
+*/
+
 
 attribute:
     COLON_TOK SYM_TOK
@@ -1244,6 +1146,7 @@ attribute:
     }
 ;
 
+/*
 var:
     QUESTION_TOK SYM_TOK
     {