100

Aho UllmanとSethiによるコンパイラ構築では、ソースプログラムの文字の入力文字列が論理的な意味を持つ文字のシーケンスに分割され、トークンと呼ばれ、語彙素はトークンを構成するシーケンスであるとされています。基本的な違いは何ですか?

4

13 に答える 13

136

Aho、Lam、Sethi、および Ullman 著の「Compilers Principles, Techniques, & Tools, 2nd Ed.(WorldCat) (別名the Purple Dragon Book ) を使用して、

語彙素 pg. 111

語彙素は、トークンのパターンに一致するソース プログラム内の一連の文字であり、字句解析器によってそのトークンのインスタンスとして識別されます。

トークンページ 111

トークンは、トークン名とオプションの属性値で構成されるペアです。トークン名は、特定のキーワードや、識別子を表す一連の入力文字など、一種の字句単位を表す抽象記号です。トークン名は、パーサーが処理する入力記号です。

パターンページ 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表示elsecomparisonidます。これらはトークンの名前です。通常、レクサー/パーサーでは、トークンは、トークンの名前だけでなく、トークンを構成する文字/記号と、トークンを構成する文字列の開始位置と終了位置を保持する構造です。エラー報告、強調表示などに使用される開始位置と終了位置。numberliteral

レクサーは文字/記号の入力を受け取り、レクサーのルールを使用して入力文字/記号をトークンに変換します。現在、レクサー/パーサーを扱う人々は、頻繁に使用するものについて独自の言葉を持っています。トークンを構成する文字/記号のシーケンスとして考えられるものは、レクサー/パーサーを使用する人々が語彙素と呼ぶものです。したがって、語彙素を見るときは、トークンを表す一連の文字/記号を考えてみてください。<比較例では、文字/記号のシーケンスは、または>またはelseまたはなどの異なるパターンにすることができます3.14

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

于 2013-02-19T13:35:10.083 に答える
8

a) トークンは、プログラムのテキストを構成するエンティティの記号名です。たとえば、キーワード if の場合は if 、任意の識別子の場合は id です。これらは字句解析器の出力を構成します。5

(b) パターンは、入力からの一連の文字がいつトークンを構成するかを指定するルールです。たとえば、トークン if のシーケンス i、f、およびトークン id の文字で始まる英数字の任意のシーケンス。

(c) 語彙素は、パターンに一致する (したがって、トークンのインスタンスを構成する) 入力からの一連の文字です。たとえば、 if は if のパターンに一致し、 foo123bar は id のパターンに一致します。

于 2013-04-24T11:28:40.020 に答える
7

語彙素- 語彙素は、トークンのパターンに一致するソース プログラム内の一連の文字であり、語彙アナライザーによってそのトークンのインスタンスとして識別されます。

トークン- トークンは、トークン名とオプションのトークン値で構成されるペアです。トークン名は字句単位のカテゴリです。一般的なトークン名は次のとおりです。

  • 識別子: プログラマが選択する名前
  • キーワード: プログラミング言語で既に使用されている名前
  • 区切り文字 (句読点とも呼ばれます): 句読点文字とペア区切り文字
  • 演算子: 引数を操作して結果を生成する記号
  • リテラル: 数値、論理、テキスト、参照リテラル

プログラミング言語 C で次の式を考えてみましょう。

合計 = 3 + 2;

トークン化され、次の表で表されます。

 Lexeme        Token category
------------------------------
sum      |    Identifier
 =       |    Assignment operator
 3       |    Integer literal
 +       |    Addition operator
 2       |    Integer literal
 ;       |    End of statement
于 2017-09-02T05:43:31.040 に答える
0

字句解析器は、一連の文字を取得して、正規表現に一致する語彙素を識別し、さらにそれをトークンに分類します。したがって、語彙素は一致する文字列であり、トークン名はその語彙素のカテゴリです。

たとえば、入力「int foo, bar;」を含む識別子の正規表現を以下に示します。

文字(文字|数字|_)*

ここで、fooおよびbar正規表現に一致するため、両方とも語彙素ですが、1 つのトークン、IDつまり識別子として分類されます。

また、次のフェーズ、つまり構文アナライザーは語彙素について知る必要はなく、トークンについて知る必要があることに注意してください。

于 2018-10-27T06:51:32.517 に答える