"파싱(Parsing)"

프로그래밍에서 매우 중요한 개념으로, 특히 텍스트 데이터를 처리할 때 자주 사용됨.

쉽게 말하면, 특정 형식(규칙)을 가진 문자열을 의미 있는 단위(토큰)로 분해하고, 그 구조를 분석하는 과정.

좀 더 풀어서 설명하면:

문자열:

파싱의 대상은 보통 텍스트, 즉 문자열을 말한다.

이 문자열은 특정 형식(format)이나 규칙(rule)을 따르고 있다.

예를 들어, CSV 파일, HTML, XML, JSON, 프로그래밍 언어 소스 코드 등이 모두 특정한 형식을 가지고 있다.

의미 있는 단위 (토큰):

형식에 따라 문자열을 더 작은 조각으로 나눈다.

이 조각들을 "토큰(token)"이라고 하는데, 예를 들어, CSV 파일에서는 쉼표(,)로 구분된 각각의 값들이 토큰이 되고, HTML에서는 <p>, <div>, </p>와 같은 태그들이 토큰이 될 수 있다.

구조 분석:

토큰들 사이의 관계를 파악하여 전체적인 구조를 이해한다.

예를 들어, HTML에서 <p>This is a paragraph.</p>라는 문자열이 있다면, <p>는 단락의 시작, </p>는 단락의 끝, "This is a paragraph."는 단락의 내용이라는 것을 파악하는 것.

프로그래밍 언어에서는 문법 규칙에 따라 코드가 올바르게 작성되었는지 확인하고,

어떤 의미를 가지는지 분석한다.

결과:

파싱의 결과는 보통 추상 구문 트리(AST, Abstract Syntax Tree) 와 같은 자료 구조로 표현된다.

AST는 파싱된 텍스트의 구조를 트리 형태로 나타낸 것으로, 프로그램을 분석하고 실행하는 데 사용된다.

간단한 경우에는 구조체나 클래스의 객체 형태로 바로 변환될 수도 있다

(예: CSV 파일의 한 줄을 Item 구조체로 변환).

예시:

CSV 파일 파싱:

 

1,Apple,개 2,Banana,개

이 CSV 문자열을 파싱하면 다음과 같은 토큰으로 분리된다:

1

Apple

2

Banana

그리고 이 토큰들을 묶어서 다음과 같은 구조로 만들 수 있다:

[
    { number: 1, name: "Apple", unit: "개" },
    { number: 2, name: "Banana", unit: "개" }
]

HTML 파싱:

HTML

<h1>Hello, world!</h1>
<p>This is a paragraph.</p>

이 HTML 문자열을 파싱하면 다음과 같은 구조를 파악할 수 있다:

<h1> 태그: 제목 (heading) 레벨 1

내용: "Hello, world!"

<p> 태그: 단락 (paragraph)

내용: "This is a paragraph."

프로그래밍 언어 파싱 (C++):

C++

int x = 10 + 5;

이 C++ 코드를 파싱하면 다음과 같은 구조를 파악할 수 있다:

int: 변수 타입 (정수)

x: 변수 이름

=: 할당 연산자

10: 숫자 리터럴

+: 덧셈 연산자

5: 숫자 리터럴

;: 문장의 끝

현재 코드에서의 파싱:

loadItemListFromCSV 함수에서 CSV 파일을 파싱하고 있다.

while (getline(file, line)) { // 파일에서 한 줄씩 읽기
    stringstream ss(line);    // 읽은 줄을 문자열 스트림으로 만들기
    string segment;
    vector<string> row_data;

    while (getline(ss, segment, ',')) { // 쉼표(,)를 기준으로 문자열 분리
        row_data.push_back(segment);   // 분리된 데이터를 row_data 벡터에 추가
    }

    // ... row_data를 사용하여 Item 객체 생성 ...
}
  1. getline(file, line): 파일에서 한 줄을 읽어 line 변수에 저장.
  2. stringstream ss(line): 읽은 줄(line)을 stringstream 객체 ss로 만들기. stringstream은 문자열을 마치 파일처럼 다룰 수 있게 해준다.
  3. while (getline(ss, segment, ',')): ss에서 쉼표(,)를 기준으로 문자열을 분리하여 segment 변수에 저장. 이 과정을 반복하여 한 줄의 모든 데이터를 분리.
  4. row_data.push_back(segment): 분리된 각 데이터(segment)를 row_data 벡터에 추가.
  5. row_data에 있는 값들을 stoi등의 함수를 이용하여 알맞은 type으로 변환한 다음 Item 객체를 생성.

이 과정이 바로 CSV 파일의 한 줄을 파싱하여 의미 있는 데이터(Item 객체)로 만드는 과정.

파싱이 필요한 이유:

데이터 추출: 텍스트 형식의 데이터에서 필요한 정보를 추출한다.

데이터 변환: 텍스트 데이터를 프로그램에서 사용하기 쉬운 형태(객체, 자료구조 등)로 변환한다.

데이터 검증: 입력 데이터가 올바른 형식인지 확인한다.

코드 실행: 프로그래밍 언어의 경우, 파싱을 통해 소스 코드를 컴퓨터가 이해할 수 있는 형태로 변환하여 실행한다. (컴파일러, 인터프리터)

간단히 말해, 파싱은 텍스트를 의미 있는 정보로 바꾸는 핵심적인 과정을 말한다.

'C++' 카테고리의 다른 글

비트 변환하기 (bitset)  (0) 2025.09.13
c++로 조합 구현하기  (0) 2025.06.19
커스텀 변수 연산자 오버로딩  (0) 2025.06.17
정렬용 비교 함수 객체  (0) 2025.06.17
포인터 (나중에 다시 또 공부하기;)  (1) 2025.06.17

+ Recent posts