간단한 Lexer

문자열 종류별로 분류하는 간단한 Lexer를 만들어 보자.

문자열 종류는 다음과 같다.

enum   TOKEN_TYPE    { TOKEN_UNKNOWN, TOKEN_ERROR, TOKEN_END, TOKEN_DELIMITER, TOKEN_VAR, TOKEN_NUMBER, TOKEN_STRING };

TOKEN_DELIMITER  : 구분자
TOKEN_VAR : 변수
TOKEN_NUMBER : 숫자
TOKEN_STRING : 문자열

char* CLexer::OpenFile( const char* szFileName )

[in]   szFileName  오픈할 파일
반환값  오픈한 파일의 문자열 포인터

문자열을 직접 Builder()로 넘겨주는 경우는 OpenFile()을 이용 할 필요가 없다.

void Build( char* szText )

[in]   szText  분류 할 문자열의 포인터

문자열을 분류해서 m_tokenContainer에 저장한다.

CLexer::TOKEN_TYPE GetToken()

반환값  TOKEN_TYPE을 반환한다.

하나의 구문 문자열(단어)은 m_strToken에 저장된다.

CLexer의 핵심은 GetToken()이다.

GetToken()의 처리 순서는 다음과 같다.

1. 토큰 앞의 공백문자 제거.(스페이스 문자, /t, /r, /n)

2. 구분자 검사

3. 문자열 검사
SearchString()

4. 변수인지 검사
SearchVariable()

5. 숫자인지 검사
SearchNumber()

 

CLexer 사용 예

    CLexer lexer;

    char* pBuffer = lexer.OpenFile("test.cpp");

    lexer.Build( pBuffer );

 

    lexer.DisplayToken();

여기서는 파일을 직접 오픈해서 문자열 토큰을 빌더하고 있다.
DisplayToken()을 통해 콘솔창으로 직접 보여주고 있다.

CLexer의 미비한점:
활용성을 높이고 복잡해지기 전에, 기능 추가를 그만 두기로 했다.
그래도 추가 되었으면 하는기능은 다음과 같다.

1. 유니코드 처리
2. 주석 문자열 처리
3. 한글 변수 처리