では、HTMLパーサーはどのように機能するのでしょうか。正規表現を使用して解析しませんか?
うーん、ダメ。
計算理論のコース、またはコース、コンパイラのコース、または類似のコースを受講した場合は、さまざまな種類の言語と計算モデルがあることを思い出してください。すべての詳細を説明する資格はありませんが、主要なポイントのいくつかをあなたと一緒に確認できます。
(これらの目的で)最も単純なタイプの言語と計算は、通常の言語です。これらは正規表現で生成でき、有限オートマトンで認識できます。基本的に、これらの言語での文字列の「解析」は状態を使用しますが、補助メモリは使用しません。HTMLは通常の言語ではありません。考えてみれば、タグのリストは任意に深くネストすることができます。たとえば、テーブルにはテーブルを含めることができ、各テーブルには多くのネストされたタグを含めることができます。正規表現を使用すると、タグのペアを選択できる場合がありますが、任意にネストされたものはありません。
規則的ではない古典的な単純な言語は、正しく一致する括弧です。いつものように、常に機能する正規表現(または有限オートマトン)を構築することはできません。ネストの深さを追跡するには、メモリが必要です。
メモリ用のスタックを備えたステートマシンは、計算モデルの次の強みです。これはプッシュダウンオートマトンと呼ばれ、文脈自由文法によって生成された言語を認識します。ここで、正しく一致する括弧を認識できます。実際、スタックはそのための完璧なメモリモデルです。
さて、これはHTMLに十分ですか?残念ながら、違います。おそらく、実際にはすべてのタグが常に完全に揃っている、非常に慎重に検証されたXMLの場合があります。実際のHTMLでは、のようなスニペットを簡単に見つけることができます<b><i>wow!</b></i>
。これは明らかにネストしないので、正しく解析するために、スタックは十分に強力ではありません。
次のレベルの計算は、一般的な文法によって生成され、チューリングマシンによって認識される言語です。これは一般に、存在する最強の計算モデルであると認められています-補助メモリを備えたステートマシンで、メモリはどこでも変更できます。これが、プログラミング言語でできることです。これは、HTMLが存在する複雑さのレベルです。
ここですべてを1つの文に要約するには、一般的なHTMLを解析するには、正規表現ではなく実際のプログラミング言語が必要です。
HTMLは、他の言語が解析されるのと同じ方法で解析されます:字句解析と解析。字句解析ステップは、個々の文字のストリームを意味のあるトークンに分解します。解析ステップでは、状態とメモリを使用して、トークンを組み立てて、操作可能な論理的に一貫したドキュメントにします。