Aho UllmanとSethiによるCompiler Constructionでは、ソースプログラムの入力文字列は、論理的な意味を持つ文字のシーケンスに分割され、トークンと語彙素はトークンを構成するシーケンスであるため、基本的な違いは何ですか?
「 コンパイラの原則、テクニック、およびツール、第2版(WorldCat) by Aho、Lam、Sethi、およびUllman、別名the Purple Book =、
語彙素pg。 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
、number
、literal
などのトークンがあります。これらはトークンの名前です。通常、レクサー/パーサーでは、トークンは、トークンの名前だけでなく、トークンを構成する文字/記号、およびトークンを構成する文字列の開始位置と終了位置を保持する構造体です。エラー報告、強調表示などに使用される開始位置と終了位置.
これで、字句解析器は文字/記号の入力を受け取り、字句解析器の規則を使用して入力文字/記号をトークンに変換します。現在、レクサー/パーサーを使用する人は、頻繁に使用するものに対して独自の言葉を持っています。トークンを構成する文字/記号のシーケンスとして考えるものは、レクサー/パーサーを使用する人々が語彙素と呼ぶものです。そのため、語彙素を見るときは、トークンを表す文字/記号のシーケンスを考えてください。比較例では、文字/記号のシーケンスは、<
または>
またはelse
または3.14
などの異なるパターンにすることができます。
2つの関係を考えるもう1つの方法は、トークンは、入力からの文字/記号を保持するlexemeというプロパティを持つパーサーによって使用されるプログラミング構造であるということです。コードでトークンのほとんどの定義を見ると、トークンのプロパティの1つとして語彙素が表示されない場合があります。これは、トークンがトークンと語彙素を表す文字/記号の開始位置と終了位置を保持する可能性が高いためです。入力が静的であるため、必要に応じて文字/記号のシーケンスを開始位置と終了位置から導出できます。
ソースプログラムが字句解析プログラムに入力されると、文字列を語彙素のシーケンスに分割することから始まります。次に、語彙素はトークンの構築に使用され、語彙素はトークンにマップされます。という変数 myVar <を示すトークンにマッピングされますid、「num」>、ここで「num」はシンボルテーブル内の変数の位置を指している必要があります。
簡単に言えば:
例を次に示します。
x = a + b * 2
語彙素を生成する:{x、=、a、+、b、*、2}
対応するトークン:{<id、0>、<=>、<id、1>、<+>、<id、2>、<*>、<id、3>}
a)トークンは、プログラムのテキストを構成するエンティティのシンボル名です。例えばキーワードのif、および任意の識別子のid。これらは、字句解析の出力を構成します。 5(b)パターンは、入力からの一連の文字がトークンを構成するタイミングを指定するルールです。たとえば、トークンifのシーケンスi、f、およびトークンIDの文字で始まる英数字のシーケンス。
(c)語彙素は、パターンに一致する(したがってトークンのインスタンスを構成する)入力からの文字のシーケンスです。たとえば、ifはifのパターンに一致し、foo123barはidのパターンに一致します。
LEXEME-トークンを形成するPATTERNに一致する文字のシーケンス
PATTERN-トークンを定義するルールのセット
TOKEN-プログラミング言語ex:ID、定数、キーワード、演算子、句読点、リテラル文字列の文字セット上の意味のある文字のコレクション
トークン:(キーワード、識別子、句読点、複数文字演算子)の種類は、単にトークンです。
パターン:入力文字からトークンを形成するためのルール。
語彙素:トークンのパターンと一致するSOURCE PROGRAMの文字のシーケンス。基本的に、トークンの要素です。
字句解析プログラム(Scannerとも呼ばれる)の動作を見てみましょう
式の例を見てみましょう:
INPUT : cout << 3+2+3;
FORMATTING PERFORMED BY SCANNER : {cout}|space|{<<}|space|{3}{+}{2}{+}{3}{;}
ただし、実際の出力ではありません。
スキャナは、入力ISが完全に削除されるまで、ソースプログラムテキスト内の語彙素を繰り返し検索します
語彙素は、文法に存在する有効な端末の文字列を形成する入力の部分文字列です。すべての語彙素はパターンの後に続きます。これは最後に説明されています(読者が最後にスキップできる部分)
(重要なルールは、次の空白に遭遇するまで有効な端末の文字列を形成する可能な限り長いプレフィックスを探すことです...以下で説明します)
LEXEMES:
(「<」も有効な端末文字列ですが、上記のルールでは、スキャナから返されるトークンを生成するために語彙素「<<」のパターンを選択します)
TOKENS:トークンは、スキャナーが(有効な)語彙素を検出するたびに1つずつ(パーサーから要求されたときにスキャナーによって)返されます。スキャナーは、トークンテーブルエントリを作成します(まだ存在しない場合)(属性を持つ:主にトークンカテゴリと他のいくつか)トークンを生成するために、語彙素を見つけると
「#」はシンボルテーブルエントリを示します。私は理解を容易にするために上記のリストの語彙素番号を指していますが、技術的にはシンボルテーブルのレコードの実際のインデックスでなければなりません。
次のトークンは、上記の例で指定された順序でスキャナーからパーサーに返されます。
<識別子、#1>
<演算子、#2>
<リテラル、#3>
<演算子、#4>
<リテラル、#5>
<演算子、#4>
<リテラル、#3>
<句読点、#6>
違いを見ることができるように、トークンは入力のサブストリングである語彙素とは異なりペアです。
ペアの最初の要素はtoken-class/categoryです
トークンクラスを以下に示します:
そしてもう1つ、スキャナーは空白を検出し、それらを無視し、空白のトークンをまったく作成しません。すべての区切り文字が空白であるわけではありません。空白は、スキャナーが目的で使用する区切り文字の1つの形式です。入力のタブ、改行、スペース、エスケープされた文字はすべて、まとめて空白区切り文字と呼ばれます。他の区切り文字はほとんどありません; '、' ':'など、トークンを形成する語彙素として広く認識されています。
ここで返されるトークンの合計数は8ですが、語彙素については6個のシンボルテーブルエントリのみが作成されます。語彙素も合計8個です(語彙素の定義を参照)
---この部分はスキップできます
A ***pattern*** is a rule ( say, a regular expression ) that is used to check if a string-of-terminals is valid or not
。
If a substring of input composed only of grammar terminals is
following the rule specified by any of the listed patterns , it is
validated as a lexeme and selected pattern will identify the category
of lexeme, else a lexical error is reported due to either (i) not
following any of the rules or (ii) input consists of a bad
terminal-character not present in grammar itself.
for example :
1. No Pattern Exists : In C++ , "99Id_Var" is grammar-supported string-of-terminals but is not recognised by any of patterns hence lexical error is reported .
2. Bad Input Character : $,@,unicode characters may not be supported as a valid character in few programming languages.`
Lexeme-語彙素は、トークンのパターンに一致するソースプログラム内の文字のシーケンスであり、字句アナライザによってそのトークンのインスタンスとして識別されます。
Token-トークンは、トークン名とオプションのトークン値で構成されるペアです。トークン名は字句単位のカテゴリです。一般的なトークン名は
プログラミング言語Cの次の式を検討してください。
sum = 3 + 2;
トークン化され、次の表で表されます。
Lexeme Token category
------------------------------
sum | Identifier
= | Assignment operator
3 | Integer literal
+ | Addition operator
2 | Integer literal
; | End of statement
トークン:トークンは、単一の論理エンティティとして扱うことができる一連の文字です。典型的なトークンは、
1)識別子
2)キーワード
3)演算子
4)特殊記号
5)定数
パターン:同じトークンが出力として生成される入力内の文字列のセット。この一連の文字列は、トークンに関連付けられたパターンと呼ばれるルールによって記述されます。
語彙素:語彙素は、トークンのパターンと一致するソースプログラム内の文字のシーケンスです。
Lexeme-lexemeは、プログラミング言語の最下位レベルの構文単位である文字列です。 。
Token-トークンは、語彙素のクラスを形成する構文カテゴリであり、語彙素のクラスを意味します所属するのは、キーワードや識別子などです。字句解析プログラムの主要なタスクの1つは、語彙素とトークンのペアを作成すること、つまりすべての文字を収集することです。
例を挙げましょう:-
if(y <= t)
y = y-3;
if KEYWORD
(左パレンテーゼ
y IDENTIFIER
<=比較
t IDENTIFIER
)右パレンテシス
y ENT IDENTIFIER
= SS
y IDENTIFIER
_ ARI算数
3 INTEGER
;SEMICOLON
語彙素とトークンの関係
語彙素語彙素は、トークン内の一連の文字(英数字)と呼ばれます。
Tokenトークンは、単一の論理エンティティとして識別できる一連の文字です。通常、トークンはキーワード、識別子、定数、文字列、句読記号、演算子です。数字。
パターンパターンと呼ばれるルールで記述された文字列のセット。パターンは、トークンになる可能性のあるものを説明し、これらのパターンは、トークンに関連付けられた正規表現を使用して定義されます。