web-dev-qa-db-ja.com

HTMLは文脈自由言語ですか?

somerelatedquestions を読んで、HTMLの理論的な性質について考えさせられました。

ここでは、XHTMLのようなコードについては話していません。私はこの完全に有効なHTML(!)のマークアップのクレイジーな部分について話している

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html<head>
<title//
<p ltr<span id=p></span</p>
</>

SGMLがここに注入する非常に複雑なことを考えると、HTMLは文脈自由言語ですか?とにかくそれは正式な言語ですか?文法は?

HTML5はどうですか?

私は正式な言語の概念に慣れていないので、我慢してください。そして、はい、私はウィキペディアの記事を読みました;)

47

Context Freeは、パーサーの実装に重要な意味を持つ言語理論の概念です。 Context Free Languageは、Context Free Grammarで記述できます。すべてのルールが矢印の左側に単一の非終端記号を持っているものです:

X→δ

この単純な制限により、Xを、前後に何があるかに関係なく、左側に表示されるルールの右側で置き換えることができます。たとえば、派生または解析中に次のアドレスに到達した場合:

αXλ 

確かに

αδλ

も有効です。非コンテキストフリールールの例は次のとおりです。

XY→δ
Xa→δ
aX→δ

それらは、ルールが適用されるかどうかを決定するためにXの周囲に何が派生する可能性があるかを知る必要があり、それが非決定論につながります(Xの周りにあるものは、それが何に由来するかも知りたいと思っています)。構文解析ではノーであり、いずれにせよ、言語を明確に定義する必要があります。

言語が文脈自由であることを証明する唯一の方法は、その文脈自由文法があることを証明することであり、これは簡単な作業ではありません。あるほとんどのプログラミング言語はすでにCFGによって記述されているので、仕事は終わりです。しかし、プログラミング言語を含め、ロジックまたはプレーンな英語を使用して記述される他の言語があるので、それらが文脈自由かどうかを見つけるための作業が必要です。

HTMLの場合、そのコンテキストの自由に関する答えは「はい」です。 SGMLは明確に定義されたContext Free Languageであり、その上に定義されたHTMLもCFLです。 Webには、両方の言語のパーサーと文法がたくさんあります。とにかく、その LL(k)文法が存在するvalidのHTMLは、言語が文脈自由であることの十分な証拠ですLLはCFの実績のあるサブセットだからです。

しかし、Webの存続期間中にHTMLが進化したため、ブラウザはHTMLをそれほど明確に定義されていないものとして扱うように強いられました。現代のWebブラウザーは、見つけたほとんどすべてのものから賢明なものをレンダリングしようとするのに邪魔になります。それらが使用する文法はCFGではなく、パーサーはSGML/HTMLに必要な文法よりもはるかに複雑です。

HTMLはいくつかのレベルで定義されています。

  1. 字句レベルでは、有効な文字、識別子、文字列などのルールがあります。
  2. 次のレベルはXMLです。XMLは、階層的なドキュメント構造を定義する<tags>の開始と終了で構成されます。ビルドスクリプトに対してApache Antが行うように、XMLまたはXMLのようなものをあらゆる目的に使用できます。
  3. 次のレベルは、HTMLで有効なタグと、どのタグがどのタグ内にネストできるかに関するルールです。
  4. 次のレベルは、CSSやJavaScriptのようにHTMLに埋め込むことができる言語である、どのタグに対してどの属性が有効であるかに関するルールです。
  5. 最後に、特定のHTMLドキュメントの意味についてのセマンティックルールがあります。

構文部分は 検証済み になるように十分に定義されています。セマンティックの部分は、構文の部分よりもはるかに大きく、HTTPに関するブラウザアクション、および Document Object Model (DOM)、およびモデルを画面にレンダリングする方法に関して定義されます。

最終的には:

  1. 正しいHTMLの解析は非常に簡単です(コンテキストフリーでLL/LRです)。
  2. Web上に実際に存在するHTMLを解析することは困難です。
  3. HTML/CSS/DOMでセマンティクス(ブラウザ)を実装することは非常に困難です。
54
Apalala

有効なHTMLは文脈自由言語ではありません。

まず第一に、HTMLがSGMLのアプリケーションであることは、すべての実用的な目的のためのフィクションであるため、質問に答えるためにSGMLを分析することは無意味です。 (しかし、SGMLフィクションもおそらく文脈自由ではありません。)

実際に定義されたHTML解析アルゴリズムを確認する方が便利です。トークン化とツリー構築という2つのレベルで機能します。 HTMLがトークン化と呼ぶものは、パーサーについて話すときに通常トークン化と呼ばれるものよりも高レベルの操作です。 HTMLの場合、トークン化は文字のストリームを開始タグ、終了タグ、コメント、テキストなどの単位に分割します。トークナイザーは文字参照を拡張します。通常、パーサーについて話すときは、「より小」記号のようなものを「トークン」として扱う可能性があり、文字参照はトークナイザによって解決されるのではなく、トークンで構成されると見なされます。

入力ストリームをトークンに分割するプロセスを検討する場合、HTML言語のそのレベルは通常のものです(exceptはツリービルダーからのフィードバック用)。

