C++의 어휘 분석기

Muhammad Adil 2023년10월12일
  1. C++의 어휘 분석기에서 토큰의 개념
  2. C++에서 어휘 분석기의 목적
  3. C++에서 어휘 분석기를 사용하는 단계
C++의 어휘 분석기

어휘 분석기는 텍스트 스트림을 토큰으로 나누고 유형을 표시하는 컴퓨터 프로그램입니다. 입력 문자열이라고 하는 임의의 긴 문자 시퀀스로 입력을 받고 토큰 시퀀스라고 하는 하나 이상의 문자 시퀀스로 출력을 생성합니다.

출력은 토큰 시퀀스이거나 고유하게 식별하기에 충분한 정보일 수 있습니다.

게다가, 어휘 분석기는 일반적으로 두 개의 개별 프로그램으로 구현됩니다. 하나는 입력 스트림에서 문자를 읽고 다른 하나는 만나는 각 단어에 대한 토큰을 출력합니다.

주로 어휘 분석기를 사용하여 철자 오류나 구문 오류와 같은 텍스트 파일의 오류를 식별할 수 있습니다. 또한 실생활에서 발생하는 경우 유해하거나 위험한 것으로 간주될 수 있는 자연어의 특정 패턴을 감지하는 데 사용됩니다.

C++의 어휘 분석기에서 토큰의 개념

토큰은 프로그램의 가장 작고 가장 나눌 수 없는 구성 요소입니다. 각 언어와 연결된 다양한 유형의 토큰이 있습니다.

식별자는 기능 및 매개변수와 같이 사용자가 프로그램의 여러 부분에 할당하는 이름입니다. 특정 메모리 주소를 “식별"하기 때문에 이것을 호출합니다.

그런 다음 다양한 기능을 수행하기 위해 언어에서 사용하는 단어 모음인 키워드가 있습니다. C++에서는 cout, cin, if, else, for, break, continue 등이 포함됩니다.

문장 부호는 표현과 문장을 만드는 데 사용되며 문장에서 기표나 키워드와 결합될 때만 유용합니다.

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 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