📄 parser.cpp
字号:
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 + -