web-dev-qa-db-ja.com

「トケナイザー」、「パーサー」、「レクサー」とは何か、またそれらがどのように相互に関連し使用されているかについての明確な定義をお探しですか?

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

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

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

128
lordhog

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

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

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

最後に確認したところ、このテーマに関する最高の本は "Compilers:Principles、Techniques、and Tools" 通常「The Dragon Book」として知られています。

143
Roger Lipscombe

例:

int x = 1;

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

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

  • 声明があります
  • それは整数の定義です
  • 整数は「x」と呼ばれます
  • 「x」は値1で初期化する必要があります
14
anon

レクサーとトークナイザーは基本的に同じものであり、テキストをコンポーネント部分(「トークン」)に破壊するものだと思います。次に、パーサーは文法を使用してトークンを解釈します。

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

4
Will Dean

与えられた答えに追加する

  • Tokenizerは、alsoコメントを削除し、Lexerにtokensのみを返します。
  • Lexerはalsoそれらのトークン(変数/関数)のスコープを定義します
  • その後、パーサーはコード/プログラム構造を構築します
0
mcha