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

📄 parsedecl.cxx

📁 SP是一个基于GNU C++编译器
💻 CXX
📖 第 1 页 / 共 5 页
字号:
  case Param::reservedName + Syntax::rNUMBER:    declaredValue      = new TokenizedDeclaredValue(TokenizedDeclaredValue::number, 0);    if (options().warnNumberDeclaredValue)      message(ParserMessages::numberDeclaredValue);    break;  case Param::reservedName + Syntax::rNUMBERS:    declaredValue      = new TokenizedDeclaredValue(TokenizedDeclaredValue::number, 1);    if (options().warnNumberDeclaredValue)      message(ParserMessages::numberDeclaredValue);    break;  case Param::reservedName + Syntax::rNUTOKEN:    declaredValue      = new TokenizedDeclaredValue(TokenizedDeclaredValue::numberToken, 0);    if (options().warnNutokenDeclaredValue)      message(ParserMessages::nutokenDeclaredValue);    break;  case Param::reservedName + Syntax::rNUTOKENS:    declaredValue      = new TokenizedDeclaredValue(TokenizedDeclaredValue::numberToken, 1);    if (options().warnNutokenDeclaredValue)      message(ParserMessages::nutokenDeclaredValue);    break;  case Param::reservedName + Syntax::rNOTATION:    {      static AllowedParams allowNameGroup(Param::nameGroup);      if (!parseParam(allowNameGroup, declInputLevel, parm))	return 0;      Vector<StringC> group(parm.nameTokenVector.size());      for (size_t i = 0; i < group.size(); i++)	parm.nameTokenVector[i].name.swap(group[i]);      declaredValue = new NotationDeclaredValue(group);      allowedFlags = 0;    }    break;  case Param::nameTokenGroup:    {      Vector<StringC> group(parm.nameTokenVector.size());      for (size_t i = 0; i < group.size(); i++)	parm.nameTokenVector[i].name.swap(group[i]);      declaredValue = new NameTokenGroupDeclaredValue(group);    }    break;  default:    CANNOT_HAPPEN();  }  if (isNotation) {    if (!(allowedFlags & asDataAttribute))      message(ParserMessages::dataAttributeDeclaredValue);  }  else if (haveDefLpd() && !isNotation && !(allowedFlags & asLinkAttribute))    message(ParserMessages::linkAttributeDeclaredValue);  return 1;}Boolean Parser::parseDefaultValue(unsigned declInputLevel,				  Boolean isNotation,				  Param &parm,				  const StringC &attributeName,				  Owner<DeclaredValue> &declaredValue,				  Owner<AttributeDefinition> &def,				  Boolean &anyCurrent){  // default value  static AllowedParams    allowDefaultValue(Param::indicatedReservedName + Syntax::rFIXED,		      Param::indicatedReservedName + Syntax::rREQUIRED,		      Param::indicatedReservedName + Syntax::rCURRENT,		      Param::indicatedReservedName + Syntax::rCONREF,		      Param::indicatedReservedName + Syntax::rIMPLIED,		      Param::attributeValue,		      Param::attributeValueLiteral);  static AllowedParams    allowTokenDefaultValue(Param::indicatedReservedName + Syntax::rFIXED,		      Param::indicatedReservedName + Syntax::rREQUIRED,		      Param::indicatedReservedName + Syntax::rCURRENT,		      Param::indicatedReservedName + Syntax::rCONREF,		      Param::indicatedReservedName + Syntax::rIMPLIED,		      Param::attributeValue,		      Param::tokenizedAttributeValueLiteral);  if (!parseParam(declaredValue->tokenized()		  ? allowTokenDefaultValue		  : allowDefaultValue, declInputLevel, parm))    return 0;  switch (parm.type) {  case Param::indicatedReservedName + Syntax::rFIXED:    {      static AllowedParams allowValue(Param::attributeValue,				      Param::attributeValueLiteral);      static AllowedParams	allowTokenValue(Param::attributeValue,			Param::tokenizedAttributeValueLiteral);      if (!parseParam(declaredValue->tokenized()		      ? allowTokenValue		      : allowValue, declInputLevel, parm))	return 0;      unsigned specLength = 0;      AttributeValue *value = declaredValue->makeValue(parm.literalText,						       *this,						       attributeName,						       specLength);      if (declaredValue->isId())	message(ParserMessages::idDeclaredValue);      def = new FixedAttributeDefinition(attributeName,					 declaredValue.extract(),					 value);    }    break;  case Param::attributeValue:    if (options().warnAttributeValueNotLiteral)      message(ParserMessages::attributeValueNotLiteral);    // falll through  case Param::attributeValueLiteral:  case Param::tokenizedAttributeValueLiteral:    {      unsigned specLength = 0;      AttributeValue *value = declaredValue->makeValue(parm.literalText,						       *this,						       attributeName,						       specLength);      if (declaredValue->isId())	message(ParserMessages::idDeclaredValue);      def = new DefaultAttributeDefinition(attributeName,					   declaredValue.extract(),					   value);    }    break;  case Param::indicatedReservedName + Syntax::rREQUIRED:    def = new RequiredAttributeDefinition(attributeName,					  declaredValue.extract());    break;  case Param::indicatedReservedName + Syntax::rCURRENT:    anyCurrent = 1;	           if (declaredValue->isId())      message(ParserMessages::idDeclaredValue);    def = new CurrentAttributeDefinition(attributeName,					 declaredValue.extract(),					 defDtd().allocCurrentAttributeIndex());    if (isNotation)      message(ParserMessages::dataAttributeDefaultValue);    else if (haveDefLpd())      message(ParserMessages::linkAttributeDefaultValue);    else if (options().warnCurrent)      message(ParserMessages::currentAttribute);    break;  case Param::indicatedReservedName + Syntax::rCONREF:    if (declaredValue->isId())      message(ParserMessages::idDeclaredValue);    def = new ConrefAttributeDefinition(attributeName,					declaredValue.extract());    if (isNotation)      message(ParserMessages::dataAttributeDefaultValue);    else if (haveDefLpd())      message(ParserMessages::linkAttributeDefaultValue);    else if (options().warnConref)      message(ParserMessages::conrefAttribute);    break;  case Param::indicatedReservedName + Syntax::rIMPLIED:    def = new ImpliedAttributeDefinition(attributeName,					 declaredValue.extract());    break;  default:    CANNOT_HAPPEN();  }  return 1;}// parm contains either system or publicBoolean Parser::parseExternalId(const AllowedParams &sysidAllow,				const AllowedParams &endAllow,				Boolean maybeWarnMissingSystemId,				unsigned declInputLevel,				Param &parm,				ExternalId &id){  id.setLocation(currentLocation());  if (parm.type == Param::reservedName + Syntax::rPUBLIC) {    static AllowedParams allowMinimumLiteral(Param::minimumLiteral);    if (!parseParam(allowMinimumLiteral, declInputLevel, parm))      return 0;    const MessageType1 *err;    if (id.setPublic(parm.literalText, sd().internalCharset(), syntax().space(),		      err)) {      PublicId::TextClass textClass;      if (sd().formal() && id.publicId()->getTextClass(textClass) && textClass == PublicId::SD)	message(ParserMessages::wwwRequired);    }    else if (sd().formal())      message(*err,	      StringMessageArg(*id.publicIdString()));  }  if (!parseParam(sysidAllow, declInputLevel, parm))    return 0;  if (parm.type == Param::systemIdentifier) {    id.setSystem(parm.literalText);    if (!parseParam(endAllow, declInputLevel, parm))      return 0;  }  else if (options().warnMissingSystemId && maybeWarnMissingSystemId)    message(ParserMessages::missingSystemId);  return 1;}Boolean Parser::parseNotationDecl(){  unsigned declInputLevel = inputLevel();  Param parm;  if (!parseParam(allowName, declInputLevel, parm))    return 0;  Notation *nt = lookupCreateNotation(parm.token);  if (validate() && nt->defined())    message(ParserMessages::duplicateNotationDeclaration,	    StringMessageArg(parm.token));  static AllowedParams    allowPublicSystem(Param::reservedName + Syntax::rPUBLIC,		      Param::reservedName + Syntax::rSYSTEM);  if (!parseParam(allowPublicSystem, declInputLevel, parm))    return 0;  static AllowedParams allowSystemIdentifierMdc(Param::systemIdentifier,						Param::mdc);  ExternalId id;  if (!parseExternalId(allowSystemIdentifierMdc, allowMdc,		       parm.type == Param::reservedName + Syntax::rSYSTEM,		       declInputLevel, parm, id))    return 0;  if (validate() && sd().formal()) {    PublicId::TextClass textClass;    const PublicId *publicId = id.publicId();    if (publicId	&& publicId->getTextClass(textClass)	&& textClass != PublicId::NOTATION)      message(ParserMessages::notationIdentifierTextClass);  }  if (!nt->defined()) {    nt->setExternalId(id, markupLocation());    nt->generateSystemId(*this);    if (currentMarkup())      eventHandler().notationDecl(new (eventAllocator())				  NotationDeclEvent(nt, markupLocation(),						    currentMarkup()));  }  return 1;}Boolean Parser::parseEntityDecl(){  unsigned declInputLevel = inputLevel();  Param parm;  static AllowedParams    allowEntityNamePero(Param::entityName,			Param::indicatedReservedName + Syntax::rDEFAULT,			Param::pero);  if (!parseParam(allowEntityNamePero, declInputLevel, parm))    return 0;  Entity::DeclType declType;  StringC name;			// empty for default entity  if (parm.type == Param::pero) {    declType = Entity::parameterEntity;    static AllowedParams allowParamEntityName(Param::paramEntityName);    if (!parseParam(allowParamEntityName, declInputLevel, parm))      return 0;    parm.token.swap(name);  }  else {    declType = Entity::generalEntity;    if (parm.type == Param::entityName)      parm.token.swap(name);    else if (options().warnDefaultEntityDecl)      message(ParserMessages::defaultEntityDecl);  }  static AllowedParams    allowEntityTextType(Param::paramLiteral,			Param::reservedName + Syntax::rCDATA,			Param::reservedName + Syntax::rSDATA,			Param::reservedName + Syntax::rPI,			Param::reservedName + Syntax::rSTARTTAG,			Param::reservedName + Syntax::rENDTAG,			Param::reservedName + Syntax::rMS,			Param::reservedName + Syntax::rMD,			Param::reservedName + Syntax::rSYSTEM,			Param::reservedName + Syntax::rPUBLIC);  if (!parseParam(allowEntityTextType, declInputLevel, parm))    return 0;  Location typeLocation(currentLocation());  Entity::DataType dataType = Entity::sgmlText;  InternalTextEntity::Bracketed bracketed = InternalTextEntity::none;  switch (parm.type) {  case Param::reservedName + Syntax::rSYSTEM:  case Param::reservedName + Syntax::rPUBLIC:    return parseExternalEntity(name, declType, declInputLevel, parm);  case Param::reservedName + Syntax::rCDATA:    dataType = Entity::cdata;    if (options().warnInternalCdataEntity)      message(ParserMessages::internalCdataEntity);    break;  case Param::reservedName + Syntax::rSDATA:    dataType = Entity::sdata;    if (options().warnInternalSdataEntity)      message(ParserMessages::internalSdataEntity);    break;  case Param::reservedName + Syntax::rPI:    dataType = Entity::pi;    if (options().warnPiEntity)      message(ParserMessages::piEntity);    break;  case Param::reservedName + Syntax::rSTARTTAG:    bracketed = InternalTextEntity::starttag;    if (options().warnBracketEntity)      message(ParserMessages::bracketEntity);    break;  case Param::reservedName + Syntax::rENDTAG:    bracketed = InternalTextEntity::endtag;    if (options().warnBracketEntity)      message(ParserMessages::bracketEntity);    break;  case Param::reservedName + Syntax::rMS:    bracketed = InternalTextEntity::ms;    if (options().warnBracketEntity)      message(ParserMessages::bracketEntity);    break;  case Param::reservedName + Syntax::rMD:    bracketed = InternalTextEntity::md;    if (options().warnBracketEntity)      message(ParserMessages::bracketEntity);    break;  }  if (parm.type != Param::paramLiteral) {    if (!parseParam(allowParamLiteral, declInputLevel, parm))      return 0;  }  Text text;  parm.literalText.swap(text);  if (bracketed != InternalTextEntity::none) {    StringC open;    StringC close;    switch (bracketed) {    case InternalTextEntity::starttag:      open = syntax().delimGeneral(Syntax::dSTAGO);      close = syntax().delimGeneral(Syntax::dTAGC);      break;    case InternalTextEntity::endtag:      open = syntax().delimGeneral(Syntax::dETAGO);      close = syntax().delimGeneral(Syntax::dTAGC);      break;    case InternalTextEntity::ms:      open = syntax().delimGeneral(Syntax::dMDO);      open += syntax().delimGeneral(Syntax::dDSO);      close = syntax().delimGeneral(Syntax::dMSC);      close += syntax().delimGeneral(Syntax::dMDC);      break;    case InternalTextEntity::md:      open = syntax().delimGeneral(Syntax::dMDO);      close = syntax().delimGeneral(Syntax::dMDC);      break;    default:      CANNOT_HAPPEN();    }    text.insertChars(open, Location(new BracketOrigin(typeLocation,						      BracketOrigin::open),				    0));    text.addChars(close, Location(new BracketOrigin(typeLocation,						    BracketOrigin::close),				  0));    if (text.size() > syntax().litlen()	&& text.size() - open.size() - close.size() <= syntax().litlen())      message(ParserMessages::bracketedLitlen,	      NumberMessageArg(syntax().litlen()));  }  if (!parseParam(allowMdc, declInputLevel, parm))    return 0;  if (declType == Entity::parameterEntity      && (dataType == Entity::cdata || dataType == Entity::sdata)) {    message(ParserMessages::internalParameterDataEntity,	    StringMessageArg(name));    return 1;  }  Ptr<Entity> entity;  switch (dataType) {  case Entity::cdata:    entity = new InternalCdataEntity(name, markupLocation(), text);    break;  case Entity::sdata:    entity = new InternalSdataEntity(name, markupLocation(), text);    break;  case Entity::pi:    entity = new PiEntity(name, declType, markupLocation(), text);    break;  case Entity::sgmlText:    entity = new InternalTextEntity(name, declType, markupLocation(), text, bracketed);    break;  default:    CANNOT_HAPPEN();    break;  }  maybeDefineEntity(entity);  return 1;}Boolean Parser::parseExternalEntity(StringC &name,				    Entity::DeclType declType,				    unsigned declInputLevel,				    Param &parm){  static AllowedParams    allowSystemIdentifierEntityTypeMdc(Param::systemIdentifier,				       Param::reservedName + Syntax::rSUBDOC,				       Param::reservedName + Syntax::rCDATA,				       Param::reservedName + Syntax::rSDATA,				       Param::reservedName + Syntax::rNDATA,				       Param::mdc);  static AllowedParams    allowEntityTypeMdc(Param::reservedName + Syntax::rSUBDOC,		       Param::reservedName + Syntax::rCDATA,		       Param::reservedName + Syntax::rSDATA,		       Param::reservedName + Syntax::rNDATA,

⌨️ 快捷键说明

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