%{ /*****************************************************************************/ /*! * \file smtlib2.y * * Author: Clark Barrett * * Created: Apr 30 2005 * *
* * License to use, copy, modify, sell and/or distribute this software * and its documentation for any purpose is hereby granted without * royalty, subject to the terms and conditions defined in the \ref * LICENSE file provided with this distribution. * *
* */ /*****************************************************************************/ /* This file contains the bison code for the parser that reads in CVC commands in SMT-LIB language. */ #include "vc.h" #include "parser_exception.h" #include "parser_temp.h" #include "translator.h" #include "kinds.h" #include "command_line_flags.h" #include "theory_arith.h" // Exported shared data namespace CVC3 { extern ParserTemp* parserTemp; } // Define shortcuts for various things #define TMP CVC3::parserTemp #define EXPR CVC3::parserTemp->expr #define VC (CVC3::parserTemp->vc) #define ARRAYSENABLED (CVC3::parserTemp->arrFlag) #define BVENABLED (CVC3::parserTemp->bvFlag) #define BVSIZE (CVC3::parserTemp->bvSize) #define RAT(args) CVC3::newRational args #define QUERYPARSED CVC3::parserTemp->queryParsed #define TRANSLATOR CVC3::parserTemp->translator // Suppress the bogus warning suppression in bison (it generates // compile error) #undef __GNUC_MINOR__ /* stuff that lives in smtlib2.lex */ extern int smtlib2lex(void); int smtlib2error(const char *s) { std::ostringstream ss; ss << CVC3::parserTemp->fileName << ":" << CVC3::parserTemp->lineNum << ": " << s; return CVC3::parserTemp->error(ss.str()); } #define YYLTYPE_IS_TRIVIAL 1 #define YYMAXDEPTH 10485760 // static hash_map *operators; %} %union { std::string *str; std::vector *strvec; CVC3::Expr *node; std::vector *vec; std::pair, std::vector > *pat_ann; }; %start command /* strings are for better error messages. "_TOK" is so macros don't conflict with kind names */ %type command command_aux non_keyword_sexpr sexpr term sort_symbol identifier binding sorted_var attribute %type sexprs sort_symbols sort_symbols_nonempty terms bindings sorted_vars attributes numerals %type quantifier %token DECIMAL_TOK %token INTEGER_TOK %token HEX_TOK %token BINARY_TOK %token SYM_TOK %token KEYWORD_TOK %token STRING_TOK %token ASSERT_TOK %token CHECKSAT_TOK %token PUSH_TOK %token POP_TOK %token DECLARE_FUN_TOK %token DECLARE_SORT_TOK %token GET_PROOF_TOK %token GET_ASSIGNMENT_TOK %token GET_VALUE_TOK %token GET_MODEL_TOK %token EXCLAMATION_TOK %token EXIT_TOK %token ITE_TOK %token LET_TOK %token LPAREN_TOK %token RPAREN_TOK %token SET_LOGIC_TOK %token SET_INFO_TOK %token UNDERSCORE_TOK %token EOF_TOK // Logic symbols /* %token AND_TOK */ /* %token AT_TOK */ /* %token DISTINCT_TOK */ /* %token DIV_TOK */ /* %token EQUAL_TOK */ %token EXISTS_TOK /* %token FALSE_TOK */ %token FORALL_TOK /* %token GREATER_THAN_TOK */ /* %token GREATER_THAN_EQ_TOK */ /* %token IFF_TOK */ /* %token IMPLIES_TOK */ /* %token LESS_THAN_TOK */ /* %token LESS_THAN_EQ_TOK */ /* %token MINUS_TOK */ /* %token NOT_TOK */ /* %token OR_TOK */ /* %token PERCENT_TOK */ /* %token PLUS_TOK */ /* %token POUND_TOK */ /* %token STAR_TOK */ /* %token TRUE_TOK */ /* %token XOR_TOK */ %% command: LPAREN_TOK command_aux RPAREN_TOK { EXPR = *$2; delete $2; YYACCEPT; } | EOF_TOK { TMP->done = true; EXPR = CVC3::Expr(); YYACCEPT; } ; command_aux: SET_LOGIC_TOK SYM_TOK { ARRAYSENABLED = false; BVENABLED = false; std::vector subCommands; /* Add the symbols of the core theory */ subCommands.push_back( VC->listExpr("_TYPEDEF", VC->idExpr("Bool"), VC->idExpr("_BOOLEAN")) ); subCommands.push_back( VC->listExpr("_CONST", VC->idExpr("true"), VC->idExpr("Bool"), VC->idExpr("_TRUE_EXPR")) ); subCommands.push_back( VC->listExpr("_CONST", VC->idExpr("false"), VC->idExpr("Bool"), VC->idExpr("_FALSE_EXPR")) ); if (*$2 == "QF_AX" || *$2 == "QF_AUFLIA" || *$2 == "AUFLIA" || *$2 == "QF_AUFLIRA" || *$2 == "AUFLIRA" || *$2 == "QF_AUFNIRA" || *$2 == "AUFNIRA" || *$2 == "QF_AUFBV" || *$2 == "QF_ABV") { ARRAYSENABLED = true; } if (*$2 == "QF_AUFBV" || *$2 == "QF_ABV" || *$2 == "QF_BV" || *$2 == "QF_UFBV") { BVENABLED = true; } /* Add the Int type for logics that include it */ if (*$2 == "AUFLIA" || *$2 == "AUFLIRA" || *$2 == "AUFNIRA" || *$2 == "QF_AUFLIA" || *$2 == "QF_IDL" || *$2 == "QF_LIA" || *$2 == "QF_NIA" || *$2 == "QF_UFIDL" || *$2 == "QF_UFLIA" || *$2 == "UFNIA" ) { subCommands.push_back( VC->listExpr("_TYPEDEF", VC->idExpr("Int"), VC->idExpr("_INT")) ); } /* Add the Real type for logics that include it */ if (*$2 == "AUFLIRA" || *$2 == "AUFNIRA" || *$2 == "LRA" || *$2 == "QF_RDL" || *$2 == "QF_LRA" || *$2 == "QF_NRA" || *$2 == "QF_UFLRA" || *$2 == "QF_UFNRA" || *$2 == "UFLRA" || *$2 == "QF_UFRDL" ) { subCommands.push_back( VC->listExpr("_TYPEDEF", VC->idExpr("Real"), VC->idExpr("_REAL")) ); } /* Enable complete instantiation heuristics */ if (*$2 == "AUFLIA" || *$2 == "AUFLIRA" || *$2 == "AUFNIRA" || *$2 == "LRA" || *$2 == "UFLRA" || *$2 == "UFNIA") { subCommands.push_back( VC->listExpr("_OPTION", VC->stringExpr("quant-complete-inst"), VC->ratExpr(1)) ); } $$ = new CVC3::Expr(VC->listExpr("_SEQ", subCommands)); delete $2; } | SET_INFO_TOK KEYWORD_TOK sexpr { $$ = NULL; if(*$2 == ":status") { TRANSLATOR->setStatus((*$3)[0].getString()); } else if(*$2 == ":source") { if($3->getKind() == CVC3::STRING_EXPR) { TRANSLATOR->setSource($3->getString()); } else if($3->getKind() == CVC3::ID) { TRANSLATOR->setSource((*$3)[0].getString()); } else { smtlib2error("bad type for set-info :source"); } } else if(*$2 == ":category") { TRANSLATOR->setCategory($3->getString()); } else if(*$2 == ":notes") { std::string notes; if($3->getKind() == CVC3::STRING_EXPR) { notes = $3->getString(); } else if($3->getKind() == CVC3::ID) { notes = (*$3)[0].getString(); } else { smtlib2error("bad type for set-info :notes"); } $$ = new CVC3::Expr(VC->listExpr("_ANNOTATION", VC->listExpr(VC->stringExpr("notes"), VC->stringExpr(notes)))); } delete $2; delete $3; if($$ == NULL) { $$ = new CVC3::Expr(); } } | DECLARE_SORT_TOK SYM_TOK INTEGER_TOK { $$ = new CVC3::Expr(VC->listExpr("_TYPE", VC->idExpr(*$2))); delete $2; } | DECLARE_FUN_TOK SYM_TOK LPAREN_TOK sort_symbols RPAREN_TOK sort_symbol { if ($4->size() == 0) { $$ = new CVC3::Expr(VC->listExpr("_CONST", VC->idExpr(*$2), (*$6))); } else { $4->push_back( *$6 ); CVC3::Expr tmp(VC->listExpr("_ARROW", *$4)); $$ = new CVC3::Expr(VC->listExpr("_CONST", VC->idExpr(*$2), tmp)); } delete $2; delete $4; delete $6; } | ASSERT_TOK term { $$ = new CVC3::Expr(VC->listExpr("_ASSERT", *$2)); delete $2; } | CHECKSAT_TOK { $$ = new CVC3::Expr(VC->listExpr("_CHECKSAT", CVC3::Expr(VC->idExpr("_TRUE_EXPR")))); } | PUSH_TOK INTEGER_TOK { $$ = new CVC3::Expr(VC->listExpr("_PUSH", CVC3::Expr(VC->ratExpr((*$2))))); } | POP_TOK INTEGER_TOK { $$ = new CVC3::Expr(VC->listExpr("_POP", CVC3::Expr(VC->ratExpr((*$2))))); } | GET_PROOF_TOK { $$ = new CVC3::Expr(VC->listExpr(VC->idExpr("_DUMP_PROOF"))); } | GET_ASSIGNMENT_TOK { $$ = new CVC3::Expr(VC->listExpr(VC->idExpr("_GET_ASSIGNMENT"))); } | GET_VALUE_TOK LPAREN_TOK terms RPAREN_TOK { $$ = new CVC3::Expr(VC->listExpr(VC->idExpr("_GET_VALUE"), VC->listExpr(*$3))); delete $3; } | GET_MODEL_TOK { $$ = new CVC3::Expr(VC->listExpr(VC->idExpr("_COUNTERMODEL"))); } | EXIT_TOK { TMP->done = true; $$ = new CVC3::Expr(); } ; sexprs: sexpr { $$ = new std::vector; $$->push_back(*$1); delete $1; } | sexprs sexpr { $1->push_back(*$2); $$ = $1; delete $2; } ; /* An S-expression that is not a keyword (NOTE: it may contain keywords in sub-expressions; it's just not *only* a keyword). */ non_keyword_sexpr: INTEGER_TOK { $$ = new CVC3::Expr(VC->ratExpr(*$1)); delete $1; } | DECIMAL_TOK { $$ = new CVC3::Expr(VC->ratExpr(*$1)); if(VC->getFlags()["translate"].getBool() && $1->find('.') != std::string::npos) { CVC3::Expr* e = $$; $$ = new CVC3::Expr(CVC3::REAL_CONST, *e); delete e; } delete $1; } | STRING_TOK { $$ = new CVC3::Expr(VC->stringExpr(*$1)); delete $1;} | SYM_TOK { $$ = new CVC3::Expr(VC->idExpr(*$1)); delete $1;} | LPAREN_TOK sexprs RPAREN_TOK { $$ = new CVC3::Expr(VC->listExpr(*$2)); delete $2; } ; sexpr: non_keyword_sexpr { $$ = $1; } | KEYWORD_TOK { $$ = new CVC3::Expr(VC->idExpr(*$1)); delete $1;} /* Possibly empty list of sort symbols */ sort_symbols: /* empty */ { $$ = new std::vector; } | sort_symbols_nonempty { $$ = $1; } ; sort_symbols_nonempty: sort_symbol { $$ = new std::vector; $$->push_back(*$1); delete $1; } | sort_symbols sort_symbol { $1->push_back(*$2); $$ = $1; delete $2; } ; sort_symbol: identifier { CVC3::Expr id = *$1; if( BVENABLED && id.isRawList() && id[0].getKind() == CVC3::ID && id[0][0].getString() == "BitVec" && id.arity() == 2 && id[1].isRational() ) { $$ = new CVC3::Expr( VC->listExpr("_BITVECTOR", id[1]) ); delete $1; } else { $$ = $1; } } | LPAREN_TOK identifier sort_symbols_nonempty RPAREN_TOK { CVC3::Expr id = *$2; if (ARRAYSENABLED && id.getKind() == CVC3::ID && id[0].getString() == "Array" && $3->size() == 2) { $$ = new CVC3::Expr( VC->listExpr("_ARRAY", *$3) ); } else { // FIXME: How to handle non-array parameterized types? $3->insert( $3->begin(), *$2 ); $$ = new CVC3::Expr( VC->listExpr(*$3) ); } delete $2; delete $3; } ; identifier: SYM_TOK { std::string id = *$1; /* If the id is a built-in operator, replace the text with the internal name. NOTE: the right way to do this would be would be with a hash_map or trie. */ if (id == "and") { id = "_AND"; } else if (id == "distinct") { id = "_DISTINCT"; } else if (id == "ite") { id = "_IF"; } else if (id == "/") { id = "_DIVIDE"; } else if (id == "=") { id = "_EQ"; } else if (id == ">") { id = "_GT"; } else if (id == ">=") { id = "_GE"; } else if (id == "=>") { id = "_IMPLIES"; } else if (id == "<") { id = "_LT"; } else if (id == "<=") { id = "_LE"; } else if (id == "-") { id = "_MINUS"; } else if (id == "not") { id = "_NOT"; } else if (id == "or") { id = "_OR"; } else if (id == "+") { id = "_PLUS"; } else if (id == "*") { id = "_MULT"; } else if (id == "is_int") { id = "_IS_INTEGER"; } else if (id == "xor") { id = "_XOR"; } else if (ARRAYSENABLED && id == "select") { id = "_READ"; } else if (ARRAYSENABLED && id == "store") { id = "_WRITE"; } else if (BVENABLED && id == "concat") { id = "_CONCAT"; } else if (BVENABLED && id == "bvadd") { id = "_BVPLUS"; } else if (BVENABLED && id == "bvand") { id = "_BVAND"; } else if (BVENABLED && id == "bvashr") { id = "_BVASHR"; } else if (BVENABLED && id == "bvcomp") { id = "_BVCOMP"; } else if (BVENABLED && id == "bvlshr") { id = "_BVLSHR"; } else if (BVENABLED && id == "bvmul") { id = "_BVMULT"; } else if (BVENABLED && id == "bvneg") { id = "_BVUMINUS"; } else if (BVENABLED && id == "bvnand") { id = "_BVNAND"; } else if (BVENABLED && id == "bvnot") { id = "_BVNEG"; } else if (BVENABLED && id == "bvnor") { id = "_BVNOR"; } else if (BVENABLED && id == "bvor") { id = "_BVOR"; } else if (BVENABLED && id == "bvshl") { id = "_BVSHL"; } else if (BVENABLED && id == "bvsdiv") { id = "_BVSDIV"; } else if (BVENABLED && id == "bvsge") { id = "_BVSGE"; } else if (BVENABLED && id == "bvsgt") { id = "_BVSGT"; } else if (BVENABLED && id == "bvsle") { id = "_BVSLE"; } else if (BVENABLED && id == "bvslt") { id = "_BVSLT"; } else if (BVENABLED && id == "bvsmod") { id = "_BVSMOD"; } else if (BVENABLED && id == "bvsrem") { id = "_BVSREM"; } else if (BVENABLED && id == "bvsub") { id = "_BVSUB"; } else if (BVENABLED && id == "bvudiv") { id = "_BVUDIV"; } else if (BVENABLED && id == "bvuge") { id = "_BVGE"; } else if (BVENABLED && id == "bvugt") { id = "_BVGT"; } else if (BVENABLED && id == "bvule") { id = "_BVLE"; } else if (BVENABLED && id == "bvult") { id = "_BVLT"; } else if (BVENABLED && id == "bvurem") { id = "_BVUREM"; } else if (BVENABLED && id == "bvxnor") { id = "_BVXNOR"; } else if (BVENABLED && id == "bvxor") { id = "_BVXOR"; } $$ = new CVC3::Expr( VC->idExpr( id ) ); delete $1; } | LPAREN_TOK UNDERSCORE_TOK SYM_TOK numerals RPAREN_TOK { std::string id = *$3; std::vector numerals = *$4; if (BVENABLED && id.size() > 2 && id[0] == 'b' && id[1] == 'v' && numerals.size() == 1) { DebugAssert( numerals[0].isRational() && numerals[0].getRational().isInteger(), "Illegal size argument to bit-vector constant." ); $$ = new CVC3::Expr( VC->listExpr("_BVCONST", VC->ratExpr(id.substr(2), 10), (*$4)[0]) ); } else { if (BVENABLED && id == "extract") { id = "_EXTRACT"; } else if (BVENABLED && id == "repeat") { id = "_BVREPEAT"; } else if (BVENABLED && id == "zero_extend") { id = "_BVZEROEXTEND"; } else if (BVENABLED && id == "sign_extend") { id = "_SX"; } else if (BVENABLED && id == "rotate_left") { id = "_BVROTL"; } else if (BVENABLED && id == "rotate_right") { id = "_BVROTR"; } $$ = new CVC3::Expr( VC->listExpr( id, *$4 ) ); } delete $3; delete $4; } ; /* a non-empty sequence of integers */ numerals: INTEGER_TOK { $$ = new std::vector; $$->push_back( VC->ratExpr(*$1) ); delete $1; } | numerals INTEGER_TOK { $1->push_back( VC->ratExpr(*$2) ); $$ = $1; delete $2; } ; /* A non-empty sequence of terms. */ terms: term { $$ = new std::vector; $$->push_back(*$1); delete $1; } | terms term { $1->push_back(*$2); $$ = $1; delete $2; } ; term: LPAREN_TOK identifier terms RPAREN_TOK { CVC3::Expr op = *$2; std::vector args = *$3; std::vector resultList; bool isId = op.getKind() == CVC3::ID; std::string opStr; if( isId ) { opStr = op[0].getString(); } if( isId && opStr == "_MINUS" && args.size() == 1 ) { resultList.push_back( VC->idExpr("_UMINUS") ); resultList.push_back( args[0] ); } else if( isId && ( opStr == "_AND" || opStr == "_OR" || opStr == "_XOR" || opStr == "_PLUS" || opStr == "_MULT" ) && args.size() == 1 ) { smtlib2error("[bin,N]-ary operator used in unary context"); } else { const int arity = op.arity(); isId = arity > 0 && op[0].getKind() == CVC3::ID; if( isId ) { opStr = op[0][0].getString(); } if( BVENABLED && arity == 3 && isId && opStr == "_EXTRACT" && op[1].isRational() && op[1].getRational().isInteger() && op[2].isRational() && op[2].getRational().isInteger() ) { resultList.push_back( op[0] ); resultList.push_back(op[1]); resultList.push_back(op[2]); } else if( BVENABLED && arity == 2 && isId && ( opStr == "_BVREPEAT" || opStr == "_BVZEROEXTEND" || opStr == "_BVROTL" || opStr == "_BVROTR" || opStr == "_SX" ) && op[1].isRational() && op[1].getRational().isInteger() ) { resultList.push_back( op[0] ); if( opStr == "_SX" ) { resultList.push_back(VC->idExpr("_smtlib")); } resultList.push_back(op[1]); } else { resultList.push_back(op); } resultList.insert( resultList.end(), args.begin(), args.end() ); } $$ = new CVC3::Expr(VC->listExpr(resultList)); delete $2; delete $3; } | LPAREN_TOK LET_TOK LPAREN_TOK bindings RPAREN_TOK term RPAREN_TOK { CVC3::Expr e(VC->listExpr(*$4)); $$ = new CVC3::Expr(VC->listExpr("_LET", e, *$6)); delete $4; delete $6; } | LPAREN_TOK quantifier LPAREN_TOK sorted_vars RPAREN_TOK term RPAREN_TOK { CVC3::Expr e(VC->listExpr(*$4)); CVC3::Expr body(*$6); DebugAssert( body.arity() > 0, "Empty quantifier body." ); if( body[0].isString() && body[0].getString() == "_ANNOTATION" ) { CVC3::Expr annots = body[2]; body = body[1]; // real body, stripping annot wrapper std::vector patterns; for( int i = 0; i < annots.arity(); ++i ) { DebugAssert( annots[i].arity() == 2 && annots[i][0].getKind() == CVC3::ID, "Illegal annotation." ); if( annots[i][0][0].getString() == ":pattern" ) { patterns.push_back( annots[i][1] ); } } $$ = new CVC3::Expr(VC->listExpr(*$2, e, body, VC->listExpr(patterns))); } else { $$ = new CVC3::Expr(VC->listExpr(*$2, e, body)); } delete $2; delete $4; delete $6; } | LPAREN_TOK EXCLAMATION_TOK term attributes RPAREN_TOK { $$ = new CVC3::Expr(VC->listExpr(VC->stringExpr("_ANNOTATION"), *$3, VC->listExpr(*$4))); delete $3; delete $4; } | identifier { $$ = $1; } | DECIMAL_TOK { $$ = new CVC3::Expr(VC->ratExpr(*$1)); if(VC->getFlags()["translate"].getBool() && $1->find('.') != std::string::npos) { CVC3::Expr* e = $$; $$ = new CVC3::Expr(CVC3::REAL_CONST, *e); delete e; } delete $1; } | INTEGER_TOK { $$ = new CVC3::Expr(VC->ratExpr(*$1)); delete $1; } | HEX_TOK { std::vector args; args.push_back(VC->idExpr("_BVCONST")); args.push_back(VC->ratExpr(*$1, 16)); args.push_back(VC->ratExpr(4 * $1->length())); $$ = new CVC3::Expr(VC->listExpr(args)); delete $1; } | BINARY_TOK { std::vector args; args.push_back(VC->idExpr("_BVCONST")); args.push_back(VC->ratExpr(*$1, 2)); args.push_back(VC->ratExpr($1->length())); $$ = new CVC3::Expr(VC->listExpr(args)); delete $1; } ; /* builtin: */ /* AND_TOK { $$ = new std::string("_AND"); } */ /* | DIV_TOK { $$ = new std::string("_DIVIDE"); } */ /* | DISTINCT_TOK { $$ = new std::string("_DISTINCT"); } */ /* | EQUAL_TOK { $$ = new std::string("_EQ"); } */ /* | GREATER_THAN_TOK { $$ = new std::string("_GT"); } */ /* | GREATER_THAN_EQ_TOK { $$ = new std::string("_GE"); } */ /* | IFF_TOK { $$ = new std::string("_IFF"); } */ /* | IMPLIES_TOK { $$ = new std::string("_IMPLIES"); } */ /* | ITE_TOK { $$ = new std::string("_IF"); } */ /* | LESS_THAN_TOK { $$ = new std::string("_LT"); } */ /* | LESS_THAN_EQ_TOK { $$ = new std::string("_LE"); } */ /* | MINUS_TOK { $$ = new std::string("_MINUS"); } */ /* | NOT_TOK { $$ = new std::string("_NOT"); } */ /* | OR_TOK { $$ = new std::string("_OR"); } */ /* | PLUS_TOK { $$ = new std::string("_PLUS"); } */ /* | STAR_TOK { $$ = new std::string("_MULT"); } */ /* | XOR_TOK { $$ = new std::string("_XOR"); } */ /* ; */ /* Returns a vector containing the operator and its arguments. This is necessary because of the behavior of certain parameterized operators (e.g., extract). */ /* op: */ /* builtin */ /* { */ /* $$ = new std::vector; */ /* $$->push_back( VC->idExpr(*$1) ); */ /* delete $1; */ /* } */ /* | identifier */ /* { */ /* $$ = new std::vector; */ /* CVC3::Expr id = *$1; */ /* if( id.getKind() == CVC3::ID ) { */ /* std::string fname = id[0].getString(); */ /* if (ARRAYSENABLED && fname == "select") { */ /* $$->push_back( VC->idExpr("_READ") ); */ /* } else if (ARRAYSENABLED && fname == "store") { */ /* $$->push_back( VC->idExpr("_WRITE") ); */ /* } else if (BVENABLED && fname == "concat") { */ /* $$->push_back( VC->idExpr("_CONCAT") ); */ /* } else if (BVENABLED && fname == "bvadd") { */ /* $$->push_back( VC->idExpr("_BVPLUS") ); */ /* } else if (BVENABLED && fname == "bvand") { */ /* $$->push_back( VC->idExpr("_BVAND") ); */ /* } else if (BVENABLED && fname == "bvashr") { */ /* $$->push_back( VC->idExpr("_BVASHR") ); */ /* } else if (BVENABLED && fname == "bvcomp") { */ /* $$->push_back( VC->idExpr("_BVCOMP") ); */ /* } else if (BVENABLED && fname == "bvlshr") { */ /* $$->push_back( VC->idExpr("_BVLSHR") ); */ /* } else if (BVENABLED && fname == "bvmul") { */ /* $$->push_back( VC->idExpr("_BVMULT") ); */ /* } else if (BVENABLED && fname == "bvneg") { */ /* $$->push_back( VC->idExpr("_BVUMINUS") ); */ /* } else if (BVENABLED && fname == "bvnand") { */ /* $$->push_back( VC->idExpr("_BVNAND") ); */ /* } else if (BVENABLED && fname == "bvnot") { */ /* $$->push_back( VC->idExpr("_BVNEG") ); */ /* } else if (BVENABLED && fname == "bvnor") { */ /* $$->push_back( VC->idExpr("_BVNOR") ); */ /* } else if (BVENABLED && fname == "bvor") { */ /* $$->push_back( VC->idExpr("_BVOR") ); */ /* } else if (BVENABLED && fname == "bvshl") { */ /* $$->push_back( VC->idExpr("_BVSHL") ); */ /* } else if (BVENABLED && fname == "bvsdiv") { */ /* $$->push_back( VC->idExpr("_BVSDIV") ); */ /* } else if (BVENABLED && fname == "bvsge") { */ /* $$->push_back( VC->idExpr("_BVSGE") ); */ /* } else if (BVENABLED && fname == "bvsgt") { */ /* $$->push_back( VC->idExpr("_BVSGT") ); */ /* } else if (BVENABLED && fname == "bvsle") { */ /* $$->push_back( VC->idExpr("_BVSLE") ); */ /* } else if (BVENABLED && fname == "bvslt") { */ /* $$->push_back( VC->idExpr("_BVSLT") ); */ /* } else if (BVENABLED && fname == "bvsrem") { */ /* $$->push_back( VC->idExpr("_BVSREM") ); */ /* } else if (BVENABLED && fname == "bvsub") { */ /* $$->push_back( VC->idExpr("_BVSUB") ); */ /* } else if (BVENABLED && fname == "bvudiv") { */ /* $$->push_back( VC->idExpr("_BVUDIV") ); */ /* } else if (BVENABLED && fname == "bvuge") { */ /* $$->push_back( VC->idExpr("_BVUGE") ); */ /* } else if (BVENABLED && fname == "bvugt") { */ /* $$->push_back( VC->idExpr("_BVUGT") ); */ /* } else if (BVENABLED && fname == "bvule") { */ /* $$->push_back( VC->idExpr("_BVULE") ); */ /* } else if (BVENABLED && fname == "bvult") { */ /* $$->push_back( VC->idExpr("_BVLT") ); */ /* } else if (BVENABLED && fname == "bvurem") { */ /* $$->push_back( VC->idExpr("_BVUREM") ); */ /* } else if (BVENABLED && fname == "bvxnor") { */ /* $$->push_back( VC->idExpr("_BVXNOR") ); */ /* } else if (BVENABLED && fname == "bvxor") { */ /* $$->push_back( VC->idExpr("_BVXOR") ); */ /* } else { */ /* $$->push_back( id ); */ /* } */ /* } else if( BVENABLED && */ /* id.arity() > 0 && */ /* id[0].getKind() == CVC3::ID ) { */ /* if( id.arity() == 3 && */ /* id[0][0].getString() == "extract" && */ /* id[1].isRational() && */ /* id[1].getRational().isInteger() && */ /* id[2].isRational() && */ /* id[2].getRational().isInteger() ) { */ /* $$->push_back( VC->idExpr("_EXTRACT") ); */ /* $$->push_back(id[1]); */ /* $$->push_back(id[2]); */ /* } else if( id.arity() == 2 && */ /* id[0][0].getString() == "repeat" && */ /* id[1].isRational() && */ /* id[1].getRational().isInteger() ) { */ /* $$->push_back( VC->idExpr("_BVREPEAT") ); */ /* $$->push_back(id[1]); */ /* } else if( id.arity() == 2 && */ /* id[0][0].getString() == "zero_extend" && */ /* id[1].isRational() && */ /* id[1].getRational().isInteger() ) { */ /* $$->push_back( VC->idExpr("_BVZEROEXTEND") ); */ /* $$->push_back(id[1]); */ /* } else if( id.arity() == 2 && */ /* id[0][0].getString() == "sign_extend" && */ /* id[1].isRational() && */ /* id[1].getRational().isInteger() ) { */ /* $$->push_back( VC->idExpr("_SX") ); */ /* $$->push_back(VC->idExpr("_smtlib")); */ /* $$->push_back(id[1]); */ /* } else if( id.arity() == 2 && */ /* id[0].getKind() == CVC3::ID && */ /* id[0][0].getString() == "rotate_left" && */ /* id[1].isRational() && */ /* id[1].getRational().isInteger() ) { */ /* $$->push_back( VC->idExpr("_BVROTL") ); */ /* $$->push_back(id[1]); */ /* } else if( id.arity() == 2 && */ /* id[0].getKind() == CVC3::ID && */ /* id[0][0].getString() == "rotate_right" && */ /* id[1].isRational() && */ /* id[1].getRational().isInteger() ) { */ /* $$->push_back( VC->idExpr("_BVROTR") ); */ /* $$->push_back(id[1]); */ /* } else { */ /* $$->push_back(id); */ /* } */ /* } else { */ /* $$->push_back(id); */ /* } */ /* delete $1; */ /* } */ /* ; */ quantifier: EXISTS_TOK { $$ = new std::string("_EXISTS"); } | FORALL_TOK { $$ = new std::string("_FORALL"); } ; /* A non-empty sequence of (var term) bindings */ bindings: binding { $$ = new std::vector; $$->push_back(*$1); delete $1; } | bindings binding { $1->push_back(*$2); $$ = $1; delete $2; } ; binding: LPAREN_TOK SYM_TOK term RPAREN_TOK { $$ = new CVC3::Expr( VC->listExpr(*$2, *$3) ); delete $2; delete $3; } ; /* A non-empty sequence of (var sort) decls */ sorted_vars: sorted_var { $$ = new std::vector; $$->push_back(*$1); delete $1; } | sorted_vars sorted_var { $1->push_back(*$2); $$ = $1; delete $2; } ; sorted_var: LPAREN_TOK SYM_TOK sort_symbol RPAREN_TOK { $$ = new CVC3::Expr(VC->listExpr(*$2, *$3)); delete $2; delete $3; } ; /* A non-empty sequence of attributes */ attributes: attribute { $$ = new std::vector; $$->push_back( *$1 ); delete $1; } | attributes attribute { $1->push_back( *$2 ); $$ = $1; delete $2; } ; attribute: KEYWORD_TOK { $$ = new CVC3::Expr( VC->idExpr(*$1) ); delete $1; } | KEYWORD_TOK SYM_TOK { $$ = new CVC3::Expr( VC->listExpr( VC->idExpr(*$1), VC->idExpr(*$2) ) ); delete $1; delete $2; } | KEYWORD_TOK INTEGER_TOK { $$ = new CVC3::Expr( VC->listExpr( VC->idExpr(*$1), VC->ratExpr(*$2) ) ); delete $1; delete $2; } | KEYWORD_TOK DECIMAL_TOK { $$ = new CVC3::Expr( VC->listExpr( VC->idExpr(*$1), VC->ratExpr(*$2) ) ); delete $1; delete $2; } | KEYWORD_TOK HEX_TOK { $$ = new CVC3::Expr( VC->listExpr( VC->idExpr(*$1), VC->ratExpr(*$2, 16) ) ); delete $1; delete $2; } | KEYWORD_TOK BINARY_TOK { $$ = new CVC3::Expr( VC->listExpr( VC->idExpr(*$1), VC->ratExpr(*$2, 2) ) ); delete $1; delete $2; } | KEYWORD_TOK STRING_TOK { $$ = new CVC3::Expr( VC->listExpr( VC->idExpr(*$1), VC->stringExpr(*$2) ) ); delete $1; delete $2; } | KEYWORD_TOK LPAREN_TOK terms RPAREN_TOK { // was "non_keyword_sexpr" above instead of "(terms)", but that breaks :pattern $$ = new CVC3::Expr( VC->listExpr( VC->idExpr(*$1), VC->listExpr(*$3) ) ); delete $1; delete $3; } ; %%