code: protected DCTree html() {
          int p = bp;
          nextChar();
          if (isIdentifierStart(ch)) {
              Name name = readIdentifier();
              List<DCTree> attrs = htmlAttrs();
              if (attrs != null) {
                  boolean selfClosing = false;
                  if (ch == '/') {
                      nextChar();
                      selfClosing = true;
                  }
                  if (ch == '>') {
                      nextChar();
                      DCTree dctree = m.at(p).newStartElementTree(name, attrs, selfClosing).setEndPos(bp);
                      return dctree;
                  }
              }
          } else if (ch == '/') {
              nextChar();
              if (isIdentifierStart(ch)) {
                  Name name = readIdentifier();
                  skipWhitespace();
                  if (ch == '>') {
                      nextChar();
                      return m.at(p).newEndElementTree(name);
                  }
              }
          } else if (ch == '!') {
              nextChar();
              if (ch == '-') {
                  nextChar();
                  if (ch == '-') {
                      nextChar();
                      while (bp < buflen) {
                          int dash = 0;
                          while (ch == '-') {
                              dash++;
                              nextChar();
                          }
                          // Strictly speaking, a comment should not contain "--"
                          // so dash > 2 is an error, dash == 2 implies ch == '>'
                          // See http://www.w3.org/TR/html-markup/syntax.html#syntax-comments
                          // for more details.
                          if (dash >= 2 && ch == '>') {
                              nextChar();
                              return m.at(p).newCommentTree(newString(p, bp));
                          }
  
                          nextChar();
                      }
                  }
              }
          }
  
          bp = p + 1;
          ch = buf[bp];
          return erroneous("dc.malformed.html", p);
      }
docs: Read the start or end of an HTML tag, or an HTML comment
  {@literal <identifier attrs> } or {@literal </identifier> }