bool CoreTheory::handleDistinct(const std::vector<types::TermType>& arguments, types::TermType& result, TheoryError& errors) { std::vector<FormulaT> args; if (!convertArguments(arguments, args, errors)) return false; result = expandDistinct(args, [](const FormulaT& a, const FormulaT& b){ return FormulaT(carl::FormulaType::XOR, {a, b}); }); return true; }
bool CoreTheory::functionCall(const Identifier& identifier, const std::vector<types::TermType>& arguments, types::TermType& result, TheoryError& errors) { std::vector<FormulaT> args; if (!convertArguments(arguments, args, errors)) return false; if (boost::iequals(identifier.symbol, "=")) { result = FormulaT(carl::FormulaType::IFF, FormulasT(args.begin(), args.end())); return true; } return false; }
int _tmain(int argc, _TCHAR* argv[]) #endif { int32_t iRet = RETVALUE_SUCCESS; #ifdef __APPLE__ _TCHAR** argv = convertArguments( argc, argvOriginal ); #endif //Initialize argument handler ArgumentHandler argumenthandler( ARRAYSIZE( options ), options ); //Initialize a parser interface cri::CParser* parser = new cri::CParser; //Initialize error handler cri::CErrorPool *error = new cri::CErrorPool; error->setErrorTable( cri::g_ErrorTable_English, sizeof( cri::g_ErrorTable_English ) / sizeof( cri::g_ErrorTable_English[ 0 ] ) ); //parse args argumenthandler.setErrorHandler( error ); int32_t iArgOffset = argumenthandler.parse( argc, argv ); //Set error output configuration error->suppressErrorLine( g_bsuppressErrorLine ); if( !g_bSuppressBanner ) { CRISCRIPT_VERSIONS ver = parser->getVersions(); cout << "CriScript compiler and linker ver."; cout << ver.major << "."; cout << ver.minor << "."; cout << ver.revision << "."; cout << ver.build << "\n"; cout << "CRI Middleware inc. 2008" << endl; } if( argc <= iArgOffset ) { if( error->hasError() ) error->dumpError(); delete( error ); //Output help info cout << endl; cout << "cscl.exe [options] source" << endl; cout << "Option switch:" << endl; for( int32_t i = 0; i < ARRAYSIZE( options ); ++ i ) { wcout << options[ i ].strOption << " : " << options[ i ].strDescription << endl; } delete( parser ); #ifdef __APPLE__ deleteArguments( argc, argv ); #endif return RETVALUE_SUCCESS; } //Open the target file #ifdef __APPLE__ ifstream fin ( argvOriginal[ iArgOffset ], ios::in | ios::binary ); #else ifstream fin ( argv[ iArgOffset ], ios::in | ios::binary ); #endif if( !fin ) { wstring strArg1( argv[ iArgOffset ] ); wstring strNull( L"" ); error->report( ERROR_FILENOTFOUND, 0, 0, strArg1, strNull, strArg1 ); error->dumpError(); delete( error ); delete( parser ); #ifdef __APPLE__ deleteArguments( argc, argv ); #endif return RETVALUE_TOOL_ERROR; } //Check file endianness; //Note that wchar_t is 4 byte in OSX. uint16_t c; fin.read( (char*)&c, sizeof( uint16_t ) ); bool bSourceEndiannness = false; switch( c ) { case 0xfeff: //Little endian break; case 0xfffe: //Big endian bSourceEndiannness = true; break; default: { wstring strArg1( argv[ iArgOffset ] ); wstring strNull( L"" ); error->report( ERROR_INVALIDFILEENCODING, 0, 0, strArg1, strNull, strArg1 ); error->dumpError(); delete( error ); } delete( parser ); #ifdef __APPLE__ deleteArguments( argc, argv ); #endif return RETVALUE_TOOL_ERROR; } //Initialize the lexer cri::CFileStreamLexer *lex = new cri::CFileStreamLexer; //test lex->init(); lex->setEndianness( bSourceEndiannness ); //Initialize the codegen cri::CCilCodeGen *codegen = new cri::CCilCodeGen; //Initialize the parser engine parser->init( lex, codegen, error ); //Set filestream to the lexer lex->setStream( &fin, &wstring( argv[ iArgOffset ] ) ); #ifdef DEBUG_PARSING //debug cri::yydebug = 1; #endif if( !g_bPerformLinkage ) { iRet = Compile( parser, fin ); g_bPerformExecution = false; } else { iRet = CompileAndLink( parser, fin ); } if( error->hasError() ) { error->dumpError(); cout << "Compile failed." << endl; iRet = RETVALUE_COMPILE_ERROR; } else { if( error->hasInformation() ) { iRet = RETVALUE_COMPILE_WARNING; cout << "Compile succeeded but with some warnings" << endl; } else { iRet = RETVALUE_SUCCESS; cout << "Compile succeeded." << endl; } error->dumpError(); } if( g_bPerformExecution && iRet != RETVALUE_COMPILE_ERROR ) { cri::CCilVm *vm = new cri::CCilVm; cri::CCilDebugger *debugger = new cri::CCilDebugger; vm->setILPool( &*parser->getILPool().begin(), parser->getILPool().size() ); //Note: //setSymbolInformation need to be invoked before SetMetaData() for now vm->setSymbolInformation( parser->getSymbolInformation() ); vm->setMetaData( parser->getMetaData() ); cout << "-----------------------------------------------------------------\n"; cri::CCilDisasm * disasm = new cri::CCilDisasm; disasm->setILStream( &*parser->getILPool().begin(), parser->getILPool().size() ); disasm->setSymbolInformation( parser->getSymbolInformation() ); disasm->setMetaData( parser->getMetaData() ); disasm->dumpDisasm(); cout << "-----------------------------------------------------------------\n"; iRet = vm->execute(); iRet = vm->getExitCode(); debugger->attach( vm ); debugger->setSymbolInformation( parser->getSymbolInformation() ); debugger->setMetaData( parser->getMetaData() ); debugger->debugDumpStats(); debugger->debugDumpStaticFields( 0 ); //dump all fields debugger->debugDumpObjects( 0 ); //dump all objects delete( disasm ); delete( debugger ); delete( vm ); } delete( lex ); delete( error ); delete( codegen ); delete( parser ); #ifdef __APPLE__ deleteArguments( argc, argv ); #endif return iRet; }