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

📄 parser.cpp

📁 ncbi源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    case K_BIGINT:        Consume();        if ( CheckSymbol('{') )            return EnumeratedBlock(new CBigIntEnumDataType());        else            return new CBigIntDataType();    case K_ENUMERATED:        Consume();        return EnumeratedBlock(new CEnumDataType());    case K_REAL:        Consume();        return new CRealDataType();    case K_BIT:        Consume();        Consume(K_STRING, "STRING");        return new CBitStringDataType();    case K_OCTET:        Consume();        Consume(K_STRING, "STRING");        return new COctetStringDataType();    case K_NULL:        Consume();        return new CNullDataType();    case K_SEQUENCE:        Consume();        if ( ConsumeIf(K_OF) )            return new CUniSequenceDataType(Type());        else            return TypesBlock(new CDataSequenceType(), true);    case K_SET:        Consume();        if ( ConsumeIf(K_OF) )            return new CUniSetDataType(Type());        else            return TypesBlock(new CDataSetType(), true);    case K_CHOICE:        Consume();        return TypesBlock(new CChoiceDataType(), false);    case K_VisibleString:    case K_UTF8String:        Consume();        return new CStringDataType(            tok == K_UTF8String ?                CStringDataType::eStringTypeUTF8 :                CStringDataType::eStringTypeVisible);    case K_StringStore:        Consume();        return new CStringStoreDataType();    case T_IDENTIFIER:    case T_TYPE_REFERENCE:        return new CReferenceDataType(TypeReference());    case T_TAG:        string val = ConsumeAndValue();        CDataType* tagged = x_Type();        tagged->SetTag(NStr::StringToInt(val.substr(1, val.length()-2)));        return tagged;    }    ParseError("type");	return 0;}bool ASNParser::HaveMoreElements(void){    const AbstractToken& token = NextToken();    if ( token.GetToken() == T_SYMBOL ) {        switch ( token.GetSymbol() ) {        case ',':            Consume();            return true;        case '}':            Consume();            return false;        case '(':            Consume();	    // skip constraints definition            SkipTo(')');            return HaveMoreElements();        }    }    ParseError("',' or '}'");    return false;}void ASNParser::SkipTo(char ch){    for ( TToken tok = Next(); tok != T_EOF; tok = Next() ) {        if (tok == T_SYMBOL && NextToken().GetSymbol() == ch) {            Consume();            return;        }        Consume();    }}CDataType* ASNParser::TypesBlock(CDataMemberContainerType* containerType,                                 bool allowDefaults){    AutoPtr<CDataMemberContainerType> container(containerType);    int line = NextTokenLine();    ConsumeSymbol('{');    CopyLineComment(line, container->Comments(), eCombineNext);    for ( bool more = true; more; ) {        line = NextTokenLine();        AutoPtr<CDataMember> member = NamedDataType(allowDefaults);        more = HaveMoreElements();        if ( more )            CopyLineComment(line, member->Comments(), eCombineNext);        else            CopyLineComment(line, member->Comments());        container->AddMember(member);    }    return container.release();}AutoPtr<CDataMember> ASNParser::NamedDataType(bool allowDefaults){    string name;    if ( Next() == T_IDENTIFIER )        name = Identifier();    AutoPtr<CDataType> type(Type());    AutoPtr<CDataMember> member(new CDataMember(name, type));    if ( allowDefaults ) {        switch ( Next() ) {        case K_OPTIONAL:            Consume();            member->SetOptional();            break;        case K_DEFAULT:            Consume();            member->SetDefault(Value());            break;        }    }    CopyComments(member->Comments());    return member;}CEnumDataType* ASNParser::EnumeratedBlock(CEnumDataType* enumType){    AutoPtr<CEnumDataType> e(enumType);    int line = NextTokenLine();    ConsumeSymbol('{');    CopyLineComment(line, e->Comments(), eCombineNext);    for ( bool more = true; more; ) {        line = NextTokenLine();        CEnumDataTypeValue& value = EnumeratedValue(*e);        more = HaveMoreElements();        CopyLineComment(line, value.GetComments(), eCombineNext);    }    return e.release();}CEnumDataTypeValue& ASNParser::EnumeratedValue(CEnumDataType& t){    string id = Identifier();    ConsumeSymbol('(');    Int4 value = Number();    ConsumeSymbol(')');    CEnumDataTypeValue& ret = t.AddValue(id, value);    CopyComments(ret.GetComments());    return ret;}void ASNParser::TypeList(list<string>& ids){    do {        ids.push_back(TypeReference());    } while ( ConsumeIfSymbol(',') );}AutoPtr<CDataValue> ASNParser::Value(void){    int line = NextTokenLine();    AutoPtr<CDataValue> value(x_Value());    value->SetSourceLine(line);    return value;}AutoPtr<CDataValue> ASNParser::x_Value(void){    switch ( Next() ) {    case T_NUMBER:        return AutoPtr<CDataValue>(new CIntDataValue(Number()));    case T_DOUBLE:        return AutoPtr<CDataValue>(new CDoubleDataValue(Double()));    case T_STRING:        return AutoPtr<CDataValue>(new CStringDataValue(String()));    case K_NULL:        Consume();        return AutoPtr<CDataValue>(new CNullDataValue());    case K_FALSE:        Consume();        return AutoPtr<CDataValue>(new CBoolDataValue(false));    case K_TRUE:        Consume();        return AutoPtr<CDataValue>(new CBoolDataValue(true));    case T_IDENTIFIER:        {            string id = Identifier();            if ( CheckSymbols(',', '}') )                return AutoPtr<CDataValue>(new CIdDataValue(id));            else                return AutoPtr<CDataValue>(new CNamedDataValue(id, Value()));        }    case T_BINARY_STRING:    case T_HEXADECIMAL_STRING:        return AutoPtr<CDataValue>(new CBitStringDataValue(ConsumeAndValue()));    case T_SYMBOL:        switch ( NextToken().GetSymbol() ) {        case '-':            return AutoPtr<CDataValue>(new CIntDataValue(Number()));        case '{':            {                Consume();                AutoPtr<CBlockDataValue> b(new CBlockDataValue());                if ( !CheckSymbol('}') ) {                    do {                        b->GetValues().push_back(Value());                    } while ( ConsumeIfSymbol(',') );                }                ConsumeSymbol('}');                return AutoPtr<CDataValue>(b.release());            }        }		break;    }    ParseError("value");	return AutoPtr<CDataValue>(0);}Int4 ASNParser::Number(void){    return NStr::StringToInt(ValueOf(T_NUMBER, "number"));}double ASNParser::Double(void){    return NStr::StringToDouble(ValueOf(T_DOUBLE, "double"));}const string& ASNParser::String(void){    Expect(T_STRING, "string");    Consume();    return L().StringValue();}const string& ASNParser::Identifier(void){    switch ( Next() ) {    case T_TYPE_REFERENCE:        ERR_POST("LINE " << Location() <<            " identifier must begin with lowercase letter");        return ConsumeAndValue();    case T_IDENTIFIER:        return ConsumeAndValue();    }    ParseError("identifier");	return NcbiEmptyString;}const string& ASNParser::TypeReference(void){    switch ( Next() ) {    case T_TYPE_REFERENCE:        return ConsumeAndValue();    case T_IDENTIFIER:        ERR_POST("LINE " << Location() <<            " type name must begin with uppercase letter");        return ConsumeAndValue();    }    ParseError("type name");	return NcbiEmptyString;}const string& ASNParser::ModuleReference(void){    switch ( Next() ) {    case T_TYPE_REFERENCE:        return ConsumeAndValue();    case T_IDENTIFIER:        ERR_POST("LINE " << Location() <<            " module name must begin with uppercase letter");        return ConsumeAndValue();    }    ParseError("module name");	return NcbiEmptyString;}END_NCBI_SCOPE

⌨️ 快捷键说明

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