ただし、3つの複雑な問題があります。最初の問題は、入力ストリームをトークンに分割することが最初の問題であり、次に、トークン内の識別子を実際に処理するツリービルダーの側です。 2つ目は、ツリービルダーがトークナイザーにフィードバックするため、トークナイザーによるいくつかの状態遷移がツリービルダーの状態に依存することです。 3つ目は、言語で有効なドキュメントは、ツリービルダーステージの出力に適用されるルールによって定義され、それらのルールは非常に複雑で、ツリーオートマトンを使用して完全に定義できないことです(RELAX NGすべての妥当性制約を説明するのに十分な表現力がない)。

これは実際の証明ではありませんが、合併症#2と#3から作業することで実際の証明を作成できるでしょう。

無効なドキュメントのケースは、言語が文脈自由であるかどうかの質問として特に興味深いものではないことに注意してください。ある程度理解できる構文解析ツリーに関係なく、可能なすべての文字列を生成する文脈自由文法があるという意味です。 HTMLパーサーが生成するツリーの観点から。 HTMLパーサーはすべての可能な文字列を正常に消費するため、その意味では、すべての可能な文字列は「無効なHTML」言語で記述されています。

編集:読者への演習として残された興味深い質問:

解析エラーのないHTMLですが、妥当性を無視することはコンテキストフリー言語ですか?

HTMLは解析エラーなしで一般的な有効性を無視しますが、有効な要素名のみでコンテキストフリー言語を許可しますか?

(合併症#2はどちらの場合にも適用されます。)

14
hsivonen

[〜#〜]いいえ[〜#〜]

以下の編集を参照してください

状況によります。

理論上のHTMLのみで構成されるサブセットについて話している場合は、yesです。

インターネット上の多くのトップサイトで毎日何百万もの人々がアクセスして使用する実際の作業用HTMLも含めると、[〜#〜]いいえ[〜#〜]

これがHTMLに柔軟性を与えるものです。解析エンジンは、タグを追加し、タグを閉じ、理論的なCFGでは実行できない処理を行います。オートマトンを取った場合、正式な文法のプロダクションルールをlhs(左側)で空(別名、イプシロン/ラムダ)にすることはできないことを覚えているかもしれません。構文解析エンジンは基本的に、正式な文法とオートマトンが持つことができなかった知識を使用しているため、それによって制限されず、「文法」はepsilon/lambda -> resultここで、特定のイプシロン/ラムダルールは、文法で利用できない情報に基づいて選択されます。

空のlhは正式な文法では許可されていないと思うので、HTMLは正式な文法では定義できず、正式な言語ではありません。

確かに、HTML5は「よりフォーマルな」言語記述に方向に移動しようとするかもしれませんが、実際には文脈自由言語になる可能性があります(つまり、文法に一致しない文字列は拒否されます)。これは、XHTML 2.0が世界を席巻し、HTMLを完全に置き換える可能性についてです(XHTMLはHTMLを正式な言語にするために行った試みです...その脆弱性のためにまとめて拒否されました)。

注目に値するのは、HTML 5が実装前に定義される最初のHTML標準であることです。そうです、HTML 1-4は、誰かがブラウザに実装したばかりのランダムなアイデアで構成されており、広く使用され広く実装されている機能に基づいて、事実に基づいて標準にまとめられました。その後、XHTMLを試してみましたが、まったく採用されませんでした。 Web上の「xhtml」でさえ、ほとんどすべての状況下で自動的にHTMLとして解析され、不可解な構文エラーでデータが壊れるのを防ぎます。これで、私たちがここにたどり着いた理由と、それがすぐに正式化される可能性が低い理由がわかります。

レッスン:「理論的には、理論と実践の間に違いはありません。実際には違いがあります。」 -ヨギベラ

編集:

実際、ドキュメントを読んだ後、HTMLは、HTML 4.01仕様に従ってさえ、実際にはSGMLに準拠していないことがわかります。自分で確認するには、HTML 4.01 Strict文書型定義(doctype)を http://www.w3.org/TR/html4/strict.dtd で表示し、次の行に注意してください。

HTML 4.01仕様には、DTD内で表現できない追加の構文制約が含まれています。

だから私はそれがおそらくそれらの機能のためにCFLではないと言います(技術的にはそれはいくつかの可能性があるという仮説を否定しませんPDA HTML 4.01を受け入れるため、SGMLがCFLであり、したがってHTMLはCFLであるという主張は阻止されます。

HTML5フリップフロップ、 SGMLへの暗黙の準拠を破棄 ですが、おそらくCFGによって記述されます。ただし、cfgに基づいていないベストエフォート型の解析が引き続き提供されるため、IMOの現在の状況(つまり、言語仕様が正式に定義されており、無効な文字列が引き続き受け入れられ、解析され、ベストエフォート形式でレンダリングされている)は、この点では考えられません。長い間、長い間、劇的に変化します。

10
Brandon

HTML5は、完全に正しくないコードの解析動作を厳密に定義するという点で、以前のHTMLバージョンとは異なります。 HTML5より前のパーサーはさまざまであり、それぞれがコード作成者の意図を「推測」するために最善を尽くします。

4
Delan Azabani