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

📄 parseparam.cxx

📁 SP是一个基于GNU C++编译器
💻 CXX
📖 第 1 页 / 共 2 页
字号:
	return 0;      }      gc.type = GroupConnector::seqGC;      if (currentMarkup())	currentMarkup()->addDelim(Syntax::dSEQ);      return 1;    case tokenOr:      if (!allow.groupConnector(GroupConnector::orGC)) {	groupConnectorInvalidToken(tokenOr, allow);	return 0;      }      gc.type = GroupConnector::orGC;      if (currentMarkup())	currentMarkup()->addDelim(Syntax::dOR);      return 1;    case tokenDtgc:      if (!allow.groupConnector(GroupConnector::dtgcGC)) {	groupConnectorInvalidToken(tokenDtgc, allow);	return 0;      }      gc.type = GroupConnector::dtgcGC;      if (inputLevel() > groupInputLevel)	message(ParserMessages::groupParameterEntityNotEnded);      if (currentMarkup())	currentMarkup()->addDelim(Syntax::dDTGC);      return 1;    case tokenGrpc:      if (!allow.groupConnector(GroupConnector::grpcGC)) {	groupConnectorInvalidToken(tokenGrpc, allow);	return 0;      }      gc.type = GroupConnector::grpcGC;      if (inputLevel() > groupInputLevel)	message(ParserMessages::groupParameterEntityNotEnded);      if (currentMarkup())	currentMarkup()->addDelim(Syntax::dGRPC);      return 1;    default:      groupConnectorInvalidToken(token, allow);      return 0;    }  }}void Parser::groupConnectorInvalidToken(Token token,					const AllowedGroupConnectors &allow){  message(ParserMessages::connectorInvalidToken,	  TokenMessageArg(token, grpMode, syntaxPointer(), sdPointer()),	  AllowedGroupConnectorsMessageArg(allow, syntaxPointer()));}Boolean Parser::parseElementNameGroup(unsigned declInputLevel, Param &parm){  if (!parseNameGroup(declInputLevel, parm))    return 0;  parm.elementVector.resize(parm.nameTokenVector.size());  for (size_t i = 0; i < parm.nameTokenVector.size(); i++)    parm.elementVector[i] = lookupCreateElement(parm.nameTokenVector[i].name);  return 1;}Boolean Parser::parseEntityReferenceNameGroup(Boolean &ignore){  Param parm;  if (!parseNameGroup(inputLevel(), parm))    return 0;  if (inInstance()) {    for (size_t i = 0; i < parm.nameTokenVector.size(); i++) {      const Lpd *lpd = lookupLpd(parm.nameTokenVector[i].name).pointer();      if (lpd && lpd->active()) {	ignore = 0;	return 1;      }    }  }  ignore = 1;  return 1;}Boolean Parser::parseTagNameGroup(Boolean &active){  Param parm;  if (!parseNameGroup(inputLevel(), parm))    return 0;  active = 0;  return 1;}Boolean Parser::parseNameGroup(unsigned declInputLevel, Param &parm){  static AllowedGroupTokens allowName(GroupToken::name);  return parseGroup(allowName, declInputLevel, parm);}Boolean Parser::parseNameTokenGroup(unsigned declInputLevel, Param &parm){  static AllowedGroupTokens allowNameToken(GroupToken::nameToken);  return parseGroup(allowNameToken, declInputLevel, parm);}staticBoolean groupContains(const Vector<NameToken> &vec, const StringC &str){  for (size_t i = 0; i < vec.size(); i++)    if (vec[i].name == str)      return 1;  return 0;}Boolean Parser::parseGroup(const AllowedGroupTokens &allowToken,			   unsigned declInputLevel,			   Param &parm){  unsigned groupInputLevel = inputLevel();  int nDuplicates = 0;  Vector<NameToken> &vec = parm.nameTokenVector;  vec.clear();  GroupConnector::Type connector = GroupConnector::grpcGC;  GroupToken gt;  for (;;) {    if (!parseGroupToken(allowToken, 0, declInputLevel, groupInputLevel, gt))      return 0;    if (groupContains(vec, gt.token)) {      nDuplicates++;      message(ParserMessages::duplicateGroupToken,	      StringMessageArg(gt.token));    }    else {      vec.resize(vec.size() + 1);      gt.token.swap(vec.back().name);      getCurrentToken(vec.back().origName);      vec.back().loc = currentLocation();    }    GroupConnector gc;    static AllowedGroupConnectors allowAnyConnectorGrpc(GroupConnector::orGC,							GroupConnector::andGC,							GroupConnector::seqGC,							GroupConnector::grpcGC);			        if (!parseGroupConnector(allowAnyConnectorGrpc, declInputLevel,			     groupInputLevel, gc))      return 0;    if (gc.type == GroupConnector::grpcGC)      break;    if (options().warnNameGroupNotOr) {      if (gc.type != GroupConnector::orGC)	message(ParserMessages::nameGroupNotOr);    }    else if (options().warnShould) {      if (connector == GroupConnector::grpcGC)	connector = gc.type;      else if (gc.type != connector) {	message(ParserMessages::mixedConnectors);	connector = gc.type;      }    }  }  if (nDuplicates + vec.size() > syntax().grpcnt())    message(ParserMessages::groupCount, NumberMessageArg(syntax().grpcnt()));  return 1;}Boolean Parser::parseDataTagGroup(unsigned nestingLevel,				  unsigned declInputLevel, GroupToken &result){  if (nestingLevel - 1 == syntax().grplvl())    message(ParserMessages::grplvl, NumberMessageArg(syntax().grplvl()));  unsigned groupInputLevel = inputLevel();  GroupToken gt;  static AllowedGroupTokens allowName(GroupToken::name);  if (!parseGroupToken(allowName, nestingLevel, declInputLevel,		       groupInputLevel, gt))    return 0;  const ElementType *element = lookupCreateElement(gt.token);  GroupConnector gc;  static AllowedGroupConnectors allowSeq(GroupConnector::seqGC);  if (!parseGroupConnector(allowSeq, declInputLevel, groupInputLevel, gc))    return 0;  static AllowedGroupTokens    allowDataTagLiteralDataTagTemplateGroup(GroupToken::dataTagLiteral,					    GroupToken::dataTagTemplateGroup);  if (!parseGroupToken(allowDataTagLiteralDataTagTemplateGroup,		       nestingLevel,		       declInputLevel,		       groupInputLevel,		       gt))    return 0;  Vector<Text> templates;  if (gt.type == GroupToken::dataTagTemplateGroup)    gt.textVector.swap(templates);  else {    templates.resize(1);    gt.text.swap(templates[0]);  }  static AllowedGroupConnectors allowSeqDtgc(GroupConnector::seqGC,					     GroupConnector::dtgcGC);  if (!parseGroupConnector(allowSeqDtgc, declInputLevel, groupInputLevel, gc))    return 0;  NCVector<Owner<ContentToken> > vec(2);  vec[1] = new PcdataToken;  if (gc.type != GroupConnector::dtgcGC) {    static AllowedGroupTokens allowDataTagLiteral(GroupToken::dataTagLiteral);    if (!parseGroupToken(allowDataTagLiteral,			 nestingLevel,			 declInputLevel,			 groupInputLevel,			 gt))      return 0;    vec[0] = new DataTagElementToken(element, templates, gt.text);    static AllowedGroupConnectors allowDtgc(GroupConnector::dtgcGC);    if (!parseGroupConnector(allowDtgc, declInputLevel, groupInputLevel, gc))      return 0;  }  else    vec[0] = new DataTagElementToken(element, templates);  ContentToken::OccurrenceIndicator oi = getOccurrenceIndicator(grpMode);  result.contentToken = new DataTagGroup(vec, oi);  result.type = GroupToken::dataTagGroup;  return 1;}Boolean Parser::parseDataTagTemplateGroup(unsigned nestingLevel,					  unsigned declInputLevel,					  GroupToken &result){  if (nestingLevel - 1 == syntax().grplvl())    message(ParserMessages::grplvl, NumberMessageArg(syntax().grplvl()));  unsigned groupInputLevel = inputLevel();  Vector<Text> &vec = result.textVector;  for (;;) {    GroupToken gt;    static AllowedGroupTokens allowDataTagLiteral(GroupToken::dataTagLiteral);    if (!parseGroupToken(allowDataTagLiteral,			 nestingLevel,			 declInputLevel,			 groupInputLevel,			 gt))      return 0;    if (vec.size() == syntax().grpcnt())      message(ParserMessages::groupCount, NumberMessageArg(syntax().grpcnt()));    vec.resize(vec.size() + 1);    gt.text.swap(vec.back());    static AllowedGroupConnectors allowOrGrpc(GroupConnector::orGC,					      GroupConnector::grpcGC);    GroupConnector gc;    if (!parseGroupConnector(allowOrGrpc, declInputLevel, groupInputLevel, gc))      return 0;    if (gc.type == GroupConnector::grpcGC)      break;  }  return 1;}Boolean Parser::parseModelGroup(unsigned nestingLevel, unsigned declInputLevel,				ModelGroup *&group, Mode oiMode){  if (nestingLevel - 1 == syntax().grplvl())    message(ParserMessages::grplvl, NumberMessageArg(syntax().grplvl()));  unsigned groupInputLevel = inputLevel();  GroupToken gt;  NCVector<Owner<ContentToken> > tokenVector;  GroupConnector::Type connector = GroupConnector::grpcGC;    static AllowedGroupTokens allowContentToken(GroupToken::pcdata,					      GroupToken::dataTagGroup,					      GroupToken::elementToken,					      GroupToken::modelGroup);  static AllowedGroupConnectors allowAnyConnectorGrpc(GroupConnector::orGC,						      GroupConnector::andGC,						      GroupConnector::seqGC,						      GroupConnector::grpcGC);			      static AllowedGroupConnectors allowOrGrpc(GroupConnector::orGC,					    GroupConnector::grpcGC);  static AllowedGroupConnectors allowAndGrpc(GroupConnector::andGC,					     GroupConnector::grpcGC);  static AllowedGroupConnectors allowSeqGrpc(GroupConnector::seqGC,					     GroupConnector::grpcGC);  const AllowedGroupConnectors *connectorp = &allowAnyConnectorGrpc;  GroupConnector gc;  Boolean pcdataCheck = 0;  do {    if (!parseGroupToken(allowContentToken, nestingLevel, declInputLevel,			 groupInputLevel, gt))      return 0;    ContentToken *contentToken;    if (gt.type == GroupToken::modelGroup)      contentToken = gt.model.extract();    else      contentToken = gt.contentToken.extract();    if (tokenVector.size() == syntax().grpcnt())      message(ParserMessages::groupCount, NumberMessageArg(syntax().grpcnt()));    tokenVector.resize(tokenVector.size() + 1);    tokenVector.back() = contentToken;    if (!parseGroupConnector(*connectorp, declInputLevel, groupInputLevel, gc))      return 0;    if (options().warnMixedContentRepOrGroup && gt.type == GroupToken::pcdata) {      if (tokenVector.size() != 1)	message(ParserMessages::pcdataNotFirstInGroup);      else if (gc.type == GroupConnector::seqGC)	message(ParserMessages::pcdataInSeqGroup);      else	pcdataCheck = 1;      if (nestingLevel != 1)	message(ParserMessages::pcdataInNestedModelGroup);    }    else if (pcdataCheck) {      if (gt.type == GroupToken::modelGroup)	message(ParserMessages::pcdataGroupMemberModelGroup);      if (contentToken->occurrenceIndicator() != ContentToken::none)	message(ParserMessages::pcdataGroupMemberOccurrenceIndicator);    }    if (tokenVector.size() == 1) {      connector = gc.type;      switch (gc.type) {      case GroupConnector::orGC:	connectorp = &allowOrGrpc;	break;      case GroupConnector::seqGC:	connectorp = &allowSeqGrpc;	break;      case GroupConnector::andGC:	connectorp = &allowAndGrpc;	if (options().warnAndGroup)	  message(ParserMessages::andGroup);	break;      default:	break;      }    }  } while (gc.type != GroupConnector::grpcGC);  ContentToken::OccurrenceIndicator oi    = getOccurrenceIndicator(oiMode);  switch (connector) {  case GroupConnector::orGC:    group = new OrModelGroup(tokenVector, oi);    if (pcdataCheck && oi != ContentToken::rep)      message(ParserMessages::pcdataGroupNotRep);    break;  case GroupConnector::grpcGC:    if (pcdataCheck && oi != ContentToken::rep && oi != ContentToken::none)      message(ParserMessages::pcdataGroupNotRep);    // fall through  case GroupConnector::seqGC:    group = new SeqModelGroup(tokenVector, oi);    break;  case GroupConnector::andGC:    group = new AndModelGroup(tokenVector, oi);    break;  default:    break;  }  return 1;}ContentToken::OccurrenceIndicatorParser::getOccurrenceIndicator(Mode oiMode){  Token token = getToken(oiMode);  switch (token) {  case tokenPlus:    if (currentMarkup())      currentMarkup()->addDelim(Syntax::dPLUS);    return ContentToken::plus;  case tokenOpt:     if (currentMarkup())      currentMarkup()->addDelim(Syntax::dOPT);   return ContentToken::opt;  case tokenRep:    if (currentMarkup())      currentMarkup()->addDelim(Syntax::dREP);    return ContentToken::rep;  default:    currentInput()->ungetToken();    return ContentToken::none;  }}Boolean Parser::parseMinimumLiteral(Boolean lita, Text &text){  return parseLiteral(lita ? mlitaMode : mlitMode, mlitMode,		      Syntax::referenceQuantity(Syntax::qLITLEN),		      ParserMessages::minimumLiteralLength,		      literalSingleSpace|literalMinimumData		      |(eventsWanted().wantPrologMarkup()			? literalDelimInfo			: 0),		      text);}Boolean Parser::parseSystemIdentifier(Boolean lita, Text &text){  return parseLiteral(lita ? slitaMode : slitMode, slitMode, syntax().litlen(),		      ParserMessages::systemIdentifierLength,		      (eventsWanted().wantPrologMarkup()			? literalDelimInfo			: 0), text);}Boolean Parser::parseParameterLiteral(Boolean lita, Text &text){  return parseLiteral(lita ? plitaMode : plitMode, pliteMode, syntax().litlen(), 		      ParserMessages::parameterLiteralLength,		      (eventsWanted().wantPrologMarkup()		       ? literalDelimInfo		       : 0),		      text);}Boolean Parser::parseDataTagParameterLiteral(Boolean lita, Text &text){  return parseLiteral(lita ? plitaMode : plitMode, pliteMode,		      syntax().dtemplen(), 		      ParserMessages::dataTagPatternLiteralLength,		      literalDataTag		      | (eventsWanted().wantPrologMarkup()			 ? literalDelimInfo			 : 0),		      text);}Boolean Parser::parseIndicatedReservedName(const AllowedParams &allow,					   Param &parm){  Syntax::ReservedName rn;  if (!getIndicatedReservedName(&rn))    return 0;  if (!allow.reservedName(rn)) {    message(ParserMessages::invalidReservedName,	    StringMessageArg(currentToken()));    return 0;  }  parm.type = Param::indicatedReservedName + rn;  return 1;}Boolean Parser::parseReservedName(const AllowedParams &allow,				  Param &parm){  Syntax::ReservedName rn;  if (!getReservedName(&rn))    return 0;  if (!allow.reservedName(rn)) {    message(ParserMessages::invalidReservedName,	    StringMessageArg(syntax().reservedName(rn)));    return 0;  }  parm.type = Param::reservedName + rn;  return 1;}Boolean Parser::parseAttributeValueParam(Param &parm){  extendNameToken(syntax().litlen() > syntax().normsep()		  ? syntax().litlen() - syntax().normsep()		  : 0,		  ParserMessages::attributeValueLength);  parm.type = Param::attributeValue;  Text text;  text.addChars(currentInput()->currentTokenStart(),		currentInput()->currentTokenLength(),		currentLocation());  text.swap(parm.literalText);  if (currentMarkup())    currentMarkup()->addAttributeValue(currentInput());  return 1;}Boolean Parser::getIndicatedReservedName(Syntax::ReservedName *result){  if (currentMarkup())    currentMarkup()->addDelim(Syntax::dRNI);  InputSource *in = currentInput();  in->startToken();  if (!syntax().isNameStartCharacter(in->tokenChar(messenger()))) {    message(ParserMessages::rniNameStart);    return 0;  }  extendNameToken(syntax().namelen(), ParserMessages::nameLength);  StringC &buffer = nameBuffer();  getCurrentToken(syntax().generalSubstTable(), buffer);  if (!syntax().lookupReservedName(buffer, result)) {    message(ParserMessages::noSuchReservedName, StringMessageArg(buffer));    return 0;  }  if (currentMarkup())    currentMarkup()->addReservedName(*result, currentInput());  return 1;}Boolean Parser::getReservedName(Syntax::ReservedName *result){  extendNameToken(syntax().namelen(), ParserMessages::nameLength);  StringC &buffer = nameBuffer();  getCurrentToken(syntax().generalSubstTable(), buffer);  if (!syntax().lookupReservedName(buffer, result)) {    message(ParserMessages::noSuchReservedName, StringMessageArg(buffer));    return 0;  }  if (currentMarkup())    currentMarkup()->addReservedName(*result, currentInput());  return 1;}#ifdef SP_NAMESPACE}#endif

⌨️ 快捷键说明

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