2009-05-28 2 views
2

flex은 UTF-8 입력을 지원하지 않는 것 같습니다. 스캐너가 ASCII가 아닌 문자를 만날 때마다 EOF 인 것처럼 스캔을 중지합니다.flex (어휘 스캐너)가 UTF-8 문자 입력을 읽는 방법?

플렉스가 내 UTF-8 문자를 강제로 먹일 수있는 방법이 있습니까? 실제로 UTF-8 문자와 일치시키지 않으려면 '.'문자를 사용할 때 그냥 먹어라. 무늬.

의견이 있으십니까?

편집

가장 간단한 해결책은 다음과 같습니다 '.'

ANY 'ANY'대신

사용 [\ x00- \ XFF] 내 규칙에.

+0

정상적으로 작동한다면, 적절한 유니 코드 지원이 좋을 것입니다. –

+0

동의. 지금 다른 이슈에서 실행 중입니다. 플렉스는 "if (yychar <= YYEOF) {/ * 스캐닝이 끝났습니다 * /}"를 체크하지만 UTF-8 문자는 부정적입니다 : ( –

+0

문제가 많습니다. 내부에서 ecs 코드, 테이블 생성기 등을 다시 쓰는 임무가 될 것입니다. 처음부터 시작하는 것이 더 나을 수도 있습니다 : –

답변

6

필자는이 문제를 직접 조사해보고 Flex 메일 링리스트를 읽고 누군가가 그것에 대해 생각하는지 확인했습니다. Flex에 유니 코드를 읽으려면 복잡한 작업이 필요합니다 ...

UTF-8 인코딩이 가능하며 대부분의 다른 인코딩 (16s)은 자동 테이블을 구동하는 대용량 테이블로 이어집니다.

하는 일반적인 방법은 지금까지입니다 :

것은 단순히 하나의 UTF-8 문자와 일치하는 패턴을 기록했다 했는가. 그들은 다음과 같이 보입니다. 그러나 나는 이렇게 오래 전에 이것을 썼기 때문에 은 UTF-8 사양 을 다시 읽으려고 할 것입니다.
유니 코드 문자열을 원하기 때문에 을 조합해야합니다. 은 단일 문자가 아닙니다.

UB [\200-\277] %% 
[\300-\337]{UB}     { do something } 
[\340-\357]{UB}{2}    { do something } 
[\360-\367]{UB}{3}    { do something } 
[\370-\373]{UB}{4}    { do something } 
[\374-\375]{UB}{5}    { do something } 

는 메일 링리스트에서 촬영.

UTF-8 지원을위한 적절한 패치를 더보고 난 다음에 보겠습니다. 위의 솔루션은 큰 .l 파일에서 유지 보수가 불가능한 것으로 보입니다. 그리고 정말 못 생겼어! 비슷한 범위를 사용하여 '.'을 만들 수 있습니다. 모든 ASCII 및 UTF-8 문자를 일치 시키려면 대체 규칙을 사용하지만 여전히보기 흉한 표현입니다.

희망이 도움이됩니다. 또한 도움이 가능성이있는 negatet의 characterclass를 작성

1

:

[\ n 개의 \의 t] 반환 공백을; [^ \ n \ t] 재시도 NON_WHITESPACE