4

JSが実際にどのように解析されるかを理解しようとしています。しかし、私の検索では、非常に曖昧に文書化された「パーサー/ジェネレーター」のプロジェクト (それが何を意味するのかさえわかりません) が返されるか、魔法の「解析」メソッドを使用して JS エンジンを使用して JS を解析する方法が返されます。たくさんのコードをスキャンして、一生理解しようとはしたくありません (できますが、時間がかかりすぎます)。

JSコードの任意の文字列が実際にオブジェクト、関数、変数などに変換される方法を知りたいです。また、その文字列をものに変換し、保存、参照、実行する手順と手法も知りたいです。

これに関するドキュメント/リファレンスはありますか?

4

2 に答える 2

4

パーサーはおそらくあらゆる種類の方法で機能しますが、基本的には、最初にトークン化の段階を経て、結果をコンパイラーに渡し、可能であればプログラムに変換します。たとえば、次のようになります。

function foo(a) {
  alert(a);
}

パーサーは、最初の文字である文字 "f" の先頭の空白をすべて削除します。トークンの終わりを示す、属さない何か (空白) を取得するまで、文字を収集します。「(」に到達するまで、「foo」の「f」から再び開始するため、トークン「function」と「foo」が含まれます。「(」はそれ自体がトークンであることを認識しているため、3 です。次に、"a" に続いて ")" を取得し、さらに 2 つのトークンで 5 を作成します。

空白が必要なのは、あいまいなトークンの間だけです (たとえば、"function" と "foo" の間に空白または別のトークンが必要です)。

トークン化が完了すると、コンパイラに渡され、「関数」が識別子として認識され、キーワード「関数」として解釈されます。次に、言語文法が関数名であることを示す識別子である「foo」を取得します。次に、「(」はグループ化の開始演算子を示し、したがって仮パラメータ リストの開始を示します。

コンパイラは、一度に 1 つずつトークンを処理したり、トークンをまとめて取得したり、あらゆる種類の奇妙なことを行ってトークンを高速に実行したりします。

How do C/C++ parser work?も読むことができます。、さらにいくつかの手がかりが得られます。または、Googleを使用してください。

于 2012-04-05T09:27:27.723 に答える
1

実際の JS エンジンの動作とは厳密には対応していませんが、 Douglas Crockford のTop Down Operator Precedenceに関する記事を読むことに興味があるかもしれません。この記事には、解析する Javascript サブセットで記述された小さな作業レクサーとパーサーのコードが含まれています。これは非常に読みやすく簡潔なコード (適切な説明が付属しています) であり、少なくとも実際の実装がどのように機能するかの概要を示します。

Crockford の "Top Down Operator Precedence" よりも一般的な手法は、JS の完全な実装であるNarcissusで使用される再帰降下解析です。

于 2012-04-05T08:56:34.147 に答える