1. ホーム
  2. compilation

[解決済み] トークンと語彙の違いは何ですか?

2022-12-30 08:18:22

質問

Aho UllmanとSethiによるCompiler Constructionでは、ソースプログラムの入力文字列は論理的な意味を持つ文字の列に分割され、トークンと呼ばれるとありますが、レキシームはトークンを構成する配列であり、基本的な違いは何でしょうか。

どのように解決するのですか?

"を使用しています。 コンパイラの原理、技法、ツール、第2版。 " (WorldCat) Aho、Lam、Sethi、Ullmanによる、別名 紫龍本 ,

レクゼム 111ページ

<ブロッククオート

レキシームとは、ソースプログラム中のトークンのパターンに合致し トークンのパターンに一致し、字句解析器によってそのトークンのインスタンスとして識別されます。 レキシカル・アナライザーによって識別されます。

トークン pg.111

<ブロッククオート

トークンは、トークン名とオプション属性である 値で構成されます。トークン名は、ある種の語彙単位を表す抽象的な記号です。 を表す抽象的な記号です。 文字列を表す抽象的な記号である。トークン名は、パーサが処理する入力 パーサが処理する入力シンボルです。

パターン pg.111

<ブロッククオート

パターンとは、あるトークンの字句が取りうる形を記述したものである。 の説明です。トークンとしてのキーワードの場合、パターンは単なる キーワードを形成する文字列です。識別子といくつかの 他のトークンの場合、パターンはより複雑な構造で、多くの文字列がマッチします。 多くの文字列と一致します。

図3.2: トークンの例 pg.112

[Token]       [Informal Description]                  [Sample Lexemes]
if            characters i, f                         if
else          characters e, l, s, e                   else
comparison    < or > or <= or >= or == or !=          <=, !=
id            letter followed by letters and digits   pi, score, D2
number        any numeric constant                    3.14159, 0, 6.02e23
literal       anything but ", surrounded by "'s       "core dumped"

このレキサーとパーサーの関係をよりよく理解するために、パーサーから始めて、入力まで逆算してみます。

パーサーの設計を容易にするために、パーサーは入力を直接操作せず、レキサーによって生成されたトークンのリストを取り込みます。図 3.2 のトークン列を見ると、次のようなトークンがあります。 if , else , comparison , id , numberliteral これらはトークンの名前です。通常、レキサー/パーサーでは、トークンはトークンの名前だけでなく、トークンを構成する文字/記号とトークンを構成する文字列の開始位置と終了位置を保持する構造体で、開始位置と終了位置はエラー報告やハイライトなどに使用されます。

さて、レキサーは文字/記号の入力を受け、レキサーのルールを使って、入力された文字/記号をトークンに変換します。現在、レキサー/パーサーを扱う人々は、よく使うものに対して自分たちの言葉を持っています。あなたがトークンを構成する文字/記号の列だと思っているものは、レキサー/パーサーを使う人たちがレキシームと呼ぶものです。ですから、lexemeを見たら、トークンを表す文字/記号の並びを思い浮かべればいいのです。比較の例では、文字/記号の列は次のような異なるパターンになります。 < あるいは > または else または 3.14 など。

この 2 つの関係を考えるもう 1 つの方法は、トークンはパーサーが使用するプログラミング構造で、入力からの文字/記号を保持する lexeme というプロパティを持つというものです。現在、トークンの定義をコードで見ると、レキシームがトークンのプロパティの 1 つとして表示されないことがほとんどです。これは、トークンは、トークンを表す文字/記号の開始位置と終了位置を保持し、レキシームは、入力が静的であるため、必要に応じて開始位置と終了位置から文字/記号のシーケンスを導き出すことができる可能性が高いからです。