Aho UllmanとSethiによるコンパイラ構築では、ソースプログラムの文字の入力文字列が論理的な意味を持つ文字のシーケンスに分割され、トークンと呼ばれ、語彙素はトークンを構成するシーケンスであるとされています。基本的な違いは何ですか?
13 に答える
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
表示else
さcomparison
れid
ます。これらはトークンの名前です。通常、レクサー/パーサーでは、トークンは、トークンの名前だけでなく、トークンを構成する文字/記号と、トークンを構成する文字列の開始位置と終了位置を保持する構造です。エラー報告、強調表示などに使用される開始位置と終了位置。number
literal
レクサーは文字/記号の入力を受け取り、レクサーのルールを使用して入力文字/記号をトークンに変換します。現在、レクサー/パーサーを扱う人々は、頻繁に使用するものについて独自の言葉を持っています。トークンを構成する文字/記号のシーケンスとして考えられるものは、レクサー/パーサーを使用する人々が語彙素と呼ぶものです。したがって、語彙素を見るときは、トークンを表す一連の文字/記号を考えてみてください。<
比較例では、文字/記号のシーケンスは、または>
またはelse
またはなどの異なるパターンにすることができます3.14
。
2 つの関係を考えるもう 1 つの方法は、トークンが、入力からの文字/記号を保持する lexeme と呼ばれるプロパティを持つパーサーによって使用されるプログラミング構造であるということです。コード内のトークンのほとんどの定義を見ると、語彙素がトークンのプロパティの 1 つとして表示されない場合があります。これは、トークンがトークンと語彙素を表す文字/記号の開始位置と終了位置を保持する可能性が高いためです。入力が静的であるため、必要に応じて文字/記号のシーケンスを開始位置と終了位置から導出できます。
a) トークンは、プログラムのテキストを構成するエンティティの記号名です。たとえば、キーワード if の場合は if 、任意の識別子の場合は id です。これらは字句解析器の出力を構成します。5
(b) パターンは、入力からの一連の文字がいつトークンを構成するかを指定するルールです。たとえば、トークン if のシーケンス i、f、およびトークン id の文字で始まる英数字の任意のシーケンス。
(c) 語彙素は、パターンに一致する (したがって、トークンのインスタンスを構成する) 入力からの一連の文字です。たとえば、 if は if のパターンに一致し、 foo123bar は id のパターンに一致します。
語彙素- 語彙素は、トークンのパターンに一致するソース プログラム内の一連の文字であり、語彙アナライザーによってそのトークンのインスタンスとして識別されます。
トークン- トークンは、トークン名とオプションのトークン値で構成されるペアです。トークン名は字句単位のカテゴリです。一般的なトークン名は次のとおりです。
- 識別子: プログラマが選択する名前
- キーワード: プログラミング言語で既に使用されている名前
- 区切り文字 (句読点とも呼ばれます): 句読点文字とペア区切り文字
- 演算子: 引数を操作して結果を生成する記号
- リテラル: 数値、論理、テキスト、参照リテラル
プログラミング言語 C で次の式を考えてみましょう。
合計 = 3 + 2;
トークン化され、次の表で表されます。
Lexeme Token category
------------------------------
sum | Identifier
= | Assignment operator
3 | Integer literal
+ | Addition operator
2 | Integer literal
; | End of statement
字句解析器は、一連の文字を取得して、正規表現に一致する語彙素を識別し、さらにそれをトークンに分類します。したがって、語彙素は一致する文字列であり、トークン名はその語彙素のカテゴリです。
たとえば、入力「int foo, bar;」を含む識別子の正規表現を以下に示します。
文字(文字|数字|_)*
ここで、foo
およびbar
正規表現に一致するため、両方とも語彙素ですが、1 つのトークン、ID
つまり識別子として分類されます。
また、次のフェーズ、つまり構文アナライザーは語彙素について知る必要はなく、トークンについて知る必要があることに注意してください。