Compiler-design-lexical-analysis

提供:Dev Guides
移動先:案内検索

コンパイラー設計-字句解析

字句解析は、コンパイラの最初のフェーズです。 文の形式で記述された言語プリプロセッサから変更されたソースコードを取得します。 字句アナライザは、ソースコード内の空白またはコメントを削除することにより、これらの構文を一連のトークンに分割します。

字句アナライザは、トークンが無効であることを検出すると、エラーを生成します。 字句解析器は構文解析器と密接に連携します。 ソースコードから文字ストリームを読み取り、正当なトークンをチェックし、必要に応じてデータを構文アナライザーに渡します。

コンパイラーでトークンを渡す

トークン

語彙素は、トークン内の一連の文字(英数字)と呼ばれます。 有効なトークンとして識別される各語彙素には、いくつかの事前定義されたルールがあります。 これらの規則は、パターンを使用して、文法規則によって定義されます。 パターンはトークンになり得るものを説明し、これらのパターンは正規表現によって定義されます。

プログラミング言語では、キーワード、定数、識別子、文字列、数字、演算子、句読点記号をトークンと見なすことができます。

たとえば、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}は英語のアルファベットのセットです。

文字列

アルファベットの有限シーケンスは文字列と呼ばれます。 文字列の長さは、アルファベットの出現回数の合計です。たとえば、文字列finddevguidesの長さは14で、| finddevguides |で表されます。 = 14。 アルファベットを含まない文字列、つまり 長さゼロの文字列は空の文字列と呼ばれ、ε(イプシロン)で示されます。

特別なシンボル

典型的な高級言語には、次の記号が含まれています。

Arithmetic Symbols Addition(+), Subtraction(-), Modulo(%), Multiplication(*), Division(/)
Punctuation Comma(,), Semicolon(;), Dot(.), Arrow(→)
Assignment =
Special Assignment +=,/=, *=, -=
Comparison ==, !=, , >=
Preprocessor #
Location Specifier &
Logical &, &&,
,
, ! Shift Operator

言語

言語は、アルファベットの有限セット上の文字列の有限セットと見なされます。 コンピューター言語は有限セットと見なされ、数学的にセット操作を実行できます。 有限言語は、正規表現を使用して説明できます。

最長一致ルール

字句解析プログラムがソースコードを読み取るとき、コードを文字ごとにスキャンします。そして、空白、演算子記号、または特殊記号に遭遇すると、単語が完成したと判断します。

例えば:

int intvalue;

両方の語彙素を「int」までスキャンしている間、字句解析プログラムは、それがキーワード_int_であるか、識別子int値のイニシャルであるかを判別できません。

最長一致ルールは、スキャンされた語彙素は、利用可能なすべてのトークンの中で最長一致に基づいて決定されるべきであると述べています。

字句アナライザは、*ルールの優先度*に従います。ここでは、言語の予約語、たとえばキーワードがユーザー入力よりも優先されます。 つまり、字句解析プログラムが既存の予約語と一致する語彙素を見つけた場合、エラーを生成するはずです。