コンパイラー設計における字句解析 (アナライザー) と例

字句解析とは何ですか?

字句解析 これはコンパイラ設計の最初の段階です。 レクサーは、文の形式で記述された変更されたソース コードを受け取ります。 つまり、一連の文字を一連のトークンに変換するのに役立ちます。 字句アナライザーは、この構文を一連のトークンに分割します。 ソースコード内に書かれた余分なスペースやコメントを削除します。

コンパイラー設計で字句解析を実行するプログラムは、字句アナライザーまたはレクサーと呼ばれます。 レクサーにはトークナイザーまたはスキャナーが含まれます。 字句アナライザーがトークンが無効であることを検出すると、エラーが生成されます。 コンパイラー設計における字句アナライザーの役割は、ソース コードから文字ストリームを読み取り、正当なトークンをチェックし、要求に応じてデータを構文アナライザーに渡すことです。

例:

How Pleasant Is The Weather?

この字句解析の例を参照してください。 ここには、How Pleasant、The、Weather、Is という XNUMX つの単語があることが簡単にわかります。 私たちは区切り文字、空白、句読点を認識できるので、これは非常に自然なことです。

 HowPl easantIs Th ewe ather?

さて、この例を確認してください。これも読むことができます。 ただし、奇数箇所にセパレータを入れるので時間がかかります。 それはすぐに思い浮かぶものではありません。

基本用語

語彙素とは何ですか?

語彙素は、トークンの一致パターンに従ってソース プログラムに含まれる文字のシーケンスです。 これはトークンのインスタンスにすぎません。

トークンとは何ですか?

コンパイラ設計におけるトークンは、ソース プログラム内の情報の単位を表す文字のシーケンスです。

パターンとは何ですか?

パターンは、トークンによって使用される説明です。 トークンとして使用するキーワードの場合、パターンは文字列です。

字句アナライザー Archi構造: トークンがどのように認識されるか

字句解析の主なタスクは、コード内の入力文字を読み取り、トークンを生成することです。

字句アナライザーはプログラムのソース コード全体をスキャンします。 各トークンを XNUMX つずつ識別します。 スキャナーは通常、パーサーによって要求された場合にのみトークンを生成するように実装されます。 コンパイラー設計におけるトークンの認識がどのように機能するかは次のとおりです。

字句アナライザー Archi構造
字句アナライザー Archi構造
  1. 「次のトークンの取得」は、パーサーから字句解析装置に送信されるコマンドです。
  2. このコマンドを受信すると、字句アナライザーは次のトークンが見つかるまで入力をスキャンします。
  3. トークンをパーサーに返します。

Lexical Analyzer は、これらのトークンの作成中に空白とコメントをスキップします。 エラーが存在する場合、字句アナライザーはそのエラーをソース ファイルおよび行番号と関連付けます。

字句アナライザーの役割

字句アナライザーは、以下の指定されたタスクを実行します。

  • シンボルテーブル内のトークンを識別するのに役立ちます
  • ソースプログラムから空白やコメントを削除します。
  • エラーメッセージとソースプログラムを関連付けます。
  • マクロがソース プログラム内で見つかった場合に、そのマクロを展開するのに役立ちます。
  • ソースプログラムから入力文字を読み込みます

字句解析、トークン、非トークンの例

字句解析器に入力される次のコードを検討してください。

#include <stdio.h>
    int maximum(int x, int y) {
        // This will compare 2 numbers
        if (x > y)
            return x;
        else {
            return y;
        }
    }

作成されるトークンの例

語彙素 Next
int型 キーワード
識別する
( Operator
int型 キーワード
x 識別する
, Operator
int型 キーワード
Y 識別する
) Operator
{ Operator
If キーワード

非トークンの例

タイプ
コメント // 2つの数値を比較します
プリプロセッサディレクティブ #include
プリプロセッサディレクティブ #define 数値 8,9
マクロ 数字
空白 /n /b /t

語彙上のエラー

有効なトークンにスキャンできない文字シーケンスは、字句エラーです。 語彙上のエラーに関する重要な事実:

  • 語彙エラーはあまり一般的ではありませんが、スキャナーで管理する必要があります。
  • 識別子、演算子、キーワードのスペルミスは語彙エラーとみなされます
  • 一般に、字句エラーは、主にトークンの先頭に不正な文字が出現することによって発生します。

字句解析器でのエラー回復

ここでは、最も一般的なエラー回復手法をいくつか示します。

  • 残りの入力から XNUMX 文字を削除します
  • パニック モードでは、整形式のトークンに到達するまで、後続の文字は常に無視されます。
  • 不足している文字を残りの入力に挿入することによって
  • 文字を別の文字に置き換える
  • XNUMX つの連続文字を入れ替える

字句アナライザーとパーサー

字句アナライザー パーサ
スキャン入力プログラム 構文解析を実行する
トークンの識別 コードの抽象表現を作成する
シンボルテーブルにトークンを挿入 シンボルテーブルエントリを更新する
語彙上のエラーが発生します ソースコードの解析ツリーを生成します

なぜレキシカルとパーサーを分けるのでしょうか?

  • 設計のシンプルさ: 不要なトークンを排除することで、字句解析と構文解析のプロセスが容易になります。
  • コンパイラの効率を向上するには: コンパイラの効率を向上させるのに役立ちます。
  • 専門化: 特殊な技術を適用して字句解析プロセスを改善できます。
  • 可搬性: スキャナのみが外部と通信する必要があります。
  • 高い移植性: レクサーに限定された入力デバイス固有の特性

字句解析の利点

  • 字句解析メソッドは、プログラマのコードから解析されたデータを使用してコンパイルされたバイナリ実行可能コードを作成できるコンパイラなどのプログラムで使用されます。
  • Web ブラウザによって、解析されたデータを利用して Web ページをフォーマットして表示するために使用されます。 ジャブスクリプト、HTML、CSS
  • 別個の字句アナライザーは、タスクに特化した潜在的により効率的なプロセッサーを構築するのに役立ちます。

字句解析の欠点

  • ソースプログラムを読んでトークンの形式で分割するにはかなりの時間を費やす必要があります
  • 一部の正規表現は、PEG または EBNF ルールと比較して理解するのが非常に困難です
  • レクサーとそのトークンの説明を開発およびデバッグするには、さらに多くの労力が必要です
  • レクサーテーブルを生成してトークンを構築するには、追加の実行時オーバーヘッドが必要です

製品概要

  • 字句解析はコンパイラ設計の最初のフェーズです
  • 語彙素とトークンは、トークンの一致パターンに従ってソース プログラムに含まれる文字のシーケンスです。
  • プログラムのソースコード全体をスキャンするために字句アナライザーが実装されています
  • 字句アナライザーは、トークンを識別してシンボルテーブルに入れるのに役立ちます
  • 有効なトークンにスキャンできない文字シーケンスは字句エラーです。
  • 残りの入力から XNUMX 文字を削除すると便利なエラー回復方法
  • 字句アナライザーは入力プログラムをスキャンし、パーサーは構文解析を実行します。
  • 不要なトークンを排除することにより、字句分析と構文分析のプロセスが容易になります。
  • 字句アナライザーは、JavsScript、HTML、CSS からの解析データを利用して Web ページをフォーマットして表示するために Web ブラウザーによって使用されます。
  • 字句アナライザーを使用する最大の欠点は、字句解析テーブルの生成とトークンの構築に追加の実行時オーバーヘッドが必要になることです。