コンパイラ設計-字句解析
字句解析は、コンパイラーの最初のフェーズです。文の形で書かれた言語プリプロセッサから変更されたソースコードを取得します。字句解析プログラムは、ソースコード内の空白やコメントを削除することにより、これらの構文を一連のトークンに分割します。
字句解析プログラムが無効なトークンを検出すると、エラーが生成されます。字句アナライザーは構文アナライザーと緊密に連携します。ソースコードから文字ストリームを読み取り、正当なトークンをチェックし、必要に応じてデータを構文アナライザーに渡します。
トークン
語彙素は、トークン内の一連の文字(英数字)であると言われています。有効なトークンとして識別されるすべての語彙素には、いくつかの事前定義されたルールがあります。これらのルールは、パターンを使用した文法ルールによって定義されます。パターンはトークンになり得るものを説明し、これらのパターンは正規表現によって定義されます。
プログラミング言語では、キーワード、定数、識別子、文字列、数字、演算子、句読点記号をトークンと見なすことができます。
たとえば、C言語では、変数宣言行
int value = 100;
トークンが含まれています:
int (keyword), value (identifier), = (operator), 100 (constant) and ; (symbol).
トークンの仕様
言語理論がどのように次の用語を引き受けるかを理解しましょう。
アルファベット
シンボルの有限セット{0,1}は、バイナリアルファベットのセット{0,1,2,3,4,5,6,7,8,9、A、B、C、D、E、F}です。は16進アルファベットのセット、{az、AZ}は英語のアルファベットのセットです。
文字列
アルファベットの有限シーケンスは文字列と呼ばれます。文字列の長さは、アルファベットの合計出現回数です。たとえば、文字列の長さtutorialspointは14であり、| tutorialspoint |で示されます。= 14.アルファベットのない文字列、つまり長さがゼロの文字列は空の文字列と呼ばれ、ε(イプシロン)で表されます。
特別な記号
典型的な高級言語には、次の記号が含まれています。
算術記号 | 加算(+)、減算(-)、モジュロ(%)、乗算(*)、除算(/) |
句読点 | コンマ(、)、セミコロン(;)、ドット(。)、矢印(->) |
割り当て | = |
特別任務 | + =、/ =、* =、-= |
比較 | ==、!=、<、<=、>、> = |
プリプロセッサ | # |
場所指定子 | & |
論理的 | &、&&、|、||、! |
シフト演算子 | >>、>>>、<<、<<< |
言語
言語は、いくつかの有限のアルファベットのセットに対する有限の文字列のセットと見なされます。コンピューター言語は有限集合と見なされ、数学的に集合操作を実行できます。有限言語は正規表現で記述できます。
最長一致ルール
字句解析プログラムがソースコードを読み取ると、コードを1文字ずつスキャンします。空白、演算子記号、または特殊記号が検出されると、単語が完成したと判断します。
For example:
int intvalue;
'int'まで両方の語彙素をスキャンしている間、字句解析プログラムは、それがキーワードintであるか、識別子int値のイニシャルであるかを判別できません。
最長一致ルールでは、スキャンされる語彙素は、使用可能なすべてのトークンの中で最長の一致に基づいて決定する必要があると規定されています。
字句解析プログラムも次のようになります rule priorityここで、言語の予約語、たとえばキーワードは、ユーザー入力よりも優先されます。つまり、字句解析プログラムが既存の予約語と一致する語彙素を見つけた場合、エラーが生成されます。