2009-06-01 4 views
8

UTF-8 문자를 처리 할 Bison 파서를 만들려고합니다. 파서가 실제로 유니 코드 문자 값을 해석하는 것을 원치 않지만 UTF-8 문자열을 바이트 시퀀스로 파싱해야합니다.Bison은 UTF-8 문자를 구문 분석 할 수 있습니까?

는 지금, 들소가 문제가 다음 코드 생성

if (yychar <= YYEOF) 
    { 
     yychar = yytoken = YYEOF; 
     YYDPRINTF ((stderr, "Now at end of input.\n")); 
    } 

문제를 UTF-8 문자열의 바이트가 음의 값을 가질 것이며, 들소는 EOF로 음의 값을 해석하는 것입니다, 멈 춥니 다.

이 방법이 있습니까?

답변

8

bison 예, flex no. 한 번은 UTF-8로 인코딩 된 파일로 작업하기 위해 bison 파서가 필요했습니다. 나는 yylex 함수를 작성했습니다.

편집 : 수 있도록하기 위해, 나는 (A gunicode 유형과 내가 유용하다고 일부 파일/문자열 조작 함수가있다) glib에서 사용할 수있는 유니 코드 작업을 많이 사용했다.

+0

음, lexer는 UTF-8 문자를 잘 처리하지만 Bison 파서는 음수 값을 보자 마자 파싱을 중단합니다. 제발 조언. –

+0

한 번에 1 바이트 씩 파일을 읽으십니까? 또는 한 번에 1 utf-8 인코딩 된 문자? – eduffy

+0

한 번에 1 바이트. –

4

flex 여기에서 문제가되는 경우 zlex을 살펴볼 수 있습니다.

+0

흥미로운 프로젝트이지만이 질문에서 다루는 문제를 정확히 해결하지는 못합니다. 16 비트 문자는 UTF-8로 인코딩 된 문자와 다릅니다 (UTF-8은 최대 4 바이트 길이 일 수 있습니다). – eduffy

0

이것은 4 년 전부터 제기 된 질문이지만 동일한 문제에 직면하고 있으며 제 아이디어를 공유하고 싶습니다.

문제는 UTF-8에서 읽을 바이트 수를 모르는 것입니다. 위에 제시된 것처럼 당신은 당신 자신의 렉서를 사용할 수 있고, 전체 라인을 읽거나 매번 4 바이트를 읽게 할 수있다. 그런 다음 UTF-8 문자를 추출하고 더 많은 바이트를 읽어 4 바이트로 다시 완료하십시오.

+0

실제로 읽을 때까지 문자 당 읽는 바이트 수를 알 수는 없지만 알 필요는 없습니다. 바이트 스트림을 올바르게 토큰 화하려면 바이트 패턴이 키워드, 구분 기호 등으로 중요한지 알아야합니다. 렉서는 다른 것을 해석 할 필요가 없습니다. 바이트 시퀀스를 토큰으로 수집합니다. 문자 리터럴 토큰을 호출자에게보고하려는 경우에도 유효한 UTF-8 코드 시퀀스와 일치하는 어휘 패턴 규칙을 작성하고이를 사용하여 들어오는 멀티 바이트 문자를 올바르게 스캔 할 수 있습니다. –