C++의 어휘 분석기
어휘 분석기는 텍스트 스트림을 토큰으로 나누고 유형을 표시하는 컴퓨터 프로그램입니다. 입력 문자열이라고 하는 임의의 긴 문자 시퀀스로 입력을 받고 토큰 시퀀스라고 하는 하나 이상의 문자 시퀀스로 출력을 생성합니다.
출력은 토큰 시퀀스이거나 고유하게 식별하기에 충분한 정보일 수 있습니다.
게다가, 어휘 분석기는 일반적으로 두 개의 개별 프로그램으로 구현됩니다. 하나는 입력 스트림에서 문자를 읽고 다른 하나는 만나는 각 단어에 대한 토큰을 출력합니다.
주로 어휘 분석기를 사용하여 철자 오류나 구문 오류와 같은 텍스트 파일의 오류를 식별할 수 있습니다. 또한 실생활에서 발생하는 경우 유해하거나 위험한 것으로 간주될 수 있는 자연어의 특정 패턴을 감지하는 데 사용됩니다.
C++의 어휘 분석기에서 토큰의 개념
토큰은 프로그램의 가장 작고 가장 나눌 수 없는 구성 요소입니다. 각 언어와 연결된 다양한 유형의 토큰이 있습니다.
식별자는 기능 및 매개변수와 같이 사용자가 프로그램의 여러 부분에 할당하는 이름입니다. 특정 메모리 주소를 “식별"하기 때문에 이것을 호출합니다.
그런 다음 다양한 기능을 수행하기 위해 언어에서 사용하는 단어 모음인 키워드가 있습니다. C++에서는 cout
, cin
, if
, else
, for
, break
, continue
등이 포함됩니다.
문장 부호는 표현과 문장을 만드는 데 사용되며 문장에서 기표나 키워드와 결합될 때만 유용합니다.
C++에서 어휘 분석기의 목적
어휘 분석기는 다음 작업을 수행합니다.
- 입력 텍스트 스트림에서 토큰을 식별하고 의미 있는 범주로 그룹화합니다.
- 입력 텍스트의 의미를 이해하는 데 도움이 되는 유형 및 값과 같은 각 토큰에 대한 정보를 제공합니다.
- 입력 텍스트를 더 쉽게 분석할 수 있도록 더 작은 의미 단위로 분해하여 구문 분석합니다.
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 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