Для начала нужно реализовать лексер - модуль, принимающий на вход текст на HTML и выдающий список лексем с их параметрами, например
<div id="test">
Привет
<div>
может быть превращено в
OPEN_TAG_START, DIV, ID, EQUALS, STRING(test), TAG_END, TEXT(Привет),
CLOSE_TAG_START, DIV, TAG_END
Затем второй модуль, парсер, по полученным лексемам строит синтаксическое дерево. Это гораздо более сложная часть, особенно если учесть, что для HTML необходимо как-то обрабатывать некорректные варианты, наподобие
<b><i>Тест</b></i>
.
В результате должно получиться DOM-дерево, скомпилированное из исходного HTML.
Начать вникать в компиляторы можно по
Книге красного дракона