C++ の字句解析プログラム

Muhammad Adil 2023年10月12日
  1. C++ の字句解析プログラムでのトークンの概念
  2. C++ での字句解析の目的
  3. C++ で字句解析プログラムを使用する手順
C++ の字句解析プログラム

字句解析プログラムは、テキストストリームをトークンに分割し、そのタイプをマークするコンピュータープログラムです。これは、入力文字列と呼ばれる任意の長さの文字シーケンスとして入力を受け取り、トークンシーケンスと呼ばれる 1つ以上の文字シーケンスとして出力を生成します。

出力は、トークンシーケンス、またはそれらを一意に識別するのに十分な情報である可能性があります。

さらに、字句解析プログラムは通常、2つの別個のプログラムとして実装されます。1つは入力ストリームから文字を読み取り、もう 1つは検出した単語ごとにトークンを出力します。

主に、字句解析プログラムを使用して、スペルミスや構文エラーなどのテキストファイル内のエラーを特定できます。また、実際に発生した場合に有害または危険と見なされる可能性のある自然言語の特定のパターンを検出するためにも使用されます。

C++ の字句解析プログラムでのトークンの概念

トークンは、プログラムの最も小さく、最も分割できないコンポーネントです。各言語にリンクされたトークンにはさまざまな種類があります。

識別子は、機能やパラメータなど、ユーザーがプログラムの複数の部分に割り当てる名前です。これらは、特定のメモリアドレスを識別するため、これと呼ばれます。

次に、さまざまな機能を実行するために言語が使用する単語のコレクションであるキーワードがあります。C++ では、これらには coutcinifelseforbreakcontinue などが含まれます。

パンクチュエーターは、式とステートメントを作成するために使用され、ステートメント内の記号またはキーワードと組み合わせた場合にのみ役立ちます。

C++ での字句解析の目的

字句アナライザーは次のタスクを実行します。

  1. 入力テキストストリーム内のトークンを識別し、それらを意味のあるカテゴリにグループ化します。
  2. 入力テキストの意味を理解するのに役立つ、タイプや値などの各トークンに関する情報を提供します。
  3. 入力テキストをより小さな意味の単位に分割して解析し、より簡単に分析できるようにします。

C++ で字句解析プログラムを使用する手順

C++ で字句解析プログラムを使用する手順について説明しましょう。

  • ヘッダーファイルをインクルードします。
  • 文をトークンに分割する関数を記述します。
  • トークンタイプごとにトークンとルールを定義します。
  • 入力文からトークンを出力するコードを記述します。
  • 正しく機能するまで、コードをテストしてデバッグします。

C++ の字句解析プログラムの例:

#include <bits/stdc++.h>

#include <string>
using namespace std;

vector<string> demo = {
    "auto",   "break",   "case",  "char",     "const",  "continue", "default",
    "do",     "double",  "else",  "enum",     "extern", "float",    "for",
    "goto",   "if",      "int",   "signed",   "sizeof", "static",   "struct",
    "switch", "typedef", "union", "unsigned", "void",   "volatile", "while"};

vector<string> hello = {"-", "*", "=", "+", "/"};

vector<string> ten = {"67", "87", "5", "12", "90"};

vector<string> parenthesis = {"(", ")"};

vector<string> brackets = {"[", "]"};

void printout(string q) {
  if (find(demo.begin(), demo.end(), q) != demo.end())
    cout << q << " \t keyword\n";
  else if (find(hello.begin(), hello.end(), q) != hello.end())
    cout << q << " \t operator\n";
  else if (find(ten.begin(), ten.end(), q) != ten.end())
    cout << q << " \t number\n";
  else if (find(parenthesis.begin(), parenthesis.end(), q) != parenthesis.end())
    cout << q << " \t paranthesis\n";
  else if (find(brackets.begin(), brackets.end(), q) != brackets.end())

    cout << q << " \t seperator\n";
}

int main() {
  string line;
  vector<string> sample;

  while (getline(cin, line, ' ')) {
    sample.push_back(line);
  }
  for (auto q : sample) printout(q);

  return 0;
}

上記のコードのライブデモンストレーションを確認するには、ここをクリックしてください。

著者: Muhammad Adil
Muhammad Adil avatar Muhammad Adil avatar

Muhammad Adil is a seasoned programmer and writer who has experience in various fields. He has been programming for over 5 years and have always loved the thrill of solving complex problems. He has skilled in PHP, Python, C++, Java, JavaScript, Ruby on Rails, AngularJS, ReactJS, HTML5 and CSS3. He enjoys putting his experience and knowledge into words.

Facebook