void () { final PsiBuilder.Marker document = mark(); while (token() == XmlTokenType.XML_COMMENT_START) { parseComment(); } parseProlog(); PsiBuilder.Marker error = null; while (shouldContinueMainLoop()) { final IElementType tt = token(); if (tt == XmlTokenType.XML_START_TAG_START) { error = flushError(error); parseTag(); } else if (tt == XmlTokenType.XML_COMMENT_START) { error = flushError(error); parseComment(); } else if (tt == XmlTokenType.XML_PI_START) { error = flushError(error); parseProcessingInstruction(); } else if (tt == XmlTokenType.XML_CHAR_ENTITY_REF || tt == XmlTokenType.XML_ENTITY_REF_TOKEN) { parseReference(); } else if (tt == XmlTokenType.XML_REAL_WHITE_SPACE || tt == XmlTokenType.XML_DATA_CHARACTERS) { error = flushError(error); advance(); } else if (tt == XmlTokenType.XML_END_TAG_START) { final PsiBuilder.Marker tagEndError = myBuilder.mark(); advance(); if (token() == XmlTokenType.XML_NAME) { advance(); if (token() == XmlTokenType.XML_TAG_END) { advance(); } } tagEndError.error(XmlPsiBundle.message("xml.parsing.closing.tag.matches.nothing")); } else if (hasCustomTopLevelContent()) { error = parseCustomTopLevelContent(error); } else { if (error == null) error = mark(); advance(); } } flushIncompleteItemsWhile((item) -> true); if (error != null) { error.error(XmlPsiBundle.message("xml.parsing.top.level.element.is.not.completed")); } document.done(XmlElementType.HTML_DOCUMENT); }