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

📄 lexer.cpp

📁 ncbi源码
💻 CPP
字号:
/* * =========================================================================== * PRODUCTION $Log: lexer.cpp,v $ * PRODUCTION Revision 1000.2  2004/06/01 19:43:15  gouriano * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.18 * PRODUCTION * =========================================================================== *//*  $Id: lexer.cpp,v 1000.2 2004/06/01 19:43:15 gouriano Exp $* ===========================================================================**                            PUBLIC DOMAIN NOTICE*               National Center for Biotechnology Information**  This software/database is a "United States Government Work" under the*  terms of the United States Copyright Act.  It was written as part of*  the author's official duties as a United States Government employee and*  thus cannot be copyrighted.  This software/database is freely available*  to the public for use. The National Library of Medicine and the U.S.*  Government have not placed any restriction on its use or reproduction.**  Although all reasonable efforts have been taken to ensure the accuracy*  and reliability of the software and data, the NLM and the U.S.*  Government do not and cannot warrant the performance or results that*  may be obtained by using this software or data. The NLM and the U.S.*  Government disclaim all warranties, express or implied, including*  warranties of performance, merchantability or fitness for any particular*  purpose.**  Please cite the author in any work or product based on this material.** ===========================================================================** Author: Eugene Vasilchenko** File Description:*   ASN.1 lexer** ---------------------------------------------------------------------------* $Log: lexer.cpp,v $* Revision 1000.2  2004/06/01 19:43:15  gouriano* PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.18** Revision 1.18  2004/05/17 21:03:14  gorelenk* Added include of PCH ncbi_pch.hpp** Revision 1.17  2004/02/25 19:45:20  gouriano* Made it possible to define DEFAULT for data members of type REAL** Revision 1.16  2003/05/22 20:10:25  gouriano* added UTF8 strings** Revision 1.15  2003/01/31 03:38:41  lavr* Heed int->bool performance warnings** Revision 1.14  2002/09/26 16:57:31  vasilche* Added flag for compatibility with asntool** Revision 1.13  2001/06/11 14:35:02  grichenk* Added support for numeric tags in ASN.1 specifications and data streams.** Revision 1.12  2001/05/17 15:07:12  lavr* Typos corrected** Revision 1.11  2000/12/15 15:38:51  vasilche* Added support of Int8 and long double.* Added support of BigInt ASN.1 extension - mapped to Int8.* Enum values now have type Int4 instead of long.** Revision 1.10  2000/11/15 20:34:54  vasilche* Added user comments to ENUMERATED types.* Added storing of user comments to ASN.1 module definition.** Revision 1.9  2000/11/14 21:41:25  vasilche* Added preserving of ASN.1 definition comments.** Revision 1.8  2000/08/25 15:59:22  vasilche* Renamed directory tool -> datatool.** Revision 1.7  2000/04/07 19:26:27  vasilche* Added namespace support to datatool.* By default with argument -oR datatool will generate objects in namespace* NCBI_NS_NCBI::objects (aka ncbi::objects).* Datatool's classes also moved to NCBI namespace.** Revision 1.6  2000/02/01 21:48:00  vasilche* Added CGeneratedChoiceTypeInfo for generated choice classes.* Removed CMemberInfo subclasses.* Added support for DEFAULT/OPTIONAL members.* Changed class generation.* Moved datatool headers to include/internal/serial/tool.** Revision 1.5  1999/11/15 19:36:16  vasilche* Fixed warnings on GCC** ===========================================================================*/#include <ncbi_pch.hpp>#include <serial/datatool/lexer.hpp>#include <serial/datatool/tokens.hpp>BEGIN_NCBI_SCOPEinline bool IsAlNum(char c){    return isalnum(c) ? true : false;}inline bool IsDigit(char c){    return isdigit(c) ? true : false;}ASNLexer::ASNLexer(CNcbiIstream& in)    : AbstractLexer(in){}ASNLexer::~ASNLexer(void){}TToken ASNLexer::LookupToken(void){    char c = Char();    switch ( c ) {    case ':':        if ( Char(1) == ':' && Char(2) == '=' ) {            StartToken();            AddChars(3);            return T_DEFINE;        }        return T_SYMBOL;    case '-':    case '+':        if ( IsDigit(Char(1)) ) {            StartToken();            AddChar();            return LookupNumber();        }        return T_SYMBOL;    case '\"':        StartToken();        AddChar();        StartString();        LookupString();        return T_STRING;    case '\'':        StartToken();        AddChar();        return LookupBinHexString();    case '[':        StartToken();        AddChar();        LookupTag();        return T_TAG;    default:        if ( IsDigit(c) ) {            StartToken();            AddChar();            return LookupNumber();        }        else if ( c >= 'a' && c <= 'z' ) {            StartToken();            AddChar();            LookupIdentifier();            return T_IDENTIFIER;        }        else if ( c >= 'A' && c <= 'Z' ) {            StartToken();            AddChar();            LookupIdentifier();            return LookupKeyword();        }        return T_SYMBOL;    }}void ASNLexer::LookupComments(void){    while ( true ) {        char c = Char();        switch ( c ) {        case ' ':        case '\t':        case '\r':            SkipChar();            break;        case '\n':            SkipChar();            NextLine();            break;        case '-':            if ( Char(1) == '-' ) {                // comments                SkipChars(2);                SkipComment();                break;            }            return;        default:            return;        }    }}void ASNLexer::SkipComment(void){    CComment& comment = AddComment();    while ( true ) {        // wait for end of comments        char c = Char();        switch ( c ) {        case '\n':            SkipChar();            NextLine();            return;        case 0:            if ( Eof() )                return;            break;        case '-':            if ( Char(1) == '-' ) {                SkipChars(2);                return;            }            break;        }        comment.AddChar(c);        SkipChar();    }}void ASNLexer::LookupString(void){    while ( true ) {        char c = Char();        switch ( c ) {        case '\r':        case '\n':            LexerWarning("unclosed string");            return;        case 0:            if ( Eof() ) {                LexerWarning("unclosed string");                return;            }            LexerWarning("illegal character in string: \\0");            AddStringChar(c);            AddChar();            break;        case '\"':            if ( Char(1) != '\"' ) {                AddChar();                return;            }            AddChars(2);            break;        default:            if ( c < ' ' && c > '\0' ) {                LexerWarning("illegal character in string: \\...");            }            else {                AddStringChar(c);            }            AddChar();            break;        }    }}TToken ASNLexer::LookupBinHexString(void){    TToken token = T_BINARY_STRING;    while ( true ) {        char c = Char();        switch ( c ) {        case '\r':        case '\n':            LexerWarning("unclosed bit string");            return token;        case 0:            if ( Eof() ) {                LexerWarning("unclosed bit string");                return token;            }            AddChar();            LexerWarning("illegal character in bit string");            break;        case '0':        case '1':            AddChar();            break;        case '2': case '3': case '4': case '5': case '6': case '7': case '8':        case '9': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':            AddChar();            token = T_HEXADECIMAL_STRING;            break;        case '\'':            switch ( Char(1) ) {            case 'B':                AddChars(2);                if ( token != T_BINARY_STRING )                    LexerWarning("binary string contains hexadecimal digits");                return T_BINARY_STRING;            case 'H':                AddChars(2);                return T_HEXADECIMAL_STRING;            default:                AddChar();                LexerWarning("unknown type of bit string");                return token;            }        default:            AddChar();            LexerWarning("illegal character in bit string");            break;        }    }}void ASNLexer::LookupIdentifier(void){    while ( true ) {        char c = Char();        if ( IsAlNum(c) )            AddChar();        else if ( c == '-' ) {            if ( IsAlNum(Char(1)) )                AddChars(2);            else {                if ( AllowIDsEndingWithMinus() )                    AddChar();                return;            }        }        else            return;    }}TToken ASNLexer::LookupNumber(void){    while ( IsDigit(Char()) ) {        AddChar();    }    char c = Char();    if (c == '.' || c == 'e' || c == 'E' || c == '-' || c == '+') {        AddChar();        LookupNumber();        return T_DOUBLE;    }    return T_NUMBER;}void ASNLexer::LookupTag(void){    while ( true ) {        char c = Char();        switch ( c ) {        case '\r':        case '\n':            LexerWarning("unclosed tag");            return;        case 0:            if ( Eof() ) {                LexerWarning("unclosed tag");                return;            }            AddChar();            LexerWarning("illegal character in tag");            break;        case ']':            AddChar();            return;        case '0': case '1': case '2': case '3': case '4':        case '5': case '6': case '7': case '8': case '9':        // case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':            AddChar();            break;        default:            AddChar();            LexerWarning("illegal character in tag");            break;        }    }}#define CHECK(keyword, t, length) \    if ( memcmp(token, keyword, length) == 0 ) return tTToken ASNLexer::LookupKeyword(void){    const char* token = CurrentTokenStart();    switch ( CurrentTokenLength() ) {    case 2:        CHECK("OF", K_OF, 2);        break;    case 3:        CHECK("SET", K_SET, 3);        CHECK("BIT", K_BIT, 3);        CHECK("END", K_END, 3);        break;    case 4:        CHECK("TRUE", K_TRUE, 4);        CHECK("NULL", K_NULL, 4);        CHECK("REAL", K_REAL, 4);        CHECK("FROM", K_FROM, 4);        break;    case 5:        CHECK("OCTET", K_OCTET, 5);        CHECK("BEGIN", K_BEGIN, 5);        CHECK("FALSE", K_FALSE, 5);        break;    case 6:        CHECK("CHOICE", K_CHOICE, 6);        CHECK("STRING", K_STRING, 6);        CHECK("BigInt", K_BIGINT, 6);        break;    case 7:        CHECK("INTEGER", K_INTEGER, 7);        CHECK("BOOLEAN", K_BOOLEAN, 7);        CHECK("DEFAULT", K_DEFAULT, 7);        CHECK("IMPORTS", K_IMPORTS, 7);        CHECK("EXPORTS", K_EXPORTS, 7);        break;    case 8:        CHECK("SEQUENCE", K_SEQUENCE, 8);        CHECK("OPTIONAL", K_OPTIONAL, 8);        break;    case 10:        CHECK("ENUMERATED", K_ENUMERATED, 10);        CHECK("UTF8String", K_UTF8String, 10);        break;    case 11:        CHECK("StringStore", K_StringStore, 11);        CHECK("DEFINITIONS", K_DEFINITIONS, 11);        break;    case 13:        CHECK("VisibleString", K_VisibleString, 13);        break;    }    return T_TYPE_REFERENCE;}void ASNLexer::StartString(void){    _ASSERT(TokenStarted());    m_StringValue.erase();}void ASNLexer::AddStringChar(char c){    _ASSERT(TokenStarted());    m_StringValue += c;}END_NCBI_SCOPE

⌨️ 快捷键说明

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