⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 parser.cpp

📁 ICE-3.2 一个开源的中间件
💻 CPP
字号:
// **********************************************************************//// Copyright (c) 2003-2007 ZeroC, Inc. All rights reserved.//// This copy of Ice is licensed to you under the terms described in the// ICE_LICENSE file included in this distribution.//// **********************************************************************#include <IceUtil/DisableWarnings.h>#include <Parser.h>#ifdef HAVE_READLINE#   include <readline/readline.h>#   include <readline/history.h>#endifusing namespace std;using namespace Demo;extern FILE* yyin;Parser* parser;voidParser::usage(){    cout <<        "help                    Print this message.\n"        "exit, quit              Exit this program.\n"        "add isbn title authors  Create new book.\n"        "isbn NUMBER             Find the book with given ISBN number.\n"        "authors NAME            Find all books by the given authors.\n"        "next                    Set the current book to the next one that was found.\n"        "current                 Display the current book.\n"        "rent NAME               Rent the current book for customer NAME.\n"        "return                  Return the currently rented book.\n"        "remove                  Permanently remove the current book from the library.\n"        "size SIZE               Set the evictor size for books to SIZE.\n"        "shutdown                Shut the library server down.\n";}ParserPtrParser::createParser(const LibraryPrx& library){    return new Parser(library);}voidParser::addBook(const list<string>& _args){    if(_args.size() != 3)    {        error("`add' requires at exactly three arguments (type `help' for more info)");        return;    }    try    {        list<string> args = _args;        BookDescription desc;        desc.isbn = args.front();        args.pop_front();        desc.title = args.front();        args.pop_front();        desc.authors = args.front();        BookPrx book = _library->createBook(desc);        cout << "added new book with isbn " << desc.isbn << endl;    }    catch(const DatabaseException& ex)    {        error(ex.message);    }    catch(const BookExistsException&)    {        error("the book already exists.");    }    catch(const Ice::Exception& ex)    {        ostringstream s;        s << ex;        error(s.str());    }}voidParser::findIsbn(const list<string>& args){    if(args.size() != 1)    {        error("`isbn' requires exactly one argument (type `help' for more info)");        return;    }    try    {        _foundBooks.clear();        _current = _foundBooks.begin();        BookPrx book = _library->findByIsbn(args.front());        if(!book)        {            cout << "no book with that ISBN number exists." << endl;        }        else        {            _foundBooks.push_back(book);            _current = _foundBooks.begin();            printCurrent();        }    }    catch(const DatabaseException& ex)    {        error(ex.message);    }    catch(const Ice::Exception& ex)    {        ostringstream s;        s << ex;        error(s.str());    }}voidParser::findAuthors(const list<string>& args){    if(args.size() != 1)    {        error("`authors' requires exactly one argument (type `help' for more info)");        return;    }    try    {        _foundBooks = _library->findByAuthors(args.front());        _current = _foundBooks.begin();        cout << "number of books found: " << _foundBooks.size() << endl;        printCurrent();    }    catch(const DatabaseException& ex)    {        error(ex.message);    }    catch(const Ice::Exception& ex)    {        ostringstream s;        s << ex;        error(s.str());    }}voidParser::nextFoundBook(){    if(_current != _foundBooks.end())    {        ++_current;    }    printCurrent();}voidParser::printCurrent(){    try    {        if(_current != _foundBooks.end())        {            BookDescription desc = (*_current)->getBookDescription();            string renter;            try            {                renter = (*_current)->getRenterName();            }            catch(const BookNotRentedException&)            {            }            cout << "current book is:" << endl;            cout << "isbn: " << desc.isbn << endl;            cout << "title: " << desc.title << endl;            cout << "authors: " << desc.authors << endl;            if(!renter.empty())            {                cout << "rented: " << renter << endl;            }        }        else        {            cout << "no current book" << endl;        }    }    catch(const Ice::ObjectNotExistException&)    {        cout << "current book no longer exists" << endl;    }    catch(const Ice::Exception& ex)    {        ostringstream s;        s << ex;        error(s.str());    }}voidParser::rentCurrent(const list<string>& args){    if(args.size() != 1)    {        error("`rent' requires exactly one argument (type `help' for more info)");        return;    }    try    {        if(_current != _foundBooks.end())        {            (*_current)->rentBook(args.front());            cout << "the book is now rented by `" << args.front() << "'" << endl;        }        else        {            cout << "no current book" << endl;        }    }    catch(const BookRentedException&)    {        cout << "the book has already been rented." << endl;    }    catch(const Ice::ObjectNotExistException&)    {        cout << "current book no longer exists" << endl;    }    catch(const DatabaseException& ex)    {        error(ex.message);    }    catch(const Ice::Exception& ex)    {        ostringstream s;        s << ex;        error(s.str());    }}voidParser::returnCurrent(){    try    {        if(_current != _foundBooks.end())        {            (*_current)->returnBook();            cout << "the book has been returned." << endl;        }        else        {            cout << "no current book" << endl;        }    }    catch(const BookNotRentedException&)    {        cout << "the book is not currently rented." << endl;    }    catch(const Ice::ObjectNotExistException&)    {        cout << "current book no longer exists" << endl;    }    catch(const DatabaseException& ex)    {        error(ex.message);    }    catch(const Ice::Exception& ex)    {        ostringstream s;        s << ex;        error(s.str());    }}voidParser::removeCurrent(){    try    {        if(_current != _foundBooks.end())        {            (*_current)->destroy();            cout << "removed current book" << endl;        }        else        {            cout << "no current book" << endl;        }    }    catch(const Ice::ObjectNotExistException&)    {        cout << "current book no longer exists" << endl;    }    catch(const DatabaseException& ex)    {        error(ex.message);    }    catch(const Ice::Exception& ex)    {        ostringstream s;        s << ex;        error(s.str());    }}voidParser::setEvictorSize(const list<string>& args){    if(args.size() != 1)    {        error("`size' requires exactly one argument (type `help' for more info)");        return;    }    try    {        _library->setEvictorSize(atoi(args.front().c_str()));    }    catch(const DatabaseException& ex)    {        error(ex.message);    }    catch(const Ice::Exception& ex)    {        ostringstream s;        s << ex;        error(s.str());    }}voidParser::shutdown(){    try    {        _library->shutdown();    }    catch(const Ice::Exception& ex)    {        ostringstream s;        s << ex;        error(s.str());    }}voidParser::getInput(char* buf, int& result, int maxSize){    if(!_commands.empty())    {        if(_commands == ";")        {            result = 0;        }        else        {#if defined(_MSC_VER) && !defined(_STLP_MSVC)            // COMPILERBUG: Stupid Visual C++ defines min and max as macros            result = _MIN(maxSize, static_cast<int>(_commands.length()));#else            result = min(maxSize, static_cast<int>(_commands.length()));#endif            strncpy(buf, _commands.c_str(), result);            _commands.erase(0, result);            if(_commands.empty())            {                _commands = ";";            }        }    }    else if(isatty(fileno(yyin)))    {#ifdef HAVE_READLINE        const char* prompt = parser->getPrompt();        char* line = readline(const_cast<char*>(prompt));        if(!line)        {            result = 0;        }        else        {            if(*line)            {                add_history(line);            }            result = strlen(line) + 1;            if(result > maxSize)            {                free(line);                error("input line too long");                result = 0;            }            else            {                strcpy(buf, line);                strcat(buf, "\n");                free(line);            }        }#else        cout << parser->getPrompt() << flush;        string line;        while(true)        {            char c = static_cast<char>(getc(yyin));            if(c == EOF)            {                if(line.size())                {                    line += '\n';                }                break;            }            line += c;            if(c == '\n')            {                break;            }        }                result = static_cast<int>(line.length());        if(result > maxSize)        {            error("input line too long");            buf[0] = EOF;            result = 1;        }        else        {            strcpy(buf, line.c_str());        }#endif    }    else    {        if(((result = static_cast<int>(fread(buf, 1, maxSize, yyin))) == 0) && ferror(yyin))        {            error("input in flex scanner failed");            buf[0] = EOF;            result = 1;        }    }}voidParser::nextLine(){    _currentLine++;}voidParser::continueLine(){    _continue = true;}const char*Parser::getPrompt(){    assert(_commands.empty() && isatty(fileno(yyin)));    if(_continue)    {        _continue = false;        return "(cont) ";    }    else    {        return ">>> ";    }}voidParser::error(const char* s){    if(_commands.empty() && !isatty(fileno(yyin)))    {        cerr << _currentFile << ':' << _currentLine << ": " << s << endl;    }    else    {        cerr << "error: " << s << endl;    }    _errors++;}voidParser::error(const string& s){    error(s.c_str());}voidParser::warning(const char* s){    if(_commands.empty() && !isatty(fileno(yyin)))    {        cerr << _currentFile << ':' << _currentLine << ": warning: " << s << endl;    }    else    {        cerr << "warning: " << s << endl;    }}voidParser::warning(const string& s){    warning(s.c_str());}intParser::parse(FILE* file, bool debug){    extern int yydebug;    yydebug = debug ? 1 : 0;    assert(!parser);    parser = this;    _errors = 0;    _commands.empty();    yyin = file;    assert(yyin);    _currentFile = "";    _currentLine = 0;    _continue = false;    nextLine();    _foundBooks.clear();    _current = _foundBooks.end();    int status = yyparse();    if(_errors)    {        status = EXIT_FAILURE;    }    parser = 0;    return status;}intParser::parse(const string& commands, bool debug){    extern int yydebug;    yydebug = debug ? 1 : 0;    assert(!parser);    parser = this;    _errors = 0;    _commands = commands;    assert(!_commands.empty());    yyin = 0;    _currentFile = "<command line>";    _currentLine = 0;    _continue = false;    nextLine();    _foundBooks.clear();    _current = _foundBooks.end();    int status = yyparse();    if(_errors)    {        status = EXIT_FAILURE;    }    parser = 0;    return status;}Parser::Parser(const LibraryPrx& library) :    _library(library){}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -