Tokenizer 클래스
•
먼저 Tokenization이 무엇인가에 대해 알아야 할 것 같습니다.
•
간단하게 말하면 Tokenization이란 Text를 여러개의 Token으로 나누는 것을 말합니다.
•
보통 공백, 구두점, 특수문자 등으로 이를 나누는데요. 그 방법에 따라 다양한 Tokenizer가 있습니다.
•
메인 아이디어는 (타겟 스트링 구조의 문자열 텍스트)를 기반으로 구분 문자 delimiter를 만들고 토큰을 만든다는 것
•
target과 tokenizer 객체를 인스턴스화 하고 반복문을 사용해서 토큰을 추출한다.
•
사용자는 tokenizer 객체에서 nextToken 함수를 호출한다.
•
함수 내부에서는 target 객체의 find_first_not_of 와 find_first_of 함수를 호출한다.
시퀀스 다이어그램
소스코드
/tokenizer.h
//
// tokenizer.h
//
//
// Created by Glory on 2021/04/28.
//
// Tokenizer 클래스의 인터페이스 파일
#ifndef TOKENIZER_H
#define TOKENIZER_H
#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();
};
#endif
C++
복사
•
Tokenizer 클래스의 인터페이스 파일입니다.
•
데이터 맴버로 문자열 자료형의 target과 delim이 있다.
•
이 클래스는 생성자와 소멸자 이외에 2개의 맴버 함수가 있다.
•
문자열에 토큰이 있는지 확인하는 맴버함수, 문자열에서 토큰을 추출하는 맴버 함수
/tokenizer.cpp
//
// tokenizer.cpp
//
//
// Created by Glory on 2021/04/28.
//
//Tokenizer 클래스의 구현 파일 (생성자와 소멸자를 포함해서 모두 4개의 맴버 함수를 정의)
#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;
}
C++
복사
/app.cpp
//
// app.cpp
//
//
// Created by Glory on 2021/04/28.
//
//Tokenizer 클래스를 테스트하는 애플리케이션 파일 (tokenizer 클래스를 인스턴스화 하여 사용하는 main
#include "tokenizer.h"
int main()
{
// 토큰화 할 문자열
string target("This is the string to be tokenized. \n");
// 구분 문자로 사용할 문자열
string delimit(" \n"); // 띄어쓰기와 줄바꿈을 구분 문자로 사용
// Tokenizer 객체 인스턴스화
Tokenizer tokenizer(target, delimit);
// target 문자열을 기반으로 토큰 찾아 출력
while(tokenizer.moreToken())
{
cout << tokenizer.nextToken() << endl;
}
return 0;
}
C++
복사