객체지향 프로그래밍 textbook에 tokenizer를 간단히 구현하는 부분이 나와서 구현해보았다.
string 자료형의 문자열을 입력받고 ->target
target을 token화할 기준인 delim도 지정한다.
이를 통해 delim마다 target을 구분하여 출력하는 것이 목표 결과이다.
tokenizer.h
#pragma once
#include <iostream>
#include <string>
using namespace std;
class Tokenizer {
private:
string target;
string delim;
int begin;
int end;
public:
Tokenizer(const string& target, const string& delim);
~Tokenizer();
bool moreToken() const;
string nextToken();
};
tokenizer.cpp
#include "tokenizer.h"
Tokenizer::Tokenizer(const string& tar, const string& del)
:target(tar), delim(del)
{
begin = target.find_first_not_of(delim, 0);
end = target.find_first_of(delim,begin);
}
Tokenizer::~Tokenizer()
{}
bool Tokenizer::moreToken()const
{
return begin != -1;
}
string Tokenizer::nextToken()
{
string token = target.substr(begin, end - begin);
begin = target.find_first_not_of(delim, end);
end = target.find_first_of(delim, begin);
return token;
}
이 부분에서 주요 부분들이 다 있다.
1 ) 우선 전체적인 코드는 moreToken()이 존재하는 경우에만 while()문을 돌려서 진행하는 형태이다.
moreToken()은 begin != -1인 경우에만 bool 형태의 값으로 true를 반환한다. 이는 while문에서 조건문에 들어갈 부분이다.
여기서 begin은 Tokenizer() constructor을 생성할 때, 정의하였다.
begin = target.find_first_not_of(delim, 0);
target 문자열에 대해서 delim 문자열 중 적어도 한 문자가 없는 가장 첫 번째 인덱스를 target 문자열의 0인덱스부터 찾아서 반환한다. 만약 없는 경우에는 begin 값에 -1 이 리턴되게 된다.
즉, 더 이상 토큰화할 부분이 없다면, begin = -1 이 되어 bool 값이 false 가 되고, while() 문이 돌아가지 않아 끝나게 된다.
2) 두 번째로 중요한 부분은 nextToken()함수를 구성하는 부분이다.
string token = target.substr(begin, end - begin);
begin = target.find_first_not_of(delim, end);
end = target.find_first_of(delim, begin);
return token;
우선 한 토큰을 반환하는데 string 라이브러리의 substr 함수를 써서, begin인덱스부터 end-begin 길이만큼 token 변수에 집어넣는다.
그 후, begin과 end를 갱신한다. begin 은 delim 문자열 중 적어도 하나가 end 인덱스 부터 없는지 검사하고,
end는 문자열 delim 중 적어도 하나가 begin 인덱스 부터 있는지 검사한다.
먼저 만들어졌던 token을 리턴하면 토큰이 하나가 생성된 것이다.
#include "tokenizer.h"
int main() {
string target;
getline(cin, target);
Tokenizer t1(target, " ");
int i = 0;
while (t1.moreToken())
{
cout << "Token " << i << " : ";
cout << t1.nextToken() << endl;
i++;
}
return 0;
}
이렇게 프로그램을 돌리면,
위와 같이 깔끔하게 결과가 나온다.
'2023 1학기 > c++' 카테고리의 다른 글
[c++] 실행 시간 나노초, 인위적으로 현재 시각 정하기 (1) | 2023.04.16 |
---|---|
[c++] virtual 설명 보충 (0) | 2023.04.15 |
[c++] virtual 함수가 필요한 이유 (0) | 2023.04.15 |
[c++] string 함수들 (0) | 2023.04.14 |
[c++] Class Relationships : association, aggregation (0) | 2023.04.08 |