std::string get_type(StringBuffer &bin) { char ch = bin.peekc(); // 버퍼의 첫 문자를 확인한다 if (is_fnamch(ch) == false) // 올바른 형식이 아니면 예외 throw Exception("잘못된 입력입니다."); std::string result = ""; while (bin.is_empty() == false) { // 버퍼에 문자가 남아있는 동안 ch = bin.getc(); // 문자를 획득하고 확인한다 if (is_namch(ch) == false) { // 더 이상 형식 문자가 아니면 bin.ungetc(); // 아직 해석되지 않은 문자를 버퍼에 되돌리고 break; // 형식이 끝났으므로 탈출한다 } result += ch; // 획득한 문자를 결과 객체에 넣는다 } return result; }
void dirdcl(StringBuffer &bin, StringList &vout) { // 직접 선언자를 분석하고 결과 출력 char ch = bin.peekc(); if (is_fnamch(ch)) { // direct-declarator: 이름 (2) std::string identifier = ""; while (bin.is_empty() == false) { ch = bin.getc(); if (is_namch(ch) == false) { bin.ungetc(); break; } identifier += ch; } if (identifier.empty()) // 식별자에 추가된 문자가 없다면 예외 throw Exception("올바른 식별자 이름이 아닙니다."); vout.push_back(identifier); } else if (ch == '(') { // direct-declarator: (declarator) (3) bin.getc(); // ( 문자를 해석해서 진입했으므로 다음으로 넘긴다 dcl(bin, vout); if (bin.peekc() != ')') // 닫는 괄호가 없으면 예외 throw Exception("닫는 괄호가 없습니다."); bin.getc(); // ) 괄호 검사를 진행했으므로 다음으로 넘긴다 } // direct-declarator: direct-declarator() (4) // direct-declarator: direct-declarator[] (5) while (bin.is_empty() == false) { ch = bin.peekc(); if (ch == '(') { // 함수 기호 획득 bin.getc(); // ( 괄호를 해석해서 진입했으므로 넘긴다 if (bin.peekc() != ')') // 닫는 괄호가 없으면 예외 throw Exception("잘못된 함수 기호입니다."); bin.getc(); // ) 괄호를 해석했으므로 다음으로 넘긴다 vout.push_back("()"); } else if (ch == '[') { // 배열 기호 획득 bin.getc(); // [ 괄호를 해석해서 진입했으므로 넘긴다 if (bin.peekc() != ']') // 닫는 괄호가 없으면 예외 throw Exception("잘못된 배열 기호입니다."); bin.getc(); // ] 괄호를 해석했으므로 다음으로 넘긴다 vout.push_back("[]"); } else { // 이외의 경우 반복문을 탈출한다 break; } } }
void dcl(StringBuffer &bin, StringList &vout) { // 선언자를 분석하고 결과 출력 // declarator: * direct-declarator (1) int pointer_count = 0; char ch; while (bin.is_empty() == false) { // 버퍼에 문자가 남아있는 동안 ch = bin.getc(); // 문자를 획득하고 확인한다 if (ch == '*') { // *라면 그만큼 포인터를 출력하기 위해 ++pointer_count; // 카운터를 증가시킨다 } else { // *가 아니라면 포인터를 되돌리고 탈출한다 bin.ungetc(); break; } } // declarator: * direct-declarator (2) dirdcl(bin, vout); // *을 모두 획득했으므로 직접 선언자를 분석한다 while (pointer_count > 0) { // 선언자의 분석이 오른쪽에서 먼저 진행되므로 vout.push_back("*"); // 왼쪽에서 획득한 기호를 오른쪽의 분석이 --pointer_count; // 종료된 후에 출력해야 한다 } }