「トークナイザー」、「パーサー」、「レクサー」とは何か、またそれらがどのように相互に関連して使用されるのかについての明確な定義をお探しですか?
質問
「トークナイザー」、「パーサー」、「レクサー」とは何なのか、またそれらがどのように相互に関係しているのか (たとえば、パーサーはトークナイザーを使用するのか、あるいはその逆なのか) についての明確な定義を探しています。c/h ソース ファイルを調べてデータの宣言と定義を抽出するプログラムを作成する必要があります。
私は例を探しており、いくつかの情報を見つけることができますが、文法規則、解析ツリー、抽象構文ツリーなどの基礎となる概念と、それらがどのように相互に関連するかを理解するのに非常に苦労しています。最終的には、これらの概念を実際のプログラムに保存する必要がありますが、1) それらはどのようなものなのか、2) 共通の実装があるのか。
私はこれらのトピックや Lex や Yacc などのプログラムについて Wikipedia を見てきましたが、コンパイラー クラス (EE 専攻) を一度も受講したことがないので、何が起こっているのかを完全に理解するのは難しいと感じています。
解決
A、通常は空白文字(タブ、スペース、改行)を探すことによってます。
Aレクサーは基本的にトークナイザですが、それは通常のトークンに追加のコンテキストを付ける - このトークンが数である、そのトークンは、この他のトークンは、等価演算子文字列リテラルです。
。パーサはレクサーからトークンのストリームを受け取り、元のテキストで表される(通常は)番組を表す抽象構文木に変換します。
私は最後にチェック、主題で最高の本は「コンパイラた:原則、ドラゴンブック 『"通常と同じように知られているの』テクニック、およびツールます。
他のヒント
例:
int x = 1;
レクサーまたはトークナイザーは、それをトークン「int」、「x」、「=」、「1」、「;」に分割します。
パーサーはこれらのトークンを取得し、それを使用して何らかの方法で理解します。
- 私たちには声明があります
- それは整数の定義です
- 整数は「x」と呼ばれます
- 「x」は値 1 で初期化する必要があります
私はレクサーとトークナイザは基本的に同じものであることを、そして彼らはその構成部品(「トークン」)にテキストを破ると言うでしょう。パーサは、次に文法を使用してトークンを解釈します。
私はあまりにもかかわらず、正確な用語の使用状況にハングアップを取得しないだろう - 人々は、多くの場合、テキストの塊を解釈する任意のアクションを記述するために「構文解析」を使用
。(与えられた答えに追加する)
- トークナイザーは また コメントを削除し、のみを返します トークン レクサーに。
- レクサーは また これらのトークン (変数/関数) のスコープを定義します。
- パーサーはコード/プログラム構造を構築します。