То як працює HTML-аналізатор? Чи він не використовує регулярні вирази для розбору?
Ну, ні.
Якщо ви повертаєтеся у своєму мозку до теорії обчислювального курсу, якщо ви проходили його, або курсу компіляторів, або чогось подібного, ви можете згадати, що існують різні типи мов та обчислювальні моделі. Я не кваліфікований, щоб вносити всі деталі, але можу переглянути декілька основних моментів з вами.
Найпростіший тип мови та обчислень (для цих цілей) - звичайна мова. Вони можуть бути згенеровані за допомогою регулярних виразів та розпізнані за допомогою кінцевих автоматів. В основному це означає, що "розбір" рядків у цих мовах використовує стан, але не допоміжну пам'ять. HTML, звичайно, не є звичайною мовою. Якщо ви подумаєте над цим, список тегів можна вкладати довільно глибоко. Наприклад, таблиці можуть містити таблиці, і кожна таблиця може містити безліч вкладених тегів. За допомогою регулярних виразів ви зможете виділити пару тегів, але, звичайно, не будь-що довільно вкладене.
Класична проста мова, яка не є регулярною, - це правильно підібрані дужки. Спробуйте як можна, ви ніколи не зможете побудувати регулярний вираз (або кінцевий автомат), який завжди буде працювати. Вам потрібна пам’ять, щоб відстежувати глибину гніздування.
Наступна сила обчислювальної моделі - державна машина з стеком для пам'яті. Це називається автоматом, що висувається, і він розпізнає мови, створені безконтекстними граматиками. Тут ми можемо розпізнати правильно підібрані дужки - дійсно, стек є ідеальною моделлю пам'яті для цього.
Що ж, це досить добре для HTML? На жаль, ні. Можливо, для супер-пупер ретельно перевіреного XML, власне, в якому всі теги завжди вирівнюються ідеально. У реальному HTML-коді ви можете легко знайти такі фрагменти, як <b><i>wow!</b></i>
. Це, очевидно, не гніздиться, тому для правильного синтаксичного аналізу стек просто недостатньо потужний.
Наступним рівнем обчислень є мови, сформовані загальними граматиками та визнані машинами Тьюрінга. Це загальновизнано ефективною найсильнішою обчислювальною моделлю, що існує - автомат стану з допоміжною пам’яттю, пам’ять якої можна змінювати де завгодно. Це те, що можуть робити мови програмування. Це рівень складності, в якому живе HTML.
Щоб узагальнити все тут одним реченням: щоб проаналізувати загальний HTML, вам потрібна справжня мова програмування, а не регулярний вираз.
Синтаксичний аналіз HTML здійснюється так само, як аналіз інших мов: лексирування та синтаксичний аналіз. Крок лексики розбиває потік окремих символів на значущі лексеми. Крок синтаксичного аналізу збирає маркери, використовуючи стани та пам’ять, у логічно цілісний документ, з яким можна діяти.