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

📄 parsecommon.cxx

📁 SP是一个基于GNU C++编译器
💻 CXX
📖 第 1 页 / 共 2 页
字号:
      else {	message(ParserMessages::characterNumber, StringMessageArg(currentToken()));	valid = 0;	break;      }    }  }  if (valid && !sd().docCharsetDecl().charDeclared(c)) {    valid = 0;    message(ParserMessages::characterNumber, StringMessageArg(currentToken()));  }  Owner<Markup> markupPtr;  if (wantMarkup()) {    markupPtr = new Markup;    markupPtr->addDelim(isHex ? Syntax::dHCRO : Syntax::dCRO);    markupPtr->addNumber(in);    switch (getToken(refMode)) {    case tokenRefc:      markupPtr->addDelim(Syntax::dREFC);      break;    case tokenRe:      markupPtr->addRefEndRe();      if (options().warnRefc)	message(ParserMessages::refc);      break;    default:      if (options().warnRefc)	message(ParserMessages::refc);      break;    }  }  else if (options().warnRefc) {    if (getToken(refMode) != tokenRefc)      message(ParserMessages::refc);  }  else    (void)getToken(refMode);  if (valid) {    ch = c;    loc = Location(new NumericCharRefOrigin(startLocation,					    currentLocation().index()					    + currentInput()->currentTokenLength()					    - startLocation.index(),					    markupPtr),		   0);  }  return valid;}// Translate a character number in the document character set// into the internal character set.// If it's a non-SGML char (ie described as UNUSED in SGML declaration),// return 1 and set sgmlChar to 0.Boolean Parser::translateNumericCharRef(Char &ch, Boolean &isSgmlChar){  if (sd().internalCharsetIsDocCharset()) {    if (options().warnNonSgmlCharRef && !syntax().isSgmlChar(ch))      message(ParserMessages::nonSgmlCharRef);    isSgmlChar = 1;    return 1;  }  UnivChar univChar;  if (!sd().docCharset().descToUniv(ch, univChar)) {    const PublicId *pubid;    CharsetDeclRange::Type type;    Number n;    StringC desc;    if (sd().docCharsetDecl().getCharInfo(ch, pubid, type, n, desc)) {      if (type == CharsetDeclRange::unused) {	if (options().warnNonSgmlCharRef)	  message(ParserMessages::nonSgmlCharRef);	isSgmlChar = 0;	return 1;      }    }    else      CANNOT_HAPPEN();    if (type == CharsetDeclRange::string)      message(ParserMessages::numericCharRefUnknownDesc,	      NumberMessageArg(ch),	      StringMessageArg(desc));    else      message(ParserMessages::numericCharRefUnknownBase,	      NumberMessageArg(ch),	      NumberMessageArg(n),	      StringMessageArg(pubid->string()));  }  else {    WideChar resultChar;    ISet<WideChar> resultChars;    switch (sd().internalCharset().univToDesc(univChar,					      resultChar,					      resultChars)) {    case 1:      if (resultChar <= charMax) {	isSgmlChar = 1;	ch = Char(resultChar);	return 1;      }      // fall through    case 2:      message(ParserMessages::numericCharRefBadInternal,	      NumberMessageArg(ch));      break;    default:      message(ParserMessages::numericCharRefNoInternal,	      NumberMessageArg(ch));      break;    }  }  return 0;}// ignoreLevel: 0 means don't ignore;// 1 means parse name group and ignore if inactive// 2 means ignoreBoolean Parser::parseEntityReference(Boolean isParameter,				     int ignoreLevel,				     ConstPtr<Entity> &entity,				     Ptr<EntityOrigin> &origin){  InputSource *in = currentInput();  Location startLocation(in->currentLocation());  Owner<Markup> markupPtr;  if (wantMarkup()) {    markupPtr = new Markup;    markupPtr->addDelim(isParameter ? Syntax::dPERO : Syntax::dERO);  }  if (ignoreLevel == 1) {    Markup savedMarkup;    Markup *savedCurrentMarkup = currentMarkup();    if (savedCurrentMarkup)      savedCurrentMarkup->swap(savedMarkup);    Location savedMarkupLocation(markupLocation());    startMarkup(markupPtr != 0, startLocation);    if (markupPtr) {      markupPtr->addDelim(Syntax::dGRPO);      markupPtr->swap(*currentMarkup());    }    Boolean ignore;    if (!parseEntityReferenceNameGroup(ignore))      return 0;    if (markupPtr)      currentMarkup()->swap(*markupPtr);    startMarkup(savedCurrentMarkup != 0, savedMarkupLocation);    if (savedCurrentMarkup)      savedMarkup.swap(*currentMarkup());    if (!ignore)      ignoreLevel = 0;    in->startToken();    Xchar c = in->tokenChar(messenger());    if (!syntax().isNameStartCharacter(c)) {      message(ParserMessages::entityReferenceMissingName);      return 0;    }  }  in->discardInitial();  if (isParameter)    extendNameToken(syntax().penamelen(), ParserMessages::parameterEntityNameLength);  else    extendNameToken(syntax().namelen(), ParserMessages::nameLength);  StringC &name = nameBuffer();  getCurrentToken(syntax().entitySubstTable(), name);  if (ignoreLevel)    entity = new IgnoredEntity(name,			       isParameter			       ? Entity::parameterEntity			       : Entity::generalEntity);  else {    entity = lookupEntity(isParameter, name, startLocation, 1);    if (entity.isNull()) {      if (haveApplicableDtd()) {	if (!isParameter) {	  entity = createUndefinedEntity(name, startLocation);	  message(ParserMessages::entityUndefined,		  StringMessageArg(name));	}	else 	  message(ParserMessages::parameterEntityUndefined,		  StringMessageArg(name));      }      else	message(ParserMessages::entityApplicableDtd);    }    else if (entity->defaulted() && options().warnDefaultEntityReference)      message(ParserMessages::defaultEntityReference, StringMessageArg(name));  }  if (markupPtr) {    markupPtr->addName(in);    switch (getToken(refMode)) {    case tokenRefc:      markupPtr->addDelim(Syntax::dREFC);      break;    case tokenRe:      markupPtr->addRefEndRe();      if (options().warnRefc)	message(ParserMessages::refc);      break;    default:      if (options().warnRefc)	message(ParserMessages::refc);      break;    }  }  else if (options().warnRefc) {    if (getToken(refMode) != tokenRefc)      message(ParserMessages::refc);  }  else    (void)getToken(refMode);  if (!entity.isNull())    origin = EntityOrigin::make(internalAllocator(),				entity,				startLocation,				currentLocation().index()				+ currentInput()->currentTokenLength()				- startLocation.index(),				markupPtr);  else    origin = (EntityOrigin *)0;  return 1;}Boolean Parser::parseComment(Mode mode){  Location startLoc(currentLocation());  Markup *markup = currentMarkup();  if (markup)    markup->addCommentStart();  Token token;  while ((token = getToken(mode)) != tokenCom)    switch (token) {    case tokenUnrecognized:      if (!reportNonSgmlCharacter())	message(ParserMessages::sdCommentSignificant,		StringMessageArg(currentToken()));      break;    case tokenEe:      message(ParserMessages::commentEntityEnd, startLoc);      return 0;    default:      if (markup)	markup->addCommentChar(currentChar());      break;    }  return 1;}void Parser::extendNameToken(size_t maxLength,			     const MessageType1 &tooLongMessage){  InputSource *in = currentInput();  size_t length = in->currentTokenLength();  const Syntax &syn = syntax();  while (syn.isNameCharacter(in->tokenChar(messenger())))    length++;  if (length > maxLength)    message(tooLongMessage, NumberMessageArg(maxLength));  in->endToken(length);}void Parser::extendNumber(size_t maxLength, const MessageType1 &tooLongMessage){  InputSource *in = currentInput();  size_t length = in->currentTokenLength();  while (syntax().isDigit(in->tokenChar(messenger())))    length++;  if (length > maxLength)    message(tooLongMessage, NumberMessageArg(maxLength));  in->endToken(length);}void Parser::extendHexNumber(){  InputSource *in = currentInput();  size_t length = in->currentTokenLength();  while (syntax().isHexDigit(in->tokenChar(messenger())))    length++;  if (length > syntax().namelen())    message(ParserMessages::hexNumberLength, NumberMessageArg(syntax().namelen()));  in->endToken(length);}Boolean Parser::reportNonSgmlCharacter(){  // In scanSuppress mode the non-SGML character will have been read.  Char c = currentInput()->currentTokenLength() ? currentChar() : getChar();  if (!syntax().isSgmlChar(c)) {    message(ParserMessages::nonSgmlCharacter, NumberMessageArg(c));    return 1;  }  return 0;}void Parser::extendS(){  InputSource *in = currentInput();  size_t length = in->currentTokenLength();  while (syntax().isS(in->tokenChar(messenger())))    length++;  in->endToken(length);}#ifdef SP_NAMESPACE}#endif

⌨️ 快捷键说明

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