in inference/src/translator/xh_scanner.cpp [208:242]
Scanner::TokenType Scanner::scanTag() {
start_ = input_.pos();
if (input_.consume() != '<') return TT_ERROR;
bool isTail = input_.peek() == '/';
if (isTail) input_.consume();
tagName_ = string_ref{input_.pos(), 0};
while (input_.peek()) {
if (skipWhitespace()) break;
if (input_.peek() == '/' || input_.peek() == '>') break;
input_.consume();
++tagName_.size;
// Note: these tests are executed at every char, thus eager.
// "<?xml" will match on `tagName_ == "?"`.
if (tagName_ == "!--") {
scanFun_ = &Scanner::scanComment;
return TT_COMMENT_START;
} else if (tagName_ == "?") {
scanFun_ = &Scanner::scanProcessingInstruction;
return TT_PROCESSING_INSTRUCTION_START;
}
}
if (!input_.peek()) return TT_EOF;
if (isTail) return input_.consume() == '>' ? TT_TAG_END : TT_ERROR;
scanFun_ = &Scanner::scanAttribute;
return TT_TAG_START;
}