Все, кроме кавычек
Для значения атрибута правильный способ сканирования состоит в том, чтобы сопоставить все, что не является кавычкой.Регулярное выражение только для этой части будет выглядеть так:
\"[^\"]*\"
Я не уверен, почему у вас есть \"*
;цитаты не могут быть повторены.Существуют и другие проблемы, такие как разрешение пробелов везде, где это возможно, или принятие одинарных кавычек в дополнение к двойным кавычкам (name='value'
является альтернативой name="value"
).Но есть более серьезная проблема, поэтому я не буду придираться.
Превышение лексера
Более важной проблемой является то, что вы слишком много разбираете в своем лексере.Задача лексера - превратить поток символов в поток токенов.Токены - это небольшие неделимые единицы в тексте.Я бы не пытался анализировать весь открывающий тег, имя элемента, атрибуты и все как один токен.
Вместо этого вы должны извлечь меньшие фрагменты тега: открытая угловая скобка, идентификатор,идентификатор, знак равенства, строка, закрывающая угловая скобка.Пусть лексер распознает эти части и предоставит парсеру понять, что эти токены в этом порядке представляют собой тег элемента.