Scanner::TokenType Scanner::scanTag()

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;
}