173

「トークナイザー」、「パーサー」、および「レクサー」とは何か、およびそれらが互いにどのように関連しているかについての明確な定義を探しています(たとえば、パーサーはトークナイザーを使用しますか、またはその逆ですか)?データの宣言と定義を抽出するために c/h ソース ファイルを通過するプログラムを作成する必要があります。

例を探していて、いくつかの情報を見つけることができますが、文法規則、解析ツリー、抽象構文ツリー、およびそれらが相互にどのように関連しているかなどの基本的な概念を理解するのに本当に苦労しています. 最終的には、これらの概念を実際のプログラムに格納する必要がありますが、1) どのように見えるか、2) 共通の実装はありますか。

これらのトピックや Lex や Yacc などのプログラムについて Wikipedia を調べてきましたが、コンパイラ クラス (EE メジャー) を経験したことがないので、何が起こっているのかを完全に理解するのは難しいと感じています。

4

4 に答える 4

200

トークナイザーは、通常、空白 (タブ、スペース、改行) を探すことによって、テキストのストリームをトークンに分割します。

レクサーは基本的にトークナイザーですが、通常は追加のコンテキストをトークンに付加します。このトークンは数値、そのトークンは文字列リテラル、この別のトークンは等価演算子です。

パーサーは、レクサーからトークンのストリームを取得し、元のテキストで表される (通常は) プログラムを表す抽象構文ツリーに変換します。

最後にチェックしたところ、このテーマに関する最高の本は、通常は「ドラゴンブック」として知られている「コンパイラ: 原則、テクニック、およびツール」でした。

于 2008-12-19T09:25:14.193 に答える
23

例:

int x = 1;

レクサーまたはトークナイザーは、それをトークン「int」、「x」、「=」、「1」、「;」に分割します。

パーサーはこれらのトークンを取得し、それらを使用して何らかの方法で理解します。

  • 私たちは声明を持っています
  • それは整数の定義です
  • 整数は「x」と呼ばれます
  • 'x' は値 1 で初期化する必要があります
于 2009-03-26T17:37:37.983 に答える
5

レクサーとトークナイザーは基本的に同じものであり、テキストをその構成要素 (「トークン」) に分割します。次にパーサーは、文法を使用してトークンを解釈します。

ただし、正確な用語の使用法にこだわりすぎることはありません。人々は、テキストの塊を解釈するアクションを説明するために「解析」をよく使用します。

于 2008-12-19T09:25:41.900 に答える