boolean (boolean topLevel) { IElementType tokenType = myBuilder.getTokenType(); boolean endedWithDelimiter = false; while ( tokenType != null && tokenType != XML_TAG_END && tokenType != XML_START_TAG_START && tokenType != XML_ELEMENT_DECL_START && tokenType != XML_RIGHT_PAREN && tokenType != XML_COMMENT_START ) { if (tokenType == XML_BAR && topLevel) { addToken(); tokenType = myBuilder.getTokenType(); continue; } else if (tokenType == XML_LEFT_PAREN) { if (!parseGroup()) return false; endedWithDelimiter = false; } else if (tokenType == XML_ENTITY_REF_TOKEN) { parseEntityRef(); endedWithDelimiter = false; } else if (tokenType == XML_NAME || tokenType == XML_CONTENT_EMPTY || tokenType == XML_CONTENT_ANY || tokenType == XML_PCDATA ) { addToken(); endedWithDelimiter = false; } else if (consumeKeywordAsName(tokenType)) { endedWithDelimiter = false; } else { myBuilder.error(XmlPsiBundle.message("dtd.parser.message.name.or.entity.ref.expected")); return false; } tokenType = myBuilder.getTokenType(); if (tokenType == XML_STAR || tokenType == XML_PLUS || tokenType == XML_QUESTION ) { addToken(); tokenType = myBuilder.getTokenType(); if (tokenType == XML_PLUS) { addToken(); tokenType = myBuilder.getTokenType(); } } if (tokenType == XML_BAR || tokenType == XML_COMMA) { addToken(); tokenType = myBuilder.getTokenType(); endedWithDelimiter = true; } } if (endedWithDelimiter && tokenType == XML_RIGHT_PAREN) { myBuilder.error(XmlPsiBundle.message("dtd.parser.message.name.or.entity.ref.expected")); } return true; }