1 // Copyright (c) 1994 James Clark
2 // See the file COPYING for copying permission.
9 #include "ParserMessages.h"
10 #include "MessageArg.h"
11 #include "TokenMessageArg.h"
16 namespace SP_NAMESPACE {
19 Boolean Parser::parseParam(const AllowedParams &allow,
20 unsigned declInputLevel,
24 Token token = getToken(allow.mainMode());
26 case tokenUnrecognized:
27 if (reportNonSgmlCharacter())
30 message(ParserMessages::markupDeclarationCharacter,
31 StringMessageArg(currentToken()),
32 AllowedParamsMessageArg(allow, syntaxPointer()));
36 if (inputLevel() <= declInputLevel) {
37 message(ParserMessages::declarationLevel);
41 currentMarkup()->addEntityEnd();
45 if (!parseComment(comMode))
47 if (options().warnPsComment)
48 message(ParserMessages::psComment);
52 paramInvalidToken(tokenDso, allow);
56 currentMarkup()->addDelim(Syntax::dDSO);
57 parm.type = Param::dso;
61 currentMarkup()->addDelim(Syntax::dGRPO);
62 switch (allow.group()) {
64 paramInvalidToken(tokenGrpo, allow);
66 case Param::modelGroup:
69 if (!parseModelGroup(1, declInputLevel, group, grpsufMode))
71 parm.type = Param::modelGroup;
72 parm.modelGroupPtr = group;
75 case Param::nameGroup:
76 if (!parseNameGroup(declInputLevel, parm))
79 case Param::nameTokenGroup:
80 if (!parseNameTokenGroup(declInputLevel, parm))
86 parm.type = allow.group();
90 parm.type = allow.literal();
91 parm.lita = token == tokenLita;
92 switch (allow.literal()) {
94 paramInvalidToken(token, allow);
96 case Param::minimumLiteral:
97 if (!parseMinimumLiteral(parm.lita, parm.literalText))
100 case Param::attributeValueLiteral:
101 if (!parseAttributeValueLiteral(parm.lita, parm.literalText))
104 case Param::tokenizedAttributeValueLiteral:
105 if (!parseTokenizedAttributeValueLiteral(parm.lita, parm.literalText))
108 case Param::systemIdentifier:
109 if (!parseSystemIdentifier(parm.lita, parm.literalText))
112 case Param::paramLiteral:
113 if (!parseParameterLiteral(parm.lita, parm.literalText))
118 currentMarkup()->addLiteral(parm.literalText);
122 paramInvalidToken(tokenMdc, allow);
125 if (inputLevel() > declInputLevel)
126 message(ParserMessages::parameterEntityNotEnded);
128 currentMarkup()->addDelim(Syntax::dMDC);
129 parm.type = Param::mdc;
132 parm.type = Param::minus;
134 currentMarkup()->addDelim(Syntax::dMINUS);
137 if (!allow.exclusions()) {
138 paramInvalidToken(tokenMinusGrpo, allow);
141 if (currentMarkup()) {
142 currentMarkup()->addDelim(Syntax::dMINUS);
143 currentMarkup()->addDelim(Syntax::dGRPO);
145 parm.type = Param::exclusions;
146 return parseElementNameGroup(declInputLevel, parm);
148 parm.type = Param::pero;
150 currentMarkup()->addDelim(Syntax::dPERO);
154 message(ParserMessages::peroGrpoProlog);
156 case tokenPeroNameStart:
159 if (options().warnInstanceParamEntityRef)
160 message(ParserMessages::instanceParamEntityRef);
163 if (options().warnInternalSubsetPsParamEntityRef && inputLevel() == 1)
164 message(ParserMessages::internalSubsetPsParamEntityRef);
166 ConstPtr<Entity> entity;
167 Ptr<EntityOrigin> origin;
168 if (!parseEntityReference(1, token == tokenPeroGrpo, entity, origin))
170 if (!entity.isNull())
171 entity->declReference(*this, origin);
175 if (!allow.inclusions()) {
176 paramInvalidToken(tokenPlusGrpo, allow);
179 if (currentMarkup()) {
180 currentMarkup()->addDelim(Syntax::dPLUS);
181 currentMarkup()->addDelim(Syntax::dGRPO);
183 parm.type = Param::inclusions;
184 return parseElementNameGroup(declInputLevel, parm);
187 paramInvalidToken(tokenRni, allow);
190 return parseIndicatedReservedName(allow, parm);
193 currentMarkup()->addS(currentChar());
196 switch (allow.nameStart()) {
198 paramInvalidToken(tokenNameStart, allow);
200 case Param::reservedName:
201 return parseReservedName(allow, parm);
204 extendNameToken(syntax().namelen(), ParserMessages::nameLength);
205 parm.type = Param::name;
206 getCurrentToken(parm.origToken);
207 parm.token = StringC(parm.origToken);
208 const SubstTable *subst = syntax().generalSubstTable();
209 StringC::iterator s = parm.token.begin();
210 size_t count = parm.token.size();
211 const Char *tokenData = parm.token.data();
212 for (; count > 0; --count)
213 *s++ = (*subst)[*tokenData++];
215 currentMarkup()->addName(currentInput());
218 case Param::entityName:
219 extendNameToken(syntax().namelen(), ParserMessages::nameLength);
220 parm.type = Param::entityName;
221 getCurrentToken(syntax().entitySubstTable(), parm.token);
223 currentMarkup()->addName(currentInput());
225 case Param::paramEntityName:
226 extendNameToken(syntax().penamelen(),
227 ParserMessages::parameterEntityNameLength);
228 parm.type = Param::paramEntityName;
229 getCurrentToken(syntax().entitySubstTable(), parm.token);
231 currentMarkup()->addName(currentInput());
233 case Param::attributeValue:
234 return parseAttributeValueParam(parm);
238 switch (allow.digit()) {
240 paramInvalidToken(tokenDigit, allow);
243 extendNumber(syntax().namelen(), ParserMessages::numberLength);
244 parm.type = Param::number;
245 getCurrentToken(parm.token);
247 currentMarkup()->addNumber(currentInput());
249 case Param::attributeValue:
250 return parseAttributeValueParam(parm);
253 case tokenLcUcNmchar:
254 switch (allow.nmchar()) {
256 paramInvalidToken(tokenLcUcNmchar, allow);
258 case Param::attributeValue:
259 return parseAttributeValueParam(parm);
268 void Parser::paramInvalidToken(Token token, const AllowedParams &allow)
271 message(ParserMessages::paramInvalidToken,
272 TokenMessageArg(token, allow.mainMode(),
273 syntaxPointer(), sdPointer()),
274 AllowedParamsMessageArg(allow, syntaxPointer()));
277 Boolean Parser::parseGroupToken(const AllowedGroupTokens &allow,
278 unsigned nestingLevel,
279 unsigned declInputLevel,
280 unsigned groupInputLevel,
284 Token token = getToken(grpMode);
287 if (inputLevel() <= groupInputLevel) {
288 message(ParserMessages::groupLevel);
289 if (inputLevel() <= declInputLevel)
292 else if (!sd().www())
293 message(ParserMessages::groupEntityEnd);
295 currentMarkup()->addEntityEnd();
301 message(ParserMessages::peroGrpoProlog);
305 ? ParserMessages::peroGrpoStartTag
306 : ParserMessages::peroGrpoEndTag);
309 case tokenPeroNameStart:
311 if (options().warnInternalSubsetTsParamEntityRef && inputLevel() == 1)
312 message(ParserMessages::internalSubsetTsParamEntityRef);
313 ConstPtr<Entity> entity;
314 Ptr<EntityOrigin> origin;
315 if (!parseEntityReference(1, token == tokenPeroGrpo, entity, origin))
317 if (!entity.isNull())
318 entity->declReference(*this, origin);
321 case tokenUnrecognized:
322 if (reportNonSgmlCharacter())
325 message(ParserMessages::groupCharacter,
326 StringMessageArg(currentToken()),
327 AllowedGroupTokensMessageArg(allow, syntaxPointer()));
331 if (!allow.groupToken(GroupToken::dataTagGroup)) {
332 groupTokenInvalidToken(tokenDtgo, allow);
336 message(ParserMessages::datatagNotImplemented);
337 if (!defDtd().isBase())
338 message(ParserMessages::datatagBaseDtd);
340 currentMarkup()->addDelim(Syntax::dDTGO);
341 return parseDataTagGroup(nestingLevel + 1, declInputLevel, gt);
344 currentMarkup()->addDelim(Syntax::dGRPO);
345 switch (allow.group()) {
346 case GroupToken::modelGroup:
348 ModelGroup *modelGroup;
349 if (!parseModelGroup(nestingLevel + 1, declInputLevel, modelGroup,
352 gt.model = modelGroup;
353 gt.type = GroupToken::modelGroup;
356 case GroupToken::dataTagTemplateGroup:
357 return parseDataTagTemplateGroup(nestingLevel + 1, declInputLevel, gt);
359 groupTokenInvalidToken(tokenGrpo, allow);
364 if (!allow.groupToken(GroupToken::pcdata)
365 && !allow.groupToken(GroupToken::all)
366 && !allow.groupToken(GroupToken::implicit)) {
367 groupTokenInvalidToken(tokenRni, allow);
370 Syntax::ReservedName rn;
371 if (!getIndicatedReservedName(&rn))
373 if (rn == Syntax::rPCDATA && allow.groupToken(GroupToken::pcdata)) {
374 gt.type = GroupToken::pcdata;
375 gt.contentToken = new PcdataToken;
378 else if (rn == Syntax::rALL && allow.groupToken(GroupToken::all)) {
379 message(ParserMessages::sorryAllImplicit);
382 else if (rn == Syntax::rIMPLICIT && allow.groupToken(GroupToken::implicit)) {
383 message(ParserMessages::sorryAllImplicit);
387 StringC token(syntax().delimGeneral(Syntax::dRNI));
388 token += syntax().reservedName(rn);
389 message(ParserMessages::invalidToken, StringMessageArg(token));
393 if (currentMarkup()) {
395 currentMarkup()->addS(currentInput());
399 switch (allow.nameStart()) {
400 case GroupToken::elementToken:
402 extendNameToken(syntax().namelen(), ParserMessages::nameLength);
403 gt.type = GroupToken::elementToken;
404 StringC &buffer = nameBuffer();
405 getCurrentToken(syntax().generalSubstTable(), buffer);
407 currentMarkup()->addName(currentInput());
408 const ElementType *e = lookupCreateElement(buffer);
409 ContentToken::OccurrenceIndicator oi
410 = getOccurrenceIndicator(grpMode);
411 gt.contentToken = new ElementToken(e, oi);
414 case GroupToken::name:
415 case GroupToken::nameToken:
416 extendNameToken(syntax().namelen(),
417 token == GroupToken::name
418 ? ParserMessages::nameLength
419 : ParserMessages::nameTokenLength);
420 getCurrentToken(syntax().generalSubstTable(), gt.token);
421 gt.type = allow.nameStart();
422 if (currentMarkup()) {
423 if (gt.type == GroupToken::nameToken)
424 currentMarkup()->addNameToken(currentInput());
426 currentMarkup()->addName(currentInput());
430 groupTokenInvalidToken(tokenNameStart, allow);
434 case tokenLcUcNmchar:
435 if (!allow.groupToken(GroupToken::nameToken)) {
436 groupTokenInvalidToken(token, allow);
439 extendNameToken(syntax().namelen(), ParserMessages::nameTokenLength);
440 getCurrentToken(syntax().generalSubstTable(), gt.token);
441 gt.type = GroupToken::nameToken;
443 currentMarkup()->addNameToken(currentInput());
447 // parameter literal in data tag pattern
448 if (!allow.groupToken(GroupToken::dataTagLiteral)) {
449 groupTokenInvalidToken(token, allow);
452 if (!parseDataTagParameterLiteral(token == tokenLita, gt.text))
454 gt.type = GroupToken::dataTagLiteral;
456 currentMarkup()->addLiteral(gt.text);
466 groupTokenInvalidToken(token, allow);
473 void Parser::groupTokenInvalidToken(Token token, const AllowedGroupTokens &allow)
475 message(ParserMessages::groupTokenInvalidToken,
476 TokenMessageArg(token, grpMode, syntaxPointer(), sdPointer()),
477 AllowedGroupTokensMessageArg(allow, syntaxPointer()));
481 Boolean Parser::parseGroupConnector(const AllowedGroupConnectors &allow,
482 unsigned declInputLevel,
483 unsigned groupInputLevel,
487 Token token = getToken(grpMode);
490 if (inputLevel() <= groupInputLevel) {
491 message(ParserMessages::groupLevel);
492 if (inputLevel() <= declInputLevel)
496 currentMarkup()->addEntityEnd();
500 if (currentMarkup()) {
502 currentMarkup()->addS(currentInput());
507 message(ParserMessages::peroGrpoProlog);
511 case tokenPeroNameStart:
513 message(ParserMessages::groupEntityReference);
515 ConstPtr<Entity> entity;
516 Ptr<EntityOrigin> origin;
517 if (!parseEntityReference(1, token == tokenPeroGrpo, entity, origin))
519 if (!entity.isNull())
520 entity->declReference(*this, origin);
523 case tokenUnrecognized:
524 if (reportNonSgmlCharacter())
527 message(ParserMessages::groupCharacter,
528 StringMessageArg(currentToken()),
529 AllowedGroupConnectorsMessageArg(allow, syntaxPointer()));
533 if (!allow.groupConnector(GroupConnector::andGC)) {
534 groupConnectorInvalidToken(tokenAnd, allow);
537 gc.type = GroupConnector::andGC;
539 currentMarkup()->addDelim(Syntax::dAND);
542 if (!allow.groupConnector(GroupConnector::seqGC)) {
543 groupConnectorInvalidToken(tokenSeq, allow);
546 gc.type = GroupConnector::seqGC;
548 currentMarkup()->addDelim(Syntax::dSEQ);
551 if (!allow.groupConnector(GroupConnector::orGC)) {
552 groupConnectorInvalidToken(tokenOr, allow);
555 gc.type = GroupConnector::orGC;
557 currentMarkup()->addDelim(Syntax::dOR);
560 if (!allow.groupConnector(GroupConnector::dtgcGC)) {
561 groupConnectorInvalidToken(tokenDtgc, allow);
564 gc.type = GroupConnector::dtgcGC;
565 if (inputLevel() > groupInputLevel)
566 message(ParserMessages::groupParameterEntityNotEnded);
568 currentMarkup()->addDelim(Syntax::dDTGC);
571 if (!allow.groupConnector(GroupConnector::grpcGC)) {
572 groupConnectorInvalidToken(tokenGrpc, allow);
575 gc.type = GroupConnector::grpcGC;
576 if (inputLevel() > groupInputLevel)
577 message(ParserMessages::groupParameterEntityNotEnded);
579 currentMarkup()->addDelim(Syntax::dGRPC);
582 groupConnectorInvalidToken(token, allow);
588 void Parser::groupConnectorInvalidToken(Token token,
589 const AllowedGroupConnectors &allow)
591 message(ParserMessages::connectorInvalidToken,
592 TokenMessageArg(token, grpMode, syntaxPointer(), sdPointer()),
593 AllowedGroupConnectorsMessageArg(allow, syntaxPointer()));
596 static AllowedGroupTokens allowName(GroupToken::name);
598 Boolean Parser::parseElementNameGroup(unsigned declInputLevel, Param &parm)
600 static AllowedGroupTokens allowCommonName(GroupToken::name,
602 GroupToken::implicit);
603 if (!parseGroup(sd().www() ? allowCommonName : allowName, declInputLevel, parm))
605 parm.elementVector.resize(parm.nameTokenVector.size());
606 for (size_t i = 0; i < parm.nameTokenVector.size(); i++)
607 parm.elementVector[i] = lookupCreateElement(parm.nameTokenVector[i].name);
611 Boolean Parser::parseEntityReferenceNameGroup(Boolean &ignore)
614 if (!parseNameGroup(inputLevel(), parm))
617 for (size_t i = 0; i < parm.nameTokenVector.size(); i++) {
618 const Lpd *lpd = lookupLpd(parm.nameTokenVector[i].name).pointer();
619 if (lpd && lpd->active()) {
623 Ptr<Dtd> dtd = lookupDtd(parm.nameTokenVector[i].name).pointer();
626 if (currentDtdPointer() == dtd) {
637 Boolean Parser::parseTagNameGroup(Boolean &active, Boolean start)
641 Boolean ret = parseNameGroup(inputLevel(), parm);
646 for (size_t i = 0; i < parm.nameTokenVector.size(); i++) {
647 Ptr<Dtd> dtd = lookupDtd(parm.nameTokenVector[i].name).pointer();
650 if (currentDtdPointer() == dtd)
657 Boolean Parser::parseNameGroup(unsigned declInputLevel, Param &parm)
659 return parseGroup(allowName, declInputLevel, parm);
662 Boolean Parser::parseNameTokenGroup(unsigned declInputLevel, Param &parm)
664 static AllowedGroupTokens allowNameToken(GroupToken::nameToken);
665 return parseGroup(allowNameToken, declInputLevel, parm);
669 Boolean groupContains(const Vector<NameToken> &vec, const StringC &str)
671 for (size_t i = 0; i < vec.size(); i++)
672 if (vec[i].name == str)
677 Boolean Parser::parseGroup(const AllowedGroupTokens &allowToken,
678 unsigned declInputLevel,
681 unsigned groupInputLevel = inputLevel();
683 Vector<NameToken> &vec = parm.nameTokenVector;
685 GroupConnector::Type connector = GroupConnector::grpcGC;
688 if (!parseGroupToken(allowToken, 0, declInputLevel, groupInputLevel, gt))
690 if (groupContains(vec, gt.token)) {
692 message(ParserMessages::duplicateGroupToken,
693 StringMessageArg(gt.token));
696 vec.resize(vec.size() + 1);
697 gt.token.swap(vec.back().name);
698 getCurrentToken(vec.back().origName);
699 vec.back().loc = currentLocation();
702 static AllowedGroupConnectors allowAnyConnectorGrpc(GroupConnector::orGC,
703 GroupConnector::andGC,
704 GroupConnector::seqGC,
705 GroupConnector::grpcGC);
707 if (!parseGroupConnector(allowAnyConnectorGrpc, declInputLevel,
708 groupInputLevel, gc))
710 if (gc.type == GroupConnector::grpcGC)
712 if (options().warnNameGroupNotOr) {
713 if (gc.type != GroupConnector::orGC)
714 message(ParserMessages::nameGroupNotOr);
716 else if (options().warnShould) {
717 if (connector == GroupConnector::grpcGC)
719 else if (gc.type != connector) {
720 message(ParserMessages::mixedConnectors);
725 if (nDuplicates + vec.size() > syntax().grpcnt())
726 message(ParserMessages::groupCount, NumberMessageArg(syntax().grpcnt()));
730 Boolean Parser::parseDataTagGroup(unsigned nestingLevel,
731 unsigned declInputLevel, GroupToken &result)
733 if (nestingLevel - 1 == syntax().grplvl())
734 message(ParserMessages::grplvl, NumberMessageArg(syntax().grplvl()));
735 unsigned groupInputLevel = inputLevel();
737 static AllowedGroupTokens allowName(GroupToken::name);
738 if (!parseGroupToken(allowName, nestingLevel, declInputLevel,
739 groupInputLevel, gt))
741 const ElementType *element = lookupCreateElement(gt.token);
743 static AllowedGroupConnectors allowSeq(GroupConnector::seqGC);
744 if (!parseGroupConnector(allowSeq, declInputLevel, groupInputLevel, gc))
746 static AllowedGroupTokens
747 allowDataTagLiteralDataTagTemplateGroup(GroupToken::dataTagLiteral,
748 GroupToken::dataTagTemplateGroup);
749 if (!parseGroupToken(allowDataTagLiteralDataTagTemplateGroup,
755 Vector<Text> templates;
756 if (gt.type == GroupToken::dataTagTemplateGroup)
757 gt.textVector.swap(templates);
760 gt.text.swap(templates[0]);
762 static AllowedGroupConnectors allowSeqDtgc(GroupConnector::seqGC,
763 GroupConnector::dtgcGC);
764 if (!parseGroupConnector(allowSeqDtgc, declInputLevel, groupInputLevel, gc))
766 NCVector<Owner<ContentToken> > vec(2);
767 vec[1] = new PcdataToken;
768 if (gc.type != GroupConnector::dtgcGC) {
769 static AllowedGroupTokens allowDataTagLiteral(GroupToken::dataTagLiteral);
770 if (!parseGroupToken(allowDataTagLiteral,
776 vec[0] = new DataTagElementToken(element, templates, gt.text);
777 static AllowedGroupConnectors allowDtgc(GroupConnector::dtgcGC);
778 if (!parseGroupConnector(allowDtgc, declInputLevel, groupInputLevel, gc))
782 vec[0] = new DataTagElementToken(element, templates);
783 ContentToken::OccurrenceIndicator oi = getOccurrenceIndicator(grpMode);
784 result.contentToken = new DataTagGroup(vec, oi);
785 result.type = GroupToken::dataTagGroup;
789 Boolean Parser::parseDataTagTemplateGroup(unsigned nestingLevel,
790 unsigned declInputLevel,
793 if (nestingLevel - 1 == syntax().grplvl())
794 message(ParserMessages::grplvl, NumberMessageArg(syntax().grplvl()));
795 unsigned groupInputLevel = inputLevel();
796 Vector<Text> &vec = result.textVector;
799 static AllowedGroupTokens allowDataTagLiteral(GroupToken::dataTagLiteral);
800 if (!parseGroupToken(allowDataTagLiteral,
806 if (vec.size() == syntax().grpcnt())
807 message(ParserMessages::groupCount, NumberMessageArg(syntax().grpcnt()));
808 vec.resize(vec.size() + 1);
809 gt.text.swap(vec.back());
810 static AllowedGroupConnectors allowOrGrpc(GroupConnector::orGC,
811 GroupConnector::grpcGC);
813 if (!parseGroupConnector(allowOrGrpc, declInputLevel, groupInputLevel, gc))
815 if (gc.type == GroupConnector::grpcGC)
821 Boolean Parser::parseModelGroup(unsigned nestingLevel, unsigned declInputLevel,
822 ModelGroup *&group, Mode oiMode)
824 if (nestingLevel - 1 == syntax().grplvl())
825 message(ParserMessages::grplvl, NumberMessageArg(syntax().grplvl()));
826 unsigned groupInputLevel = inputLevel();
828 NCVector<Owner<ContentToken> > tokenVector;
829 GroupConnector::Type connector = GroupConnector::grpcGC;
831 static AllowedGroupTokens allowContentToken(GroupToken::pcdata,
832 GroupToken::dataTagGroup,
833 GroupToken::elementToken,
834 GroupToken::modelGroup);
835 static AllowedGroupTokens allowCommonContentToken(GroupToken::pcdata,
837 GroupToken::implicit,
838 GroupToken::dataTagGroup,
839 GroupToken::elementToken,
840 GroupToken::modelGroup);
841 static AllowedGroupConnectors allowAnyConnectorGrpc(GroupConnector::orGC,
842 GroupConnector::andGC,
843 GroupConnector::seqGC,
844 GroupConnector::grpcGC);
846 static AllowedGroupConnectors allowOrGrpc(GroupConnector::orGC,
847 GroupConnector::grpcGC);
848 static AllowedGroupConnectors allowAndGrpc(GroupConnector::andGC,
849 GroupConnector::grpcGC);
850 static AllowedGroupConnectors allowSeqGrpc(GroupConnector::seqGC,
851 GroupConnector::grpcGC);
852 const AllowedGroupConnectors *connectorp = &allowAnyConnectorGrpc;
855 Boolean pcdataCheck = 0;
857 if (!parseGroupToken(sd().www() ? allowCommonContentToken
859 nestingLevel, declInputLevel, groupInputLevel, gt))
861 ContentToken *contentToken;
862 if (gt.type == GroupToken::modelGroup)
863 contentToken = gt.model.extract();
865 contentToken = gt.contentToken.extract();
866 if (tokenVector.size() == syntax().grpcnt())
867 message(ParserMessages::groupCount, NumberMessageArg(syntax().grpcnt()));
868 tokenVector.resize(tokenVector.size() + 1);
869 tokenVector.back() = contentToken;
870 if (!parseGroupConnector(*connectorp, declInputLevel, groupInputLevel, gc))
872 if (options().warnMixedContentRepOrGroup && gt.type == GroupToken::pcdata) {
873 if (tokenVector.size() != 1)
874 message(ParserMessages::pcdataNotFirstInGroup);
875 else if (gc.type == GroupConnector::seqGC)
876 message(ParserMessages::pcdataInSeqGroup);
879 if (nestingLevel != 1)
880 message(ParserMessages::pcdataInNestedModelGroup);
882 else if (pcdataCheck) {
883 if (gt.type == GroupToken::modelGroup)
884 message(ParserMessages::pcdataGroupMemberModelGroup);
885 if (contentToken->occurrenceIndicator() != ContentToken::none)
886 message(ParserMessages::pcdataGroupMemberOccurrenceIndicator);
888 if (tokenVector.size() == 1) {
891 case GroupConnector::orGC:
892 connectorp = &allowOrGrpc;
894 case GroupConnector::seqGC:
895 connectorp = &allowSeqGrpc;
897 case GroupConnector::andGC:
898 connectorp = &allowAndGrpc;
899 if (options().warnAndGroup)
900 message(ParserMessages::andGroup);
906 } while (gc.type != GroupConnector::grpcGC);
907 ContentToken::OccurrenceIndicator oi
908 = getOccurrenceIndicator(oiMode);
910 case GroupConnector::orGC:
911 group = new OrModelGroup(tokenVector, oi);
912 if (pcdataCheck && oi != ContentToken::rep)
913 message(ParserMessages::pcdataGroupNotRep);
915 case GroupConnector::grpcGC:
916 if (pcdataCheck && oi != ContentToken::rep && oi != ContentToken::none)
917 message(ParserMessages::pcdataGroupNotRep);
919 case GroupConnector::seqGC:
920 group = new SeqModelGroup(tokenVector, oi);
922 case GroupConnector::andGC:
923 group = new AndModelGroup(tokenVector, oi);
931 ContentToken::OccurrenceIndicator
932 Parser::getOccurrenceIndicator(Mode oiMode)
934 Token token = getToken(oiMode);
938 currentMarkup()->addDelim(Syntax::dPLUS);
939 return ContentToken::plus;
942 currentMarkup()->addDelim(Syntax::dOPT);
943 return ContentToken::opt;
946 currentMarkup()->addDelim(Syntax::dREP);
947 return ContentToken::rep;
949 currentInput()->ungetToken();
950 return ContentToken::none;
954 Boolean Parser::parseMinimumLiteral(Boolean lita, Text &text)
956 return parseLiteral(lita ? mlitaMode : mlitMode, mlitMode,
957 Syntax::referenceQuantity(Syntax::qLITLEN),
958 ParserMessages::minimumLiteralLength,
959 literalSingleSpace|literalMinimumData
960 |(eventsWanted().wantPrologMarkup()
966 Boolean Parser::parseSystemIdentifier(Boolean lita, Text &text)
968 return parseLiteral(lita ? slitaMode : slitMode, slitMode, syntax().litlen(),
969 ParserMessages::systemIdentifierLength,
970 (eventsWanted().wantPrologMarkup()
975 Boolean Parser::parseParameterLiteral(Boolean lita, Text &text)
977 return parseLiteral(lita ? plitaMode : plitMode, pliteMode, syntax().litlen(),
978 ParserMessages::parameterLiteralLength,
979 (eventsWanted().wantPrologMarkup()
985 Boolean Parser::parseDataTagParameterLiteral(Boolean lita, Text &text)
987 return parseLiteral(lita ? plitaMode : plitMode, pliteMode,
989 ParserMessages::dataTagPatternLiteralLength,
991 | (eventsWanted().wantPrologMarkup()
997 Boolean Parser::parseIndicatedReservedName(const AllowedParams &allow,
1000 Syntax::ReservedName rn;
1001 if (!getIndicatedReservedName(&rn))
1003 if (!allow.reservedName(rn)) {
1004 message(ParserMessages::invalidReservedName,
1005 StringMessageArg(currentToken()));
1008 parm.type = Param::indicatedReservedName + rn;
1012 Boolean Parser::parseReservedName(const AllowedParams &allow,
1015 Syntax::ReservedName rn;
1016 if (!getReservedName(&rn))
1018 if (!allow.reservedName(rn)) {
1019 message(ParserMessages::invalidReservedName,
1020 StringMessageArg(syntax().reservedName(rn)));
1023 parm.type = Param::reservedName + rn;
1028 Boolean Parser::parseAttributeValueParam(Param &parm)
1030 extendNameToken(syntax().litlen() > syntax().normsep()
1031 ? syntax().litlen() - syntax().normsep()
1033 ParserMessages::attributeValueLength);
1034 parm.type = Param::attributeValue;
1036 text.addChars(currentInput()->currentTokenStart(),
1037 currentInput()->currentTokenLength(),
1039 text.swap(parm.literalText);
1040 if (currentMarkup())
1041 currentMarkup()->addAttributeValue(currentInput());
1045 Boolean Parser::getIndicatedReservedName(Syntax::ReservedName *result)
1047 if (currentMarkup())
1048 currentMarkup()->addDelim(Syntax::dRNI);
1049 InputSource *in = currentInput();
1051 if (!syntax().isNameStartCharacter(in->tokenChar(messenger()))) {
1052 message(ParserMessages::rniNameStart);
1055 extendNameToken(syntax().namelen(), ParserMessages::nameLength);
1056 StringC &buffer = nameBuffer();
1057 getCurrentToken(syntax().generalSubstTable(), buffer);
1058 if (!syntax().lookupReservedName(buffer, result)) {
1059 message(ParserMessages::noSuchReservedName, StringMessageArg(buffer));
1062 if (currentMarkup())
1063 currentMarkup()->addReservedName(*result, currentInput());
1067 Boolean Parser::getReservedName(Syntax::ReservedName *result)
1069 extendNameToken(syntax().namelen(), ParserMessages::nameLength);
1070 StringC &buffer = nameBuffer();
1071 getCurrentToken(syntax().generalSubstTable(), buffer);
1072 if (!syntax().lookupReservedName(buffer, result)) {
1073 message(ParserMessages::noSuchReservedName, StringMessageArg(buffer));
1076 if (currentMarkup())
1077 currentMarkup()->addReservedName(*result, currentInput());