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