Comment fonctionne un analyseur HTML ? N'utilise-t-il pas des expressions régulières pour analyser ?
Eh bien, non.
Si vous vous remémorez un cours de théorie du calcul, si vous en avez suivi un, ou un cours sur les compilateurs, ou quelque chose de similaire, vous vous souviendrez peut-être qu'il existe différents types de langages et de modèles informatiques. Je ne suis pas qualifié pour entrer dans tous les détails, mais je peux passer en revue avec vous quelques-uns des principaux points.
Le type de langage et de calcul le plus simple (à ces fins) est un langage régulier. Ceux-ci peuvent être générés avec des expressions régulières, et reconnus avec des automates finis. Fondamentalement, cela signifie que l'"analyse" des chaînes de caractères dans ces langages utilise un état, mais pas de mémoire auxiliaire. Le HTML n'est certainement pas un langage régulier. Si vous y réfléchissez, la liste des balises peut être imbriquée de manière arbitraire et profonde. Par exemple, les tableaux peuvent contenir des tableaux, et chaque tableau peut contenir de nombreuses balises imbriquées. Avec les expressions régulières, vous pouvez être en mesure de repérer une paire de balises, mais certainement pas quelque chose d'arbitrairement imbriqué.
Un langage simple classique qui n'est pas régulier est celui des parenthèses correctement appariées. Vous aurez beau essayer, vous ne serez jamais en mesure de construire une expression régulière (ou un automate fini) qui fonctionnera toujours. Vous avez besoin de mémoire pour garder la trace de la profondeur d'imbrication.
Une machine à états avec une pile pour la mémoire est la force suivante du modèle de calcul. On l'appelle un automate poussé vers le bas, et il reconnaît les langages générés par des grammaires sans contexte. Ici, nous pouvons reconnaître les parenthèses correctement appariées - en fait, une pile est le modèle de mémoire parfait pour cela.
C'est assez bon pour le HTML ? Malheureusement, non. Peut-être pour le XML validé avec un soin extrême, dans lequel toutes les balises sont toujours parfaitement alignées. Dans le monde réel du HTML, vous pouvez facilement trouver des extraits tels que <b><i>wow!</b></i>
. Il est évident que cela ne s'emboîte pas, donc pour l'analyser correctement, une pile n'est pas assez puissante.
Le niveau de calcul suivant est celui des langages générés par des grammaires générales, et reconnus par des machines de Turing. Il est généralement admis qu'il s'agit du modèle de calcul le plus puissant qui soit - une machine à états, avec une mémoire auxiliaire, dont la mémoire peut être modifiée partout. C'est ce que peuvent faire les langages de programmation. C'est le niveau de complexité où se situe le HTML.
Pour résumer tout cela en une phrase : pour analyser le HTML général, il faut un vrai langage de programmation, pas une expression régulière.
Le HTML est analysé de la même manière que les autres langues : par lexie et analyse syntaxique. L'étape de lexie décompose le flux de caractères individuels en jetons significatifs. L'étape d'analyse syntaxique assemble les tokens, en utilisant des états et de la mémoire, en un document logiquement cohérent sur lequel on peut agir.