2011-10-03 3 views
0

나는 모든 문자열을 토큰 화하는 파일을 가지고 있습니다.파일의 문자열 토큰 화

각 토큰은 char *token = (char *) malloc(len + 1);에 저장됩니다. 새 토큰이 할당되기 전에 토큰이 해제되어 나중에 사용할 토큰을 저장할 방법이 필요합니다.

토큰을 저장하는 좋은 전략은 무엇입니까? 한 번에 하나의 단일 토큰 문자열을 출력하는 함수가 있습니다.

여기 내 질문은 토큰 화 또는 구문 분석 방법에 관한 것이 아니므로 구현을 무시하십시오. 내 질문은 루프 내에서 여러 번 할당되고 해제되는 일련의 문자열이 있다는 것입니다. 그렇다면 추가 할당을 위해 각 할당을 다른 곳에 저장하는 방법은 무엇입니까?

+2

이 파일의 예를 볼 수 있습니까? –

+3

더 많은 컨텍스트를 제공 할 수 있습니까? 너 뭐하려고? –

+1

현재 질문은 'lex'와 같은 완전한 어휘 분석 솔루션이나 'strtok'과 같은 단순한 문자열 토크 나이저에 이르기까지 다양합니다. 다른 사람들이 더 자세한 내용을 말한 것처럼. – Joe

답변

0

일반적으로 토큰은 파일에 저장되지 않습니다. 파서가 더 많은 입력을 읽을 준비가되면 파서에 의해 요청됩니다.

이와 같이 토큰은 프로그램의 힙에 메모리에 저장되고 처리 된 후 (파일이 완전히 구문 분석되기 훨씬 오래 걸릴 수 있음) 해제됩니다. 과도한 할당 및 할당 해제에 대해 고민하는 경우에

--- 업데이트

--- 편집을 따라, 당신은 당신이 해결하려는 문제의 세부 사항에 따라 솔루션의 번호를 가지고있다.

문자열의 경우 "문자열 작성기"인터페이스를 통해 문자열을 만들 수 있습니다.이 인터페이스는 문자열이 이미 해당 텍스트에 있는지 확인하고, 해당 문자열이 이미 있으면 해당 문자열에 대한 참조를 반환합니다. 이 기능이 제대로 작동하려면 반환 된 모든 문자열이 변경 불가능해야합니다 (하나의 참조 문자열을 변경하면 모든 참조의 문자열이 변경되므로). 숫자, 부울 값 등에 대해서도 비슷한 해결책이 가능합니다.

토큰 재사용을 위해 파서가 "사용"할 가능성이있는 데이터를 포인터로 참조하는 구조로 토큰을 만들 수 있습니다. 그런 식으로 구문 분석기는 토큰의 "필드"를 잡고 "스켈레톤"토큰을 "재사용 대기열"에 다시 추가 할 수 있습니다. 재사용 대기열은 토큰 라이저에 반환하기 전에 토큰의 "데이터"참조를 재설정해야하며, 이는 데이터 구조에 대한 대기열을 요청하도록 다시 작성됩니다. "큐에"토큰이없는 경우 큐는 자동으로 토큰을 할당해야합니다.

당신이 얻고 자하는 교활한 방법에 따라 다른 솔루션도 있습니다.

+0

편집을 참조하십시오. 감사합니다. – darksky

+0

일부 편집 문제를 해결하기 위해 질문을 업데이트했습니다. –

관련 문제