2016-11-16 1 views
3

지금까지 내가 사양 (http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf)을 캡처 생각했다JFlex 문자열 정규식 이상한 행동

string = \"((\\(\"|\\|\/|b|f|n|r|t|u[0-9a-fA-F]{4})) | [^\"\\])*\" 

을 가지고 JFlex에서 JSON 문자열 파서를 작성하려합니다. 제어 문자와 표준 문자 및 기호에 대해 테스트했지만 어떤 이유로 £ 또는 (또는) 또는 ¬을 허용하지 않습니다. 누군가이 문제의 원인을 알려주십시오.

답변

4

아마 JLex 호환 모드에서 실행 중입니까? 그렇다면 공식 JFlex 사용자 매뉴얼에서 다음을 참조하십시오. 기본적으로 입력에 7 비트 문자 코드를 사용하는 반면 원하는 것은 16 비트 (유니 코드)입니다.

첫 번째 %% 다음에 %unicode 줄을 추가하여이 문제를 해결할 수 있습니다.

자료 :

입력 문자

은 7 비트의 입력 문자 집합 (문자 코드 127)를 사용하여 생성 된 스캐너 원인 %의 7 비트를 설정한다. 런타임시 입력에서 127보다 큰 코드를 가진 입력 문자가 발견되면 스캐너는 ArrayIndexOutofBoundsException을 발생시킵니다. 이것 때문에뿐만 아니라, % unicode 지시문을 사용하는 것을 고려해야합니다. 문자 인코딩에 대한 정보는 인코딩을 참조하십시오. 이것은 JLex 호환 모드의 기본값입니다.

퍼센트 전체 % 8 비트

두 옵션 생성 스캐너 8 비트 입력 문자 집합 (문자 코드 255)을 사용하도록 야기한다. 런타임시 입력에서 255보다 큰 코드를 가진 입력 문자가 발견되면 스캐너는 ArrayIndexOutofBoundsException을 발생시킵니다. 플랫폼이 문자 당 1 바이트 만 사용하더라도 문자의 유니 코드 값은 여전히 ​​255보다 클 수 있습니다. 텍스트 파일을 스캔하는 경우 % unicode 지시문을 사용해야합니다. 문자 인코딩에 대한 자세한 내용은 섹션 Econdings를 참조하십시오. 0-0x10FFFF :

% 유니 코드 %의 16 비트

두 옵션은 생성 된 스캐너가 보조 코드 포인트를 포함한 전체 유니 코드 입력 문자 집합을 사용하도록합니다. % unicode는 스캐너가 한 번에 2 바이트를 읽는 것을 의미하지 않습니다. 읽히는 무엇이고 특성을 구성하는 무엇이 런타임 플래트 홈에 달려있다. 문자 인코딩에 대한 더 자세한 정보는 Encoding 섹션을 참고하십시오. JLex 호환성 모드가 사용되지 않는 한 기본값입니다 (명령 행 옵션 --jlex).

+1

나중에 참조 할 수 있도록 출처를 자신의 글과 분명히 구별하고 원본에 대한 하이퍼 링크를 제공하려면 인용 부호로 묶으십시오. – Laurence