5.3) StringBuffer
우리는 1장과 2장을 통해 식별자를 획득하는 방법을 이미 배웠다. 식별자를 획득하려면 왼쪽부터 시작하여 식별자의 조건에 맞는 문자를 모두 획득해야 한다. C 기준에서는 밑줄(_)이나 알파벳으로 시작하는 단어를 밑줄, 알파벳 또는 숫자가 아닌 문자가 나타날 때까지 문자를 획득해야 한다. 그리고 이 과정을 편리하게 하기 위해 StringBuffer클래스를 작성하고 활용했었다.
여기서는 StringBuffer 클래스를 JavaScript를 이용하여 다시 작성한다. 가장 마지막으로 StringBuffer를 작성했던 프로젝트에 있는 StringBuffer 헤더 파일을 보이겠다.
StringBuffer.h |
#ifndef __HANDY_STRINGBUFFER_H__ #define __HANDY_STRINGBUFFER_H__
#include <string> #include "common.h"
typedef Exception StringBufferException;
class StringBuffer { std::string str; unsigned len; unsigned idx;
public: // explicit StringBuffer(const char *s = ""); explicit StringBuffer(const std::string &str); ~StringBuffer();
// 버퍼를 문자열로 초기화합니다. void init(const char *str); void init(const std::string &str);
// 버퍼로부터 문자를 하나 읽습니다. 포인터가 이동합니다. char getc(); // 버퍼의 포인터가 가리키는 문자를 가져옵니다. 포인터는 이동하지 않습니다. char peekc() const; // 버퍼에서 읽었던 값을 되돌립니다. 되돌릴 수 없으면 false를 반환합니다. bool ungetc();
// 버퍼의 끝에 문자 또는 문자열을 추가합니다. void add(char c); void add(const char *s); void add(const std::string &str);
// 버퍼가 비어있다면 true, 값을 더 읽을 수 있다면 false를 반환합니다. bool is_empty() const;
// 버퍼로부터 정수를 획득합니다. std::string get_number(); // 버퍼로부터 식별자를 획득합니다. std::string get_identifier(); // 버퍼로부터 C 연산자를 획득합니다. std::string get_operator(); // 공백이 아닌 문자가 나올 때까지 포인터를 옮깁니다. void trim(); // 현재 위치 다음에 존재하는 토큰을 획득합니다. std::string get_token(); };
#endif |
그럼 이를 바탕으로 StringBuffer 형식을 어떻게 구현해야할지를 고민해보자.
- #ifndef~
> StringBuffer 형식은 StringBuffer.js 파일로 분리하여 구현할 것이다. 이는 필요 없다.
- #include~
> JavaScript는 기본으로 문자열 형식을 지원하므로 string은 필요 없다. common에는 is_digit과 같은 기본 판별 함수가 들어가는데, String 객체가 이에 관한 메서드를 지원하지만 여기서는 별도로 만드는 것이 좋겠다. 즉common.h와 common.cpp 파일을 바탕으로 common.js 파일을 작성한다. 추가로 말하자면 이전에는 예외 형식을 별도로 정의하는 대신 std::string 객체가 이 역할을 하도록 했었는데, 우리는 방금 Exception 객체에 관해 다루었던 만큼 앞으로 Exception 형식이 이를 대체하도록 할 것이다. Exception 형식은 handy.js에 정의했으므로common에서 재정의 할 필요는 없다.
- typedef Exception StringBufferException;
> StringBuffer를 사용하면서 예외가 발생할 때 그 예외 정보를 담는 형식을 StringBufferException으로 정의한다.이전에는 Exception 형식을 재정의 하는 수준에서 정의했지만, 여기서는 보다 디버깅 할 때 도움이 될 정보를 추가할 것이다.
- class StringBuffer ~
> StringBuffer의 구현을 담고 있다.
그리고 이를 바탕으로 다음과 같이 StringBuffer.js를 구현한다.